转自:http://www.cnblogs.com/souroot/p/4511760.html

LuCI (Lua Configiration Interface) 是OpenWRT 的Web 管理介面。LuCI 是一个MVC (Model View Controller) framework,所以我们可以在LuCI 的基础上写Web 的应用程式。
第一个controller 模组
假设我们想做一件事:「当使用者浏览/cgi-bin/luci/myapp/mymodule/time.htm 时,便在网页上显示OpenWRT 目前的系统时间」。那么可以写一段程式码如下(mymodule.lua):

-- Save this to /usr/lib/lua/luci/controller/myapp/mymodule.lua
-- Browse to: /cgi-bin/luci/myapp/mymodule/time.htm module("luci.controller.myapp.mymodule", package.seeall) function index()
-- 定義節點, request 時會呼叫 action_time
page = entry({"myapp", "mymodule", "time.htm"}, call("action_time")) -- 沒有上層節點
page.dependent = false
-- 假如是葉節點, 就設成 true 避免錯誤
page.leaf = true
end function action_time()
luci.http.prepare_content("text/html")
luci.http.write("<h1>Hello LuCi</h1>")
luci.http.write("<h2>Current time: " .. os.date("%D %T") .. "</h2")
end

其中,以entry() 定义了一个节点,作用是「当使用者浏览/cgi-bin/luci/myapp/mymodule/time.htm 时,便会呼叫action_time() 函式」,而action_time() 函式则会负责产生一个显示目前系统时间的网页。
把mymodule.lua 放到/usr/lib/lua/luci/controller/myapp/mymodule.lua,然后浏览/cgi-bin/luci/myapp/mymodule/time.htm,就会看到底下的结果:

建立VIEW
跟PHP, ASP.NET, JSP 一样,LuCI 也有template 的功能,可以在HTML 里混用Lua Script 产生动态网页。底下做个示范。
首先,建立了一个template 档如下,并把它存到/usr/lib/lua/luci/view/myapp_mymodule/time.htm:

<!-- Save this to /usr/lib/lua/luci/view/myapp_mymodule/time.htm -->
<%+header%>
<h1>Hello LuCI</h1>
<h2>Current Time: <%= os.date("%D %T")%></h2>
<%+footer%>

接着写个controller 模组如下,把它存到/usr/lib/lua/luci/controller/myapp/mymodule.lua:

-- Save this to /usr/lib/lua/luci/controller/myapp/mymodule.lua
-- Browse to: /cgi-bin/luci/myapp/mymodule/ module("luci.controller.myapp.mymodule", package.seeall) function index()
-- 定義節點, 當作 myapp.mymodule.time.htm 的別名
page = entry({"myapp", "mymodule"},
alias("myapp", "mymodule", "time.htm"), "My Module")
page.dependent = false -- 定義節點, request 時會 render view/myapp_mymodule/time.htm
page = entry({"myapp", "mymodule", "time.htm"},
template("myapp_mymodule/time"), "Time")
page.dependent = false; page.leaf = true
end

LuCI 现在预设都是用bootstrap CSS frontend,time.htm 引入了header template,因此享受bootstrap 的好处,变得比较美观了。
暂除LuCI 模组暂存档
在学习写LuCI 模组时,有件特别注意的事。由于LuCI 会把module 暂存起来,就算你写的module 有做过变动,LuCI 也不会跑更新过后的版本。所以当你更新module 时,记得删除LuCI 的模组暂存档,这样LuCI 才会跑新版本的模组。
删除LuCI 模组暂存档的指令为:
  rm /tmp/luci-indexcache /tmp/luci-modulecache/*
参考资料
HOWOT: Write Modules

luci范例的更多相关文章

  1. 对应sslocal的简易luci web界面

    直接通过官方ss代码库安装的ss, 只有一个可执行的sslocal, 也没找到对应的luci-app, 所以就自己写了一个. 因为/etc/init.d/sslocal 和 /etc/config/s ...

  2. openwrt下部署adbyby去广告大师 免luci 带自启动,自动开启透明代理

    最近朋友送了个360老路由器 C301,于是乎就掉进了智能路由器的坑, 玩智能路由器第一件事一定是去广告, 要么怎么对得起智能路由器- -! 路由器去广告当然首推广告屏蔽大师 www.adbyby.c ...

  3. C# 7.0 新功能代码范例

    随着新版本的IDE Visual Studio 15 紧锣密鼓的开发中,2016年8月24日,微软发布了与之配套的C# 7.0 preview 的新特性. 其主要特性有: 内联声明out变量 (Out ...

  4. Information Management Policy(信息管理策略)的使用范例

    基础知识 很多人都会定期收拾自己的书架或者抽屉,把里面过旧的资料拿走,为新的资料腾出空间来,这样既可以节省空间,而且当冗余资料过多的时候也会降低你查找的速度和效率.那么,在企业的SharePoint中 ...

  5. 开发OpenWrt路由器上LuCI的模块

    [题外话] 学校里最近改造了校园网,要求必须用iNode验证,万幸的是路由器能刷OpenWrt,并且OpenWrt上有好多iNode认证的开源项目,比如njit8021xclient(以下简称njit ...

  6. 关于LuCi

    好吧,又长见识了...相见恨晚的赶脚,恩,居然是我喜欢的lua.其主页在这里:http://luci.subsignal.org/ The initial reason for this projec ...

  7. Java学习笔记13---一个循环程序的设计范例

    package welcome; import java.util.Scanner; /* * 一个循环程序的设计范例 * 首先编写仅执行一次的程序(当无循环时) * 循环的设计步骤: * 1.确定程 ...

  8. [liusy.api-SMJ]-创建工程范例 MAVEN archetype 学习阶段(一)

    由于这个架构需要好多不同能力的工程,为了创建方便减少冗余,创建工程范例尤为重要 学习阶段: 参考资料 http://maven.apache.org/archetype/maven-archetype ...

  9. 通过 UDP 发送数据的简单范例

    package j2se.core.net.udp; import java.io.IOException;import java.net.DatagramPacket;import java.net ...

随机推荐

  1. C后端设计开发 - 第6章-武技-常见组件上三路

    正文 第6章-武技-常见组件上三路 后记 如果有错误, 欢迎指正. 有好的补充, 和疑问欢迎交流, 一块提高. 在此谢谢大家了.

  2. popup menu案例,无说明只代码

    效果图: 布局文件, 展示列表的容器 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  3. Go语言大神亲述:历七劫方可成为程序员!

    “历劫1”:你坚信你可以用Go来做面向对象编程? 在经历了一次Go应用之旅之后,你可能就会开始思考:“怎么样才能让这种语言更像面向对象的编程语言?”因为你已经习惯了这种编程,你想要制作健壮的代码.想要 ...

  4. JS判断客户端是否是iOS或者Android手机移动端

    var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  5. awk处理之案例六:awk根据条件插入文本

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  6. linux命令(43):cal命令

    cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal  ...

  7. windows下github 出现Permission denied (publickey)

    github教科书传送门:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 再学习到 ...

  8. Django Rest Framework用户访问频率限制

    一. REST framework的请求生命周期 基于rest-framework的请求处理,与常规的url配置不同,通常一个django的url请求对应一个视图函数,在使用rest-framewor ...

  9. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  10. git在window与linux的换行符问题

    1:背景.我win7,后端是win10,使用了TortoiseGit工具.我使用ssh,他使用http.仓库是在linux,使用gitLab管理 2:问题.仓库是总监之前建好的.后端把文件add后pu ...