基于MVC模式的luci开发

    MVC(Model,View,Controller)模式是一种软件设计模式。视图(view)既软件与用户交互的界面,模型(model)表示数据以及业务规则,控制器(Controller)连接二者的桥梁,接受视图所提交的请求,调用模型去完成请求。

LUCI从某些功能的实现来讲属于MVC框架。使用winSCP进入openwrt系统,可以发现在usr/lib/lua/luci文件夹下存在着三个文件子文件夹view、controller、model。view文件夹下有大量html文件,即luci的视图文件。controller文件夹下存着逻辑控制程序,model文件夹下的cbi文件夹存在着处理各种请求的程序 。例如视图wireless—>overview:

在控制器中对应处理函数即entry({"admin", "network","wireless"},arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wifi"), 15)。其中"admin", "network","wireless"表示视图所在位置,cbi("admin_network/wifi"))表示其处理模型为/usr/lib/lua/luci/model/cbi下的wifi.lua。

LUCI中某些功能的实现在model中并没有专门的模型程序,因为其在Controller文件中写了功能函数做了处理。例如中的add操作,在cbi下并没有对应的程序做处理,在Controller文件中定义了function wifi_add()函数,执行对应操作。

对于一些视图页面上信息动态显示,luci采用在html文件中嵌入lua程序,利用API直接获取,采用JavaScript动态显示的方法实现。例如关联移动台信息的显示问题,直接在view/admin_network/wifi_overview.htm文件下利用嵌入lua,与JavaScript语言进行动态显示。

知道了其实现思路后,对于在openwrt的开发就相对明了了。如果想获取openwrt的系统的一些参数情况,我们就可以在相应的视图程序中查找嵌入的lua代码,然后进行分析。如果想做对系统配置操作,我们需要现在视图中找到其位置,然后在相应的Controller程序中找到其对应入口函数,如果Controller中的入口程序调用的是cbi中的模型,我们就可以顺藤摸瓜找到其模型程序进行分析。若其没有专门的模型程序,调用的是Controller程序中定义的功能函数,那我们应该分析的就是其定义的功能函数。


你可能感兴趣的:(开发)