Luci要点

写这篇文章借鉴了好多文章,应该是对大家都总结才对。

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

第四项为现实的顺序,这个数字越小,显示越靠前,靠上。


现在说一下这些文件的解析是怎么解析的呢?你当然是说dispatch.lua中,你说对了,但是真正解析成菜单的递归算法确实在header.htm中  位置:/usr/lib/lua/luci/view/themes/bootstrap/ header.htm太复杂了看不懂中。。。这个东西就是页面的toub




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值