写这篇文章借鉴了好多文章,应该是对大家都总结才对。
OpenWRT的web采取的是luci框架,该框架采取了MVC的设计模式。在luci目录下有3个重目录,contoller、model、view。html文件放在view下;逻辑控制文件放在contoller下(主要是注册页面);Model只要是业务上的处理(还不是太明白。。)
controller在luci框架中的作用是逻辑上的组织,编码时主要分为2块
1、module("luci.controller.admin.system", package.seeall)(模块的注册)
在luci/controller/admin/下注册一个system模块
2、function index() (节点的注册)
local fs = require "nixio.fs"
entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
entry({"admin", "system", "clock_status"}, call("action_clock_status"))
entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2)
..............................
.................................
entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90)
end
entry函数是有属性的,
1:用户管理:
在luci的官方网站说明了luci是一个MVC架构的框架, luci是一个单用户框架,公用的模块放置在*/luci/controller/下面,各个用户的模块放置在*/luci/controller/下面对应的文件夹里面,比如admin登录,最终的页面只显示/luci/controller/admin下面的菜单。这样既有效的管理了不同管理员的权限。一共7个文件
root@OpenWrt:/usr/lib/lua/luci/controller/admin# ls -l
-rw-rw-r-- 1 root root 319 Mar 31 07:19 filebrowser.lua
-rw-rw-r-- 1 root root 1140 Mar 31 07:19 index.lua
-rw-rw-r-- 1 root root 11355 Mar 31 07:19 network.lua
-rw-rw-r-- 1 root root 4403 Mar 31 07:19 status.lua
-rw-rw-r-- 1 root root 10235 Mar 31 07:19 system.lua
-rw-rw-r-- 1 root root 1769 Mar 31 07:19 uci.lua
-rw-rw-r-- 1 root root 1167 Mar 31 07:19 servicectl.lua
前面6个来至Feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin目录,最后一个来自luci-base目录
index.lua这个文件定义了node,最外面的节点,最上层菜单的显示等等。在其他的lua文件里,定义了其他菜单的显示和html以及业务处理路径。每个文件对应一个菜单相。
举例system.lua的部分代码
module("luci.controller.admin.system", package.seeall)
function index()
local fs = require "nixio.fs"
entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
entry({"admin", "system", "clock_status"}, call("action_clock_status"))
entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2)
if fs.access("/bin/opkg") then
entry({"admin", "system", "packages"}, call("action_packages"), _("Software"), 10)
entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg"))
end
entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45)
entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46)
if fs.access("/sbin/block") then
entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50)
entry({"admin", "system", "fstab", "mount"}, cbi("admin_system/fstab/mount"), nil).leaf = true
entry({"admin", "system", "fstab", "swap"}, cbi("admin_system/fstab/swap"), nil).leaf = true
end
if fs.access("/sys/class/leds") then
entry({"admin", "system", "leds"}, cbi("admin_system/leds"), _("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), 60)
end
entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70)
entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles"))
entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90)
end
mudel是对应文件的,function index定义了菜单,比如这一句
entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90)
第1项为菜单入口:{"admin", "system", "reboot"},
第二项为菜单对应的页面,可以是lua的源代码文件,也可以是html页面。
alias cgi form call 等定义了此菜单相应的处理方式,form和cgi对应到model/cbi相应的目录下面,那里面是对应的定制好的html和lua业务处理。
alias表示连接到其他某个节点,call调用了本文将或者导入文件的相应的函数。还有一种调用,是template,是直接链接到view相应目录下面的htm页面。(说明:luci框架下面的htm都是可以嵌入lua语句的,做业务处理,相当于jsp页面的内部的Java语句)。
entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90):对应此文件的 action_reboot 函数( system.lua文件中)
第三项为i18n显示,_("Reboot")为国际化显示如果是中文则显示(feeds/luci/modules/luci-base/po/zh-cn/base.po文件中的中文
如msgid "Reboot"
msgstr "重启"
国际化的问题参考 blog.csdn.net/kwongfung/article/details/8488188
第四项为现实的顺序,这个数字越小,显示越靠前,靠上。