426 lines
12 KiB
Markdown
426 lines
12 KiB
Markdown
|
|
# 型号管理接口
|
||
|
|
|
||
|
|
<cite>
|
||
|
|
**本文档引用的文件**
|
||
|
|
- [model.go](file://internal/handler/model.go)
|
||
|
|
- [model_list.go](file://internal/handler/model_list.go)
|
||
|
|
- [router.go](file://internal/router/router.go)
|
||
|
|
- [model.go](file://internal/repository/model.go)
|
||
|
|
- [model.go](file://internal/model/model.go)
|
||
|
|
- [meilisearch.go](file://internal/search/meilisearch.go)
|
||
|
|
- [response.go](file://internal/response/response.go)
|
||
|
|
- [base64.go](file://pkg/encode/base64.go)
|
||
|
|
- [model.sql](file://sql/model.sql)
|
||
|
|
- [logger.go](file://internal/middleware/logger.go)
|
||
|
|
- [cors.go](file://internal/middleware/cors.go)
|
||
|
|
- [meilisearch.go](file://internal/config/meilisearch.go)
|
||
|
|
- [README.md](file://README.md)
|
||
|
|
</cite>
|
||
|
|
|
||
|
|
## 目录
|
||
|
|
1. [简介](#简介)
|
||
|
|
2. [项目结构](#项目结构)
|
||
|
|
3. [核心组件](#核心组件)
|
||
|
|
4. [架构概览](#架构概览)
|
||
|
|
5. [详细组件分析](#详细组件分析)
|
||
|
|
6. [依赖关系分析](#依赖关系分析)
|
||
|
|
7. [性能考虑](#性能考虑)
|
||
|
|
8. [故障排除指南](#故障排除指南)
|
||
|
|
9. [结论](#结论)
|
||
|
|
|
||
|
|
## 简介
|
||
|
|
|
||
|
|
本文档详细描述了型号管理接口的完整 API 规范,包括获取型号信息和搜索型号列表两个核心接口。该系统采用 Gin 框架构建,支持 MySQL 数据库和 Meilisearch 全文搜索引擎,提供高性能的型号数据检索能力。
|
||
|
|
|
||
|
|
系统主要功能:
|
||
|
|
- 获取特定品牌或型号的详细信息
|
||
|
|
- 基于关键词的型号搜索
|
||
|
|
- 支持 Base64 响应编码优化传输
|
||
|
|
- 统一的错误处理和日志记录
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
|
||
|
|
应用程序采用清晰的分层架构设计,主要目录结构如下:
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
subgraph "应用层"
|
||
|
|
Handler[处理器层]
|
||
|
|
Router[路由层]
|
||
|
|
Middleware[中间件层]
|
||
|
|
end
|
||
|
|
subgraph "业务逻辑层"
|
||
|
|
Repository[仓储层]
|
||
|
|
Search[搜索服务]
|
||
|
|
end
|
||
|
|
subgraph "数据访问层"
|
||
|
|
Database[(MySQL数据库)]
|
||
|
|
MeiliSearch[(Meilisearch搜索引擎)]
|
||
|
|
end
|
||
|
|
subgraph "工具层"
|
||
|
|
Response[响应格式化]
|
||
|
|
Encode[编码工具]
|
||
|
|
end
|
||
|
|
Handler --> Repository
|
||
|
|
Handler --> Search
|
||
|
|
Router --> Handler
|
||
|
|
Middleware --> Router
|
||
|
|
Repository --> Database
|
||
|
|
Search --> MeiliSearch
|
||
|
|
Handler --> Response
|
||
|
|
Handler --> Encode
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [router.go:14-42](file://internal/router/router.go#L14-L42)
|
||
|
|
- [model.go:14-24](file://internal/handler/model.go#L14-L24)
|
||
|
|
- [model_list.go:14-24](file://internal/handler/model_list.go#L14-L24)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [router.go:14-42](file://internal/router/router.go#L14-L42)
|
||
|
|
- [README.md:5-17](file://README.md#L5-L17)
|
||
|
|
|
||
|
|
## 核心组件
|
||
|
|
|
||
|
|
### 数据模型
|
||
|
|
|
||
|
|
型号实体包含以下字段结构:
|
||
|
|
|
||
|
|
| 字段名 | 类型 | 描述 | 是否可空 |
|
||
|
|
|--------|------|------|----------|
|
||
|
|
| id | int | 型号唯一标识符 | 否 |
|
||
|
|
| brandName | string | 品牌名称 | 否 |
|
||
|
|
| name | string | 型号名称 | 否 |
|
||
|
|
| form | *string | 产品形态 | 是 |
|
||
|
|
| rig | *string | 适用场景 | 是 |
|
||
|
|
| source | *string | 来源信息 | 是 |
|
||
|
|
| eqKey | *string | 等效键值 | 是 |
|
||
|
|
| createAt | time.Time | 创建时间 | 否 |
|
||
|
|
|
||
|
|
### 统一响应格式
|
||
|
|
|
||
|
|
所有 API 响应遵循统一的 JSON 结构:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 0,
|
||
|
|
"message": "ok",
|
||
|
|
"data": {}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
错误响应格式:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"code": 50000,
|
||
|
|
"message": "failed to get model list"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [model.go:5-15](file://internal/model/model.go#L5-L15)
|
||
|
|
- [response.go:9-37](file://internal/response/response.go#L9-L37)
|
||
|
|
|
||
|
|
## 架构概览
|
||
|
|
|
||
|
|
系统采用分层架构,将业务逻辑与数据访问分离:
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Client as 客户端
|
||
|
|
participant Router as 路由器
|
||
|
|
participant Handler as 处理器
|
||
|
|
participant Repo as 仓储层
|
||
|
|
participant DB as MySQL数据库
|
||
|
|
participant Search as 搜索引擎
|
||
|
|
participant Meili as Meilisearch
|
||
|
|
Client->>Router : HTTP请求
|
||
|
|
Router->>Handler : 调用相应处理器
|
||
|
|
alt 获取型号列表
|
||
|
|
Handler->>Repo : List(brandName, modelName)
|
||
|
|
Repo->>DB : 执行SQL查询
|
||
|
|
DB-->>Repo : 返回查询结果
|
||
|
|
Repo-->>Handler : 返回型号列表
|
||
|
|
else 搜索型号列表
|
||
|
|
Handler->>Search : ModelList(key, count)
|
||
|
|
Search->>Meili : 执行全文搜索
|
||
|
|
Meili-->>Search : 返回搜索结果
|
||
|
|
Search-->>Handler : 返回搜索列表
|
||
|
|
end
|
||
|
|
Handler-->>Client : 统一JSON响应
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [router.go:32-38](file://internal/router/router.go#L32-L38)
|
||
|
|
- [model.go:26-50](file://internal/handler/model.go#L26-L50)
|
||
|
|
- [model_list.go:26-56](file://internal/handler/model_list.go#L26-L56)
|
||
|
|
|
||
|
|
## 详细组件分析
|
||
|
|
|
||
|
|
### 获取型号信息接口
|
||
|
|
|
||
|
|
#### 接口规范
|
||
|
|
|
||
|
|
**HTTP 方法**: GET
|
||
|
|
**URL 模式**: `/audio/getModel`
|
||
|
|
**请求参数**:
|
||
|
|
|
||
|
|
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|
||
|
|
|--------|------|------|------|------|
|
||
|
|
| brandName | string | 否 | 品牌名称过滤条件 | sony |
|
||
|
|
| modelName | string | 否 | 型号名称模糊匹配 | wh-1000xm4 |
|
||
|
|
| base64Resp | boolean | 否 | 是否返回Base64编码响应 | true |
|
||
|
|
|
||
|
|
**响应格式**: JSON 数组,每个元素包含完整的型号信息
|
||
|
|
|
||
|
|
#### 处理流程
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
Start([请求进入]) --> ParseParams["解析查询参数<br/>brandName, modelName, base64Resp"]
|
||
|
|
ParseParams --> ValidateParams{"验证参数有效性"}
|
||
|
|
ValidateParams --> |有效| CallRepo["调用仓储层查询"]
|
||
|
|
ValidateParams --> |无效| ReturnError["返回错误响应"]
|
||
|
|
CallRepo --> ExecQuery["执行数据库查询"]
|
||
|
|
ExecQuery --> BuildResult["构建响应数据"]
|
||
|
|
BuildResult --> CheckBase64{"base64Resp为真?"}
|
||
|
|
CheckBase64 --> |是| EncodeBase64["Base64编码响应"]
|
||
|
|
CheckBase64 --> |否| ReturnJSON["直接返回JSON"]
|
||
|
|
EncodeBase64 --> End([响应客户端])
|
||
|
|
ReturnJSON --> End
|
||
|
|
ReturnError --> End
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [model.go:26-50](file://internal/handler/model.go#L26-L50)
|
||
|
|
- [model.go:20-61](file://internal/repository/model.go#L20-L61)
|
||
|
|
|
||
|
|
#### 数据库查询逻辑
|
||
|
|
|
||
|
|
查询支持三种模式:
|
||
|
|
|
||
|
|
1. **按品牌过滤**: `WHERE brand_name = ? ORDER BY name ASC`
|
||
|
|
2. **按型号模糊匹配**: `WHERE name LIKE ? ORDER BY name ASC`
|
||
|
|
3. **无条件查询**: 返回空数组
|
||
|
|
|
||
|
|
查询结果按型号名称升序排列。
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [model.go:26-50](file://internal/handler/model.go#L26-L50)
|
||
|
|
- [model.go:20-61](file://internal/repository/model.go#L20-L61)
|
||
|
|
- [model.sql:24-35](file://sql/model.sql#L24-L35)
|
||
|
|
|
||
|
|
### 搜索型号列表接口
|
||
|
|
|
||
|
|
#### 接口规范
|
||
|
|
|
||
|
|
**HTTP 方法**: GET
|
||
|
|
**URL 模式**: `/audio/modelList`
|
||
|
|
**请求参数**:
|
||
|
|
|
||
|
|
| 参数名 | 类型 | 必填 | 描述 | 默认值 |
|
||
|
|
|--------|------|------|------|--------|
|
||
|
|
| key | string | 是 | 搜索关键词 | - |
|
||
|
|
| count | int | 否 | 返回结果数量限制 | 100 |
|
||
|
|
| base64Resp | boolean | 否 | 是否返回Base64编码响应 | true |
|
||
|
|
|
||
|
|
#### 搜索条件
|
||
|
|
|
||
|
|
搜索支持以下字段的全文检索:
|
||
|
|
- `rig` (适用场景)
|
||
|
|
- `form` (产品形态)
|
||
|
|
- `name` (型号名称)
|
||
|
|
- `brand_name` (品牌名称)
|
||
|
|
- `source` (来源信息)
|
||
|
|
- `eq_key` (等效键值)
|
||
|
|
|
||
|
|
#### 结果排序规则
|
||
|
|
|
||
|
|
搜索结果按照 Meilisearch 的相关性评分排序,最相关的条目排在前面。
|
||
|
|
|
||
|
|
#### 处理流程
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Client as 客户端
|
||
|
|
participant Handler as ModelListHandler
|
||
|
|
participant Search as Search.Client
|
||
|
|
participant Meili as Meilisearch
|
||
|
|
Client->>Handler : GET /audio/modelList?key=&count=
|
||
|
|
Handler->>Handler : 解析查询参数
|
||
|
|
Handler->>Handler : 设置默认count=100
|
||
|
|
Handler->>Search : ModelList(ctx, key, count)
|
||
|
|
Search->>Meili : 执行全文搜索
|
||
|
|
Meili-->>Search : 返回搜索结果
|
||
|
|
Search-->>Handler : 返回命中列表
|
||
|
|
Handler->>Handler : 处理Base64响应
|
||
|
|
Handler-->>Client : 统一JSON响应
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [model_list.go:26-56](file://internal/handler/model_list.go#L26-L56)
|
||
|
|
- [meilisearch.go:22-45](file://internal/search/meilisearch.go#L22-L45)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [model_list.go:26-56](file://internal/handler/model_list.go#L26-L56)
|
||
|
|
- [meilisearch.go:22-45](file://internal/search/meilisearch.go#L22-L45)
|
||
|
|
|
||
|
|
### Base64 响应编码
|
||
|
|
|
||
|
|
系统支持可选的 Base64 响应编码,用于优化传输效率:
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
Start([开始编码]) --> MarshalJSON["序列化为JSON"]
|
||
|
|
MarshalJSON --> StandardBase64["标准Base64编码"]
|
||
|
|
StandardBase64 --> CustomMap["应用自定义字符映射"]
|
||
|
|
CustomMap --> ReturnEncoded["返回编码后的字符串"]
|
||
|
|
subgraph "字符映射表"
|
||
|
|
A["ABCDEFGHIJKLMNOPQRSTUVWXYZ"] --> K["KLMPQRSTUVWXYZABC"]
|
||
|
|
B["abcdefghijklmnopqrstuvwxyz"] --> G["GHdefIJjkNOlmnp"]
|
||
|
|
C["0123456789+"] --> C1["34501289+/"]
|
||
|
|
D["="] --> D1["="]
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [base64.go:21-42](file://pkg/encode/base64.go#L21-L42)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [base64.go:21-52](file://pkg/encode/base64.go#L21-L52)
|
||
|
|
|
||
|
|
## 依赖关系分析
|
||
|
|
|
||
|
|
### 组件依赖图
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
subgraph "外部依赖"
|
||
|
|
Gin[Gin Web框架]
|
||
|
|
MySQL[MySQL驱动]
|
||
|
|
Meili[Meilisearch SDK]
|
||
|
|
Redis[Redis客户端]
|
||
|
|
Zap[Zap日志]
|
||
|
|
end
|
||
|
|
subgraph "内部模块"
|
||
|
|
Router[路由模块]
|
||
|
|
Handler[处理器模块]
|
||
|
|
Repository[仓储模块]
|
||
|
|
Search[搜索模块]
|
||
|
|
Response[响应模块]
|
||
|
|
Encode[编码模块]
|
||
|
|
Config[配置模块]
|
||
|
|
end
|
||
|
|
Router --> Handler
|
||
|
|
Handler --> Repository
|
||
|
|
Handler --> Search
|
||
|
|
Handler --> Response
|
||
|
|
Handler --> Encode
|
||
|
|
Repository --> MySQL
|
||
|
|
Search --> Meili
|
||
|
|
Handler --> Gin
|
||
|
|
Handler --> Zap
|
||
|
|
Config --> Meili
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [router.go:3-12](file://internal/router/router.go#L3-L12)
|
||
|
|
- [model.go:3-12](file://internal/handler/model.go#L3-L12)
|
||
|
|
- [model_list.go:3-12](file://internal/handler/model_list.go#L3-L12)
|
||
|
|
|
||
|
|
### 错误处理机制
|
||
|
|
|
||
|
|
系统采用统一的错误处理策略:
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
Request[HTTP请求] --> Handler[处理器处理]
|
||
|
|
Handler --> TryOperation{尝试操作}
|
||
|
|
TryOperation --> |成功| Success[返回成功响应]
|
||
|
|
TryOperation --> |失败| LogError[记录错误日志]
|
||
|
|
LogError --> ReturnError[返回错误响应]
|
||
|
|
subgraph "错误类型"
|
||
|
|
ValidationError[参数验证错误]
|
||
|
|
DatabaseError[数据库操作错误]
|
||
|
|
SearchError[搜索操作错误]
|
||
|
|
EncodeError[编码操作错误]
|
||
|
|
end
|
||
|
|
TryOperation --> |失败| ValidationError
|
||
|
|
TryOperation --> |失败| DatabaseError
|
||
|
|
TryOperation --> |失败| SearchError
|
||
|
|
TryOperation --> |失败| EncodeError
|
||
|
|
```
|
||
|
|
|
||
|
|
**图表来源**
|
||
|
|
- [response.go:23-37](file://internal/response/response.go#L23-L37)
|
||
|
|
- [logger.go:10-46](file://internal/middleware/logger.go#L10-L46)
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [response.go:23-37](file://internal/response/response.go#L23-L37)
|
||
|
|
- [logger.go:10-46](file://internal/middleware/logger.go#L10-L46)
|
||
|
|
|
||
|
|
## 性能考虑
|
||
|
|
|
||
|
|
### 查询优化建议
|
||
|
|
|
||
|
|
1. **索引优化**
|
||
|
|
- 品牌名称和型号名称已建立唯一索引
|
||
|
|
- 建议在高频查询字段上建立适当索引
|
||
|
|
|
||
|
|
2. **分页处理**
|
||
|
|
- 搜索接口支持 `count` 参数限制返回数量
|
||
|
|
- 建议设置合理的默认值和最大值限制
|
||
|
|
|
||
|
|
3. **缓存策略**
|
||
|
|
- 可考虑在 Redis 中缓存热门查询结果
|
||
|
|
- 对于频繁访问的品牌和型号数据建立缓存层
|
||
|
|
|
||
|
|
4. **连接池管理**
|
||
|
|
- 合理配置数据库连接池大小
|
||
|
|
- 监控连接池使用情况避免过度连接
|
||
|
|
|
||
|
|
### 性能监控
|
||
|
|
|
||
|
|
系统内置日志中间件,自动记录请求状态、延迟和错误信息:
|
||
|
|
|
||
|
|
- **日志级别**: 根据 HTTP 状态码自动分级
|
||
|
|
- **关键指标**: 请求路径、方法、延迟、IP 地址
|
||
|
|
- **错误追踪**: 自动记录异常和错误详情
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [logger.go:10-46](file://internal/middleware/logger.go#L10-L46)
|
||
|
|
- [model.sql:34](file://sql/model.sql#L34)
|
||
|
|
|
||
|
|
## 故障排除指南
|
||
|
|
|
||
|
|
### 常见问题及解决方案
|
||
|
|
|
||
|
|
| 问题类型 | 症状 | 可能原因 | 解决方案 |
|
||
|
|
|----------|------|----------|----------|
|
||
|
|
| 数据库连接失败 | HTTP 500 错误 | 数据库配置错误 | 检查 DATABASE_* 环境变量 |
|
||
|
|
| 搜索服务不可用 | 搜索接口超时 | Meilisearch 服务离线 | 检查 MEILISEARCH_HOST 和 API Key |
|
||
|
|
| 参数验证失败 | HTTP 400 错误 | 请求参数格式不正确 | 验证必需参数和数据类型 |
|
||
|
|
| 编码错误 | 响应内容乱码 | Base64 编码失败 | 检查 JSON 序列化和编码过程 |
|
||
|
|
|
||
|
|
### 调试技巧
|
||
|
|
|
||
|
|
1. **启用详细日志**: 设置 `GIN_MODE=debug` 环境变量
|
||
|
|
2. **检查请求ID**: 使用 `X-Request-ID` 头部关联日志
|
||
|
|
3. **监控响应时间**: 关注日志中的延迟字段
|
||
|
|
4. **验证数据库连接**: 确认 MySQL 服务正常运行
|
||
|
|
|
||
|
|
**章节来源**
|
||
|
|
- [response.go:30-37](file://internal/response/response.go#L30-L37)
|
||
|
|
- [logger.go:22-43](file://internal/middleware/logger.go#L22-L43)
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
|
||
|
|
型号管理接口提供了完整的耳机型号数据检索能力,具有以下特点:
|
||
|
|
|
||
|
|
1. **双模式查询**: 支持精确的品牌过滤和全文搜索
|
||
|
|
2. **灵活的响应格式**: 支持标准 JSON 和 Base64 编码响应
|
||
|
|
3. **统一的错误处理**: 标准化的错误响应格式便于客户端处理
|
||
|
|
4. **完善的日志记录**: 内置详细的请求日志和错误追踪
|
||
|
|
5. **可扩展的架构**: 清晰的分层设计便于功能扩展和维护
|
||
|
|
|
||
|
|
推荐的最佳实践包括:合理设置搜索参数、利用缓存机制提升性能、监控系统指标、以及建立完善的错误处理流程。这些接口为上层应用提供了稳定可靠的型号数据服务基础。
|