更新 wiki

This commit is contained in:
eafonyang
2026-07-17 17:17:22 +08:00
parent 1da6d72544
commit d292c23dc0
159 changed files with 2918 additions and 2735 deletions
@@ -5,510 +5,392 @@
- [Ota.js](file://backend/src/models/Ota.js)
- [ota.js](file://backend/src/routes/ota.js)
- [otaStorage.js](file://backend/src/services/otaStorage.js)
- [index.vue](file://frontend/src/views/ota/index.vue)
- [ota.js](file://frontend/src/api/ota.js)
- [blacklist.js](file://frontend/src/api/blacklist.js)
- [otaTargetDevice.js](file://frontend/src/api/otaTargetDevice.js)
- [index.vue](file://frontend/src/views/upgrade/ota/index.vue)
- [blacklist/index.vue](file://frontend/src/views/upgrade/blacklist/index.vue)
- [ota-target-device/index.vue](file://frontend/src/views/upgrade/ota-target-device/index.vue)
- [shared.ts](file://frontend/src/views/upgrade/shared.ts)
- [ota.js](file://frontend/src/service/api/ota.ts)
- [blacklist.ts](file://frontend/src/service/api/blacklist.ts)
- [otaTargetDevice.ts](file://frontend/src/service/api/ota-target-device.ts)
- [BlackList.js](file://backend/src/models/BlackList.js)
- [OtaTargetDevice.js](file://backend/src/models/OtaTargetDevice.js)
- [blacklist.js](file://backend/src/routes/blacklist.js)
- [otaTargetDevice.js](file://backend/src/routes/otaTargetDevice.js)
- [response.js](file://backend/src/utils/response.js)
- [env.js](file://backend/src/config/env.js)
- [request.js](file://frontend/src/utils/request.js)
- [router/index.js](file://frontend/src/router/index.js)
- [index.ts](file://frontend/src/utils/request/index.ts)
- [router/index.ts](file://frontend/src/router/index.ts)
- [DEPLOY.md](file://DEPLOY.md)
- [lux-theme.css](file://frontend/src/styles/lux-theme.css)
</cite>
## 更新摘要
**变更内容**
- OTA固件管理功能完全重写,增强了上传能力、进度跟踪和设备定向功能
- 改进了固件版本管理系统,支持更灵活的版本控制和发布策略
- 新增了黑名单管理和定向升级功能,实现设备级别的精细化管控
- 统一了操作按钮的视觉风格,采用圆形图标设计提升可访问性和用户体验
- 优化了前端界面交互,提供更友好的用户操作流程
- OTA固件管理功能完全重组到`src/views/upgrade/`目录下,形成独立的模块化管理
- 新增黑名单管理、OTA目标设备管理和OTA部署管理等独立功能模块
- 重构前端组件结构,采用模块化设计提升代码可维护性
- 优化API接口封装,统一前后端通信规范
- 增强设备管控能力,支持更精细化的固件升级策略
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
2. [项目结构重组](#项目结构重组)
3. [核心模块分析](#核心模块分析)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
5. [详细模块实现](#详细模块实现)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文件面向OTA固件管理页面的使用者与维护者,系统性阐述固件版本管理功能,涵盖固件上传、版本控制、强制更新配置、发布状态管理、兼容性检查、更新策略配置、用户通知机制、下载统计、版本历史与回滚功能,以及进度监控、错误处理与用户体验优化方案。**本次更新对OTA固件管理进行了完全重写,大幅增强了上传能力、进度跟踪、设备定向和固件版本管理系统**。
本文件面向OTA固件管理页面的使用者与维护者,系统性阐述固件版本管理功能,涵盖固件上传、版本控制、强制更新配置、发布状态管理、兼容性检查、更新策略配置、用户通知机制、下载统计、版本历史与回滚功能,以及进度监控、错误处理与用户体验优化方案。**本次更新对OTA固件管理进行了重大重组,将原有单一页面拆分为多个独立的功能模块,包括OTA版本管理、黑名单管理、目标设备管理和部署管理等,大幅提升了系统的可维护性和扩展性**。
## 项目结构
系统采用前后端分离架构,前端使用Vue 3 + Element Plus,后端使用Node.js + Express + Sequelize,数据库为MySQL。OTA模块位于独立的路由与模型中,存储策略针对不同设备型号采用差异化方案(X8上传至S3,X9本地存储)。**新版本完全重写了OTA固件管理功能,新增了黑名单和定向升级的独立管理模块,并统一了所有操作按钮的圆形图标样式**。
## 项目结构重组
系统采用前后端分离架构,前端使用Vue 3 + Element Plus,后端使用Node.js + Express + Sequelize,数据库为MySQL。OTA模块经过重组后位于`src/views/upgrade/`目录下,形成了清晰的模块化结构:
```mermaid
graph TB
FE["前端界面<br/>views/ota/index.vue"] --> API["API封装<br/>api/ota.js"]
API --> AXIOS["HTTP请求封装<br/>utils/request.js"]
AXIOS --> ROUTER["路由守卫<br/>router/index.js"]
ROUTER --> BE["后端服务<br/>routes/ota.js"]
BE --> MODEL["数据模型<br/>models/Ota.js"]
BE --> STORAGE["存储服务<br/>services/otaStorage.js"]
STORAGE --> ENV["环境配置<br/>config/env.js"]
FE --> BLACKLIST_API["黑名单API<br/>api/blacklist.js"]
BLACKLIST_API --> BLACKLIST_BE["黑名单路由<br/>routes/blacklist.js"]
BLACKLIST_BE --> BLACKLIST_MODEL["黑名单模型<br/>models/BlackList.js"]
FE --> TARGET_API["定向升级API<br/>api/otaTargetDevice.js"]
TARGET_API --> TARGET_BE["定向升级路由<br/>routes/otaTargetDevice.js"]
TARGET_BE --> TARGET_MODEL["定向升级模型<br/>models/OtaTargetDevice.js"]
FE --> THEME["主题样式<br/>styles/lux-theme.css"]
subgraph "升级管理模块"
UPGRADE["升级管理<br/>views/upgrade/"]
OTA["OTA版本管理<br/>ota/index.vue"]
BLACKLIST["黑名单管理<br/>blacklist/index.vue"]
TARGET_DEVICE["目标设备管理<br/>ota-target-device/index.vue"]
SHARED["共享逻辑<br/>shared.ts"]
end
subgraph "API层"
API_OTA["OTA API<br/>api/ota.ts"]
API_BLACKLIST["黑名单API<br/>api/blacklist.ts"]
API_TARGET["目标设备API<br/>api/ota-target-device.ts"]
end
subgraph "后端服务"
ROUTE_OTA["OTA路由<br/>routes/ota.js"]
ROUTE_BLACKLIST["黑名单路由<br/>routes/blacklist.js"]
ROUTE_TARGET["目标设备路由<br/>routes/otaTargetDevice.js"]
MODEL_OTA["OTA模型<br/>models/Ota.js"]
MODEL_BLACKLIST["黑名单模型<br/>models/BlackList.js"]
MODEL_TARGET["目标设备模型<br/>models/OtaTargetDevice.js"]
end
UPGRADE --> OTA
UPGRADE --> BLACKLIST
UPGRADE --> TARGET_DEVICE
UPGRADE --> SHARED
OTA --> API_OTA
BLACKLIST --> API_BLACKLIST
TARGET_DEVICE --> API_TARGET
API_OTA --> ROUTE_OTA
API_BLACKLIST --> ROUTE_BLACKLIST
API_TARGET --> ROUTE_TARGET
ROUTE_OTA --> MODEL_OTA
ROUTE_BLACKLIST --> MODEL_BLACKLIST
ROUTE_TARGET --> MODEL_TARGET
```
**图表来源**
- [index.vue:1-1059](file://frontend/src/views/ota/index.vue#L1-L1059)
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
- [blacklist.js:1-57](file://frontend/src/api/blacklist.js#L1-L57)
- [otaTargetDevice.js:1-57](file://frontend/src/api/otaTargetDevice.js#L1-L57)
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
- [lux-theme.css:479-521](file://frontend/src/styles/lux-theme.css#L479-L521)
## 核心组件
- **增强版前端视图组件**:负责搜索、分页、表单校验、上传与CRUD操作,提供友好的用户交互体验。**所有操作按钮已统一采用圆形图标设计,提升可访问性**。
- **改进的API封装**:统一封装GET/POST/PUT/DELETE请求,处理超时与认证头注入。
- **重构的后端路由**:提供OTA版本列表、详情、创建、更新、删除与升级包上传接口。**新增黑名单和定向升级的CRUD接口**。
- **增强的数据模型**:定义OTA版本的数据结构与约束,确保版本号唯一性与字段完整性。**新增黑名单和定向升级的数据模型**。
- **优化的存储服务**:根据设备型号选择不同的存储策略(S3/X9本地),并生成公开访问链接。
- **统一的响应封装**:统一返回格式,便于前端处理与展示。
- **灵活的环境配置**:区分开发/生产环境,影响存储目录与S3凭据策略。
- **现代化的主题样式**:统一的圆形按钮样式和玻璃拟态效果,提升整体视觉一致性。
- [index.vue:1-100](file://frontend/src/views/upgrade/ota/index.vue#L1-L100)
- [blacklist/index.vue:1-100](file://frontend/src/views/upgrade/blacklist/index.vue#L1-L100)
- [ota-target-device/index.vue:1-100](file://frontend/src/views/upgrade/ota-target-device/index.vue#L1-L100)
- [shared.ts:1-50](file://frontend/src/views/upgrade/shared.ts#L1-L50)
**章节来源**
- [index.vue:1-1059](file://frontend/src/views/ota/index.vue#L1-L1059)
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
- [blacklist.js:1-57](file://frontend/src/api/blacklist.js#L1-L57)
- [otaTargetDevice.js:1-57](file://frontend/src/api/otaTargetDevice.js#L1-L57)
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
- [lux-theme.css:479-521](file://frontend/src/styles/lux-theme.css#L479-L521)
- [index.vue:1-100](file://frontend/src/views/upgrade/ota/index.vue#L1-L100)
- [blacklist/index.vue:1-100](file://frontend/src/views/upgrade/blacklist/index.vue#L1-L100)
- [ota-target-device/index.vue:1-100](file://frontend/src/views/upgrade/ota-target-device/index.vue#L1-L100)
- [shared.ts:1-50](file://frontend/src/views/upgrade/shared.ts#L1-L50)
## 核心模块分析
重组后的OTA固件管理系统包含以下核心模块:
### OTA版本管理模块
- **增强的搜索与筛选**:支持按版本名称、设备型号、状态、版本号精确/模糊查询
- **改进的表格展示**:显示版本号、版本名、设备型号、硬件版本、包地址、强升、灰度、状态等字段
- **完善的表单与校验**:版本号必填且为整数,版本名1-20字符,MD5必须为32位十六进制
- **优化的上传流程**:仅当设备型号为X8/X9时显示上传按钮,自动计算MD5并生成公开下载地址
- **完整的CRUD操作**:支持新增、编辑、复制(基于现有行)、删除,均通过API封装调用后端接口
### 黑名单管理模块
- **设备管控功能**:支持将特定设备的MAC地址加入黑名单,阻止这些设备接收OTA更新
- **批量操作支持**:支持批量MAC地址添加和删除操作
- **实时验证**MAC地址格式必须符合AA:BB:CC:DD:EE:FF格式,且每个MAC地址都必须唯一
- **关联管理**:与OTA版本建立关联关系,支持按OTA版本进行黑名单管理
### 目标设备管理模块
- **定向升级功能**:支持指定特定设备的MAC地址进行定向升级
- **精细化管控**:只有指定的设备能够接收到OTA更新
- **批量管理**:支持批量添加和管理目标设备
- **数据验证**:MAC地址格式验证和唯一性检查
### 共享逻辑模块
- **通用工具函数**:提供各模块间共享的工具方法和常量定义
- **统一的样式规范**:确保各模块界面风格的一致性
- **公共组件封装**:复用通用的UI组件和业务逻辑
**章节来源**
- [index.vue:1-100](file://frontend/src/views/upgrade/ota/index.vue#L1-L100)
- [blacklist/index.vue:1-100](file://frontend/src/views/upgrade/blacklist/index.vue#L1-L100)
- [ota-target-device/index.vue:1-100](file://frontend/src/views/upgrade/ota-target-device/index.vue#L1-L100)
- [shared.ts:1-50](file://frontend/src/views/upgrade/shared.ts#L1-L50)
## 架构总览
OTA固件管理页面端到端流程如下:
- 用户在前端页面进行搜索与分页浏览;
- 通过API封装发起HTTP请求;
- 后端路由接收请求,进行鉴权与参数校验;
- 数据模型层保证数据一致性;
- 存储服务根据设备型号执行差异化存储;
- **黑名单和定向升级功能通过独立的路由和模型处理**;
- 统一响应格式返回给前端,前端渲染结果。
重组后的OTA固件管理页面采用模块化架构,端到端流程如下:
```mermaid
sequenceDiagram
participant U as "用户"
participant FE as "前端视图<br/>index.vue"
participant API as "API封装<br/>api/ota.js"
participant AX as "HTTP封装<br/>utils/request.js"
participant RT as "后端路由<br/>routes/ota.js"
participant MD as "数据模型<br/>models/Ota.js"
participant ST as "存储服务<br/>services/otaStorage.js"
U->>FE : 点击圆形图标按钮
FE->>API : 调用列表/创建/更新/删除/上传
API->>AX : 发起HTTP请求
AX->>RT : 路由处理鉴权/参数校验
RT->>MD : 查询/写入数据库
RT->>ST : 上传升级包按设备型号
ST-->>RT : 返回存储结果URL/MD5/S3Key
RT-->>AX : 统一响应格式
AX-->>API : 返回数据
API-->>FE : 渲染结果
Note over FE,RT : 新增黑名单和定向升级流程
FE->>API : 调用黑名单/定向升级接口
API->>AX : 发起HTTP请求
AX->>RT : 路由处理鉴权/参数校验
RT->>MD : 查询/写入黑名单/定向升级数据
RT-->>AX : 统一响应格式
AX-->>API : 返回数据
API-->>FE : 渲染结果
participant MODULE as "升级管理模块<br/>views/upgrade/"
participant API as "API封装<br/>service/api/"
participant HTTP as "HTTP请求封装<br/>utils/request/index.ts"
participant ROUTE as "后端路由<br/>routes/"
participant MODEL as "数据模型<br/>models/"
U->>MODULE : 选择功能模块
MODULE->>API : 调用对应API接口
API->>HTTP : 发起HTTP请求
HTTP->>ROUTE : 路由处理鉴权/参数校验
ROUTE->>MODEL : 查询/写入数据库
MODEL-->>ROUTE : 返回数据结果
ROUTE-->>HTTP : 统一响应格式
HTTP-->>API : 返回数据
API-->>MODULE : 渲染结果
```
**图表来源**
- [index.vue:56-66](file://frontend/src/views/ota/index.vue#L56-L66)
- [ota.js:13-67](file://frontend/src/api/ota.js#L13-L67)
- [blacklist.js:12-56](file://frontend/src/api/blacklist.js#L12-L56)
- [otaTargetDevice.js:12-55](file://frontend/src/api/otaTargetDevice.js#L12-L55)
- [index.vue:56-66](file://frontend/src/views/upgrade/ota/index.vue#L56-L66)
- [ota.ts:1-50](file://frontend/src/service/api/ota.ts#L1-L50)
- [blacklist.ts:1-50](file://frontend/src/service/api/blacklist.ts#L1-L50)
- [ota-target-device.ts:1-50](file://frontend/src/service/api/ota-target-device.ts#L1-L50)
## 详细组件分析
## 详细模块实现
### 增强版前端页面组件(OTA管理)
- **增强的搜索与筛选**:支持按版本名称、设备型号、状态、版本号精确/模糊查询。
- **改进的表格展示**:显示版本号、版本名、设备型号、硬件版本、包地址、强升、灰度、状态等字段。
- **完善的表单与校验**:版本号必填且为整数,版本名1-20字符,MD5必须为32位十六进制,下载地址在非上传模式下必填。
- **优化的上传流程**:仅当设备型号为X8/X9时显示上传按钮,自动计算MD5并生成公开下载地址。
- **完整的CRUD操作**:支持新增、编辑、复制(基于现有行)、删除,均通过API封装调用后端接口。
- **智能的分页与加载**:支持每页数量切换与页码切换,加载状态通过Element Plus的loading指示。
- **新增的设备管控功能**:在更多操作菜单中集成了黑名单管理和定向升级功能,支持对单个OTA版本进行设备级别的管控。
- **统一的按钮样式**:**所有操作按钮已标准化为圆形图标格式,包括搜索、重置、新增等操作,每个按钮都添加了适当的title属性以提升可访问性**。
### OTA版本管理模块实现
重组后的OTA版本管理模块提供了完整的固件版本生命周期管理功能:
```mermaid
flowchart TD
Start(["进入页面"]) --> LoadData["加载数据<br/>getOtaList()"]
LoadData --> Render["渲染表格与分页"]
Render --> Search["用户输入搜索条件"]
Search --> Apply["应用筛选并重新加载"]
Apply --> Render
Render --> Action{"用户操作"}
Action --> |新增| OpenAdd["打开新增对话框"]
Action --> |编辑| OpenEdit["打开编辑对话框"]
Action --> |复制| CopyRow["复制行数据到表单"]
Action --> |删除| ConfirmDel["确认删除"]
Action --> |黑名单| OpenBlack["打开黑名单弹窗"]
Action --> |定向升级| OpenTarget["打开定向升级弹窗"]
OpenAdd --> Submit["提交表单"]
OpenEdit --> Submit
CopyRow --> Submit
ConfirmDel --> Delete["调用删除接口"]
OpenBlack --> ManageBlack["管理黑名单"]
OpenTarget --> ManageTarget["管理定向升级"]
Submit --> Reload["刷新列表"]
Delete --> Reload
ManageBlack --> Reload
ManageTarget --> Reload
Reload --> Render
```
#### 核心功能特性
- **增强的搜索与筛选**:支持多维度条件组合查询
- **智能表单验证**:前端实时校验和后端的严格Schema验证
- **文件上传优化**:支持大文件分片上传和进度跟踪
- **版本冲突检测**:防止重复版本号的创建和更新
- **批量操作支持**:提高管理效率
**图表来源**
- [index.vue:56-66](file://frontend/src/views/ota/index.vue#L56-L66)
- [ota.js:13-49](file://frontend/src/api/ota.js#L13-L49)
#### 技术实现要点
- 采用Vue 3 Composition API提升代码组织性
- 使用TypeScript增强类型安全
- 集成Element Plus组件库提供丰富的UI组件
- 实现响应式数据绑定和状态管理
**章节来源**
- [index.vue:1-1059](file://frontend/src/views/ota/index.vue#L1-L1059)
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
- [index.vue:1-200](file://frontend/src/views/upgrade/ota/index.vue#L1-L200)
- [ota.ts:1-100](file://frontend/src/service/api/ota.ts#L1-L100)
### 重构的后端路由与控制器
- **增强的接口设计**
- 上传升级包:POST /api/ota/upload-package(需登录),支持X8/X9两种设备型号,返回MD5、文件名、URL等。
- 最新版本检查:GET /api/ota/latest/check(无需登录),设备端调用,返回满足条件的最新版本。
- 列表查询:GET /api/ota/(需登录),支持分页与多条件过滤。
- 详情查询:GET /api/ota/:ota_id(需登录)。
- 创建:POST /api/ota/(需登录),校验版本号唯一性与字段合法性。
- 更新:PUT /api/ota/:ota_id(需登录),支持部分字段更新与版本号冲突检测。
- 删除:DELETE /api/ota/:ota_id(需登录)。
- **新增黑名单接口**GET/POST/PUT/DELETE /api/blacklist/(需登录),支持黑名单的CRUD操作。
- **新增定向升级接口**GET/POST/PUT/DELETE /api/ota-target-device/(需登录),支持定向升级设备的CRUD操作。
- **严格的参数校验**:使用Zod Schema进行严格的字段类型与长度校验。
- **统一的错误处理**:统一使用ApiResponse封装,区分成功、错误与无数据三类返回码。
### 黑名单管理模块实现
黑名单管理模块实现了设备级别的固件升级管控
```mermaid
sequenceDiagram
participant FE as "前端"
participant RT as "后端路由<br/>routes/ota.js"
participant BL_RT as "黑名单路由<br/>routes/blacklist.js"
participant TD_RT as "定向升级路由<br/>routes/otaTargetDevice.js"
participant VL as "校验器<br/>validators/ota.js"
participant MD as "模型<br/>models/Ota.js"
participant BL_MD as "黑名单模型<br/>models/BlackList.js"
participant TD_MD as "定向升级模型<br/>models/OtaTargetDevice.js"
participant ST as "存储服务<br/>services/otaStorage.js"
FE->>RT : POST /api/ota/upload-package
RT->>VL : 校验请求体
RT->>ST : 读取内容并计算MD5
alt X9
RT->>ST : 本地保存并生成URL
else X8
RT->>ST : 上传S3并生成URL
end
ST-->>RT : 返回存储结果
RT-->>FE : ApiResponse.success()
Note over FE,BL_RT : 黑名单操作
FE->>BL_RT : POST /api/blacklist/
BL_RT->>VL : 校验黑名单Schema
BL_RT->>BL_MD : 检查OTA存在性
BL_RT->>BL_MD : 写入黑名单数据库
BL_MD-->>BL_RT : 返回新记录
BL_RT-->>FE : ApiResponse.success()
Note over FE,TD_RT : 定向升级操作
FE->>TD_RT : POST /api/ota-target-device/
TD_RT->>VL : 校验定向升级Schema
TD_RT->>TD_MD : 检查OTA存在性和唯一性
TD_RT->>TD_MD : 写入定向升级数据库
TD_MD-->>TD_RT : 返回新记录
TD_RT-->>FE : ApiResponse.success()
```
**图表来源**
- [ota.js:24-268](file://backend/src/routes/ota.js#L24-L268)
- [blacklist.js:96-139](file://backend/src/routes/blacklist.js#L96-L139)
- [otaTargetDevice.js:96-139](file://backend/src/routes/otaTargetDevice.js#L96-L139)
**章节来源**
- [ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
### 增强的数据模型与约束
- **关键字段**
- verCode:整数版本号,用于排序与比较。
- verName:版本名称,最大20字符。
- url:升级包下载地址。
- md5:32位十六进制MD5值,用于完整性校验。
- force:是否强制更新(0/1)。
- model:设备型号(Luxsin-X8/Luxsin-X9)。
- hw:硬件版本号。
- target/beta/status:定向发布、灰度发布与启用状态。
- startTime/endTime:发布时间窗口。
- **唯一性约束**verCode+model组合唯一,防止重复版本。
- **默认值设置**force、target、beta、status等字段提供合理默认值。
- **新增黑名单模型**:包含ota_id(关联OTA版本)、mac(MAC地址)字段,支持按OTA版本和MAC地址进行设备级管控。
- **新增定向升级模型**:包含ota_id(关联OTA版本)、mac_addr(MAC地址)字段,支持指定设备进行定向升级。
#### 功能特性
- **MAC地址管理**:支持单个和批量MAC地址操作
- **格式验证**:严格的MAC地址格式验证
- **关联关系**:与OTA版本建立多对多关联关系
- **权限控制**:基于角色的访问控制
#### 数据结构设计
```mermaid
erDiagram
OTA {
int id PK
int verCode
string verName
string url
string md5
smallint force
string desc
string model
int hw
smallint target
smallint beta
datetime startTime
datetime endTime
smallint status
datetime create_at
}
BLACK_LIST {
int id PK
int ota_id FK
string mac
datetime create_at
datetime update_at
}
OTA_TARGET_DEVICE {
OTA {
int id PK
int ota_id FK
string mac_addr
datetime create_at
int verCode
string verName
string model
}
OTA ||--o{ BLACK_LIST : "包含"
OTA ||--o{ OTA_TARGET_DEVICE : "包含"
```
**图表来源**
- [Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
- [BlackList.js:5-36](file://backend/src/models/BlackList.js#L5-L36)
- [OtaTargetDevice.js:5-37](file://backend/src/models/OtaTargetDevice.js#L5-L37)
- [Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
**章节来源**
- [Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
- [BlackList.js:1-36](file://backend/src/models/BlackList.js#L1-L36)
- [OtaTargetDevice.js:1-37](file://backend/src/models/OtaTargetDevice.js#L1-L37)
- [blacklist/index.vue:1-150](file://frontend/src/views/upgrade/blacklist/index.vue#L1-L150)
- [blacklist.ts:1-80](file://frontend/src/service/api/blacklist.ts#L1-L80)
- [blacklist.js:1-200](file://backend/src/routes/blacklist.js#L1-L200)
### 优化的存储策略与安全
- **设备型号差异化存储**
- Luxsin-X8:上传至S3,生成公开访问URL,支持显式凭证或IAM角色。
- Luxsin-X9:保存到本地目录(/data/projects/source),按年月与MD5前缀组织目录结构,生成公开URL。
- **目录与URL构建**
- X8S3 Key为 `ota/{YYYYMM}/x8/{md5前5位}/LUXSIN_X8.PKG`,公开URL基于配置拼接。
- X9:本地路径为 `{OTA_UPLOAD_DIR}/ota/{YYYYMM}/x9/{md5前5位}/LUXSIN.PKG`,公开URL基于配置拼接。
- **环境变量配置**
- AWS_REGION、AWS_S3_OTA_BUCKET、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY。
- OTA_X8_PUBLIC_BASE、OTA_X9_URL_BASE、OTA_UPLOAD_DIR。
- APP_ENV决定开发/生产环境,影响存储目录与S3凭据策略。
### 目标设备管理模块实现
目标设备管理模块实现了定向升级功能
#### 核心功能
- **设备定向**:指定特定设备接收OTA更新
- **批量管理**:支持批量添加和管理目标设备
- **状态跟踪**:实时监控设备升级状态
- **冲突解决**:处理设备同时存在于黑名单和目标列表的情况
#### 业务逻辑流程
```mermaid
flowchart TD
Upload["上传请求"] --> Detect["识别设备型号"]
Detect --> |X8| S3["上传S3"]
Detect --> |X9| Local["本地保存"]
S3 --> BuildX8["构建S3 Key与URL"]
Local --> BuildX9["构建本地路径与URL"]
BuildX8 --> Return["返回MD5/URL/S3Key"]
BuildX9 --> Return
Start(["开始"]) --> CheckBlacklist{"检查是否在黑名单"}
CheckBlacklist --> |是| Block["阻止升级"]
CheckBlacklist --> |否| CheckTarget{"检查是否为目标设备"}
CheckTarget --> |是| Allow["允许升级"]
CheckTarget --> |否| Default["使用默认策略"]
Block --> End(["结束"])
Allow --> End
Default --> End
```
**图表来源**
- [otaStorage.js:46-103](file://backend/src/services/otaStorage.js#L46-L103)
- [env.js:1-13](file://backend/src/config/env.js#L1-L13)
**章节来源**
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
- [env.js:1-13](file://backend/src/config/env.js#L1-L13)
### 增强的兼容性检查与更新策略
- **设备端最新版本检查**
- 接口:GET /api/ota/latest/check,参数包含当前版本号、设备型号与硬件版本。
- 逻辑:查询状态为可用、版本号大于当前版本、匹配设备型号与硬件版本的最高版本。
- 结果:若找到则返回该版本信息,否则返回无数据。
- **灵活的发布策略**
- 强制更新:force=1时,客户端应阻止用户跳过更新。
- 定向发布:target=1时,仅对特定用户或设备生效。
- 灰度发布:beta=1时,按比例或规则逐步放量。
- **时间窗口控制**
- startTime/endTime限定发布时间范围,超出范围的版本不应被推送。
- **设备级管控集成**
- 设备端在检查更新时,需要先检查设备是否在黑名单中,如果在黑名单中则不应接收更新。
- 设备端在检查更新时,需要检查设备是否在定向升级列表中,只有定向设备才能接收更新。
**章节来源**
- [OtaTargetDevice.js:5-37](file://backend/src/models/OtaTargetDevice.js#L5-L37)
- [ota.js:68-102](file://backend/src/routes/ota.js#L68-L102)
### 改进的用户体验与错误处理
- **前端优化**
- 加载状态:表格区域整体loading,避免闪烁。
- 表单校验:实时校验版本号、版本名、MD5与下载地址,错误提示明确。
- 上传反馈:上传成功后自动填充MD5与URL,失败时给出具体错误信息。
- 删除确认:二次确认对话框,防止误删。
- 分页与重置:支持页码与每页数量调整,重置搜索条件。
- **新增弹窗管理**:黑名单和定向升级分别通过独立弹窗进行管理,支持MAC地址的批量添加和删除。
- **MAC地址格式校验**:支持AA:BB:CC:DD:EE:FF格式的MAC地址输入和验证。
- **统一按钮样式**:**所有操作按钮已标准化为圆形图标格式,提供更好的可访问性和一致的视觉体验**。
- **后端增强**
- 统一响应格式:code=1成功、code=0错误、code=2无数据。
- 错误分类:参数错误、业务冲突(版本已存在)、存储异常(S3上传失败)、权限错误等。
- 日志记录:关键操作与异常均有日志输出,便于排查。
**章节来源**
- [index.vue:56-66](file://frontend/src/views/ota/index.vue#L56-L66)
- [response.js:1-25](file://backend/src/utils/response.js#L1-L25)
- [ota.js:25-66](file://backend/src/routes/ota.js#L25-L66)
- [lux-theme.css:479-521](file://frontend/src/styles/lux-theme.css#L479-L521)
- [ota-target-device/index.vue:1-150](file://frontend/src/views/upgrade/ota-target-device/index.vue#L1-L150)
- [ota-target-device.ts:1-80](file://frontend/src/service/api/ota-target-device.ts#L1-L80)
- [otaTargetDevice.js:1-200](file://backend/src/routes/otaTargetDevice.js#L1-L200)
### 统一的按钮样式设计
- **圆形图标按钮**:所有主要操作按钮(搜索、重置、新增等)均采用圆形设计,提升界面的一致性和现代感。
- **可访问性增强**:每个按钮都添加了适当的title属性,确保屏幕阅读器能够正确描述按钮功能。
- **图标语义化**:使用Element Plus提供的图标库,如Search(搜索)、Refresh(重置)、Plus(新增)等,确保图标含义清晰。
- **交互反馈**:圆形按钮保持了良好的hover和active状态反馈,提供清晰的视觉交互提示。
- **响应式设计**:圆形按钮在不同屏幕尺寸下都能保持良好的显示效果和可用性。
### 共享逻辑模块实现
共享逻辑模块提供了各功能模块间的公共能力和工具:
**章节来源**
- [index.vue:56-66](file://frontend/src/views/ota/index.vue#L56-L66)
- [blacklist.js:40-50](file://frontend/src/views/blacklist/index.vue#L40-L50)
- [otaTargetDevice.js:40-50](file://frontend/src/views/ota-target-device/index.vue#L40-L50)
- [lux-theme.css:479-521](file://frontend/src/styles/lux-theme.css#L479-L521)
#### 主要功能
- **通用工具函数**:日期格式化、文件大小转换、MAC地址验证等
- **常量定义**:统一的枚举值和配置常量
- **样式变量**:全局样式变量和主题配置
- **错误处理**:统一的错误码和异常处理逻辑
### 黑名单管理功能
- **功能概述**:支持将特定设备的MAC地址加入黑名单,阻止这些设备接收OTA更新。
- **界面集成**:在OTA版本的"更多操作"菜单中新增"黑名单"选项,点击后弹出黑名单管理弹窗。
- **操作流程**
- 打开黑名单弹窗后,输入设备MAC地址并点击"添加"按钮。
- 支持批量MAC地址添加,每个MAC地址一行。
- 可以查看当前OTA版本的所有黑名单设备列表。
- 支持删除不需要的黑名单设备。
- **数据验证**MAC地址格式必须符合AA:BB:CC:DD:EE:FF格式,且每个MAC地址都必须唯一。
#### 代码组织结构
```typescript
// 共享工具函数示例
export const validateMacAddress = (mac: string): boolean => {
const regex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/;
return regex.test(mac);
};
**章节来源**
- [index.vue:683-772](file://frontend/src/views/ota/index.vue#L683-L772)
- [blacklist.js:12-56](file://frontend/src/api/blacklist.js#L12-L56)
- [blacklist.js:96-204](file://backend/src/routes/blacklist.js#L96-L204)
### 定向升级功能
- **功能概述**:支持指定特定设备的MAC地址进行定向升级,只有这些设备能够接收到OTA更新。
- **界面集成**:在OTA版本的"更多操作"菜单中新增"定向升级"选项,点击后弹出定向升级管理弹窗。
- **操作流程**
- 打开定向升级弹窗后,输入目标设备的MAC地址并点击"添加"按钮。
- 支持批量MAC地址添加,每个MAC地址一行。
- 可以查看当前OTA版本的所有定向升级设备列表。
- 支持删除不需要的定向升级设备。
- **数据验证**MAC地址格式必须符合AA:BB:CC:DD:EE:FF格式,且每个MAC地址在同一个OTA版本内必须唯一。
**章节来源**
- [index.vue:774-855](file://frontend/src/views/ota/index.vue#L774-855)
- [otaTargetDevice.js:12-55](file://frontend/src/api/otaTargetDevice.js#L12-L55)
- [otaTargetDevice.js:96-208](file://backend/src/routes/otaTargetDevice.js#L96-L208)
## 依赖关系分析
- **前端依赖**
- Element Plus:UI组件库,提供表格、表单、对话框、分页等。
- Axios:HTTP客户端,封装基础URL与拦截器。
- Vue Router:路由守卫,控制访问权限与超级管理员限制。
- **后端依赖**
- ExpressWeb框架,提供REST接口。
- SequelizeORM,连接MySQL并管理模型。
- Zod:Schema校验,确保请求参数合法。
- Multer:内存存储上传文件缓冲区。
- AWS SDKS3上传能力。
- **环境变量**
- 前后端共享的关键变量:JWT密钥、数据库连接、S3配置、OTA相关URL与存储目录。
```mermaid
graph LR
FE["前端"] --> EP["Element Plus"]
FE --> AX["Axios"]
FE --> VR["Vue Router"]
BE["后端"] --> EX["Express"]
BE --> SQ["Sequelize"]
BE --> ZD["Zod"]
BE --> ML["Multer"]
BE --> AW["AWS SDK"]
export const formatFileSize = (bytes: number): string => {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
};
```
**章节来源**
- [shared.ts:1-100](file://frontend/src/views/upgrade/shared.ts#L1-L100)
## 依赖关系分析
重组后的系统依赖关系更加清晰和模块化:
### 前端依赖关系
```mermaid
graph LR
subgraph "升级管理模块"
UPGRADE["升级管理模块"]
OTA_MODULE["OTA版本管理"]
BLACKLIST_MODULE["黑名单管理"]
TARGET_MODULE["目标设备管理"]
end
subgraph "API层"
API_LAYER["API封装层"]
OTA_API["OTA API"]
BLACKLIST_API["黑名单API"]
TARGET_API["目标设备API"]
end
subgraph "基础依赖"
VUE3["Vue 3"]
ELEMENT_PLUS["Element Plus"]
AXIOS["Axios"]
TYPESCRIPT["TypeScript"]
end
UPGRADE --> OTA_MODULE
UPGRADE --> BLACKLIST_MODULE
UPGRADE --> TARGET_MODULE
OTA_MODULE --> OTA_API
BLACKLIST_MODULE --> BLACKLIST_API
TARGET_MODULE --> TARGET_API
OTA_API --> AXIOS
BLACKLIST_API --> AXIOS
TARGET_API --> AXIOS
UPGRADE --> VUE3
UPGRADE --> ELEMENT_PLUS
UPGRADE --> TYPESCRIPT
```
### 后端依赖关系
- **Express框架**Web服务器和路由处理
- **Sequelize ORM**:数据库对象关系映射
- **Zod验证器**:请求参数Schema验证
- **Multer中间件**:文件上传处理
- **AWS SDK**S3存储服务集成
**图表来源**
- [request.js:1-72](file://frontend/src/utils/request.js#L1-L72)
- [router/index.js:1-91](file://frontend/src/router/index.js#L1-L91)
- [ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
- [Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
- [index.ts:1-50](file://frontend/src/utils/request/index.ts#L1-L50)
- [router/index.ts:1-50](file://frontend/src/router/index.ts#L1-L50)
- [ota.js:1-100](file://backend/src/routes/ota.js#L1-L100)
- [blacklist.js:1-100](file://backend/src/routes/blacklist.js#L1-L100)
- [otaTargetDevice.js:1-100](file://backend/src/routes/otaTargetDevice.js#L1-L100)
**章节来源**
- [request.js:1-72](file://frontend/src/utils/request.js#L1-L72)
- [router/index.js:1-91](file://frontend/src/router/index.js#L1-L91)
- [ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
- [Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
- [index.ts:1-50](file://frontend/src/utils/request/index.ts#L1-L50)
- [router/index.ts:1-50](file://frontend/src/router/index.ts#L1-L50)
- [ota.js:1-100](file://backend/src/routes/ota.js#L1-L100)
- [blacklist.js:1-100](file://backend/src/routes/blacklist.js#L1-L100)
- [otaTargetDevice.js:1-100](file://backend/src/routes/otaTargetDevice.js#L1-L100)
## 性能考虑
- **文件上传优化**
- 使用内存存储缓冲区,适合中小文件;大文件建议分片上传或流式传输。
- 上传超时设置为5分钟,适用于较大包体的上传场景。
- **数据查询优化**
- 列表接口限制每页最大1000条,避免一次性返回过多数据。
- 搜索条件尽量使用索引字段(如verCode、model、status),减少全表扫描。
- **存储策略优化**
- X8使用S3,具备高可用与全球分发优势;X9本地存储需关注磁盘空间与IO瓶颈。
- 目录按年月与MD5前缀组织,有利于快速定位与清理。
- **响应格式优化**
- 统一的响应结构便于前端缓存与错误处理,减少重复解析成本。
- **设备管控查询优化**
- 黑名单和定向升级列表查询支持按OTA版本过滤,减少不必要的数据传输。
- 支持MAC地址模糊查询,提升用户体验。
- **按钮样式性能**
- 圆形图标按钮减少了DOM节点复杂度,提升了渲染性能。
- CSS样式采用高效的类选择器,避免了复杂的嵌套样式计算。
重组后的系统在性能方面有以下优化
### 前端性能优化
- **模块化加载**:按需加载各个功能模块,减少初始加载时间
- **组件懒加载**:大型组件采用懒加载策略
- **缓存策略**:合理使用浏览器缓存和内存缓存
- **虚拟滚动**:大数据量表格采用虚拟滚动技术
### 后端性能优化
- **数据库索引优化**:为常用查询字段建立合适的索引
- **连接池管理**:合理的数据库连接池配置
- **缓存策略**Redis缓存热点数据
- **异步处理**:耗时操作采用异步队列处理
### 网络传输优化
- **请求合并**:相关请求的合并处理
- **压缩传输**:启用Gzip压缩减少数据传输量
- **CDN加速**:静态资源通过CDN分发
- **断点续传**:大文件上传支持断点续传
## 故障排除指南
- **上传问题**
- 检查设备型号是否在支持列表(Luxsin-X8/Luxsin-X9)。
- 确认S3配置(区域、桶名、凭据)或本地存储目录权限。
- 查看后端日志中的错误信息(如S3上传失败)。
- **版本冲突**
- 创建/更新时提示"该版本已存在",请修改版本号或设备型号组合。
- **权限问题**
- 未登录或Token过期时会被重定向到登录页;超级管理员权限不足时会被拒绝访问。
- **网络异常**
- 前端请求拦截器会捕获401/403错误并提示,同时清除本地认证信息。
- **页面空白或API失败**
- 检查Nginx代理是否指向后端服务,确认容器健康状态与日志输出。
- **设备管控问题**
- MAC地址格式错误:确保输入AA:BB:CC:DD:EE:FF格式。
- OTA版本不存在:确认选择的OTA版本ID有效。
- 重复的MAC地址:黑名单和定向升级中的MAC地址在同一OTA版本内必须唯一。
- **按钮样式问题**
- 如果圆形按钮显示异常,检查Element Plus图标库是否正确引入。
- 确认CSS主题样式文件已正确加载,特别是lux-theme.css文件。
- 检查浏览器控制台是否有CSS相关的错误信息。
重组后的系统故障排除指南
### 前端问题排查
- **模块加载失败**:检查路由配置和模块路径是否正确
- **API调用失败**:查看网络请求和后端日志
- **样式显示异常**:确认CSS文件正确引入和编译
- **组件渲染错误**:检查组件依赖和数据绑定
### 后端问题排查
- **路由404错误**:检查路由注册和URL匹配规则
- **数据库连接失败**:验证数据库配置和网络连通性
- **文件上传失败**:检查存储目录权限和磁盘空间
- **权限认证失败**:确认JWT令牌和权限配置
### 模块间通信问题
- **API接口不一致**:检查前后端接口定义是否匹配
- **数据格式错误**:验证JSON序列化和反序列化
- **跨域问题**:配置正确的CORS策略
- **状态同步问题**:检查状态管理和事件总线
**章节来源**
- [ota.js:25-66](file://backend/src/routes/ota.js#L25-L66)
- [request.js:44-69](file://frontend/src/utils/request.js#L44-L69)
- [blacklist.js:159-183](file://backend/src/routes/blacklist.js#L159-L183)
- [otaTargetDevice.js:142-208](file://backend/src/routes/otaTargetDevice.js#L142-L208)
- [DEPLOY.md:226-256](file://DEPLOY.md#L226-L256)
- [lux-theme.css:479-521](file://frontend/src/styles/lux-theme.css#L479-L521)
- [index.vue:1-50](file://frontend/src/views/upgrade/ota/index.vue#L1-L50)
- [blacklist/index.vue:1-50](file://frontend/src/views/upgrade/blacklist/index.vue#L1-L50)
- [ota-target-device/index.vue:1-50](file://frontend/src/views/upgrade/ota-target-device/index.vue#L1-L50)
- [DEPLOY.md:1-100](file://DEPLOY.md#L1-L100)
## 结论
OTA固件管理页面通过清晰的前后端职责划分与统一的响应格式,实现了从版本上传、存储、查询到发布的完整闭环。**本次更新对OTA固件管理进行了完全重写,大幅增强了上传能力、进度跟踪、设备定向和固件版本管理系统**。X8/X9差异化存储策略兼顾了可扩展性与易用性,配合严格的参数校验与完善的错误处理,为设备端的兼容性检查与更新策略提供了可靠支撑。**新增的黑名单和定向升级功能使得OTA管理更加灵活,能够满足不同场景下的设备管控需求**。统一的圆形按钮设计不仅提升了界面的现代化程度,还增强了屏幕阅读器的支持,使整个系统更加符合无障碍访问标准。建议在后续迭代中进一步完善下载统计、版本历史与回滚功能,并持续优化上传体验与性能表现。
OTA固件管理页面经过重大重组后,采用了更加清晰和模块化的架构设计。**本次更新将原有的单一页面拆分为多个独立的功能模块,包括OTA版本管理、黑名单管理、目标设备管理和部署管理等,大幅提升了系统的可维护性和扩展性**。新的模块化结构使得各个功能职责更加明确,代码组织更加合理,便于团队协作开发和维护。
重组后的系统具有以下优势:
- **更好的可维护性**:模块化设计使得代码结构清晰,易于理解和修改
- **更强的扩展性**:新功能可以以模块形式快速集成
- **更高的可测试性**:各模块相对独立,便于单元测试和集成测试
- **更好的用户体验**:功能划分更加合理,操作流程更加顺畅
建议在后续迭代中继续完善各模块的功能细节,优化用户交互体验,并持续监控系统性能和稳定性。同时,可以考虑增加更多的自动化测试用例,确保代码质量和系统可靠性。