14 KiB
14 KiB
型号管理API
**本文档引用的文件** - [backend/src/routes/models.js](file://backend/src/routes/models.js) - [backend/src/models/Model.js](file://backend/src/models/Model.js) - [backend/src/validators/model.js](file://backend/src/validators/model.js) - [backend/src/utils/response.js](file://backend/src/utils/response.js) - [backend/src/middleware/auth.js](file://backend/src/middleware/auth.js) - [frontend/src/api/model.js](file://frontend/src/api/model.js) - [backend/src/models/Ota.js](file://backend/src/models/Ota.js) - [backend/src/routes/ota.js](file://backend/src/routes/ota.js)目录
简介
本文件为型号管理API的详细RESTful API文档,覆盖型号的CRUD操作、查询筛选与排序、数据验证规则,以及与OTA固件的一对多关联关系与级联操作。文档同时提供前端调用示例与后端实现细节,帮助开发者快速集成与维护。
项目结构
型号管理API位于后端Express应用中,采用模块化设计:
- 路由层:集中于 models.js,提供型号的增删改查、搜索推送、频响文件处理等接口
- 模型层:Model.js 定义数据库表结构
- 验证层:model.js 使用Zod进行请求体验证
- 工具层:response.js 统一响应格式
- 中间件:auth.js 提供鉴权保护
- 前端封装:frontend/src/api/model.js 提供HTTP调用封装
graph TB
FE["前端应用<br/>frontend/src/api/model.js"] --> R["路由层<br/>backend/src/routes/models.js"]
R --> M["模型层<br/>backend/src/models/Model.js"]
R --> V["验证层<br/>backend/src/validators/model.js"]
R --> U["工具层<br/>backend/src/utils/response.js"]
R --> A["中间件<br/>backend/src/middleware/auth.js"]
R -. 关联 .-> OTA["OTA模型<br/>backend/src/models/Ota.js"]
图表来源
- backend/src/routes/models.js:1-569
- backend/src/models/Model.js:1-53
- backend/src/validators/model.js:1-22
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:1-36
- frontend/src/api/model.js:1-151
- backend/src/models/Ota.js:1-97
章节来源
- backend/src/routes/models.js:1-569
- backend/src/models/Model.js:1-53
- backend/src/validators/model.js:1-22
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:1-36
- frontend/src/api/model.js:1-151
- backend/src/models/Ota.js:1-97
核心组件
- 路由控制器:models.js 提供型号的列表查询、详情获取、创建、更新、删除、搜索推送、频响文件上传与查询等接口
- 数据模型:Model.js 定义型号字段及约束
- 请求验证:model.js 使用Zod Schema进行创建/更新的输入校验
- 统一响应:response.js 提供统一的响应结构
- 鉴权中间件:auth.js 实现Bearer Token鉴权
- 前端封装:frontend/src/api/model.js 提供HTTP调用封装
章节来源
- backend/src/routes/models.js:133-181
- backend/src/models/Model.js:4-50
- backend/src/validators/model.js:3-19
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
- frontend/src/api/model.js:13-150
架构概览
型号管理API采用分层架构,路由层负责HTTP协议与参数解析,模型层负责数据持久化,验证层确保输入合法性,工具层统一输出格式,中间件提供安全控制。
sequenceDiagram
participant C as "客户端"
participant R as "路由(models.js)"
participant V as "验证(model.js)"
participant M as "模型(Model.js)"
participant U as "响应(response.js)"
participant A as "鉴权(auth.js)"
C->>R : "HTTP请求"
R->>A : "鉴权检查"
A-->>R : "通过/拒绝"
R->>V : "请求体验证"
V-->>R : "验证结果"
R->>M : "数据库操作"
M-->>R : "结果"
R->>U : "封装响应"
U-->>C : "统一响应"
图表来源
- backend/src/routes/models.js:307-361
- backend/src/validators/model.js:3-19
- backend/src/models/Model.js:4-50
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
详细组件分析
型号数据模型
型号实体包含以下字段:
- id:自增主键
- brand_name:品牌名称(必填,最大100字符)
- name:型号名称(必填,最大100字符)
- form:佩戴方式(可选,最大100字符)
- rig:阻抗(可选,最大100字符)
- source:来源(可选,最大100字符)
- eq_key:EQ键(可选,最大255字符)
- create_at:创建时间(默认当前时间)
erDiagram
MODEL {
int id PK
string brand_name
string name
string form
string rig
string source
string eq_key
datetime create_at
}
图表来源
章节来源
型号参数验证规则
- 创建请求体验证:
- brand_name:字符串,长度1-100
- name:字符串,长度1-100
- form/rig/source/eq_key:字符串,最大长度分别为100、100、100、255,可为空
- 更新请求体验证:
- 字段同上,但允许部分字段为空(表示不更新)
章节来源
型号CRUD接口
1) 型号列表查询
- 方法与路径:GET /api/models/
- 认证:需要登录(Bearer Token)
- 查询参数:
- skip:跳过数量,默认0
- limit:返回数量,默认100,上限1000
- brand_name:品牌名称(模糊匹配)
- name:型号名称(模糊匹配)
- sort_by:排序字段,id 或 create_at,默认id
- sort_order:asc 或 desc,默认desc
- 成功响应:包含items、total、skip、limit的分页数据
- 异常响应:统一错误码与消息
章节来源
- backend/src/routes/models.js:133-181
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
2) 型号详情获取
- 方法与路径:GET /api/models/:model_id
- 认证:需要登录
- 路径参数:model_id(整数)
- 成功响应:型号基础字段
- 异常响应:未找到或通用错误
章节来源
- backend/src/routes/models.js:280-304
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
3) 型号创建
- 方法与路径:POST /api/models/
- 认证:需要登录
- 内容类型:multipart/form-data
- 表单字段:
- measurement_file:频响文件(CSV/TXT/JSON),可选
- brand_name、name、form、rig、source、eq_key
- 文件处理:
- TXT文件自动转换为CSV
- 仅允许.csv、.txt、.json
- 上传至S3,键值包含source、form、brand_name、name
- 成功响应:创建后的型号信息
- 异常响应:重复、格式不支持、通用错误
章节来源
- backend/src/routes/models.js:306-361
- backend/src/validators/model.js:3-10
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
4) 型号更新
- 方法与路径:PUT /api/models/:model_id
- 认证:需要登录
- 内容类型:multipart/form-data
- 路径参数:model_id(整数)
- 表单字段:同创建,支持部分字段更新(传入'null'表示保持原值)
- 文件处理:同创建,若上传需提供source与form
- 成功响应:更新后的型号信息
- 异常响应:未找到、重复、格式不支持、通用错误
章节来源
- backend/src/routes/models.js:363-436
- backend/src/validators/model.js:12-19
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
5) 型号删除
- 方法与路径:DELETE /api/models/:model_id
- 认证:需要登录
- 路径参数:model_id(整数)
- 删除流程:
- 先从Meilisearch删除对应文档
- 再删除数据库记录
- 成功响应:删除成功
- 异常响应:未找到、Meilisearch删除失败、通用错误
章节来源
- backend/src/routes/models.js:438-464
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:3-26
型号搜索、过滤与排序
- 支持按品牌名称与型号名称进行模糊过滤
- 支持按id或create_at排序,升序/降序
- 分页参数:skip、limit(上限1000)
章节来源
型号与OTA固件的一对多关联
- 关联字段:OTA模型中的model字段用于标识对应设备型号
- 查询示例:可通过OTA路由按model字段过滤
- 级联建议:删除型号前应清理或迁移相关OTA记录,避免悬挂引用
erDiagram
MODEL ||--o{ OTA : "一对多"
MODEL {
int id PK
string brand_name
string name
}
OTA {
int id PK
int verCode
string verName
string model
}
图表来源
章节来源
Meilisearch搜索推送与校验
- 校验接口:POST /api/models/push-to-search/validate
- 输入:model_ids数组
- 输出:通过校验的型号数量或具体校验失败项
- 推送接口:POST /api/models/push-to-search
- 输入:model_ids数组
- 输出:推送成功数量、任务ID与推送数据
章节来源
频响文件上传与查询
- 上传:POST /api/models/(multipart/form-data),支持TXT自动转换为CSV
- 查询:GET /api/models/:model_id/measurement(仅Eafonyoung来源且存在form时可用)
章节来源
EQ缓存与Meilisearch文档查询
- 获取Redis EQ缓存键:GET /api/models/:model_id/eq-cache
- 获取指定Hash Field:GET /api/models/:model_id/eq-cache/field?key=...
- 查询Meilisearch推送状态:GET /api/models/:model_id/meilisearch
章节来源
依赖分析
- 路由依赖:models.js 依赖Model模型、Zod验证器、响应工具、鉴权中间件,并与Meilisearch、S3服务交互
- 模型依赖:Model.js 依赖Sequelize ORM
- 前端依赖:frontend/src/api/model.js 依赖通用请求封装
graph LR
R["models.js"] --> M["Model.js"]
R --> V["model.js(Zod)"]
R --> U["response.js"]
R --> A["auth.js"]
R -. 外部 .-> MS["Meilisearch"]
R -. 外部 .-> S3["S3存储"]
图表来源
- backend/src/routes/models.js:1-569
- backend/src/models/Model.js:1-53
- backend/src/validators/model.js:1-22
- backend/src/utils/response.js:1-25
- backend/src/middleware/auth.js:1-36
章节来源
性能考虑
- 分页限制:列表查询limit上限为1000,避免一次性返回过多数据
- Meilisearch超时:查询与删除文档设置超时,防止阻塞
- 文件上传:内存存储multer,建议在高并发场景下优化为流式处理或外部对象存储直传
- 验证前置:使用Zod在进入数据库操作前完成字段校验,减少无效请求
故障排除指南
- 401 未登录/无效凭证:检查Authorization头是否为Bearer Token且有效
- 403 需要超级管理员权限:确认用户角色
- 404 未找到资源:确认model_id是否存在
- 重复型号:创建/更新时如提示品牌+型号已存在,请调整参数
- 文件格式不支持:仅允许.csv、.txt、.json,TXT会自动转换为CSV
- Meilisearch异常:检查服务连通性与API密钥
章节来源
- backend/src/middleware/auth.js:3-26
- backend/src/routes/models.js:314-317
- backend/src/routes/models.js:322-325
- backend/src/routes/models.js:450-455
结论
型号管理API提供了完善的CRUD能力、灵活的查询过滤与排序、严格的输入验证、以及与搜索与存储系统的集成。结合OTA模型的关联关系,可支撑从型号到固件升级的完整业务闭环。建议在生产环境中关注分页与超时配置、文件上传性能与安全策略,并在删除型号前做好OTA关联清理。