luci界面开发中的MVC架构——LuCI介绍(二)

想要给openwrt开发应用,虽然直接可执行程序也可以运行,但是没有UI会很不方便,想要开发UI就要用openwrt的那一套,自然就是LuCI,LuCI又用了一套MVC框架,今天就讲讲这是个什么东西。

OpenWrt LuCI 界面开发中的 MVC 架构

在 OpenWrt 的 LuCI Web 界面开发中,采用了 MVC(Model-View-Controller)架构,但它和传统的 MVC 框架有所不同,主要依赖 Lua + UCI + JavaScript(Vue 风格) 来实现 Web UI 交互。


1. OpenWrt LuCI 的 MVC 架构

在 LuCI 开发中:

  • Model(模型):负责数据处理(通常基于 UCI 配置)。
  • View(视图):负责 UI 展示(使用 Lua Template (.htm) 或现代 JavaScript (.js))。
  • Controller(控制器):负责业务逻辑和路由(通常是 Lua (.lua) 脚本)。

🔹 架构示意图

用户请求 (Web)↓
Controller (Lua) - 处理请求,调用 Model↓
Model (UCI) - 读取/写入配置数据↓
View (HTML/JS) - 渲染页面↓
用户交互 (表单提交,RPC 调用)

2. LuCI 的三大核心组件

组件作用代码位置
Model(模型)处理 UCI 配置数据/usr/lib/lua/luci/model/cbi/
View(视图)生成 HTML/JS 页面/usr/lib/lua/luci/view//www/luci-static/resources/view/
Controller(控制器)处理请求逻辑和路由/usr/lib/lua/luci/controller/

3. Model(模型) - 处理 UCI 配置

在 LuCI 开发中,Model 层主要用于 操作 OpenWrt 的 UCI(Unified Configuration Interface)

📌 示例:定义 Model 处理 UCI

文件/usr/lib/lua/luci/model/cbi/admin_network/wol.lua

m = Map("wol", "Wake on LAN")  -- 绑定到 UCI "wol" 配置
s = m:section(NamedSection, "main", "wol", "WOL 配置")mac = s:option(Value, "macaddr", "MAC 地址")  -- 用户输入的 MAC 地址
mac.datatype = "macaddr"iface = s:option(ListValue, "interface", "网络接口")
iface:value("br-lan", "LAN")
iface:value("wan", "WAN")return m

🔹 解释

  • Map("wol", "Wake on LAN") 绑定到 /etc/config/wol UCI 配置文件。
  • s:option(Value, "macaddr", "MAC 地址") 定义了 MAC 地址 输入框,并限制为 macaddr 数据类型。
  • iface:value("br-lan", "LAN") 提供了接口选择。

4. View(视图) - 生成 UI 页面

LuCI 视图有两种方式:

  1. 传统 Lua 模板 (.htm)
  2. 现代 JavaScript (.js)

📌 示例 1:Lua 方式渲染 HTML

文件/usr/lib/lua/luci/view/admin_network/wol.htm

<%+cbi/header%>
<h2>Wake on LAN</h2>
<%+cbi/apply_cb%>
<form method="post"><input type="text" name="macaddr" placeholder="输入 MAC 地址"/><button type="submit">发送 WOL</button>
</form>
<%+cbi/footer%>

🔹 解释

  • cbi/headercbi/footer 负责引入 LuCI 标准框架。
  • <input type="text" name="macaddr"> 让用户输入 MAC 地址。
  • <button> 让用户提交 WOL 请求。

📌 示例 2:JavaScript (.js) 动态渲染

文件/www/luci-static/resources/view/wol.js

return view.extend({render: function() {return E([CBI.form.Value.extend({name: "macaddr",label: _("MAC 地址"),datatype: "macaddr",}),CBI.form.ListValue.extend({name: "interface",label: _("网络接口"),values: {"br-lan": _("LAN"),"wan": _("WAN")}})]);}
});

🔹 解释

  • CBI.form.Value 创建一个 MAC 地址输入框
  • CBI.form.ListValue 创建一个 接口选择下拉框
  • 视图是动态生成的,没有固定 HTML 代码

5. Controller(控制器) - 处理请求

LuCI 的 Controller 层主要用于:

  1. 定义 Web UI 的 URL 路由
  2. 调用 Model(UCI 读取/写入)
  3. 返回 View(HTML/JS 渲染)

📌 示例:控制器定义 WOL 页面

文件/usr/lib/lua/luci/controller/admin/wol.lua

module("luci.controller.admin.wol", package.seeall)function index()entry({"admin", "network", "wol"}, cbi("admin_network/wol"), "Wake on LAN", 30)entry({"admin", "network", "wol_send"}, call("send_wol"), nil).leaf = true
endfunction send_wol()local mac = luci.http.formvalue("macaddr")os.execute("etherwake " .. mac)luci.http.redirect(luci.dispatcher.build_url("admin", "network", "wol"))
end

🔹 解释

  • entry({"admin", "network", "wol"}) 创建 Web UI 菜单项
  • cbi("admin_network/wol") 调用 Model (wol.lua) 处理 UCI 配置
  • function send_wol() 处理用户提交的 WOL 请求,然后执行 etherwake 命令。

6. 组件之间如何协作?

组件作用代码
Controller (Lua)处理请求,调用 Modelluci.controller.admin.wol
Model (Lua/UCI)读取/写入配置luci.model.cbi.admin_network.wol
View (HTML/JS)渲染 Web UIluci-static/resources/view/wol.js
后端进程 (C/命令行)执行 WOLetherwake

🔹 交互流程

  1. 用户打开 WOL 页面(Controller 解析请求)
  2. Controller 调用 Model 读取 UCI 配置
  3. View 生成 UI,用户输入 MAC 地址
  4. 用户点击 "发送 WOL",Controller 处理请求
  5. Controller 调用 etherwake 发送 WOL
  6. 返回到 Web UI,显示成功消息

7. 结论

LuCI 使用 MVC 架构,但 Controller 是 Lua,View 现在更多用 JavaScript。
现代 OpenWrt 主要基于 rpcdubus 进行数据交互,而不只是传统的 Lua cbi()
如果你要修改 luci-app-wol,需要改动 controller/wol.lua(后端)、view/wol.js(前端)、以及 rpcd 相关部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全监测探针安装位置 网络安全监测系统

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件简介&#xff1a; SockMon(SocketMonitor)网络安全监控系统是一款为电脑专业人员打造的一款出色的安防监控软件。在如今这个恶意软件&#xff0c;攻击&#…

车载DoIP协议 --- TCP详细解析

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…

2025年SCI一区智能优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO),提供MATLAB代码

一. 真菌生长优化算法&#xff08;FGO&#xff09; 真菌生长优化算法&#xff08;Fungal Growth Optimizer&#xff0c;FGO&#xff09;是一种新型的自然启发式元启发式算法&#xff0c;其灵感来源于自然界中真菌的生长行为。该算法通过模拟真菌的菌丝尖端生长、分支和孢子萌发…

【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 蓝耘智算平台 蓝耘智算平台核心技术与突破元生代推理引擎快速入门&#xff1a;三步调用大模型接口&#xff0c;OpenAI SDK无缝兼容实战用例文…

基于AVue的二次封装:快速构建后台管理系统的CRUD方案

基于AVue的二次封装&#xff1a;快速构建后台管理系统的CRUD方案 在开发后台管理系统时&#xff0c;表格是常见的组件之一。然而&#xff0c;使用原生的Element Plus实现CRUD&#xff08;增删改查&#xff09;功能往往需要编写大量重复代码&#xff0c;过程繁琐。即使借助类似…

Spring全局异常处理

在项目开发中&#xff0c;异常是经常遇到的&#xff0c;但是如何更高效的处理好异常信息&#xff0c;让我们能快速定位到BUG&#xff0c;是很重要的&#xff0c;不仅能够提高我们的开发效率&#xff0c;还能让你代码看上去更舒服&#xff0c;SpringBoot的项目已经对有一定的异常…

华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)

文章目录 1. **查看固件和驱动版本**2. **查看CANN版本**3. **其他辅助方法**注意事项 在华为昇腾服务器上查看固件、驱动和CANN版本的常用方法如下&#xff1a; 1. 查看固件和驱动版本 通过命令行工具 npu-smi 执行以下命令查看当前设备的固件&#xff08;Firmware&#xff0…

pikachu靶场搭建教程

需要的东西 phpStudy&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1fJ-5TNtdDZGUf5FhTm245g 提取码&#xff1a;0278 pikachu-master&#xff1a; Github链接&#xff1a;https://github.com/zhuifengshaonianhanlu/pikachu 链接&#xff1a; https://pan.baidu.c…

R与RStudio简介及安装

目录 一、R与RStudio关系 二、R简介 2.1. 发展历史 2.2. R语言特点 三、安装指南 3.1 R安装指南 3.2 R studio安装指南 一、R与RStudio关系 R是统计领域广泛使用的工具&#xff0c;属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;是 用于统计计算和统计绘图…

netty基础知识梳理和总结

目录标题 由来netty整体结构核心功能可扩展的事件模型统一的通信 API零拷贝机制与字节缓冲区 传输服务协议支持 netty的IO模型netty核心组件ChannelEventLoop、EventLoopGroupChannelHandlerChannelPipelineBootstrapFuture netty的bytebufbytebuf的内部构造bytebuf的使用模式B…

《Head First设计模式》读书笔记 —— 单件模式

文章目录 为什么需要单件模式单件模式典型实现剖析定义单件模式本节用例多线程带来的问题解决问题优化 Q&A总结 《Head First设计模式》读书笔记 相关代码&#xff1a; Vks-Feng/HeadFirstDesignPatternNotes: Head First设计模式读书笔记及相关代码 用来创建独一无二的&a…

tailwindcss 前端 css 框架 无需写css 快速构建页面

版本&#xff1a;VUE3 TS 框架 vite 文章中使用tailwindcss 版本&#xff1a; ^3.4.17 简介&#xff1a; Tailwind CSS 一个CSS 框架&#xff0c;提供组件化的样式&#xff0c;直接在HTML 中编写样式&#xff0c;无需额外自定义CSS &#xff0c;快速&#xff01; 简洁&#…

给小米/红米手机root(工具基本为官方工具)——KernelSU篇

目录 前言准备工作下载刷机包xiaomirom下载刷机包【适用于MIUI和hyperOS】“hyper更新”微信小程序【只适用于hyperOS】 下载KernelSU刷机所需程序和驱动文件 开始刷机设置手机第一种刷机方式【KMI】推荐提取boot或init_boot分区 第二种刷机方式【GKI】不推荐 结语 前言 刷机需…

路由器的WAN口和LAN口有什么区别?

今时今日&#xff0c;移动终端盛行的时代&#xff0c;WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口&#xff0c;到底有什么区别&#xff1f;它们的功能和作用…

【Open X-Embodiment】简单数据下载与预处理

文章目录 1. RLDS Dataset2. 处理成numpy格式3. 存储桶 1. RLDS Dataset 从 Octo 里面找到数据下载的代码 rlds_dataset_mod github 按照官网代码配置环境后&#xff0c;修改 prepare_open_x.sh&#xff0c;相当于只用 gsutil 下载数据&#xff1a; DOWNLOAD_DIR/mnt/data…

神经网络八股(1)

1.什么是有监督学习&#xff0c;无监督学习 有监督学习是带有标签的&#xff0c;无监督学习是没有标签的&#xff0c;简单来说就是有监督学习的输入输出都是固定的&#xff0c;已知的&#xff0c;无监督学习输入是已知的&#xff0c;输出是不固定的&#xff0c;无监督学习是通…

达梦:开发 ODBC配置指南

目录 达梦数据库DM8 ODBC配置指南&#xff08;Linux环境&#xff09;ODBC一、环境准备二、核心配置步骤1. 安装unixODBC2. 配置ODBC驱动&#xff08;odbcinst.ini&#xff09;3. 配置数据源&#xff08;odbc.ini&#xff09; 三、连接测试与验证1. 使用isql工具测试2. 执行基础…

Python游戏编程之赛车游戏6-1

通过Python的pygame模块可以实现赛车游戏&#xff0c;如图1所示。 图1 赛车游戏 从图1中可以看出&#xff0c;玩家通过键盘的左右键操作蓝色汽车躲避红色汽车的撞击&#xff0c;每成功躲避过一辆红色汽车&#xff0c;则玩家得一分。当蓝色汽车被红色汽车撞击后&#xff0c;游戏…

【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组&#xff1f;2.2 什么是会话&#xff1f; 3、应用层协议HTTP3.1 HTTP协议3.2 HT…