添加 uipro,更新 wiki
This commit is contained in:
@@ -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上传至S3,Luxsin-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校验规则修正请求体字段(长度、类型、取值范围)
|
||||
- 版本冲突:
|
||||
- 创建/更新时若verCode与model组合重复,会返回“该版本已存在”
|
||||
- **版本冲突**:
|
||||
- **创建/更新时若verCode、model和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)
|
||||
Reference in New Issue
Block a user