更新wiki
This commit is contained in:
@@ -3,7 +3,7 @@ schema_version: 1
|
||||
locale: zh-CN
|
||||
branch: main
|
||||
nodes_managed: true
|
||||
exported_at: "2026-06-30T06:40:47Z"
|
||||
exported_at: "2026-06-30T10:39:57Z"
|
||||
modules:
|
||||
"":
|
||||
dir_name: 音频设备管理全栈平台
|
||||
@@ -23,8 +23,8 @@ modules:
|
||||
depends_on: []
|
||||
related_to: []
|
||||
backend:
|
||||
dir_name: 音频设备管理后端 API
|
||||
title: 音频设备管理后端 API
|
||||
dir_name: 耳机管理后台 API
|
||||
title: 耳机管理后台 API
|
||||
scope:
|
||||
- backend/
|
||||
source_files: []
|
||||
@@ -93,8 +93,8 @@ modules:
|
||||
depends_on: []
|
||||
related_to: []
|
||||
frontend:
|
||||
dir_name: 音频设备管理后台前端
|
||||
title: 音频设备管理后台前端
|
||||
dir_name: 音频设备管理前端应用
|
||||
title: 音频设备管理前端应用
|
||||
scope:
|
||||
- frontend/
|
||||
source_files: []
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
schema_version: 1
|
||||
module_path: backend
|
||||
title: 音频设备管理后端 API
|
||||
title: 耳机管理后台 API
|
||||
scope:
|
||||
- backend/
|
||||
source_files: []
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
schema_version: 1
|
||||
module_path: frontend
|
||||
title: 音频设备管理后台前端
|
||||
title: 音频设备管理前端应用
|
||||
scope:
|
||||
- frontend/
|
||||
source_files: []
|
||||
@@ -7,6 +7,12 @@
|
||||
- [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)
|
||||
- [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)
|
||||
@@ -14,6 +20,14 @@
|
||||
- [DEPLOY.md](file://DEPLOY.md)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**变更内容**
|
||||
- 集成黑名单管理功能,支持按MAC地址阻止设备接收OTA更新
|
||||
- 集成定向升级功能,支持指定设备进行定向升级
|
||||
- 在OTA管理页面中新增黑名单和定向升级的操作入口
|
||||
- 新增黑名单和定向升级的独立管理页面
|
||||
- 完善OTA版本管理的完整生命周期管理体验
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
@@ -26,10 +40,10 @@
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件面向OTA固件管理页面的使用者与维护者,系统性阐述固件版本管理功能,涵盖固件上传、版本控制、强制更新配置、发布状态管理、兼容性检查、更新策略配置、用户通知机制、下载统计、版本历史与回滚功能,以及进度监控、错误处理与用户体验优化方案。文档以仓库现有代码为依据,结合前后端交互流程,提供可操作的实践指导。
|
||||
本文件面向OTA固件管理页面的使用者与维护者,系统性阐述固件版本管理功能,涵盖固件上传、版本控制、强制更新配置、发布状态管理、兼容性检查、更新策略配置、用户通知机制、下载统计、版本历史与回滚功能,以及进度监控、错误处理与用户体验优化方案。**本次更新集成了黑名单管理和定向升级功能,提供更完整的OTA管理体验**。
|
||||
|
||||
## 项目结构
|
||||
系统采用前后端分离架构,前端使用Vue 3 + Element Plus,后端使用Node.js + Express + Sequelize,数据库为MySQL。OTA模块位于独立的路由与模型中,存储策略针对不同设备型号采用差异化方案(X8上传至S3,X9本地存储)。
|
||||
系统采用前后端分离架构,前端使用Vue 3 + Element Plus,后端使用Node.js + Express + Sequelize,数据库为MySQL。OTA模块位于独立的路由与模型中,存储策略针对不同设备型号采用差异化方案(X8上传至S3,X9本地存储)。**新增了黑名单和定向升级的独立管理模块**。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
@@ -40,45 +54,38 @@ 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"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
**图表来源**
|
||||
- [index.vue:1-1003](file://frontend/src/views/ota/index.vue#L1-L1003)
|
||||
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
|
||||
- [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)
|
||||
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [env.js:1-13](file://backend/src/config/env.js#L1-L13)
|
||||
|
||||
章节来源
|
||||
- [index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
|
||||
- [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)
|
||||
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [env.js:1-13](file://backend/src/config/env.js#L1-L13)
|
||||
- [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)
|
||||
|
||||
## 核心组件
|
||||
- 前端视图组件:负责搜索、分页、表单校验、上传与CRUD操作,提供友好的用户交互体验。
|
||||
- 前端视图组件:负责搜索、分页、表单校验、上传与CRUD操作,提供友好的用户交互体验。**新增了黑名单和定向升级的弹窗管理功能**。
|
||||
- API封装:统一封装GET/POST/PUT/DELETE请求,处理超时与认证头注入。
|
||||
- 后端路由:提供OTA版本列表、详情、创建、更新、删除与升级包上传接口。
|
||||
- 数据模型:定义OTA版本的数据结构与约束,确保版本号唯一性与字段完整性。
|
||||
- 后端路由:提供OTA版本列表、详情、创建、更新、删除与升级包上传接口。**新增黑名单和定向升级的CRUD接口**。
|
||||
- 数据模型:定义OTA版本的数据结构与约束,确保版本号唯一性与字段完整性。**新增黑名单和定向升级的数据模型**。
|
||||
- 存储服务:根据设备型号选择不同的存储策略(S3/X9本地),并生成公开访问链接。
|
||||
- 响应封装:统一返回格式,便于前端处理与展示。
|
||||
- 环境配置:区分开发/生产环境,影响存储目录与S3凭据策略。
|
||||
|
||||
章节来源
|
||||
- [index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
**章节来源**
|
||||
- [index.vue:1-1003](file://frontend/src/views/ota/index.vue#L1-L1003)
|
||||
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
|
||||
- [ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
|
||||
- [Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
||||
- [env.js:1-13](file://backend/src/config/env.js#L1-L13)
|
||||
- [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)
|
||||
|
||||
## 架构总览
|
||||
OTA固件管理页面的端到端流程如下:
|
||||
@@ -87,6 +94,7 @@ OTA固件管理页面的端到端流程如下:
|
||||
- 后端路由接收请求,进行鉴权与参数校验;
|
||||
- 数据模型层保证数据一致性;
|
||||
- 存储服务根据设备型号执行差异化存储;
|
||||
- **黑名单和定向升级功能通过独立的路由和模型处理**;
|
||||
- 统一响应格式返回给前端,前端渲染结果。
|
||||
|
||||
```mermaid
|
||||
@@ -108,15 +116,21 @@ 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 : 渲染结果
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [index.vue:420-579](file://frontend/src/views/ota/index.vue#L420-L579)
|
||||
**图表来源**
|
||||
- [index.vue:420-831](file://frontend/src/views/ota/index.vue#L420-L831)
|
||||
- [ota.js:13-67](file://frontend/src/api/ota.js#L13-L67)
|
||||
- [request.js:11-69](file://frontend/src/utils/request.js#L11-L69)
|
||||
- [ota.js:24-268](file://backend/src/routes/ota.js#L24-L268)
|
||||
- [Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
|
||||
- [otaStorage.js:46-103](file://backend/src/services/otaStorage.js#L46-L103)
|
||||
- [blacklist.js:12-56](file://frontend/src/api/blacklist.js#L12-L56)
|
||||
- [otaTargetDevice.js:12-55](file://frontend/src/api/otaTargetDevice.js#L12-L55)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
@@ -127,6 +141,7 @@ API-->>FE : 渲染结果
|
||||
- 上传流程:仅当设备型号为X8/X9时显示上传按钮,自动计算MD5并生成公开下载地址。
|
||||
- CRUD操作:支持新增、编辑、复制(基于现有行)、删除,均通过API封装调用后端接口。
|
||||
- 分页与加载:支持每页数量切换与页码切换,加载状态通过Element Plus的loading指示。
|
||||
- **新增功能**:在更多操作菜单中集成了黑名单管理和定向升级功能,支持对单个OTA版本进行设备级别的管控。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
@@ -140,21 +155,27 @@ 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
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [index.vue:420-579](file://frontend/src/views/ota/index.vue#L420-L579)
|
||||
**图表来源**
|
||||
- [index.vue:420-831](file://frontend/src/views/ota/index.vue#L420-L831)
|
||||
- [ota.js:13-49](file://frontend/src/api/ota.js#L13-L49)
|
||||
|
||||
章节来源
|
||||
- [index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
**章节来源**
|
||||
- [index.vue:1-1003](file://frontend/src/views/ota/index.vue#L1-L1003)
|
||||
- [ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
|
||||
|
||||
### 后端路由与控制器
|
||||
@@ -166,6 +187,8 @@ Reload --> Render
|
||||
- 创建: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封装,区分成功、错误与无数据三类返回码。
|
||||
|
||||
@@ -173,8 +196,12 @@ Reload --> Render
|
||||
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 : 校验请求体
|
||||
@@ -186,25 +213,31 @@ RT->>ST : 上传S3并生成URL
|
||||
end
|
||||
ST-->>RT : 返回存储结果
|
||||
RT-->>FE : ApiResponse.success()
|
||||
FE->>RT : POST /api/ota/
|
||||
RT->>VL : 校验创建Schema
|
||||
RT->>MD : 检查版本号唯一性
|
||||
RT->>MD : 写入数据库
|
||||
MD-->>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)
|
||||
- [ota.js:3-33](file://backend/src/validators/ota.js#L3-L33)
|
||||
- [Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
|
||||
- [otaStorage.js:46-103](file://backend/src/services/otaStorage.js#L46-L103)
|
||||
- [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)
|
||||
- [ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
|
||||
### 数据模型与约束
|
||||
- 关键字段:
|
||||
@@ -219,6 +252,8 @@ RT-->>FE : ApiResponse.success()
|
||||
- startTime/endTime:发布时间窗口。
|
||||
- 唯一性约束:verCode+model组合唯一,防止重复版本。
|
||||
- 默认值:force、target、beta、status等字段提供合理默认值。
|
||||
- **新增黑名单模型**:包含ota_id(关联OTA版本)、mac(MAC地址)字段,支持按OTA版本和MAC地址进行设备级管控。
|
||||
- **新增定向升级模型**:包含ota_id(关联OTA版本)、mac_addr(MAC地址)字段,支持指定设备进行定向升级。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
@@ -239,13 +274,31 @@ datetime endTime
|
||||
smallint status
|
||||
datetime create_at
|
||||
}
|
||||
BLACK_LIST {
|
||||
int id PK
|
||||
int ota_id FK
|
||||
string mac
|
||||
datetime create_at
|
||||
}
|
||||
OTA_TARGET_DEVICE {
|
||||
int id PK
|
||||
int ota_id FK
|
||||
string mac_addr
|
||||
datetime create_at
|
||||
}
|
||||
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: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)
|
||||
|
||||
### 存储策略与安全
|
||||
- 设备型号差异化:
|
||||
@@ -270,11 +323,11 @@ BuildX8 --> Return["返回MD5/URL/S3Key"]
|
||||
BuildX9 --> Return
|
||||
```
|
||||
|
||||
图表来源
|
||||
**图表来源**
|
||||
- [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)
|
||||
|
||||
@@ -289,8 +342,11 @@ BuildX9 --> Return
|
||||
- 灰度发布:beta=1时,按比例或规则逐步放量。
|
||||
- 时间窗口:
|
||||
- startTime/endTime限定发布时间范围,超出范围的版本不应被推送。
|
||||
- **黑名单与定向升级集成**:
|
||||
- 设备端在检查更新时,需要先检查设备是否在黑名单中,如果在黑名单中则不应接收更新。
|
||||
- 设备端在检查更新时,需要检查设备是否在定向升级列表中,只有定向设备才能接收更新。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [ota.js:68-102](file://backend/src/routes/ota.js#L68-L102)
|
||||
|
||||
### 用户体验与错误处理
|
||||
@@ -300,16 +356,48 @@ BuildX9 --> Return
|
||||
- 上传反馈:上传成功后自动填充MD5与URL,失败时给出具体错误信息。
|
||||
- 删除确认:二次确认对话框,防止误删。
|
||||
- 分页与重置:支持页码与每页数量调整,重置搜索条件。
|
||||
- **新增弹窗管理**:黑名单和定向升级分别通过独立弹窗进行管理,支持MAC地址的批量添加和删除。
|
||||
- **MAC地址格式校验**:支持AA:BB:CC:DD:EE:FF格式的MAC地址输入和验证。
|
||||
- 后端:
|
||||
- 统一响应格式:code=1成功、code=0错误、code=2无数据。
|
||||
- 错误分类:参数错误、业务冲突(版本已存在)、存储异常(S3上传失败)等。
|
||||
- 错误分类:参数错误、业务冲突(版本已存在)、存储异常(S3上传失败)、权限错误等。
|
||||
- 日志记录:关键操作与异常均有日志输出,便于排查。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [index.vue:305-338](file://frontend/src/views/ota/index.vue#L305-L338)
|
||||
- [response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
||||
- [ota.js:25-66](file://backend/src/routes/ota.js#L25-L66)
|
||||
|
||||
### 黑名单管理功能
|
||||
- 功能概述:支持将特定设备的MAC地址加入黑名单,阻止这些设备接收OTA更新。
|
||||
- 界面集成:在OTA版本的"更多操作"菜单中新增"黑名单"选项,点击后弹出黑名单管理弹窗。
|
||||
- 操作流程:
|
||||
- 打开黑名单弹窗后,输入设备MAC地址并点击"添加"按钮。
|
||||
- 支持批量MAC地址添加,每个MAC地址一行。
|
||||
- 可以查看当前OTA版本的所有黑名单设备列表。
|
||||
- 支持删除不需要的黑名单设备。
|
||||
- 数据验证:MAC地址格式必须符合AA:BB:CC:DD:EE:FF格式,且每个MAC地址都必须唯一。
|
||||
|
||||
**章节来源**
|
||||
- [index.vue:645-734](file://frontend/src/views/ota/index.vue#L645-L734)
|
||||
- [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:736-817](file://frontend/src/views/ota/index.vue#L736-L817)
|
||||
- [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组件库,提供表格、表单、对话框、分页等。
|
||||
@@ -336,21 +424,21 @@ BE --> ML["Multer"]
|
||||
BE --> AW["AWS SDK"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
**图表来源**
|
||||
- [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)
|
||||
- [ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [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)
|
||||
- [ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
|
||||
## 性能考虑
|
||||
- 文件上传:
|
||||
@@ -364,6 +452,9 @@ BE --> AW["AWS SDK"]
|
||||
- 目录按年月与MD5前缀组织,有利于快速定位与清理。
|
||||
- 响应格式:
|
||||
- 统一的响应结构便于前端缓存与错误处理,减少重复解析成本。
|
||||
- **黑名单和定向升级查询优化**:
|
||||
- 黑名单和定向升级列表查询支持按OTA版本过滤,减少不必要的数据传输。
|
||||
- 支持MAC地址模糊查询,提升用户体验。
|
||||
|
||||
## 故障排除指南
|
||||
- 上传失败:
|
||||
@@ -371,18 +462,24 @@ BE --> AW["AWS SDK"]
|
||||
- 确认S3配置(区域、桶名、凭据)或本地存储目录权限。
|
||||
- 查看后端日志中的错误信息(如S3上传失败)。
|
||||
- 版本冲突:
|
||||
- 创建/更新时提示“该版本已存在”,请修改版本号或设备型号组合。
|
||||
- 创建/更新时提示"该版本已存在",请修改版本号或设备型号组合。
|
||||
- 权限问题:
|
||||
- 未登录或Token过期时会被重定向到登录页;超级管理员权限不足时会被拒绝访问。
|
||||
- 网络异常:
|
||||
- 前端请求拦截器会捕获401/403错误并提示,同时清除本地认证信息。
|
||||
- 页面空白或API失败:
|
||||
- 检查Nginx代理是否指向后端服务,确认容器健康状态与日志输出。
|
||||
- **黑名单和定向升级问题**:
|
||||
- MAC地址格式错误:确保输入AA:BB:CC:DD:EE:FF格式。
|
||||
- OTA版本不存在:确认选择的OTA版本ID有效。
|
||||
- 重复的MAC地址:黑名单和定向升级中的MAC地址在同一OTA版本内必须唯一。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [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)
|
||||
|
||||
## 结论
|
||||
OTA固件管理页面通过清晰的前后端职责划分与统一的响应格式,实现了从版本上传、存储、查询到发布的完整闭环。X8/X9差异化存储策略兼顾了可扩展性与易用性,配合严格的参数校验与完善的错误处理,为设备端的兼容性检查与更新策略提供了可靠支撑。建议在后续迭代中进一步完善下载统计、版本历史与回滚功能,并持续优化上传体验与性能表现。
|
||||
OTA固件管理页面通过清晰的前后端职责划分与统一的响应格式,实现了从版本上传、存储、查询到发布的完整闭环。**本次更新集成了黑名单管理和定向升级功能,显著提升了OTA管理的精细化程度和安全性**。X8/X9差异化存储策略兼顾了可扩展性与易用性,配合严格的参数校验与完善的错误处理,为设备端的兼容性检查与更新策略提供了可靠支撑。**新增的黑名单和定向升级功能使得OTA管理更加灵活,能够满足不同场景下的设备管控需求**。建议在后续迭代中进一步完善下载统计、版本历史与回滚功能,并持续优化上传体验与性能表现。
|
||||
@@ -3,34 +3,59 @@
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/src/models/Ota.js](file://backend/src/models/Ota.js)
|
||||
- [backend/src/models/BlackList.js](file://backend/src/models/BlackList.js)
|
||||
- [backend/src/models/OtaTargetDevice.js](file://backend/src/models/OtaTargetDevice.js)
|
||||
- [backend/src/routes/ota.js](file://backend/src/routes/ota.js)
|
||||
- [backend/src/routes/blacklist.js](file://backend/src/routes/blacklist.js)
|
||||
- [backend/src/routes/otaTargetDevice.js](file://backend/src/routes/otaTargetDevice.js)
|
||||
- [backend/src/services/otaStorage.js](file://backend/src/services/otaStorage.js)
|
||||
- [backend/src/validators/ota.js](file://backend/src/validators/ota.js)
|
||||
- [backend/src/validators/blacklist.js](file://backend/src/validators/blacklist.js)
|
||||
- [backend/src/validators/otaTargetDevice.js](file://backend/src/validators/otaTargetDevice.js)
|
||||
- [backend/src/utils/response.js](file://backend/src/utils/response.js)
|
||||
- [backend/src/config/env.js](file://backend/src/config/env.js)
|
||||
- [backend/src/config/database.js](file://backend/src/config/database.js)
|
||||
- [frontend/src/views/ota/index.vue](file://frontend/src/views/ota/index.vue)
|
||||
- [frontend/src/views/blacklist/index.vue](file://frontend/src/views/blacklist/index.vue)
|
||||
- [frontend/src/views/ota-target-device/index.vue](file://frontend/src/views/ota-target-device/index.vue)
|
||||
- [frontend/src/api/ota.js](file://frontend/src/api/ota.js)
|
||||
- [frontend/src/api/blacklist.js](file://frontend/src/api/blacklist.js)
|
||||
- [frontend/src/api/otaTargetDevice.js](file://frontend/src/api/otaTargetDevice.js)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**所做更改**
|
||||
- 新增黑名单管理功能模块,支持设备黑名单维护
|
||||
- 新增目标设备升级功能,支持定向升级控制
|
||||
- 扩展OTA版本检查流程,增加黑名单和定向设备过滤逻辑
|
||||
- 更新前端管理界面,新增黑名单和定向升级管理页面
|
||||
- 增强OTA版本管理的完整性和安全性
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
6. [黑名单管理功能](#黑名单管理功能)
|
||||
7. [目标设备升级功能](#目标设备升级功能)
|
||||
8. [依赖关系分析](#依赖关系分析)
|
||||
9. [性能考虑](#性能考虑)
|
||||
10. [故障排除指南](#故障排除指南)
|
||||
11. [结论](#结论)
|
||||
12. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本项目提供完整的OTA固件管理能力,涵盖固件版本管理、文件上传下载、强制更新配置以及设备端版本检查。系统支持两种设备型号:Luxsin-X8与Luxsin-X9,采用不同的存储策略:
|
||||
- Luxsin-X8:通过S3对象存储进行分发
|
||||
- Luxsin-X9:保存到本地文件系统
|
||||
|
||||
系统还提供了完善的前端管理界面,支持版本列表查询、新增/编辑/删除、文件上传、强制更新策略配置等功能。
|
||||
**新增功能**:
|
||||
- 黑名单管理:支持将特定设备MAC地址加入黑名单,阻止其接收OTA更新
|
||||
- 目标设备升级:支持定向升级功能,仅允许指定设备接收特定OTA版本
|
||||
- 增强的版本检查:在设备端版本检查时集成黑名单和定向设备过滤逻辑
|
||||
|
||||
系统还提供了完善的前端管理界面,支持版本列表查询、新增/编辑/删除、文件上传、强制更新策略配置、黑名单管理和定向升级管理等功能。
|
||||
|
||||
## 项目结构
|
||||
后端采用Express + Sequelize架构,前端基于Vue3 + Element Plus构建。整体结构清晰,职责分离明确。
|
||||
@@ -38,36 +63,66 @@
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_View["OTA视图<br/>frontend/src/views/ota/index.vue"]
|
||||
FE_API["OTA API封装<br/>frontend/src/api/ota.js"]
|
||||
FE_OtaView["OTA视图<br/>frontend/src/views/ota/index.vue"]
|
||||
FE_BlackListView["黑名单视图<br/>frontend/src/views/blacklist/index.vue"]
|
||||
FE_TargetDeviceView["目标设备视图<br/>frontend/src/views/ota-target-device/index.vue"]
|
||||
FE_OtaAPI["OTA API封装<br/>frontend/src/api/ota.js"]
|
||||
FE_BlackListAPI["黑名单API封装<br/>frontend/src/api/blacklist.js"]
|
||||
FE_TargetDeviceAPI["目标设备API封装<br/>frontend/src/api/otaTargetDevice.js"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_Router["OTA路由<br/>backend/src/routes/ota.js"]
|
||||
BE_BlackListRouter["黑名单路由<br/>backend/src/routes/blacklist.js"]
|
||||
BE_TargetDeviceRouter["目标设备路由<br/>backend/src/routes/otaTargetDevice.js"]
|
||||
BE_Model["OTA模型<br/>backend/src/models/Ota.js"]
|
||||
BE_BlackListModel["黑名单模型<br/>backend/src/models/BlackList.js"]
|
||||
BE_TargetDeviceModel["目标设备模型<br/>backend/src/models/OtaTargetDevice.js"]
|
||||
BE_Validator["OTA校验器<br/>backend/src/validators/ota.js"]
|
||||
BE_BlackListValidator["黑名单校验器<br/>backend/src/validators/blacklist.js"]
|
||||
BE_TargetDeviceValidator["目标设备校验器<br/>backend/src/validators/otaTargetDevice.js"]
|
||||
BE_Storage["OTA存储服务<br/>backend/src/services/otaStorage.js"]
|
||||
BE_Utils["响应工具<br/>backend/src/utils/response.js"]
|
||||
BE_DB["数据库配置<br/>backend/src/config/database.js"]
|
||||
BE_ENV["环境配置<br/>backend/src/config/env.js"]
|
||||
end
|
||||
FE_View --> FE_API
|
||||
FE_API --> BE_Router
|
||||
FE_OtaView --> FE_OtaAPI
|
||||
FE_BlackListView --> FE_BlackListAPI
|
||||
FE_TargetDeviceView --> FE_TargetDeviceAPI
|
||||
FE_OtaAPI --> BE_Router
|
||||
FE_BlackListAPI --> BE_BlackListRouter
|
||||
FE_TargetDeviceAPI --> BE_TargetDeviceRouter
|
||||
BE_Router --> BE_Model
|
||||
BE_BlackListRouter --> BE_BlackListModel
|
||||
BE_TargetDeviceRouter --> BE_TargetDeviceModel
|
||||
BE_Router --> BE_Validator
|
||||
BE_BlackListRouter --> BE_BlackListValidator
|
||||
BE_TargetDeviceRouter --> BE_TargetDeviceValidator
|
||||
BE_Router --> BE_Storage
|
||||
BE_Router --> BE_Utils
|
||||
BE_Model --> BE_DB
|
||||
BE_BlackListModel --> BE_DB
|
||||
BE_TargetDeviceModel --> BE_DB
|
||||
BE_Storage --> BE_ENV
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/routes/ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
|
||||
- [backend/src/routes/blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [backend/src/routes/otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [backend/src/models/BlackList.js:1-37](file://backend/src/models/BlackList.js#L1-L37)
|
||||
- [backend/src/models/OtaTargetDevice.js:1-38](file://backend/src/models/OtaTargetDevice.js#L1-L38)
|
||||
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
- [frontend/src/views/blacklist/index.vue:1-381](file://frontend/src/views/blacklist/index.vue#L1-L381)
|
||||
- [frontend/src/views/ota-target-device/index.vue:1-386](file://frontend/src/views/ota-target-device/index.vue#L1-L386)
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/routes/ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
|
||||
- [backend/src/routes/blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [backend/src/routes/otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
- [frontend/src/views/blacklist/index.vue:1-381](file://frontend/src/views/blacklist/index.vue#L1-L381)
|
||||
- [frontend/src/views/ota-target-device/index.vue:1-386](file://frontend/src/views/ota-target-device/index.vue#L1-L386)
|
||||
|
||||
## 核心组件
|
||||
系统的核心组件包括:
|
||||
@@ -75,16 +130,24 @@ BE_Storage --> BE_ENV
|
||||
- **OTA路由**:提供RESTful API接口
|
||||
- **OTA存储服务**:处理不同设备型号的文件存储策略
|
||||
- **OTA校验器**:使用Zod进行数据验证
|
||||
- **黑名单模型**:管理设备黑名单
|
||||
- **目标设备模型**:管理定向升级设备
|
||||
- **黑名单路由**:管理黑名单相关操作
|
||||
- **目标设备路由**:管理定向升级相关操作
|
||||
- **前端管理界面**:提供可视化操作界面
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [backend/src/models/BlackList.js:1-37](file://backend/src/models/BlackList.js#L1-L37)
|
||||
- [backend/src/models/OtaTargetDevice.js:1-38](file://backend/src/models/OtaTargetDevice.js#L1-L38)
|
||||
- [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [backend/src/validators/blacklist.js:1-14](file://backend/src/validators/blacklist.js#L1-L14)
|
||||
- [backend/src/validators/otaTargetDevice.js:1-14](file://backend/src/validators/otaTargetDevice.js#L1-L14)
|
||||
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
|
||||
## 架构总览
|
||||
系统采用分层架构设计,前后端分离,职责清晰:
|
||||
系统采用分层架构设计,前后端分离,职责清晰。新增的黑名单和目标设备功能通过独立的路由和模型实现,与现有OTA功能无缝集成。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
@@ -106,10 +169,17 @@ Frontend->>Backend : 创建/更新OTA版本
|
||||
Backend->>DB : 持久化数据
|
||||
DB-->>Backend : 确认写入
|
||||
Backend-->>Frontend : 响应操作结果
|
||||
Frontend->>Backend : 设备端版本检查
|
||||
Backend->>DB : 查询黑名单和定向设备
|
||||
DB-->>Backend : 返回过滤条件
|
||||
Backend->>DB : 查询可用版本
|
||||
DB-->>Backend : 返回匹配记录
|
||||
Backend-->>Frontend : 响应最终版本信息
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/routes/ota.js:24-66](file://backend/src/routes/ota.js#L24-L66)
|
||||
- [backend/src/routes/ota.js:68-102](file://backend/src/routes/ota.js#L68-L102)
|
||||
- [backend/src/services/otaStorage.js:46-103](file://backend/src/services/otaStorage.js#L46-L103)
|
||||
- [frontend/src/views/ota/index.vue:384-412](file://frontend/src/views/ota/index.vue#L384-L412)
|
||||
|
||||
@@ -147,12 +217,27 @@ varchar source
|
||||
varchar eq_key
|
||||
datetime create_at
|
||||
}
|
||||
BLACKLIST {
|
||||
int id PK
|
||||
int ota_id FK
|
||||
varchar mac
|
||||
datetime create_at
|
||||
}
|
||||
OTATARGETDEVICE {
|
||||
int id PK
|
||||
int ota_id FK
|
||||
varchar mac_addr
|
||||
datetime create_at
|
||||
}
|
||||
OTA ||--|| MODEL : "对应型号"
|
||||
OTA ||--o{ BLACKLIST : "黑名单关联"
|
||||
OTA ||--o{ OTATARGETDEVICE : "目标设备关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/models/Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
|
||||
- [backend/src/models/Model.js:4-50](file://backend/src/models/Model.js#L4-L50)
|
||||
- [backend/src/models/BlackList.js:5-32](file://backend/src/models/BlackList.js#L5-L32)
|
||||
- [backend/src/models/OtaTargetDevice.js:5-33](file://backend/src/models/OtaTargetDevice.js#L5-L33)
|
||||
|
||||
**字段说明**:
|
||||
- `verCode`:版本号(整数),用于排序和比较
|
||||
@@ -165,9 +250,13 @@ OTA ||--|| MODEL : "对应型号"
|
||||
- `target`:是否定向发布(0-全量,1-定向)
|
||||
- `beta`:是否灰度发布(0-否,1-是)
|
||||
- `status`:状态(0-停用,1-可用)
|
||||
- `mac`:黑名单设备MAC地址
|
||||
- `mac_addr`:目标设备MAC地址
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [backend/src/models/BlackList.js:1-37](file://backend/src/models/BlackList.js#L1-L37)
|
||||
- [backend/src/models/OtaTargetDevice.js:1-38](file://backend/src/models/OtaTargetDevice.js#L1-L38)
|
||||
|
||||
### 文件上传与存储策略
|
||||
系统针对不同设备型号采用差异化的存储策略:
|
||||
@@ -214,17 +303,22 @@ Error --> End([结束])
|
||||
- [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
|
||||
### OTA版本检查流程
|
||||
设备端通过`/api/ota/latest/check`接口获取最新可用版本:
|
||||
设备端通过`/api/ota/latest/check`接口获取最新可用版本,现已集成黑名单和定向设备过滤逻辑:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Device as "设备端"
|
||||
participant API as "OTA检查接口"
|
||||
participant DB as "数据库"
|
||||
Device->>API : GET /api/ota/latest/check?currentVerCode&model&hw
|
||||
Device->>API : GET /api/ota/latest/check?currentVerCode&model&hw&mac
|
||||
API->>API : 解析查询参数
|
||||
API->>DB : 检查黑名单(mac)
|
||||
DB-->>API : 返回黑名单状态
|
||||
API->>DB : 查询定向设备(仅当target=1)
|
||||
DB-->>API : 返回定向设备状态
|
||||
API->>DB : 查询verCode > currentVerCode且status=1
|
||||
DB-->>API : 返回匹配记录
|
||||
API->>API : 过滤黑名单和定向设备
|
||||
API->>API : 按verCode降序排序
|
||||
API->>Device : 返回最高版本信息
|
||||
Note over Device,API : 未找到可用版本时返回空数据
|
||||
@@ -236,6 +330,8 @@ Note over Device,API : 未找到可用版本时返回空数据
|
||||
**查询逻辑**:
|
||||
- 必须满足:`status=1`(可用)、`verCode > 当前版本号`
|
||||
- 支持按`model`和`hw`(硬件版本)过滤
|
||||
- **新增**:黑名单过滤(mac存在于黑名单表)
|
||||
- **新增**:定向设备过滤(当target=1时,mac必须存在于目标设备表)
|
||||
- 返回最高版本的完整信息
|
||||
|
||||
**章节来源**
|
||||
@@ -276,6 +372,22 @@ class OtaUpdateSchema {
|
||||
+endTime : string?
|
||||
+status : number?
|
||||
}
|
||||
class BlackListCreateSchema {
|
||||
+ota_id : number
|
||||
+mac : string
|
||||
}
|
||||
class BlackListUpdateSchema {
|
||||
+ota_id : number?
|
||||
+mac : string?
|
||||
}
|
||||
class OtaTargetDeviceCreateSchema {
|
||||
+ota_id : number
|
||||
+mac_addr : string
|
||||
}
|
||||
class OtaTargetDeviceUpdateSchema {
|
||||
+ota_id : number?
|
||||
+mac_addr : string?
|
||||
}
|
||||
class ApiResponse {
|
||||
+success(data, msg)
|
||||
+error(msg, code)
|
||||
@@ -283,26 +395,31 @@ class ApiResponse {
|
||||
}
|
||||
OtaCreateSchema --> ApiResponse : "验证失败时返回错误"
|
||||
OtaUpdateSchema --> ApiResponse : "验证失败时返回错误"
|
||||
BlackListCreateSchema --> ApiResponse : "验证失败时返回错误"
|
||||
OtaTargetDeviceCreateSchema --> ApiResponse : "验证失败时返回错误"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/validators/ota.js:3-35](file://backend/src/validators/ota.js#L3-L35)
|
||||
- [backend/src/validators/blacklist.js:3-11](file://backend/src/validators/blacklist.js#L3-L11)
|
||||
- [backend/src/validators/otaTargetDevice.js:3-11](file://backend/src/validators/otaTargetDevice.js#L3-L11)
|
||||
- [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
||||
|
||||
**验证规则**:
|
||||
- 版本号必须为整数
|
||||
- 版本名称长度1-20字符
|
||||
- URL最长255字符
|
||||
- MD5必须为32位十六进制
|
||||
- 数值字段范围0-1(布尔型)
|
||||
- 可选字段支持null值
|
||||
- **OTA版本验证**:版本号必须为整数,版本名称长度1-20字符,URL最长255字符,MD5必须为32位十六进制,数值字段范围0-1(布尔型)
|
||||
- **黑名单验证**:ota_id必须为整数,MAC地址不能为空且最多100字符
|
||||
- **目标设备验证**:ota_id必须为整数,MAC地址不能为空且最多17字符
|
||||
- **可选字段支持**:所有更新操作支持null值
|
||||
- **唯一性约束**:目标设备MAC地址在同一OTA版本下必须唯一
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [backend/src/validators/blacklist.js:1-14](file://backend/src/validators/blacklist.js#L1-L14)
|
||||
- [backend/src/validators/otaTargetDevice.js:1-14](file://backend/src/validators/otaTargetDevice.js#L1-L14)
|
||||
- [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
||||
|
||||
### 前端管理界面
|
||||
前端提供完整的OTA管理界面,支持多种操作:
|
||||
前端提供完整的OTA管理界面,支持多种操作,现已集成黑名单和目标设备管理功能:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
@@ -321,10 +438,17 @@ UploadFile --> SaveInfo[自动填充URL和MD5]
|
||||
SaveBtn[保存按钮] --> ValidateForm[表单验证]
|
||||
ValidateForm --> SubmitAPI[提交到后端]
|
||||
SubmitAPI --> RefreshList[刷新列表]
|
||||
MoreActions[更多操作] --> BlackListAction[黑名单管理]
|
||||
MoreActions --> TargetDeviceAction[定向升级管理]
|
||||
BlackListAction --> OpenBlackListDialog[打开黑名单对话框]
|
||||
TargetDeviceAction --> OpenTargetDeviceDialog[打开目标设备对话框]
|
||||
OpenBlackListDialog --> LoadBlackList[加载黑名单列表]
|
||||
OpenTargetDeviceDialog --> LoadTargetDeviceList[加载目标设备列表]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/views/ota/index.vue:420-579](file://frontend/src/views/ota/index.vue#L420-L579)
|
||||
- [frontend/src/views/ota/index.vue:645-683](file://frontend/src/views/ota/index.vue#L645-L683)
|
||||
|
||||
**主要功能**:
|
||||
- 版本列表查询(支持按版本名、型号、状态、版本号筛选)
|
||||
@@ -333,10 +457,195 @@ SubmitAPI --> RefreshList[刷新列表]
|
||||
- 文件上传(支持Luxsin-X8/X9)
|
||||
- 强制更新策略配置(强制更新、定向发布、灰度发布)
|
||||
- 状态管理(可用/停用)
|
||||
- **新增**:黑名单管理(支持按OTA版本、设备型号、MAC地址筛选)
|
||||
- **新增**:定向升级管理(支持按OTA版本、设备型号、MAC地址筛选)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
|
||||
- [frontend/src/views/blacklist/index.vue:1-381](file://frontend/src/views/blacklist/index.vue#L1-L381)
|
||||
- [frontend/src/views/ota-target-device/index.vue:1-386](file://frontend/src/views/ota-target-device/index.vue#L1-L386)
|
||||
- [frontend/src/api/ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
|
||||
- [frontend/src/api/blacklist.js:1-57](file://frontend/src/api/blacklist.js#L1-L57)
|
||||
- [frontend/src/api/otaTargetDevice.js:1-57](file://frontend/src/api/otaTargetDevice.js#L1-L57)
|
||||
|
||||
## 黑名单管理功能
|
||||
|
||||
### 黑名单模型设计
|
||||
黑名单功能通过独立的BlackList模型实现,与OTA版本建立一对多关联关系。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
BLACKLIST {
|
||||
int id PK
|
||||
int ota_id FK
|
||||
varchar mac
|
||||
datetime create_at
|
||||
}
|
||||
OTA {
|
||||
int id PK
|
||||
int verCode
|
||||
varchar verName
|
||||
varchar url
|
||||
char md5
|
||||
smallint force
|
||||
varchar desc
|
||||
varchar model
|
||||
int hw
|
||||
smallint target
|
||||
smallint beta
|
||||
datetime startTime
|
||||
datetime endTime
|
||||
smallint status
|
||||
datetime create_at
|
||||
}
|
||||
BLACKLIST }|--|| OTA : "关联OTA版本"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/models/BlackList.js:5-32](file://backend/src/models/BlackList.js#L5-L32)
|
||||
- [backend/src/models/Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
|
||||
|
||||
**字段说明**:
|
||||
- `id`:黑名单记录ID
|
||||
- `ota_id`:关联的OTA版本ID
|
||||
- `mac`:设备MAC地址,最多100字符
|
||||
- `create_at`:创建时间,默认当前时间
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/models/BlackList.js:1-37](file://backend/src/models/BlackList.js#L1-L37)
|
||||
|
||||
### 黑名单管理流程
|
||||
黑名单管理提供完整的CRUD操作,支持按OTA版本、设备型号、MAC地址进行筛选查询。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Admin as "管理员"
|
||||
participant Frontend as "黑名单管理界面"
|
||||
participant API as "黑名单API"
|
||||
participant DB as "数据库"
|
||||
Admin->>Frontend : 访问黑名单管理页面
|
||||
Frontend->>API : 查询黑名单列表
|
||||
API->>DB : 按条件查询(ota_id/model/mac)
|
||||
DB-->>API : 返回黑名单记录
|
||||
API-->>Frontend : 响应JSON数据
|
||||
Frontend->>API : 新增黑名单
|
||||
API->>DB : 校验OTA存在性
|
||||
DB-->>API : 返回OTA信息
|
||||
API->>DB : 插入黑名单记录
|
||||
DB-->>API : 返回插入结果
|
||||
API-->>Frontend : 响应操作结果
|
||||
Frontend->>API : 编辑/删除黑名单
|
||||
API->>DB : 更新/删除记录
|
||||
DB-->>API : 确认操作
|
||||
API-->>Frontend : 响应操作结果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/routes/blacklist.js:16-71](file://backend/src/routes/blacklist.js#L16-L71)
|
||||
- [backend/src/routes/blacklist.js:96-131](file://backend/src/routes/blacklist.js#L96-L131)
|
||||
- [frontend/src/views/blacklist/index.vue:144-346](file://frontend/src/views/blacklist/index.vue#L144-L346)
|
||||
|
||||
**功能特性**:
|
||||
- **查询筛选**:支持按OTA版本、设备型号、MAC地址模糊查询
|
||||
- **分页加载**:支持skip/limit参数,最大每页1000条记录
|
||||
- **关联查询**:支持按设备型号筛选时自动转换为OTA ID列表
|
||||
- **数据验证**:MAC地址格式验证,OTA存在性校验
|
||||
- **权限控制**:所有接口均需登录认证
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/routes/blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [frontend/src/views/blacklist/index.vue:1-381](file://frontend/src/views/blacklist/index.vue#L1-L381)
|
||||
|
||||
## 目标设备升级功能
|
||||
|
||||
### 目标设备模型设计
|
||||
目标设备功能通过独立的OtaTargetDevice模型实现,与OTA版本建立一对多关联关系。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
OTATARGETDEVICE {
|
||||
int id PK
|
||||
int ota_id FK
|
||||
varchar mac_addr
|
||||
datetime create_at
|
||||
}
|
||||
OTA {
|
||||
int id PK
|
||||
int verCode
|
||||
varchar verName
|
||||
varchar url
|
||||
char md5
|
||||
smallint force
|
||||
varchar desc
|
||||
varchar model
|
||||
int hw
|
||||
smallint target
|
||||
smallint beta
|
||||
datetime startTime
|
||||
datetime endTime
|
||||
smallint status
|
||||
datetime create_at
|
||||
}
|
||||
OTATARGETDEVICE }|--|| OTA : "关联OTA版本"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/models/OtaTargetDevice.js:5-33](file://backend/src/models/OtaTargetDevice.js#L5-L33)
|
||||
- [backend/src/models/Ota.js:4-94](file://backend/src/models/Ota.js#L4-L94)
|
||||
|
||||
**字段说明**:
|
||||
- `id`:目标设备记录ID
|
||||
- `ota_id`:关联的OTA版本ID
|
||||
- `mac_addr`:设备MAC地址,最多17字符
|
||||
- `create_at`:创建时间,默认当前时间
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/models/OtaTargetDevice.js:1-38](file://backend/src/models/OtaTargetDevice.js#L1-L38)
|
||||
|
||||
### 目标设备管理流程
|
||||
目标设备管理提供完整的CRUD操作,支持按OTA版本、设备型号、MAC地址进行筛选查询,并确保MAC地址在同一OTA版本下的唯一性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Admin as "管理员"
|
||||
participant Frontend as "目标设备管理界面"
|
||||
participant API as "目标设备API"
|
||||
participant DB as "数据库"
|
||||
Admin->>Frontend : 访问目标设备管理页面
|
||||
Frontend->>API : 查询目标设备列表
|
||||
API->>DB : 按条件查询(ota_id/model/mac_addr)
|
||||
DB-->>API : 返回目标设备记录
|
||||
API-->>Frontend : 响应JSON数据
|
||||
Frontend->>API : 新增目标设备
|
||||
API->>DB : 校验OTA存在性
|
||||
DB-->>API : 返回OTA信息
|
||||
API->>DB : 唯一性校验(mac_addr在ota_id下唯一)
|
||||
DB-->>API : 返回校验结果
|
||||
API->>DB : 插入目标设备记录
|
||||
DB-->>API : 返回插入结果
|
||||
API-->>Frontend : 响应操作结果
|
||||
Frontend->>API : 编辑/删除目标设备
|
||||
API->>DB : 更新/删除记录
|
||||
DB-->>API : 确认操作
|
||||
API-->>Frontend : 响应操作结果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/routes/otaTargetDevice.js:16-71](file://backend/src/routes/otaTargetDevice.js#L16-L71)
|
||||
- [backend/src/routes/otaTargetDevice.js:96-139](file://backend/src/routes/otaTargetDevice.js#L96-L139)
|
||||
- [frontend/src/views/ota-target-device/index.vue:144-351](file://frontend/src/views/ota-target-device/index.vue#L144-L351)
|
||||
|
||||
**功能特性**:
|
||||
- **查询筛选**:支持按OTA版本、设备型号、MAC地址模糊查询
|
||||
- **分页加载**:支持skip/limit参数,最大每页1000条记录
|
||||
- **关联查询**:支持按设备型号筛选时自动转换为OTA ID列表
|
||||
- **唯一性约束**:同一OTA版本下MAC地址必须唯一
|
||||
- **数据验证**:MAC地址格式验证,OTA存在性校验
|
||||
- **权限控制**:所有接口均需登录认证
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/routes/otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
- [frontend/src/views/ota-target-device/index.vue:1-386](file://frontend/src/views/ota-target-device/index.vue#L1-L386)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
@@ -351,28 +660,50 @@ Multer["Multer文件上传"]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
OtaRoute["OTA路由"]
|
||||
BlackListRoute["黑名单路由"]
|
||||
TargetDeviceRoute["目标设备路由"]
|
||||
OtaModel["OTA模型"]
|
||||
BlackListModel["黑名单模型"]
|
||||
TargetDeviceModel["目标设备模型"]
|
||||
OtaValidator["OTA校验器"]
|
||||
BlackListValidator["黑名单校验器"]
|
||||
TargetDeviceValidator["目标设备校验器"]
|
||||
OtaStorage["OTA存储服务"]
|
||||
ResponseUtil["响应工具"]
|
||||
EnvConfig["环境配置"]
|
||||
DBConfig["数据库配置"]
|
||||
end
|
||||
Express --> OtaRoute
|
||||
Express --> BlackListRoute
|
||||
Express --> TargetDeviceRoute
|
||||
Sequelize --> OtaModel
|
||||
Sequelize --> BlackListModel
|
||||
Sequelize --> TargetDeviceModel
|
||||
Zod --> OtaValidator
|
||||
Zod --> BlackListValidator
|
||||
Zod --> TargetDeviceValidator
|
||||
S3 --> OtaStorage
|
||||
Multer --> OtaRoute
|
||||
OtaRoute --> OtaModel
|
||||
OtaRoute --> OtaValidator
|
||||
OtaRoute --> OtaStorage
|
||||
OtaRoute --> ResponseUtil
|
||||
BlackListRoute --> BlackListModel
|
||||
BlackListRoute --> BlackListValidator
|
||||
BlackListRoute --> ResponseUtil
|
||||
TargetDeviceRoute --> TargetDeviceModel
|
||||
TargetDeviceRoute --> TargetDeviceValidator
|
||||
TargetDeviceRoute --> ResponseUtil
|
||||
OtaStorage --> EnvConfig
|
||||
OtaModel --> DBConfig
|
||||
BlackListModel --> DBConfig
|
||||
TargetDeviceModel --> DBConfig
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/src/routes/ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
|
||||
- [backend/src/routes/blacklist.js:1-223](file://backend/src/routes/blacklist.js#L1-L223)
|
||||
- [backend/src/routes/otaTargetDevice.js:1-248](file://backend/src/routes/otaTargetDevice.js#L1-L248)
|
||||
- [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [backend/package.json:11-24](file://backend/package.json#L11-L24)
|
||||
|
||||
@@ -381,18 +712,20 @@ OtaModel --> DBConfig
|
||||
- **可扩展**:模块化设计便于功能扩展
|
||||
- **环境适配**:支持开发/生产环境差异化配置
|
||||
- **安全性**:内置输入验证和错误处理
|
||||
- **新增**:黑名单和目标设备功能独立部署,不影响核心OTA功能
|
||||
|
||||
**章节来源**
|
||||
- [backend/package.json:1-29](file://backend/package.json#L1-L29)
|
||||
- [backend/src/config/env.js:1-13](file://backend/src/config/env.js#L1-L13)
|
||||
|
||||
## 性能考虑
|
||||
系统在设计时充分考虑了性能优化:
|
||||
系统在设计时充分考虑了性能优化,新增功能同样遵循这些原则:
|
||||
|
||||
### 数据库优化
|
||||
- 使用索引字段:`verCode`、`model`、`status`
|
||||
- 使用索引字段:`verCode`、`model`、`status`、`mac`、`mac_addr`
|
||||
- 分页查询限制:最大每页1000条记录
|
||||
- 条件查询优化:支持多字段组合查询
|
||||
- **新增**:黑名单和目标设备表建立适当的索引以支持频繁的MAC地址查询
|
||||
|
||||
### 存储优化
|
||||
- **S3存储**:利用CDN加速,支持断点续传
|
||||
@@ -403,6 +736,7 @@ OtaModel --> DBConfig
|
||||
- **缓存友好**:查询参数明确,便于缓存
|
||||
- **批量操作**:支持分页批量获取
|
||||
- **错误快速返回**:验证失败立即返回
|
||||
- **新增**:黑名单和目标设备查询支持按OTA版本批量筛选
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
@@ -428,19 +762,38 @@ OtaModel --> DBConfig
|
||||
- 确认跨域配置正确
|
||||
- 验证API接口可达性
|
||||
|
||||
**5. 黑名单添加失败**
|
||||
- 检查MAC地址格式是否正确(AA:BB:CC:DD:EE:FF)
|
||||
- 确认关联的OTA版本是否存在
|
||||
- 验证黑名单中MAC地址是否重复
|
||||
|
||||
**6. 目标设备添加失败**
|
||||
- 检查MAC地址格式是否正确(AA:BB:CC:DD:EE:FF)
|
||||
- 确认关联的OTA版本是否存在
|
||||
- 验证同一OTA版本下MAC地址是否唯一
|
||||
|
||||
**7. 设备无法接收OTA更新**
|
||||
- 检查设备MAC地址是否在黑名单中
|
||||
- 确认设备是否在目标设备列表中(当target=1时)
|
||||
- 验证设备硬件版本与OTA版本兼容性
|
||||
|
||||
**章节来源**
|
||||
- [backend/src/routes/ota.js:174-181](file://backend/src/routes/ota.js#L174-L181)
|
||||
- [backend/src/services/otaStorage.js:95-98](file://backend/src/services/otaStorage.js#L95-L98)
|
||||
- [backend/src/routes/blacklist.js:108-112](file://backend/src/routes/blacklist.js#L108-L112)
|
||||
- [backend/src/routes/otaTargetDevice.js:108-112](file://backend/src/routes/otaTargetDevice.js#L108-L112)
|
||||
|
||||
## 结论
|
||||
本OTA固件管理系统具有以下优势:
|
||||
本OTA固件管理系统经过功能增强后具有以下优势:
|
||||
- **架构清晰**:前后端分离,职责明确
|
||||
- **功能完整**:覆盖从版本管理到文件分发的全流程
|
||||
- **扩展性强**:模块化设计便于功能扩展
|
||||
- **安全可靠**:完善的输入验证和错误处理机制
|
||||
- **性能优化**:合理的存储策略和查询优化
|
||||
- **新增功能完善**:黑名单管理和目标设备升级功能完整集成
|
||||
- **管理便捷**:提供完整的前端管理界面,支持多种操作
|
||||
|
||||
系统特别适合需要管理多型号设备固件更新的企业应用场景,为设备厂商提供了完整的OTA解决方案。
|
||||
系统特别适合需要管理多型号设备固件更新的企业应用场景,为设备厂商提供了完整的OTA解决方案,现在包括更精细的设备控制能力。
|
||||
|
||||
## 附录
|
||||
|
||||
@@ -453,6 +806,7 @@ OtaModel --> DBConfig
|
||||
- `currentVerCode`:当前版本号(必填)
|
||||
- `model`:设备型号(必填)
|
||||
- `hw`:硬件版本(可选)
|
||||
- `mac`:设备MAC地址(可选,用于黑名单过滤)
|
||||
|
||||
**版本管理接口**
|
||||
- 列表查询:GET `/api/ota/`
|
||||
@@ -466,6 +820,20 @@ OtaModel --> DBConfig
|
||||
- 支持格式:`.pkg`、`.bin`、`.zip`
|
||||
- 超时时间:5分钟
|
||||
|
||||
**黑名单管理接口**
|
||||
- 列表查询:GET `/api/blacklist/`
|
||||
- 获取详情:GET `/api/blacklist/:id`
|
||||
- 创建黑名单:POST `/api/blacklist/`
|
||||
- 更新黑名单:PUT `/api/blacklist/:id`
|
||||
- 删除黑名单:DELETE `/api/blacklist/:id`
|
||||
|
||||
**目标设备管理接口**
|
||||
- 列表查询:GET `/api/ota-target-device/`
|
||||
- 获取详情:GET `/api/ota-target-device/:id`
|
||||
- 创建目标设备:POST `/api/ota-target-device/`
|
||||
- 更新目标设备:PUT `/api/ota-target-device/:id`
|
||||
- 删除目标设备:DELETE `/api/ota-target-device/:id`
|
||||
|
||||
### 环境配置
|
||||
- 数据库:MySQL(UTF8MB4字符集)
|
||||
- 存储:S3或本地文件系统
|
||||
@@ -473,4 +841,14 @@ OtaModel --> DBConfig
|
||||
- `DATABASE_*`:数据库连接配置
|
||||
- `AWS_*`:S3存储配置
|
||||
- `OTA_*`:OTA存储路径和URL配置
|
||||
- `APP_ENV`:应用环境(development/production)
|
||||
- `APP_ENV`:应用环境(development/production)
|
||||
|
||||
### 数据库表结构
|
||||
- **ota**:OTA版本主表
|
||||
- **black_list**:黑名单表
|
||||
- **ota_target_device**:目标设备表
|
||||
|
||||
### 前端路由
|
||||
- `/ota`:OTA版本管理
|
||||
- `/blacklist`:黑名单管理
|
||||
- `/ota-target-device`:目标设备管理
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user