我的openwrt学习笔记(三十四):Openwrt之uci 在ubuntu中的测试
来源:互联网 发布:网络推广平台找推网 编辑:程序博客网 时间:2024/05/16 15:17
我的openwrt学习笔记(三十四):Openwrt之uci 在ubuntu中的测试
UCI是Unified Configuration Interface的缩写,翻译成中文就是统一配置接口,用途就是为OpenWrt提供一个集中控制的接口。OpenWrt实现的这个工具,能够让你的不管是Lua还是PHP程序,或者SHELL程序或C程序,只要执行命令传输参数就能达到修改系统参数的目的.
Uci 在ubuntu下的使用.
UCI的配置文件被分割成/etc/config下的多个独立的文件,各个文件按名字含义对应系统的不同的功能配置。你可以通过文本编译器或者uci实用程序去修改这些配置文件,同时uci还提供了C语言/脚本/Lua等语言的应用程序接口,WEB配置页面例如Luci就是利用了uci所提供的API而实现对UCI配置文件的修改的。
不管你是采用文本编辑器还是通过命令行的方式修改了UCI配置文件,相应的服务或应用程序不会自动更新状态,这时你都必须调用一次/etc/init.d (re)start才能使刚刚对UCI配置文件的修改生效。许多兼容UCI的程序采用这样的方法来应用更新:在init.d脚本执行流中去修改自己程序的配置文件。具体说来,init.d脚本先去修改自己程序的原配置文件中的信息(如/etc/samba/smb.conf),之后重启一次应用程序,应用程序就会去读自己的配置文件(刚刚被init.d更新过的)再启动,这样应用程序的状态就更新了。仅仅重启应用程序,而不执行init.d脚本的话,/etc/config下的UCI配置文件是不会应用于应用程序的,新配置也就不生效了。
linux@ubuntu:~/linux_c/uci$ ls -l
total 56
drwxr-xr-x 5 linux linux 4096 Jul 21 09:31 uci-2014-04-11.1
-rw-rw-r-- 1 linux linux 50065 Sep 14 19:25 uci-2014-04-11.1.tar.gz
linux@ubuntu:~/linux_c/uci$ cd uci-2014-04-11.1/
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ ls -l
total 196
-rw-r--r-- 1 linux linux 4864 Jul 21 09:31 blob.c
-rw-r--r-- 1 linux linux 14589 Jul 21 09:31 cli.c
-rw-r--r-- 1 linux linux 1013 Jul 21 09:31 CMakeLists.txt
-rw-r--r-- 1 linux linux 10991 Jul 21 09:31 delta.c
-rw-r--r-- 1 linux linux 19524 Jul 21 09:31 file.c
-rw-r--r-- 1 linux linux 5290 Jul 21 09:31 libuci.c
-rw-r--r-- 1 linux linux 16379 Jul 21 09:31 list.c
-rw-r--r-- 1 linux linux 17600 Jul 21 09:31 list.h
drwxr-xr-x 2 linux linux 4096 Jul 21 09:31 lua
-rw-r--r-- 1 linux linux 2587 Jul 21 09:31 parse.c
drwxr-xr-x 2 linux linux 4096 Jul 21 09:31 sh
drwxr-xr-x 6 linux linux 4096 Jul 21 09:31 test
-rw-r--r-- 1 linux linux 1299 Jul 21 09:31 uci_blob.h
-rw-r--r-- 1 linux linux 59 Jul 21 09:31 uci_config.h.in
-rw-r--r-- 1 linux linux 17605 Jul 21 09:31 uci.h
-rw-r--r-- 1 linux linux 7220 Jul 21 09:31 uci_internal.h
-rw-r--r-- 1 linux linux 19146 Jul 21 09:31 ucimap.c
-rw-r--r-- 1 linux linux 9118 Jul 21 09:31 ucimap.h
-rw-r--r-- 1 linux linux 5109 Jul 21 09:31 util.c
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ cmake .
-- The C compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/linux/linux_c/uci/uci-2014-04-11.1
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ make
Scanning dependencies of target uci
[ 11%] Building C object CMakeFiles/uci.dir/libuci.c.o
[ 22%] Building C object CMakeFiles/uci.dir/file.c.o
[ 33%] Building C object CMakeFiles/uci.dir/util.c.o
[ 44%] Building C object CMakeFiles/uci.dir/delta.c.o
[ 55%] Building C object CMakeFiles/uci.dir/parse.c.o
[ 66%] Building C object CMakeFiles/uci.dir/blob.c.o
Linking C shared library libuci.so
[ 66%] Built target uci
Scanning dependencies of target cli
[ 77%] Building C object CMakeFiles/cli.dir/cli.c.o
Linking C executable uci
[ 77%] Built target cli
Scanning dependencies of target ucimap
[ 88%] Building C object CMakeFiles/ucimap.dir/ucimap.c.o
Linking C static library libucimap.a
[ 88%] Built target ucimap
Scanning dependencies of target uci_lua
[100%] Building C object lua/CMakeFiles/uci_lua.dir/uci.c.o
Linking C shared module uci.so
[100%] Built target uci_lua
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ file uci
uci: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xd271be1dcdf6d41d5e6517da451263c291483673, not stripped
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ sudo make install
[sudo] password for linux:
[ 66%] Built target uci
[ 77%] Built target cli
[ 88%] Built target ucimap
[100%] Built target uci_lua
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/include/uci.h
-- Installing: /usr/local/include/uci_config.h
-- Installing: /usr/local/include/uci_blob.h
-- Installing: /usr/local/include/ucimap.h
-- Installing: /usr/local/lib/libuci.so
-- Installing: /usr/local/bin/uci
-- Removed runtime path from "/usr/local/bin/uci"
-- Installing: /usr/local/lib/lua/5.1/uci.so
-- Removed runtime path from "/usr/local/lib/lua/5.1/uci.so"
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ which uci
/usr/local/bin/uci
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ uci -v
uci: error while loading shared libraries: libuci.so: cannot open shared object file: No such file or directory
linux@ubuntu:/usr/local/lib$ ldd /usr/local/bin/uci
linux-gate.so.1 => (0xb779f000)
libuci.so => not found
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e7000)
/lib/ld-linux.so.2 (0xb77a0000)
linux@ubuntu:/usr/local/lib$ LD_DEBUG=libs uci -v
5877: find library=libuci.so [0]; searching
5877: search cache=/etc/ld.so.cache
5877: search path=/lib/i386-linux-gnu/tls/i686/sse2/cmov:/lib/i386-linux-gnu/tls/i686/sse2:/lib/i386-linux-gnu/tls/i686/cmov:/lib/i386-linux-gnu/tls/i686:/lib/i386-linux-gnu/tls/sse2/cmov:/lib/i386-linux-gnu/tls/sse2:/lib/i386-linux-gnu/tls/cmov:/lib/i386-linux-gnu/tls:/lib/i386-linux-gnu/i686/sse2/cmov:/lib/i386-linux-gnu/i686/sse2:/lib/i386-linux-gnu/i686/cmov:/lib/i386-linux-gnu/i686:/lib/i386-linux-gnu/sse2/cmov:/lib/i386-linux-gnu/sse2:/lib/i386-linux-gnu/cmov:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu/tls/i686/sse2/cmov:/usr/lib/i386-linux-gnu/tls/i686/sse2:/usr/lib/i386-linux-gnu/tls/i686/cmov:/usr/lib/i386-linux-gnu/tls/i686:/usr/lib/i386-linux-gnu/tls/sse2/cmov:/usr/lib/i386-linux-gnu/tls/sse2:/usr/lib/i386-linux-gnu/tls/cmov:/usr/lib/i386-linux-gnu/tls:/usr/lib/i386-linux-gnu/i686/sse2/cmov:/usr/lib/i386-linux-gnu/i686/sse2:/usr/lib/i386-linux-gnu/i686/cmov:/usr/lib/i386-linux-gnu/i686:/usr/lib/i386-linux-gnu/sse2/cmov:/usr/lib/i386-linux-gnu/sse2:/usr/lib/i386-linux-gnu/cmov:/usr/lib/i386-linux-gnu:/lib/tls/i686/sse2/cmov:/lib/tls/i686/sse2:/lib/tls/i686/cmov:/lib/tls/i686:/lib/tls/sse2/cmov:/lib/tls/sse2:/lib/tls/cmov:/lib/tls:/lib/i686/sse2/cmov:/lib/i686/sse2:/lib/i686/cmov:/lib/i686:/lib/sse2/cmov:/lib/sse2:/lib/cmov:/lib:/usr/lib/tls/i686/sse2/cmov:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686/cmov:/usr/lib/tls/i686:/usr/lib/tls/sse2/cmov:/usr/lib/tls/sse2:/usr/lib/tls/cmov:/usr/lib/tls:/usr/lib/i686/sse2/cmov:/usr/lib/i686/sse2:/usr/lib/i686/cmov:/usr/lib/i686:/usr/lib/sse2/cmov:/usr/lib/sse2:/usr/lib/cmov:/usr/lib (system search path)
5877: trying file=/lib/i386-linux-gnu/tls/i686/sse2/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/i686/sse2/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/i686/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/i686/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/sse2/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/sse2/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/tls/libuci.so
5877: trying file=/lib/i386-linux-gnu/i686/sse2/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/i686/sse2/libuci.so
5877: trying file=/lib/i386-linux-gnu/i686/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/i686/libuci.so
5877: trying file=/lib/i386-linux-gnu/sse2/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/sse2/libuci.so
5877: trying file=/lib/i386-linux-gnu/cmov/libuci.so
5877: trying file=/lib/i386-linux-gnu/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/i686/sse2/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/i686/sse2/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/i686/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/i686/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/sse2/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/sse2/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/tls/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/i686/sse2/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/i686/sse2/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/i686/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/i686/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/sse2/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/sse2/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/cmov/libuci.so
5877: trying file=/usr/lib/i386-linux-gnu/libuci.so
5877: trying file=/lib/tls/i686/sse2/cmov/libuci.so
5877: trying file=/lib/tls/i686/sse2/libuci.so
5877: trying file=/lib/tls/i686/cmov/libuci.so
5877: trying file=/lib/tls/i686/libuci.so
5877: trying file=/lib/tls/sse2/cmov/libuci.so
5877: trying file=/lib/tls/sse2/libuci.so
5877: trying file=/lib/tls/cmov/libuci.so
5877: trying file=/lib/tls/libuci.so
5877: trying file=/lib/i686/sse2/cmov/libuci.so
5877: trying file=/lib/i686/sse2/libuci.so
5877: trying file=/lib/i686/cmov/libuci.so
5877: trying file=/lib/i686/libuci.so
5877: trying file=/lib/sse2/cmov/libuci.so
5877: trying file=/lib/sse2/libuci.so
5877: trying file=/lib/cmov/libuci.so
5877: trying file=/lib/libuci.so
5877: trying file=/usr/lib/tls/i686/sse2/cmov/libuci.so
5877: trying file=/usr/lib/tls/i686/sse2/libuci.so
5877: trying file=/usr/lib/tls/i686/cmov/libuci.so
5877: trying file=/usr/lib/tls/i686/libuci.so
5877: trying file=/usr/lib/tls/sse2/cmov/libuci.so
5877: trying file=/usr/lib/tls/sse2/libuci.so
5877: trying file=/usr/lib/tls/cmov/libuci.so
5877: trying file=/usr/lib/tls/libuci.so
5877: trying file=/usr/lib/i686/sse2/cmov/libuci.so
5877: trying file=/usr/lib/i686/sse2/libuci.so
5877: trying file=/usr/lib/i686/cmov/libuci.so
5877: trying file=/usr/lib/i686/libuci.so
5877: trying file=/usr/lib/sse2/cmov/libuci.so
5877: trying file=/usr/lib/sse2/libuci.so
5877: trying file=/usr/lib/cmov/libuci.so
5877: trying file=/usr/lib/libuci.so
5877:
uci: error while loading shared libraries: libuci.so: cannot open shared object file: No such file or directory
linux@ubuntu:/usr/local/lib$ ln -s /usr/local/lib/libuci.so /usr/lib/libuci.so
ln: failed to create symbolic link `/usr/lib/libuci.so': Permission denied
linux@ubuntu:/usr/local/lib$ sudo ln -s /usr/local/lib/libuci.so /usr/lib/libuci.so
linux@ubuntu:/usr/local/lib$ ldd /usr/local/bin/uci
linux-gate.so.1 => (0xb7776000)
libuci.so => /usr/lib/libuci.so (0xb7757000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b2000)
libubox.so => /usr/lib/libubox.so (0xb75a7000)
/lib/ld-linux.so.2 (0xb7777000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb759e000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7583000)
OK ,test下
linux@ubuntu:/usr/local/lib$ uci --version
uci: invalid option -- '-'
Usage: uci [<options>] <command> [<arguments>]
Commands:
batch
export [<config>]
import [<config>]
changes [<config>]
commit [<config>]
add <config> <section-type>
add_list <config>.<section>.<option>=<string>
del_list <config>.<section>.<option>=<string>
show [<config>[.<section>[.<option>]]]
get <config>.<section>[.<option>]
set <config>.<section>[.<option>]=<value>
delete <config>[.<section>[[.<option>][=<id>]]]
rename <config>.<section>[.<option>]=<name>
revert <config>[.<section>[.<option>]]
reorder <config>.<section>=<position>
Options:
-c <path> set the search path for config files (default: /etc/config)
-d <str> set the delimiter for list values in uci show
-f <file> use <file> as input instead of stdin
-m when importing, merge data into an existing package
-n name unnamed sections on export (default)
-N don't name unnamed sections
-p <path> add a search path for config change files
-P <path> add a search path for config change files and use as default
-q quiet mode (don't print error messages)
-s force strict mode (stop on parser errors, default)
-S disable strict mode
-X do not use extended syntax on 'show'
Uci使用
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ pwd
/home/linux/linux_c/uci/uci-2014-04-11.1/test/config
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ ls -l
total 4
-rw-r--r-- 1 linux linux 452 Jul 21 09:31 network
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ cat network
config 'alias' 'a'
option 'interface' 'lan'
config 'alias' 'b'
option 'interface' 'lan'
config 'interface' 'lan'
option 'proto' 'static'
option 'ifname' 'eth0'
option 'test' '123'
option 'enabled' 'off'
option 'ipaddr' '2.3.4.5'
config 'interface' 'wan'
option 'proto' 'dhcp'
option 'ifname' 'eth1'
option 'enabled' 'on'
option 'aliases' 'c d'
config 'alias' 'c'
option 'interface' 'wan'
config 'alias' 'd'
option 'interface' 'wan'
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config
network.a=alias
network.a.interface=lan
network.b=alias
network.b.interface=lan
network.lan=interface
network.lan.proto=static
network.lan.ifname=eth0
network.lan.test=123
network.lan.enabled=off
network.lan.ipaddr=2.3.4.5
network.wan=interface
network.wan.proto=dhcp
network.wan.ifname=eth1
network.wan.enabled=on
network.wan.aliases=c d
network.c=alias
network.c.interface=wan
network.d=alias
network.d.interface=wan
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show network.b -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config
network.b=alias
network.b.interface=lan
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show network.lan -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config
network.lan=interface
network.lan.proto=static
network.lan.ifname=eth0
network.lan.test=123
network.lan.enabled=off
network.lan.ipaddr=2.3.4.5
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show network.lan.test -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config
network.lan.test=123
uci add操作
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci add network test -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config
cfg0a6865
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci commit
uci: Entry not found
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci commit -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config
linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ cat network
config alias 'a'
option interface 'lan'
config alias 'b'
option interface 'lan'
config interface 'lan'
option proto 'static'
option ifname 'eth0'
option test '123'
option enabled 'off'
option ipaddr '2.3.4.5'
config interface 'wan'
option proto 'dhcp'
option ifname 'eth1'
option enabled 'on'
option aliases 'c d'
config alias 'c'
option interface 'wan'
config alias 'd'
option interface 'wan'
config wire 'test'
config test
config test
生效修改(任何写入类的语法,最终都要执行生效修改,否则所做修改只在缓存中,切记!)
创建UCI文件并测试
默认uci搜索目录是/etc/config
linux@ubuntu:/etc/config$ sudo mkdir -p /etc/config
linux@ubuntu:/etc/config$ sudo touch test
linux@ubuntu:/etc/config$ ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 15 09:51 test
linux@ubuntu:/etc/config$ sudo chown linux:linux test
linux@ubuntu:/etc/config$ ls -l
total 0
-rw-r--r-- 1 linux linux 0 Sep 15 09:51 test
linux@ubuntu:/etc/config$ chmod 777 test
linux@ubuntu:/etc/config$ vi test
linux@ubuntu:/etc/config$ uci show
test.abc=test
test.abc.test_var=value
test.abc.test_var2=value22
linux@ubuntu:/etc/config$ cat test
config 'test' 'abc'
option 'test_var' 'value'
option 'test_var2' 'value22'
参考
总结:
1. 和共享库相关的一些错误如何处理:
1> LD_DEBUG命令:
LD_DEBUG 是 glibc中的 loader 为了方便自身调试而设置的一个环境变量。通过设置这个环境变量,可以方便的看到 loader 的加载过程。
UCI API的使用
C中调用UCI API
http://blog.chinaunix.net/uid-26675482-id-4633889.html
好了 ,lua 学习 , uci也学习了,接下来就是luci
Lua中使用UCI 例子:
Luci文件源代码:
linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$cat test1.luci
#!/usr/bin/lua
--helloworld lua program
print("Hello World!")
require("uci")
-- Get asection type or an option
x =uci.cursor()
a =x:get("test", "abc", "test_var")
print(a)
-- Getthe configuration directory
b =x:get_confdir()
print(b)
-- Getall sections of a config or all values of a section
d =x:get_all("test", "abc")
print(d)
print(d["test_var"])
print(d["test_var2"])
uci 文件具体内容
linux@ubuntu:/etc/config$pwd
/etc/config
linux@ubuntu:/etc/config$cat test
config'test' 'abc'
option 'test_var' 'value'
option 'test_var2' 'value22'
执行测试输出结果:
linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$lua test1.luci
HelloWorld!
value
/etc/config
table:0x9190018
value
value22
Luci api
http://luci.subsignal.org/api/luci/
http://wiki.openwrt.org/doc/techref/uci#api
- 我的openwrt学习笔记(三十四):Openwrt之uci 在ubuntu中的测试
- 我的openwrt学习笔记(三十三):Openwrt 之lua 在ubuntu中的测试
- 我的openwrt学习笔记(三十五):Openwrt 之luci-lua调用uci的测试
- 我的openwrt学习笔记(三十二):openwrt 的UCI
- OpenWrt UCI 学习笔记
- 我的openwrt学习笔记(十三):MT7688 串口测试
- 我的openwrt学习笔记(一):OpenWrt简介
- 我的openwrt学习笔记(四):OpenWrt源代码下载
- ubuntu 编译独立与openwrt的uci
- 我的openwrt学习笔记(三十):webserver之uhttpd
- openwrt uci的使用
- Openwrt的uci操作
- OpenWrt的UCI系统
- OpenWrt配置(UCI)
- 我的openwrt学习笔记(二十):WIFI 无线传输速率测试-iperf
- 我的openwrt学习笔记(二十四):WIFI无线传输速率相对测试方法_netcat
- 我的openwrt学习笔记(九):开发板访问虚拟机 ubuntu linux 文件方法
- OpenWRT UCI API的使用
- 报表性能优化方案之报表计算时间
- Activity 与Fragment 生命周期的交换
- 三步升级已安装的 Android SDK 和 ADT 插件
- 大写String和小写string的区别
- 将信息写入keychain中
- 我的openwrt学习笔记(三十四):Openwrt之uci 在ubuntu中的测试
- 评估网页性能利器——page speed
- 可以用于练习编程的网站和书
- POJ 3414 POTS BFS
- 数据结构例程——迷宫问题(用栈结构)
- SSH小谈
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题
- ganglia安装与配置
- 学习笔记之Intro.js轻松搞定页面引导流程