添加 uipro,更新 wiki

This commit is contained in:
eafonyang
2026-07-10 11:25:45 +08:00
parent 6bb39e9172
commit f88ff46427
163 changed files with 30244 additions and 151 deletions
@@ -15,6 +15,13 @@
- [frontend/package.json](file://frontend/package.json)
</cite>
## 更新摘要
**变更内容**
- 版本唯一性约束从'verCode + model'升级为'verCode + model + beta',支持同一设备型号下存在多个不同beta状态的版本
- 在创建/更新接口中新增对beta字段的支持,允许设置灰度发布状态
- 前端新增beta筛选功能,支持按灰度状态过滤版本列表
- 实现基于(model, beta)组合的最新版本标识显示逻辑
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
@@ -30,11 +37,12 @@
## 简介
本文件为OTA固件管理API的完整RESTful接口文档,涵盖固件版本管理的HTTP方法、URL模式、请求/响应格式以及文件上传处理流程。内容包括:
- 固件版本列表查询、详情获取、创建、更新、删除接口
- 设备端最新版本检查接口
- 设备端"最新版本检查"接口
- 文件上传(Luxsin-X8上传至S3Luxsin-X9保存到本地目录)
- 存储服务配置与使用示例
- 固件版本比较、强制更新策略与兼容性检查机制
- 下载链接生成、版本升级通知与错误处理实现指南
- **新增**:Beta版本支持与灰度发布管理功能
## 项目结构
后端采用Express + Sequelize + MySQL架构,前端基于Vue3 + Element Plus。OTA相关逻辑集中在路由、模型、服务层与验证器中,并通过统一响应封装返回。
@@ -65,20 +73,20 @@ STORE --> ENV
```
图表来源
- [backend/src/routes/ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
- [backend/src/routes/ota.js:1-295](file://backend/src/routes/ota.js#L1-L295)
- [frontend/src/api/ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
- [frontend/src/views/ota/index.vue:1-1068](file://frontend/src/views/ota/index.vue#L1-L1068)
章节来源
- [backend/src/routes/ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
- [backend/src/routes/ota.js:1-295](file://backend/src/routes/ota.js#L1-L295)
- [frontend/src/api/ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
- [frontend/src/views/ota/index.vue:1-1068](file://frontend/src/views/ota/index.vue#L1-L1068)
## 核心组件
- 路由层:定义所有OTA相关HTTP接口,包含设备端最新版本检查和后台管理接口。
- 路由层:定义所有OTA相关HTTP接口,包含设备端"最新版本检查"和后台管理接口。
- 认证中间件:保护后台接口,要求Bearer Token。
- 参数校验:使用Zod对创建/更新请求体进行严格校验。
- 数据模型:Sequelize定义的OTA表结构,包含版本号、MD5、强制更新、定向灰度、时间窗口等字段。
- 参数校验:使用Zod对创建/更新请求体进行严格校验,支持beta字段验证
- 数据模型:Sequelize定义的OTA表结构,包含版本号、MD5、强制更新、定向灰度、时间窗口等字段**新增beta字段支持**
- 存储服务:根据设备型号选择不同存储路径(S3或本地),并生成公开下载链接。
- 响应封装:统一封装成功/错误/无数据三类响应格式。
@@ -117,7 +125,7 @@ Router->>Logger : 记录查询结果
## 详细组件分析
### 设备端最新版本检查
### 设备端"最新版本检查"
- 方法与路径:GET /api/ota/latest/check
- 请求参数:
- currentVerCode: 当前设备版本号(整数)
@@ -145,10 +153,13 @@ Router->>Logger : 记录查询结果
- verName: 模糊匹配版本名称
- model: 模糊匹配设备型号
- status: 状态(0/1
- **beta: 灰度状态筛选(0/1**
- 响应:分页数据(items、total、skip、limit
**更新** 新增beta参数支持,可按灰度状态筛选版本列表
章节来源
- [backend/src/routes/ota.js:107-143](file://backend/src/routes/ota.js#L107-L143)
- [backend/src/routes/ota.js:107-145](file://backend/src/routes/ota.js#L107-L145)
#### 获取指定OTA详情
- 方法与路径:GET /api/ota/:ota_id
@@ -156,12 +167,12 @@ Router->>Logger : 记录查询结果
- 响应:单条记录或无数据
章节来源
- [backend/src/routes/ota.js:145-160](file://backend/src/routes/ota.js#L145-L160)
- [backend/src/routes/ota.js:147-162](file://backend/src/routes/ota.js#L147-L162)
#### 创建OTA版本
- 方法与路径:POST /api/ota/
- 请求体字段(必填/可选见校验规则):
- verCode: 整数(唯一性约束:同model下不可重复)
- verCode: 整数(**唯一性约束:同model+beta下不可重复**
- verName: 字符串(1~20
- url: 字符串(下载地址或上传后生成的URL)
- md5: 32位十六进制字符串
@@ -170,13 +181,15 @@ Router->>Logger : 记录查询结果
- model: 设备型号(可空)
- hw: 硬件版本号(默认0
- target: 是否定向(0/1,默认0
- beta: 是否灰度(0/1,默认0
- **beta: 是否灰度(0/1,默认0**
- startTime/endTime: 时间字符串(可空)
- status: 状态(0/1,默认1
- 响应:创建成功的记录
**更新** 版本唯一性约束已更新为'verCode + model + beta'组合,允许同一设备型号下存在多个不同beta状态的版本
章节来源
- [backend/src/routes/ota.js:162-194](file://backend/src/routes/ota.js#L162-L194)
- [backend/src/routes/ota.js:164-196](file://backend/src/routes/ota.js#L164-L196)
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
@@ -185,11 +198,13 @@ Router->>Logger : 记录查询结果
- 请求体字段:同创建接口(部分字段可为空表示不更新)
- 响应:更新后的记录
- 注意:
- 若更新版本号设备型号,需保证新的组合在同model下唯一
- **若更新版本号设备型号或灰度状态,需保证新的组合在同model+beta下唯一**
- 日期字段会自动转换为Date类型
**更新** 版本冲突检查逻辑已更新,现在考虑beta字段参与唯一性验证
章节来源
- [backend/src/routes/ota.js:196-247](file://backend/src/routes/ota.js#L196-L247)
- [backend/src/routes/ota.js:198-250](file://backend/src/routes/ota.js#L198-L250)
- [backend/src/validators/ota.js:19-33](file://backend/src/validators/ota.js#L19-L33)
#### 删除OTA版本
@@ -197,7 +212,7 @@ Router->>Logger : 记录查询结果
- 响应:删除成功消息
章节来源
- [backend/src/routes/ota.js:249-268](file://backend/src/routes/ota.js#L249-L268)
- [backend/src/routes/ota.js:252-271](file://backend/src/routes/ota.js#L252-L271)
### 文件上传与存储
@@ -255,14 +270,18 @@ Router-->>Client : 成功响应
- 前端API模块提供:
- 列表、详情、创建、更新、删除、上传包等方法
- OTA页面视图:
- 支持搜索(版本名、设备型号、状态、版本号)
- 支持搜索(版本名、设备型号、状态、版本号、**灰度状态**
- 分页与表格展示
- **新增beta筛选下拉框,支持按灰度状态过滤**
- **实现基于(model, beta)组合的最新版本标识显示**
- 上传升级包(X8/X9)并回填URL与MD5
- 表单校验与提交
**更新** 前端新增beta筛选功能和智能最新版本标识显示逻辑
章节来源
- [frontend/src/api/ota.js:1-68](file://frontend/src/api/ota.js#L1-L68)
- [frontend/src/views/ota/index.vue:1-628](file://frontend/src/views/ota/index.vue#L1-L628)
- [frontend/src/views/ota/index.vue:1-1068](file://frontend/src/views/ota/index.vue#L1-L1068)
## 依赖关系分析
@@ -317,7 +336,7 @@ OtaRoute --> ApiResponse : "统一响应"
```
图表来源
- [backend/src/routes/ota.js:1-292](file://backend/src/routes/ota.js#L1-L292)
- [backend/src/routes/ota.js:1-295](file://backend/src/routes/ota.js#L1-L295)
- [backend/src/middleware/auth.js:1-36](file://backend/src/middleware/auth.js#L1-L36)
- [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25)
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
@@ -326,13 +345,14 @@ OtaRoute --> ApiResponse : "统一响应"
## 性能考量
- 列表查询限制每页最大1000条,避免一次性返回过多数据。
- 最新版本检查接口按verCode降序查询第一条,索引建议:
- "最新版本检查"接口按verCode降序查询第一条,索引建议:
- 在verCode、model、status上建立复合索引以提升查询效率。
- **建议增加beta字段的索引以优化灰度版本筛选查询**。
- 文件上传使用内存存储(multer.memoryStorage),大文件可能影响内存占用,建议:
- 控制上传文件大小与超时时间(前端已设置较长超时)。
- 对于X8大文件,优先考虑流式上传或分片上传策略(当前实现为一次性上传)。
[本节为通用性能建议,不直接分析具体文件]
**更新** 建议为beta字段添加数据库索引以优化灰度版本筛选性能
## 故障排查指南
- 认证失败(401):
@@ -340,24 +360,28 @@ OtaRoute --> ApiResponse : "统一响应"
- 确认Token未过期
- 参数校验失败:
- 按照Zod校验规则修正请求体字段(长度、类型、取值范围)
- 版本冲突:
- 创建/更新时若verCodemodel组合重复,会返回该版本已存在
- **版本冲突**
- **创建/更新时若verCodemodel和beta组合重复,会返回"该版本已存在(相同版本+灰度状态)"**
- **确保在同一设备型号和灰度状态下版本号的唯一性**
- S3上传失败:
- 检查AWS_REGION、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY与AWS_S3_OTA_BUCKET配置
- 确认S3权限与存储桶存在
- 无可用版本:
- 设备端查询不到更高版本时返回无数据,确认目标设备型号、硬件版本与状态
- 设备端查询不到更高版本时返回"无数据",确认目标设备型号、硬件版本与状态
**更新** 版本冲突错误信息已更新,明确说明需要检查verCode + model + beta组合的唯一性
章节来源
- [backend/src/middleware/auth.js:1-36](file://backend/src/middleware/auth.js#L1-L36)
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
- [backend/src/routes/ota.js:174-181](file://backend/src/routes/ota.js#L174-L181)
- [backend/src/routes/ota.js:176-183](file://backend/src/routes/ota.js#L176-L183)
- [backend/src/routes/ota.js:223-231](file://backend/src/routes/ota.js#L223-L231)
- [backend/src/services/otaStorage.js:72-103](file://backend/src/services/otaStorage.js#L72-L103)
## 结论
本OTA固件API提供了完善的版本管理能力,支持设备端最新版本检查与后台管理功能,结合S3与本地存储策略满足不同设备型号的升级包分发需求。通过严格的参数校验与统一响应封装,提升了接口的稳定性与易用性。建议在生产环境中完善索引、优化大文件上传策略,并加强S3权限与监控告警。
本OTA固件API提供了完善的版本管理能力,支持设备端"最新版本检查"与后台管理功能,结合S3与本地存储策略满足不同设备型号的升级包分发需求。**新增的beta版本支持功能使得系统能够管理同一设备型号下的多个灰度版本,提升了版本发布的灵活性和可控性**。通过严格的参数校验与统一响应封装,提升了接口的稳定性与易用性。建议在生产环境中完善索引、优化大文件上传策略,并加强S3权限与监控告警。
[本节为总结性内容,不直接分析具体文件]
**更新** 系统现已支持完整的灰度发布管理,允许在同一设备型号下并行管理稳定版和测试版固件。
## 附录
@@ -373,16 +397,38 @@ OtaRoute --> ApiResponse : "统一响应"
- 版本比较:仅返回verCode大于当前版本且状态为可用的最高版本
- 强制更新:由force字段控制,客户端据此决定是否强制升级
- 定向/灰度:target/beta字段可用于控制发布范围
- **新版本管理**:系统支持同一设备型号下存在多个不同beta状态的版本,每个(beta, model)组合都有独立的最新版本标识
**更新** 最新版本标识逻辑已更新,现在基于(model, beta)组合来计算和显示latest标签
章节来源
- [backend/src/routes/ota.js:77-89](file://backend/src/routes/ota.js#L77-L89)
- [backend/src/models/Ota.js:33-66](file://backend/src/models/Ota.js#L33-L66)
- [frontend/src/views/ota/index.vue:428-443](file://frontend/src/views/ota/index.vue#L428-L443)
### 前端调用示例(参考)
- 列表查询:传入skip、limit、verName、model、status、verCode
- 列表查询:传入skip、limit、verName、model、status、verCode、**beta**
- 上传包:构造FormData,包含package_file与model,设置Content-Type为multipart/form-data
- 提交表单:根据设备型号决定是否需要先上传包再填写URL/MD5
- **beta筛选**:在searchForm中添加beta字段,值为0或1进行灰度状态筛选
**更新** 前端API调用示例已更新,包含beta参数的使用方法
章节来源
- [frontend/src/api/ota.js:13-67](file://frontend/src/api/ota.js#L13-L67)
- [frontend/src/views/ota/index.vue:420-449](file://frontend/src/views/ota/index.vue#L420-L449)
- [frontend/src/views/ota/index.vue:412-418](file://frontend/src/views/ota/index.vue#L412-L418)
- [frontend/src/views/ota/index.vue:597-599](file://frontend/src/views/ota/index.vue#L597-L599)
### Beta版本管理特性
- **版本唯一性**:同一设备型号下,相同版本号但不同beta状态的版本可以共存
- **灰度发布**:通过beta字段控制版本是否为灰度版本(0=否,1=是)
- **智能标识**:前端自动计算并显示每个(model, beta)组合下的最新版本标签
- **筛选功能**:支持按beta状态筛选版本列表,便于管理不同发布阶段的版本
**新增** Beta版本管理功能的详细说明
章节来源
- [backend/src/routes/ota.js:176-183](file://backend/src/routes/ota.js#L176-L183)
- [backend/src/routes/ota.js:218-231](file://backend/src/routes/ota.js#L218-L231)
- [frontend/src/views/ota/index.vue:428-443](file://frontend/src/views/ota/index.vue#L428-L443)
- [frontend/src/views/ota/index.vue:35-45](file://frontend/src/views/ota/index.vue#L35-L45)