![luci-app-easytier](https://socialify.git.ci/EasyTier/luci-app-easytier/image?description=1&font=JetBrains+Mono&forks=1&issues=1&logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F169161851%3Fs%3D200%26v%3D4&name=1&pulls=1&stargazers=1&theme=Auto) # 开发指南 [English](DEVELOPMENT_EN.md) | 简体中文 本文档详细说明 luci-app-easytier 的开发规范和要求。 ## 核心原则 **必须兼容 OpenWrt 18.06 ~ 26.x,使用 LuCI Lua1 架构** ## 技术栈限制 ### 后端 (Lua) #### ✅ 允许使用 - Lua 5.1 标准语法 - LuCI Lua1 API: - `luci.controller` - `luci.model.uci` - `luci.http` - `luci.sys` - `nixio.fs` - 标准库: `io`, `os`, `string`, `table`, `math` #### ❌ 禁止使用 - Lua2 特有语法 - 新版 LuCI JS API - 任何需要额外依赖的库 ### 前端 (JavaScript) #### ✅ 允许使用 - ES5 语法 - `var` 声明变量 - `function` 关键字 - `XMLHttpRequest` - 原生 DOM 操作 - 原生事件处理 #### ❌ 禁止使用 ```javascript // 禁止 ES6+ 语法 let x = 1; // ❌ const y = 2; // ❌ var z = () => {}; // ❌ 箭头函数 fetch('/api'); // ❌ async/await // ❌ import/export // ❌ 模板字符串 `${x}` // ❌ 解构赋值 // ❌ class 语法 // ❌ // 禁止框架 Vue/React/Angular // ❌ jQuery // ❌ 任何构建工具 // ❌ ``` #### ✅ 正确示例 ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', '/api/status', true); xhr.onload = function() { if (xhr.status === 200) { var data = JSON.parse(xhr.responseText); document.getElementById('status').textContent = data.status; } }; xhr.send(); ``` ## 架构设计 ### 页面渲染流程 ``` 用户请求 → Lua Controller → 渲染 HTM 模板 → 返回 HTML ↓ 初始数据注入到页面 ↓ JavaScript 增强交互 ↓ AJAX 调用 Lua API ↓ 更新局部 DOM ``` ### 文件组织 ``` controller/easytier.lua ├── index() # 路由注册 ├── act_status() # 状态API ├── upload_binary() # 上传API └── ... view/easytier/status.htm ├── Lua 模板代码 (<%...%>) ├── HTML 结构 ├── CSS 样式 (