# OTA固件管理 **本文档引用的文件** - [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) ## 更新摘要 **所做更改** - 新增黑名单管理功能模块,支持设备黑名单维护 - 新增目标设备升级功能,支持定向升级控制 - 扩展OTA版本检查流程,增加黑名单和定向设备过滤逻辑 - 更新前端管理界面,新增黑名单和定向升级管理页面 - 增强OTA版本管理的完整性和安全性 ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 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构建。整体结构清晰,职责分离明确。 ```mermaid graph TB subgraph "前端" FE_OtaView["OTA视图
frontend/src/views/ota/index.vue"] FE_BlackListView["黑名单视图
frontend/src/views/blacklist/index.vue"] FE_TargetDeviceView["目标设备视图
frontend/src/views/ota-target-device/index.vue"] FE_OtaAPI["OTA API封装
frontend/src/api/ota.js"] FE_BlackListAPI["黑名单API封装
frontend/src/api/blacklist.js"] FE_TargetDeviceAPI["目标设备API封装
frontend/src/api/otaTargetDevice.js"] end subgraph "后端" BE_Router["OTA路由
backend/src/routes/ota.js"] BE_BlackListRouter["黑名单路由
backend/src/routes/blacklist.js"] BE_TargetDeviceRouter["目标设备路由
backend/src/routes/otaTargetDevice.js"] BE_Model["OTA模型
backend/src/models/Ota.js"] BE_BlackListModel["黑名单模型
backend/src/models/BlackList.js"] BE_TargetDeviceModel["目标设备模型
backend/src/models/OtaTargetDevice.js"] BE_Validator["OTA校验器
backend/src/validators/ota.js"] BE_BlackListValidator["黑名单校验器
backend/src/validators/blacklist.js"] BE_TargetDeviceValidator["目标设备校验器
backend/src/validators/otaTargetDevice.js"] BE_Storage["OTA存储服务
backend/src/services/otaStorage.js"] BE_Utils["响应工具
backend/src/utils/response.js"] BE_DB["数据库配置
backend/src/config/database.js"] BE_ENV["环境配置
backend/src/config/env.js"] end 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) ## 核心组件 系统的核心组件包括: - **OTA模型**:定义固件版本的数据结构和约束 - **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 participant Client as "客户端" participant Frontend as "前端界面" participant Backend as "后端API" participant Storage as "存储服务" participant DB as "数据库" Client->>Frontend : 访问OTA管理页面 Frontend->>Backend : 获取OTA版本列表 Backend->>DB : 查询版本记录 DB-->>Backend : 返回版本数据 Backend-->>Frontend : 响应JSON数据 Frontend->>Backend : 上传升级包(Luxsin-X8/X9) Backend->>Storage : 保存文件 Storage-->>Backend : 返回访问URL Backend-->>Frontend : 响应上传结果 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) ## 详细组件分析 ### OTA模型设计 OTA模型定义了完整的固件版本数据结构,包含版本标识、文件信息、更新策略等关键字段。 ```mermaid erDiagram 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 } MODEL { int id PK varchar brand_name varchar name varchar form varchar rig 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/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`:版本号(整数),用于排序和比较 - `verName`:版本名称,最多20字符 - `url`:升级包下载URL - `md5`:文件MD5校验值,32位十六进制 - `force`:是否强制更新(0-否,1-是) - `model`:对应的设备型号 - `hw`:硬件版本号 - `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) ### 文件上传与存储策略 系统针对不同设备型号采用差异化的存储策略: ```mermaid flowchart TD Start([开始上传]) --> CheckModel["检查设备型号"] CheckModel --> IsX8{"是否Luxsin-X8?"} IsX8 --> |是| UploadS3["上传到S3"] IsX8 --> |否| CheckX9{"是否Luxsin-X9?"} CheckX9 --> |是| SaveLocal["保存到本地"] CheckX9 --> |否| Error["不支持的型号"] UploadS3 --> GenS3Key["生成S3 Key"] GenS3Key --> UploadOK{"上传成功?"} UploadOK --> |是| BuildUrlS3["构建公共URL"] UploadOK --> |否| S3Error["S3上传失败"] SaveLocal --> GenDir["生成目录结构"] GenDir --> WriteFile["写入文件"] WriteFile --> BuildUrlLocal["构建本地URL"] BuildUrlS3 --> Success([返回结果]) BuildUrlLocal --> Success S3Error --> Error Error --> End([结束]) ``` **图表来源** - [backend/src/routes/ota.js:24-66](file://backend/src/routes/ota.js#L24-L66) - [backend/src/services/otaStorage.js:72-103](file://backend/src/services/otaStorage.js#L72-L103) **存储策略详情**: - **Luxsin-X8(S3存储)**: - 文件名固定:`LUXSIN_X8.PKG` - 存储路径:`ota/{YYYYMM}/x8/{md5前5位}/LUXSIN_X8.PKG` - 访问URL:基于S3 Bucket的公共域名 - 凭证配置:支持显式凭证或IAM角色 - **Luxsin-X9(本地存储)**: - 文件名固定:`LUXSIN.PKG` - 存储路径:`ota/{YYYYMM}/x9/{md5前5位}/LUXSIN.PKG` - 访问URL:基于配置的基础URL - 环境区分:开发环境使用临时目录,生产环境使用/data/projects/source **章节来源** - [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113) ### OTA版本检查流程 设备端通过`/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&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 : 未找到可用版本时返回空数据 ``` **图表来源** - [backend/src/routes/ota.js:68-102](file://backend/src/routes/ota.js#L68-L102) **查询逻辑**: - 必须满足:`status=1`(可用)、`verCode > 当前版本号` - 支持按`model`和`hw`(硬件版本)过滤 - **新增**:黑名单过滤(mac存在于黑名单表) - **新增**:定向设备过滤(当target=1时,mac必须存在于目标设备表) - 返回最高版本的完整信息 **章节来源** - [backend/src/routes/ota.js:68-102](file://backend/src/routes/ota.js#L68-L102) ### 数据验证与安全 系统使用Zod进行严格的输入验证,确保数据完整性: ```mermaid classDiagram class OtaCreateSchema { +verCode : number +verName : string +url : string +md5 : string +force : number +desc : string +model : string +hw : number +target : number +beta : number +startTime : string +endTime : string +status : number } class OtaUpdateSchema { +verCode : number? +verName : string? +url : string? +md5 : string? +force : number? +desc : string? +model : string? +hw : number? +target : number? +beta : number? +startTime : string? +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) +noData(msg) } 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) **验证规则**: - **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管理界面,支持多种操作,现已集成黑名单和目标设备管理功能: ```mermaid flowchart TD PageLoad[页面加载] --> LoadData[加载OTA列表] LoadData --> RenderTable[渲染表格] AddBtn[新增按钮] --> OpenDialog[打开新增对话框] EditBtn[编辑按钮] --> OpenDialog CopyBtn[复制按钮] --> OpenDialog OpenDialog --> FormInit[初始化表单] FormInit --> CheckModel[检查设备型号] CheckModel --> UploadMode{"是否支持上传?"} UploadMode --> |是| EnableUpload[启用文件上传] UploadMode --> |否| DisableUpload[禁用文件上传] EnableUpload --> UploadFile[选择并上传文件] 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) **主要功能**: - 版本列表查询(支持按版本名、型号、状态、版本号筛选) - 分页加载(每页最多100条记录) - 新增/编辑/删除OTA版本 - 文件上传(支持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) ## 依赖关系分析 ```mermaid graph LR subgraph "外部依赖" Express["Express框架"] Sequelize["Sequelize ORM"] Zod["Zod数据验证"] S3["@aws-sdk/client-s3"] 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) **依赖特点**: - **轻量级**:仅使用必要的核心依赖 - **可扩展**:模块化设计便于功能扩展 - **环境适配**:支持开发/生产环境差异化配置 - **安全性**:内置输入验证和错误处理 - **新增**:黑名单和目标设备功能独立部署,不影响核心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`、`mac`、`mac_addr` - 分页查询限制:最大每页1000条记录 - 条件查询优化:支持多字段组合查询 - **新增**:黑名单和目标设备表建立适当的索引以支持频繁的MAC地址查询 ### 存储优化 - **S3存储**:利用CDN加速,支持断点续传 - **本地存储**:采用目录分片,避免单目录文件过多 - **MD5前缀分片**:按MD5前5位组织文件结构 ### 接口优化 - **缓存友好**:查询参数明确,便于缓存 - **批量操作**:支持分页批量获取 - **错误快速返回**:验证失败立即返回 - **新增**:黑名单和目标设备查询支持按OTA版本批量筛选 ## 故障排除指南 ### 常见问题及解决方案 **1. S3上传失败** - 检查AWS凭证配置 - 验证Bucket权限设置 - 确认网络连接正常 **2. 版本冲突错误** - 确保`verCode`+`model`组合唯一 - 检查是否存在重复版本号 - 避免在同一型号下使用相同版本号 **3. 文件完整性验证失败** - 确认MD5计算正确 - 检查文件传输完整性 - 验证存储路径正确性 **4. 前端上传异常** - 检查文件类型和大小限制 - 确认跨域配置正确 - 验证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解决方案,现在包括更精细的设备控制能力。 ## 附录 ### API接口规范 **版本检查接口** - 方法:GET - 路径:`/api/ota/latest/check` - 参数: - `currentVerCode`:当前版本号(必填) - `model`:设备型号(必填) - `hw`:硬件版本(可选) - `mac`:设备MAC地址(可选,用于黑名单过滤) **版本管理接口** - 列表查询:GET `/api/ota/` - 获取详情:GET `/api/ota/:ota_id` - 创建版本:POST `/api/ota/` - 更新版本:PUT `/api/ota/:ota_id` - 删除版本:DELETE `/api/ota/:ota_id` **文件上传接口** - 上传包:POST `/api/ota/upload-package` - 支持格式:`.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或本地文件系统 - 环境变量: - `DATABASE_*`:数据库连接配置 - `AWS_*`:S3存储配置 - `OTA_*`:OTA存储路径和URL配置 - `APP_ENV`:应用环境(development/production) ### 数据库表结构 - **ota**:OTA版本主表 - **black_list**:黑名单表 - **ota_target_device**:目标设备表 ### 前端路由 - `/ota`:OTA版本管理 - `/blacklist`:黑名单管理 - `/ota-target-device`:目标设备管理