434 lines
10 KiB
Markdown
434 lines
10 KiB
Markdown
# 品牌管理API
|
|
|
|
<cite>
|
|
**本文档引用的文件**
|
|
- [brands.js](file://backend/src/routes/brands.js)
|
|
- [Brand.js](file://backend/src/models/Brand.js)
|
|
- [brand.js](file://backend/src/validators/brand.js)
|
|
- [response.js](file://backend/src/utils/response.js)
|
|
- [app.js](file://backend/src/app.js)
|
|
- [index.js](file://backend/src/routes/index.js)
|
|
- [brand.js](file://frontend/src/api/brand.js)
|
|
</cite>
|
|
|
|
## 目录
|
|
1. [简介](#简介)
|
|
2. [项目结构](#项目结构)
|
|
3. [核心组件](#核心组件)
|
|
4. [架构概览](#架构概览)
|
|
5. [详细组件分析](#详细组件分析)
|
|
6. [依赖关系分析](#依赖关系分析)
|
|
7. [性能考虑](#性能考虑)
|
|
8. [故障排除指南](#故障排除指南)
|
|
9. [结论](#结论)
|
|
|
|
## 简介
|
|
|
|
品牌管理API是一个基于Express.js和Sequelize的RESTful Web服务,用于管理音频设备品牌信息。该API提供了完整的企业级品牌CRUD操作,包括品牌列表查询、单个品牌获取、品牌创建、更新和删除功能。系统采用Zod进行数据验证,确保数据完整性和安全性。
|
|
|
|
## 项目结构
|
|
|
|
品牌管理API采用典型的三层架构设计:
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "前端层"
|
|
FE_API[前端API模块<br/>frontend/src/api/brand.js]
|
|
end
|
|
subgraph "应用层"
|
|
APP[应用入口<br/>backend/src/app.js]
|
|
ROUTES[路由层<br/>backend/src/routes/brands.js]
|
|
MIDDLEWARE[中间件<br/>backend/src/middleware/auth.js]
|
|
end
|
|
subgraph "服务层"
|
|
VALIDATORS[Zod验证器<br/>backend/src/validators/brand.js]
|
|
RESPONSE[响应格式化<br/>backend/src/utils/response.js]
|
|
end
|
|
subgraph "数据层"
|
|
MODELS[模型定义<br/>backend/src/models/Brand.js]
|
|
DATABASE[(MySQL数据库)]
|
|
end
|
|
FE_API --> APP
|
|
APP --> ROUTES
|
|
ROUTES --> MIDDLEWARE
|
|
ROUTES --> VALIDATORS
|
|
ROUTES --> RESPONSE
|
|
ROUTES --> MODELS
|
|
MODELS --> DATABASE
|
|
```
|
|
|
|
**图表来源**
|
|
- [app.js:1-60](file://backend/src/app.js#L1-L60)
|
|
- [brands.js:1-147](file://backend/src/routes/brands.js#L1-L147)
|
|
- [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23)
|
|
|
|
**章节来源**
|
|
- [app.js:1-60](file://backend/src/app.js#L1-L60)
|
|
- [index.js:1-13](file://backend/src/routes/index.js#L1-L13)
|
|
|
|
## 核心组件
|
|
|
|
### 数据模型
|
|
|
|
品牌模型定义了品牌实体的数据结构和约束条件:
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|--------|------|------|------|
|
|
| id | INTEGER | 主键, 自增 | 品牌ID |
|
|
| name | STRING(100) | 唯一, 非空 | 品牌名称 |
|
|
|
|
### 响应格式
|
|
|
|
所有API响应遵循统一的JSON格式:
|
|
|
|
```mermaid
|
|
classDiagram
|
|
class ApiResponse {
|
|
+success(data, msg) Object
|
|
+error(msg, code) Object
|
|
+noData(msg) Object
|
|
}
|
|
class PageData {
|
|
+Array items
|
|
+number total
|
|
+number skip
|
|
+number limit
|
|
+constructor(items, total, skip, limit)
|
|
}
|
|
ApiResponse --> PageData : "返回分页数据"
|
|
```
|
|
|
|
**图表来源**
|
|
- [response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
|
|
|
**章节来源**
|
|
- [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23)
|
|
- [response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
|
|
|
## 架构概览
|
|
|
|
品牌管理API采用MVC架构模式,通过Express.js处理HTTP请求,Sequelize ORM管理数据库操作。
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Client as 客户端
|
|
participant API as Express应用
|
|
participant Auth as 认证中间件
|
|
participant Route as 品牌路由
|
|
participant Validator as Zod验证器
|
|
participant Model as 品牌模型
|
|
participant DB as MySQL数据库
|
|
Client->>API : HTTP请求
|
|
API->>Auth : 验证用户身份
|
|
Auth-->>API : 认证通过
|
|
API->>Route : 路由分发
|
|
Route->>Validator : 数据验证
|
|
Validator-->>Route : 验证结果
|
|
Route->>Model : 数据库操作
|
|
Model->>DB : SQL执行
|
|
DB-->>Model : 查询结果
|
|
Model-->>Route : 模型实例
|
|
Route-->>Client : JSON响应
|
|
```
|
|
|
|
**图表来源**
|
|
- [brands.js:14-147](file://backend/src/routes/brands.js#L14-L147)
|
|
- [brand.js:1-12](file://backend/src/validators/brand.js#L1-L12)
|
|
|
|
## 详细组件分析
|
|
|
|
### 品牌路由层
|
|
|
|
品牌路由实现了完整的CRUD操作,所有接口均需要认证。
|
|
|
|
#### GET /api/brands/ - 品牌列表查询
|
|
|
|
**请求参数:**
|
|
- `skip` (可选): 跳过记录数,默认0
|
|
- `limit` (可选): 返回记录数,默认100,最大1000
|
|
- `name` (可选): 品牌名称模糊查询
|
|
|
|
**响应数据:**
|
|
```javascript
|
|
{
|
|
code: 1,
|
|
msg: "success",
|
|
data: {
|
|
items: [
|
|
{ id: number, name: string }
|
|
],
|
|
total: number,
|
|
skip: number,
|
|
limit: number
|
|
}
|
|
}
|
|
```
|
|
|
|
#### GET /api/brands/:brand_id - 单个品牌获取
|
|
|
|
**路径参数:**
|
|
- `brand_id`: 品牌ID
|
|
|
|
**响应数据:**
|
|
```javascript
|
|
{
|
|
code: 1,
|
|
msg: "success",
|
|
data: { id: number, name: string }
|
|
}
|
|
```
|
|
|
|
#### POST /api/brands/ - 创建品牌
|
|
|
|
**请求体:**
|
|
```javascript
|
|
{
|
|
name: string // 品牌名称,1-100字符
|
|
}
|
|
```
|
|
|
|
**响应数据:**
|
|
```javascript
|
|
{
|
|
code: 1,
|
|
msg: "品牌创建成功",
|
|
data: { id: number, name: string }
|
|
}
|
|
```
|
|
|
|
#### PUT /api/brands/:brand_id - 更新品牌
|
|
|
|
**路径参数:**
|
|
- `brand_id`: 品牌ID
|
|
|
|
**请求体:**
|
|
```javascript
|
|
{
|
|
name?: string // 品牌名称,1-100字符(可选)
|
|
}
|
|
```
|
|
|
|
**响应数据:**
|
|
```javascript
|
|
{
|
|
code: 1,
|
|
msg: "品牌更新成功",
|
|
data: { id: number, name: string }
|
|
}
|
|
```
|
|
|
|
#### DELETE /api/brands/:brand_id - 删除品牌
|
|
|
|
**路径参数:**
|
|
- `brand_id`: 品牌ID
|
|
|
|
**响应数据:**
|
|
```javascript
|
|
{
|
|
code: 1,
|
|
msg: "删除成功",
|
|
data: null
|
|
}
|
|
```
|
|
|
|
**章节来源**
|
|
- [brands.js:14-147](file://backend/src/routes/brands.js#L14-L147)
|
|
|
|
### 数据验证器
|
|
|
|
使用Zod进行类型安全的数据验证:
|
|
|
|
```mermaid
|
|
classDiagram
|
|
class BrandCreateSchema {
|
|
+name : string(min=1, max=100)
|
|
}
|
|
class BrandUpdateSchema {
|
|
+name : string(min=1, max=100)?
|
|
}
|
|
class ZodValidator {
|
|
+safeParse(input) ValidationResult
|
|
+parse(input) ValidatedData
|
|
}
|
|
BrandCreateSchema --|> ZodValidator
|
|
BrandUpdateSchema --|> ZodValidator
|
|
```
|
|
|
|
**图表来源**
|
|
- [brand.js:1-12](file://backend/src/validators/brand.js#L1-L12)
|
|
|
|
**章节来源**
|
|
- [brand.js:1-12](file://backend/src/validators/brand.js#L1-L12)
|
|
|
|
### 前端集成
|
|
|
|
前端提供了完整的API调用封装:
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Vue as Vue组件
|
|
participant API as 品牌API
|
|
participant Backend as 后端服务
|
|
participant DB as 数据库
|
|
Vue->>API : getBrands(params)
|
|
API->>Backend : GET /brands/
|
|
Backend->>DB : 查询品牌列表
|
|
DB-->>Backend : 品牌数据
|
|
Backend-->>API : JSON响应
|
|
API-->>Vue : Promise结果
|
|
Vue->>API : createBrand(data)
|
|
API->>Backend : POST /brands/
|
|
Backend->>DB : 创建品牌
|
|
DB-->>Backend : 新品牌ID
|
|
Backend-->>API : 成功响应
|
|
API-->>Vue : Promise结果
|
|
```
|
|
|
|
**图表来源**
|
|
- [brand.js:10-66](file://frontend/src/api/brand.js#L10-L66)
|
|
|
|
**章节来源**
|
|
- [brand.js:10-66](file://frontend/src/api/brand.js#L10-L66)
|
|
|
|
## 依赖关系分析
|
|
|
|
### 数据库约束关系
|
|
|
|
```mermaid
|
|
erDiagram
|
|
BRAND {
|
|
int id PK
|
|
varchar name UK
|
|
}
|
|
MODEL {
|
|
int id PK
|
|
varchar brand_name
|
|
varchar name
|
|
varchar form
|
|
varchar rig
|
|
varchar source
|
|
varchar eq_key
|
|
datetime create_at
|
|
}
|
|
BRAND ||--o{ MODEL : "一对一关联"
|
|
```
|
|
|
|
**图表来源**
|
|
- [Brand.js:4-20](file://backend/src/models/Brand.js#L4-L20)
|
|
- [Model.js:4-50](file://backend/src/models/Model.js#L4-L50)
|
|
|
|
### 组件依赖图
|
|
|
|
```mermaid
|
|
graph LR
|
|
subgraph "外部依赖"
|
|
EXPRESS[Express.js]
|
|
SEQUELIZE[Sequelize ORM]
|
|
MYSQL[MySQL驱动]
|
|
ZOD[Zod验证库]
|
|
end
|
|
subgraph "内部模块"
|
|
ROUTES[品牌路由]
|
|
MODELS[品牌模型]
|
|
VALIDATORS[验证器]
|
|
RESPONSE[响应格式化]
|
|
AUTH[认证中间件]
|
|
end
|
|
EXPRESS --> ROUTES
|
|
SEQUELIZE --> MODELS
|
|
MYSQL --> SEQUELIZE
|
|
ZOD --> VALIDATORS
|
|
ROUTES --> MODELS
|
|
ROUTES --> VALIDATORS
|
|
ROUTES --> RESPONSE
|
|
ROUTES --> AUTH
|
|
```
|
|
|
|
**图表来源**
|
|
- [brands.js:1-10](file://backend/src/routes/brands.js#L1-L10)
|
|
- [Brand.js:1-2](file://backend/src/models/Brand.js#L1-L2)
|
|
- [brand.js:1-1](file://backend/src/validators/brand.js#L1-L1)
|
|
|
|
**章节来源**
|
|
- [brands.js:1-147](file://backend/src/routes/brands.js#L1-L147)
|
|
- [Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23)
|
|
|
|
## 性能考虑
|
|
|
|
### 分页优化
|
|
- 最大限制:1000条记录
|
|
- 默认限制:100条记录
|
|
- 支持跳过机制避免全表扫描
|
|
|
|
### 数据库优化
|
|
- 品牌名称字段建立唯一索引
|
|
- 使用`findAndCountAll`进行高效分页查询
|
|
- 条件查询支持模糊匹配
|
|
|
|
### 缓存策略
|
|
- 建议在应用层添加Redis缓存
|
|
- 对频繁访问的品牌数据进行缓存
|
|
- 设置合理的TTL过期时间
|
|
|
|
## 故障排除指南
|
|
|
|
### 常见错误码
|
|
|
|
| 错误码 | 描述 | 可能原因 | 解决方案 |
|
|
|--------|------|----------|----------|
|
|
| 0 | error | 服务器内部错误 | 检查服务器日志,确认数据库连接 |
|
|
| 1 | success | 操作成功 | 正常响应,无需处理 |
|
|
| 2 | no data | 无数据 | 检查查询条件或数据是否存在 |
|
|
|
|
### 错误处理流程
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start([请求开始]) --> Validate[参数验证]
|
|
Validate --> Valid{验证通过?}
|
|
Valid --> |否| ReturnError[返回错误响应]
|
|
Valid --> |是| DBOperation[数据库操作]
|
|
DBOperation --> DBSuccess{操作成功?}
|
|
DBSuccess --> |否| HandleError[处理数据库错误]
|
|
DBSuccess --> |是| ReturnSuccess[返回成功响应]
|
|
HandleError --> ReturnError
|
|
ReturnError --> End([请求结束])
|
|
ReturnSuccess --> End
|
|
```
|
|
|
|
**图表来源**
|
|
- [brands.js:36-81](file://backend/src/routes/brands.js#L36-L81)
|
|
|
|
### 调试建议
|
|
1. 检查认证中间件是否正确配置
|
|
2. 验证数据库连接字符串
|
|
3. 确认品牌表结构和约束
|
|
4. 查看服务器日志输出
|
|
|
|
**章节来源**
|
|
- [brands.js:36-147](file://backend/src/routes/brands.js#L36-L147)
|
|
|
|
## 结论
|
|
|
|
品牌管理API提供了完整的企业级品牌数据管理解决方案。系统具有以下特点:
|
|
|
|
### 技术优势
|
|
- **类型安全**: 使用Zod进行编译时类型检查
|
|
- **数据完整性**: 数据库层面的唯一性约束
|
|
- **响应标准化**: 统一的JSON响应格式
|
|
- **错误处理**: 完善的异常捕获和错误响应
|
|
|
|
### 功能特性
|
|
- **完整的CRUD操作**: 支持品牌的增删改查
|
|
- **分页查询**: 高效的大数据量查询
|
|
- **模糊搜索**: 支持品牌名称的模糊匹配
|
|
- **认证保护**: 所有接口均需登录认证
|
|
|
|
### 扩展建议
|
|
1. 添加品牌与型号的一对一关联关系
|
|
2. 实现批量操作接口
|
|
3. 添加排序和过滤选项
|
|
4. 增加数据导入导出功能
|
|
5. 实现审计日志记录
|
|
|
|
该API为音频设备管理系统提供了坚实的基础,可以作为企业级应用的可靠数据服务层。 |