优化体验,修复 bug

This commit is contained in:
eafonyang
2026-07-09 10:33:19 +08:00
parent e2577ff661
commit b4926ba148
21 changed files with 1196 additions and 260 deletions
@@ -0,0 +1,9 @@
schema_version: 1
module_path: backend
title: 音频设备管理后端 API
scope:
- backend/
source_files: []
depends_on: []
related_to:
- path: frontend
@@ -0,0 +1,5 @@
- **运行时与框架**Node.js 22 (Alpine), Express.js v4。
- **数据持久化**MySQL (via `mysql2` and `sequelize` ORM)。
- **缓存与搜索**Redis (via `ioredis` for EQ cache), Meilisearch (via `axios` for model search)。
- **文件存储**AWS S3 (via `@aws-sdk/client-s3` for OTA packages and measurement files)。
- **工具库**`jsonwebtoken` (JWT), `zod` (Schema 验证), `multer` (文件上传), `winston` (日志)。
@@ -0,0 +1,5 @@
- **分层架构**:采用经典的 MVC 模式,`routes/` 处理 HTTP 请求与响应,`models/` (Sequelize) 定义数据模型,`services/` 封装外部存储(S3, Redis)和业务逻辑。
- **入口与初始化**`src/app.js` 为应用入口,负责加载环境变量、同步数据库表结构 (`sequelize.sync()`) 并引导创建超级管理员 (`userBootstrap`)。
- **路由组织**`src/routes/index.js` 汇总所有业务路由(auth, brands, models, ota 等),通过 Express 中间件机制挂载。
- **认证机制**`middleware/auth.js` 实现基于 JWT 的身份验证,支持普通用户登录与超级管理员权限校验 (`requireSuperAdmin`)。
- **外部集成**:通过 `services/` 目录下的模块与 AWS S3 (文件存储)、Redis (EQ 缓存)、Meilisearch (搜索索引) 及远程曲线服务进行交互。
@@ -0,0 +1 @@
提供耳机品牌、型号、OTA 升级及用户管理的 RESTful API,集成 MySQL、Redis、S3 和 Meilisearch。
@@ -0,0 +1,3 @@
- **依赖管理**:使用 `pnpm` 作为包管理器 (`packageManager: pnpm@11.5.2`),安装命令为 `pnpm install --frozen-lockfile`
- **启动脚本**:提供 `start.sh`, `stop.sh`, `restart.sh` 用于进程管理;Docker 镜像基于 `node:22-alpine` 构建。
- **环境引导**:首次启动时会自动执行 `ensureBootstrapSuperAdmin`,若数据库无用户则根据环境变量 `DASHBOARD_ADMIN_USERNAME/PASSWORD` 创建初始超级管理员。
@@ -0,0 +1,4 @@
- 统一响应格式:所有 API 均通过 `utils/response.js` 中的 `ApiResponse` 对象返回标准化 JSON,包含 `code` (1:成功, 0:错误, 2:无数据), `msg``data` 字段。
- 集中式日志记录:使用 `winston` 配置的 `logger` 记录关键业务操作(如登录、创建/更新/删除资源)及错误信息,日志输出至 `logs/app.log`
- 路由级认证保护:受保护的路由组(如 brands, models, ota)在路由文件顶部通过 `router.use(authMiddleware)` 全局启用 JWT 验证,仅公开接口(如 `/health`, `/api/ota/latest/check`)例外。
- 参数空值处理:在更新操作中,显式检查请求体字段是否为 `undefined``'null'` 字符串,以区分“未提供”与“设为空”,避免意外覆盖现有数据。