更新 wiki
This commit is contained in:
@@ -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构建**:
|
||||
- X8:S3 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:路由守卫,控制访问权限与超级管理员限制。
|
||||
- **后端依赖**:
|
||||
- Express:Web框架,提供REST接口。
|
||||
- Sequelize:ORM,连接MySQL并管理模型。
|
||||
- Zod:Schema校验,确保请求参数合法。
|
||||
- Multer:内存存储上传文件缓冲区。
|
||||
- AWS SDK:S3上传能力。
|
||||
- **环境变量**:
|
||||
- 前后端共享的关键变量: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版本管理、黑名单管理、目标设备管理和部署管理等,大幅提升了系统的可维护性和扩展性**。新的模块化结构使得各个功能职责更加明确,代码组织更加合理,便于团队协作开发和维护。
|
||||
|
||||
重组后的系统具有以下优势:
|
||||
- **更好的可维护性**:模块化设计使得代码结构清晰,易于理解和修改
|
||||
- **更强的扩展性**:新功能可以以模块形式快速集成
|
||||
- **更高的可测试性**:各模块相对独立,便于单元测试和集成测试
|
||||
- **更好的用户体验**:功能划分更加合理,操作流程更加顺畅
|
||||
|
||||
建议在后续迭代中继续完善各模块的功能细节,优化用户交互体验,并持续监控系统性能和稳定性。同时,可以考虑增加更多的自动化测试用例,确保代码质量和系统可靠性。
|
||||
Reference in New Issue
Block a user