523 lines
14 KiB
Markdown
523 lines
14 KiB
Markdown
|
|
# 品牌管理接口
|
|||
|
|
|
|||
|
|
<cite>
|
|||
|
|
**本文引用的文件**
|
|||
|
|
- [brand.go](file://internal/handler/brand.go)
|
|||
|
|
- [brand.go](file://internal/repository/brand.go)
|
|||
|
|
- [brand.go](file://internal/model/brand.go)
|
|||
|
|
- [base64.go](file://pkg/encode/base64.go)
|
|||
|
|
- [router.go](file://internal/router/router.go)
|
|||
|
|
- [response.go](file://internal/response/response.go)
|
|||
|
|
- [main.go](file://cmd/server/main.go)
|
|||
|
|
- [config.go](file://internal/config/config.go)
|
|||
|
|
- [mysql.go](file://internal/database/mysql.go)
|
|||
|
|
- [cors.go](file://internal/middleware/cors.go)
|
|||
|
|
- [logger.go](file://internal/middleware/logger.go)
|
|||
|
|
- [README.md](file://README.md)
|
|||
|
|
</cite>
|
|||
|
|
|
|||
|
|
## 目录
|
|||
|
|
1. [简介](#简介)
|
|||
|
|
2. [项目结构](#项目结构)
|
|||
|
|
3. [核心组件](#核心组件)
|
|||
|
|
4. [架构概览](#架构概览)
|
|||
|
|
5. [详细组件分析](#详细组件分析)
|
|||
|
|
6. [依赖关系分析](#依赖关系分析)
|
|||
|
|
7. [性能考虑](#性能考虑)
|
|||
|
|
8. [故障排除指南](#故障排除指南)
|
|||
|
|
9. [结论](#结论)
|
|||
|
|
10. [附录](#附录)
|
|||
|
|
|
|||
|
|
## 简介
|
|||
|
|
|
|||
|
|
品牌管理接口是 Luxsin 应用 API 的核心功能模块之一,提供品牌信息的查询服务。该接口支持按品牌名称进行模糊搜索,并提供了灵活的响应格式选项,包括标准 JSON 格式和 Base64 编码格式。
|
|||
|
|
|
|||
|
|
本接口采用分层架构设计,包含处理器层、存储库层、模型层和编码层,确保了良好的代码组织和可维护性。接口支持多种响应格式,满足不同客户端的需求,特别是在需要安全传输或特殊字符处理的场景中。
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
|
|||
|
|
该项目采用清晰的分层架构,主要目录结构如下:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "应用入口"
|
|||
|
|
CMD[cmd/server/main.go]
|
|||
|
|
end
|
|||
|
|
subgraph "核心业务层"
|
|||
|
|
Handler[internal/handler/]
|
|||
|
|
Repository[internal/repository/]
|
|||
|
|
Model[internal/model/]
|
|||
|
|
end
|
|||
|
|
subgraph "基础设施层"
|
|||
|
|
Router[internal/router/router.go]
|
|||
|
|
Middleware[internal/middleware/]
|
|||
|
|
Database[internal/database/]
|
|||
|
|
Config[internal/config/]
|
|||
|
|
end
|
|||
|
|
subgraph "工具包"
|
|||
|
|
Encode[pkg/encode/]
|
|||
|
|
Response[internal/response/]
|
|||
|
|
end
|
|||
|
|
CMD --> Router
|
|||
|
|
Router --> Handler
|
|||
|
|
Handler --> Repository
|
|||
|
|
Repository --> Model
|
|||
|
|
Handler --> Encode
|
|||
|
|
Handler --> Response
|
|||
|
|
Router --> Middleware
|
|||
|
|
CMD --> Database
|
|||
|
|
CMD --> Config
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [main.go:1-96](file://cmd/server/main.go#L1-L96)
|
|||
|
|
- [router.go:1-42](file://internal/router/router.go#L1-L42)
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [main.go:1-96](file://cmd/server/main.go#L1-L96)
|
|||
|
|
- [router.go:1-42](file://internal/router/router.go#L1-L42)
|
|||
|
|
|
|||
|
|
## 核心组件
|
|||
|
|
|
|||
|
|
### 品牌处理器 (BrandHandler)
|
|||
|
|
|
|||
|
|
品牌处理器负责处理品牌相关的 HTTP 请求,实现了完整的品牌查询逻辑:
|
|||
|
|
|
|||
|
|
- **职责分离**:专门处理品牌查询请求,不涉及其他业务逻辑
|
|||
|
|
- **参数验证**:从查询字符串中提取品牌名称参数
|
|||
|
|
- **响应控制**:根据 base64Resp 参数决定响应格式
|
|||
|
|
- **错误处理**:统一的错误处理机制,返回标准化的错误响应
|
|||
|
|
|
|||
|
|
### 品牌存储库 (BrandRepository)
|
|||
|
|
|
|||
|
|
存储库层负责与数据库交互,实现数据访问逻辑:
|
|||
|
|
|
|||
|
|
- **SQL 查询构建**:动态构建 SQL 查询语句,支持条件过滤
|
|||
|
|
- **参数化查询**:使用参数化查询防止 SQL 注入攻击
|
|||
|
|
- **结果映射**:将数据库结果映射到 Brand 结构体
|
|||
|
|
- **上下文支持**:支持超时和取消的上下文操作
|
|||
|
|
|
|||
|
|
### 品牌模型 (Brand)
|
|||
|
|
|
|||
|
|
简单的数据传输对象,定义了品牌的基本属性:
|
|||
|
|
|
|||
|
|
- **ID 字段**:整数类型的唯一标识符
|
|||
|
|
- **Name 字段**:字符串类型的品牌名称
|
|||
|
|
- **JSON 标签**:支持自动序列化为 JSON 格式
|
|||
|
|
|
|||
|
|
### Base64 编码器
|
|||
|
|
|
|||
|
|
提供自定义 Base64 编码功能,支持特殊字符的安全传输:
|
|||
|
|
|
|||
|
|
- **自定义字符映射**:使用特殊的字符集替换标准 Base64 字符
|
|||
|
|
- **JSON 序列化**:先序列化为 JSON 再进行 Base64 编码
|
|||
|
|
- **参数解析**:支持 base64Resp 查询参数的解析
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [brand.go:1-50](file://internal/handler/brand.go#L1-L50)
|
|||
|
|
- [brand.go:1-51](file://internal/repository/brand.go#L1-L51)
|
|||
|
|
- [brand.go:1-7](file://internal/model/brand.go#L1-L7)
|
|||
|
|
- [base64.go:1-52](file://pkg/encode/base64.go#L1-L52)
|
|||
|
|
|
|||
|
|
## 架构概览
|
|||
|
|
|
|||
|
|
品牌管理接口采用经典的三层架构模式,各层职责明确,耦合度低:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant Client as 客户端
|
|||
|
|
participant Router as 路由器
|
|||
|
|
participant Handler as 品牌处理器
|
|||
|
|
participant Repo as 品牌存储库
|
|||
|
|
participant DB as MySQL 数据库
|
|||
|
|
participant Encoder as Base64 编码器
|
|||
|
|
Client->>Router : GET /audio/getBrand?brandName=sony&base64Resp=true
|
|||
|
|
Router->>Handler : 调用 GetBrand 方法
|
|||
|
|
Handler->>Handler : 解析查询参数
|
|||
|
|
Handler->>Repo : List(brandName)
|
|||
|
|
Repo->>DB : 执行 SQL 查询
|
|||
|
|
DB-->>Repo : 返回查询结果
|
|||
|
|
Repo-->>Handler : 品牌列表
|
|||
|
|
alt base64Resp = true
|
|||
|
|
Handler->>Encoder : EncodeJSON(品牌列表)
|
|||
|
|
Encoder-->>Handler : Base64 编码结果
|
|||
|
|
Handler-->>Client : 返回编码后的响应
|
|||
|
|
else base64Resp = false
|
|||
|
|
Handler-->>Client : 返回 JSON 格式响应
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
|||
|
|
- [brand.go:20-50](file://internal/repository/brand.go#L20-L50)
|
|||
|
|
- [base64.go:35-42](file://pkg/encode/base64.go#L35-L42)
|
|||
|
|
|
|||
|
|
## 详细组件分析
|
|||
|
|
|
|||
|
|
### 接口规范
|
|||
|
|
|
|||
|
|
#### HTTP 方法和 URL 模式
|
|||
|
|
- **HTTP 方法**:GET
|
|||
|
|
- **基础路径**:/audio
|
|||
|
|
- **端点**:/getBrand
|
|||
|
|
- **完整 URL**:`/audio/getBrand`
|
|||
|
|
|
|||
|
|
#### 请求参数
|
|||
|
|
|
|||
|
|
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|
|||
|
|
|--------|------|------|--------|------|
|
|||
|
|
| brandName | string | 否 | 空 | 品牌名称查询参数,支持模糊匹配 |
|
|||
|
|
| base64Resp | boolean | 否 | true | 响应格式控制参数 |
|
|||
|
|
|
|||
|
|
**Base64 响应选项详解**:
|
|||
|
|
- **默认行为**:base64Resp=true(启用 Base64 编码)
|
|||
|
|
- **禁用方式**:base64Resp=false 或 base64Resp=0
|
|||
|
|
- **适用场景**:需要安全传输或特殊字符处理的场景
|
|||
|
|
|
|||
|
|
#### 响应格式
|
|||
|
|
|
|||
|
|
**标准 JSON 格式**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 0,
|
|||
|
|
"message": "ok",
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"id": 1,
|
|||
|
|
"name": "Sony"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"id": 2,
|
|||
|
|
"name": "Apple"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Base64 编码格式**:
|
|||
|
|
响应内容为 JSON 序列化后经过自定义 Base64 编码的字符串。
|
|||
|
|
|
|||
|
|
#### 错误处理
|
|||
|
|
|
|||
|
|
系统提供统一的错误处理机制:
|
|||
|
|
|
|||
|
|
| 错误类型 | HTTP 状态码 | 错误代码 | 描述 |
|
|||
|
|
|----------|-------------|----------|------|
|
|||
|
|
| 参数错误 | 400 | 40000 | 请求参数无效 |
|
|||
|
|
| 服务器错误 | 500 | 50000 | 服务器内部错误 |
|
|||
|
|
| 数据库错误 | 500 | 50000 | 数据库操作失败 |
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
|||
|
|
- [response.go:15-37](file://internal/response/response.go#L15-L37)
|
|||
|
|
|
|||
|
|
### 数据流分析
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart TD
|
|||
|
|
Start([请求到达]) --> ParseParam["解析查询参数<br/>brandName, base64Resp"]
|
|||
|
|
ParseParam --> ValidateParam{"参数验证"}
|
|||
|
|
ValidateParam --> |有效| BuildQuery["构建 SQL 查询"]
|
|||
|
|
ValidateParam --> |无效| ReturnBadRequest["返回 400 错误"]
|
|||
|
|
BuildQuery --> ExecuteQuery["执行数据库查询"]
|
|||
|
|
ExecuteQuery --> QuerySuccess{"查询成功?"}
|
|||
|
|
QuerySuccess --> |否| ReturnServerError["返回 500 错误"]
|
|||
|
|
QuerySuccess --> |是| CheckFormat{"检查响应格式"}
|
|||
|
|
CheckFormat --> |Base64| EncodeResponse["JSON 编码 + Base64 编码"]
|
|||
|
|
CheckFormat --> |标准| ReturnJSON["直接返回 JSON"]
|
|||
|
|
EncodeResponse --> SendResponse["发送响应"]
|
|||
|
|
ReturnJSON --> SendResponse
|
|||
|
|
ReturnBadRequest --> End([结束])
|
|||
|
|
ReturnServerError --> End
|
|||
|
|
SendResponse --> End
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
|||
|
|
- [brand.go:20-50](file://internal/repository/brand.go#L20-L50)
|
|||
|
|
|
|||
|
|
### 类关系图
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
classDiagram
|
|||
|
|
class BrandHandler {
|
|||
|
|
-repo : BrandRepository
|
|||
|
|
-log : Logger
|
|||
|
|
+NewBrandHandler(db, log) BrandHandler
|
|||
|
|
+GetBrand(c) void
|
|||
|
|
}
|
|||
|
|
class BrandRepository {
|
|||
|
|
-db : sql.DB
|
|||
|
|
+NewBrandRepository(db) BrandRepository
|
|||
|
|
+List(ctx, brandName) []Brand
|
|||
|
|
}
|
|||
|
|
class Brand {
|
|||
|
|
+int ID
|
|||
|
|
+string Name
|
|||
|
|
}
|
|||
|
|
class Base64Encoder {
|
|||
|
|
+CustomBase64Encode(data) string
|
|||
|
|
+EncodeJSON(v) string
|
|||
|
|
+ParseBase64Param(c) bool
|
|||
|
|
}
|
|||
|
|
BrandHandler --> BrandRepository : 使用
|
|||
|
|
BrandRepository --> Brand : 返回
|
|||
|
|
BrandHandler --> Base64Encoder : 使用
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [brand.go:14-24](file://internal/handler/brand.go#L14-L24)
|
|||
|
|
- [brand.go:12-18](file://internal/repository/brand.go#L12-L18)
|
|||
|
|
- [brand.go:3-6](file://internal/model/brand.go#L3-L6)
|
|||
|
|
- [base64.go:21-51](file://pkg/encode/base64.go#L21-L51)
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [brand.go:1-50](file://internal/handler/brand.go#L1-L50)
|
|||
|
|
- [brand.go:1-51](file://internal/repository/brand.go#L1-L51)
|
|||
|
|
- [brand.go:1-7](file://internal/model/brand.go#L1-L7)
|
|||
|
|
- [base64.go:1-52](file://pkg/encode/base64.go#L1-L52)
|
|||
|
|
|
|||
|
|
## 依赖关系分析
|
|||
|
|
|
|||
|
|
### 外部依赖
|
|||
|
|
|
|||
|
|
系统使用的主要外部库:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph LR
|
|||
|
|
subgraph "Web 框架"
|
|||
|
|
Gin[Gin Web Framework]
|
|||
|
|
end
|
|||
|
|
subgraph "数据库"
|
|||
|
|
MySQL[MySQL Driver]
|
|||
|
|
SQL[Go SQL 包]
|
|||
|
|
end
|
|||
|
|
subgraph "日志"
|
|||
|
|
Zap[Zap Logger]
|
|||
|
|
end
|
|||
|
|
subgraph "缓存"
|
|||
|
|
Redis[Redis Client]
|
|||
|
|
end
|
|||
|
|
subgraph "搜索引擎"
|
|||
|
|
Meilisearch[Meilisearch Client]
|
|||
|
|
end
|
|||
|
|
BrandHandler --> Gin
|
|||
|
|
BrandRepository --> MySQL
|
|||
|
|
BrandRepository --> SQL
|
|||
|
|
BrandHandler --> Zap
|
|||
|
|
BrandHandler --> Redis
|
|||
|
|
BrandHandler --> Meilisearch
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [main.go:3-19](file://cmd/server/main.go#L3-L19)
|
|||
|
|
- [brand.go:3-12](file://internal/handler/brand.go#L3-L12)
|
|||
|
|
|
|||
|
|
### 内部依赖关系
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TD
|
|||
|
|
Router[路由层] --> Handler[处理器层]
|
|||
|
|
Handler --> Repository[存储库层]
|
|||
|
|
Repository --> Model[模型层]
|
|||
|
|
Handler --> Encoder[编码器]
|
|||
|
|
Handler --> Response[响应处理]
|
|||
|
|
Router --> Middleware[中间件]
|
|||
|
|
Middleware --> Logger[日志中间件]
|
|||
|
|
Middleware --> CORS[CORS 中间件]
|
|||
|
|
CMD[应用入口] --> Router
|
|||
|
|
CMD --> Database[数据库连接]
|
|||
|
|
CMD --> Config[配置管理]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [router.go:14-41](file://internal/router/router.go#L14-L41)
|
|||
|
|
- [main.go:64-64](file://cmd/server/main.go#L64-L64)
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [router.go:1-42](file://internal/router/router.go#L1-L42)
|
|||
|
|
- [main.go:1-96](file://cmd/server/main.go#L1-L96)
|
|||
|
|
|
|||
|
|
## 性能考虑
|
|||
|
|
|
|||
|
|
### 数据库优化
|
|||
|
|
|
|||
|
|
- **连接池配置**:最大连接数 25,空闲连接 5,连接最大生命周期 5 分钟
|
|||
|
|
- **参数化查询**:防止 SQL 注入,提高查询安全性
|
|||
|
|
- **索引优化**:建议在品牌表的 name 字段上建立索引以提升模糊查询性能
|
|||
|
|
|
|||
|
|
### 编码性能
|
|||
|
|
|
|||
|
|
- **Base64 编码开销**:编码后数据大小约为原数据的 1.33 倍
|
|||
|
|
- **内存使用**:Base64 编码会增加临时内存占用
|
|||
|
|
- **CPU 消耗**:额外的编码步骤会增加 CPU 开销
|
|||
|
|
|
|||
|
|
### 缓存策略
|
|||
|
|
|
|||
|
|
虽然当前实现未集成缓存,但可以考虑以下优化方案:
|
|||
|
|
- **查询结果缓存**:热门品牌查询结果可缓存 5-10 分钟
|
|||
|
|
- **配置缓存**:数据库连接配置可缓存避免重复初始化
|
|||
|
|
- **响应缓存**:静态品牌数据可考虑缓存
|
|||
|
|
|
|||
|
|
## 故障排除指南
|
|||
|
|
|
|||
|
|
### 常见问题及解决方案
|
|||
|
|
|
|||
|
|
#### 1. 数据库连接失败
|
|||
|
|
|
|||
|
|
**症状**:启动时出现数据库连接错误
|
|||
|
|
**原因**:
|
|||
|
|
- 数据库配置不正确
|
|||
|
|
- 网络连接问题
|
|||
|
|
- 认证凭据错误
|
|||
|
|
|
|||
|
|
**解决方法**:
|
|||
|
|
- 检查数据库配置参数
|
|||
|
|
- 验证网络连通性
|
|||
|
|
- 确认用户名和密码正确
|
|||
|
|
|
|||
|
|
#### 2. 查询结果为空
|
|||
|
|
|
|||
|
|
**症状**:查询返回空数组
|
|||
|
|
**可能原因**:
|
|||
|
|
- 品牌名称参数不匹配
|
|||
|
|
- 数据库中无对应数据
|
|||
|
|
- 查询条件过于严格
|
|||
|
|
|
|||
|
|
**解决方法**:
|
|||
|
|
- 检查品牌名称拼写
|
|||
|
|
- 验证数据库中是否存在数据
|
|||
|
|
- 调整查询条件
|
|||
|
|
|
|||
|
|
#### 3. Base64 编码错误
|
|||
|
|
|
|||
|
|
**症状**:Base64 编码失败
|
|||
|
|
**原因**:
|
|||
|
|
- JSON 序列化失败
|
|||
|
|
- 编码过程中的异常
|
|||
|
|
|
|||
|
|
**解决方法**:
|
|||
|
|
- 检查数据结构的有效性
|
|||
|
|
- 查看服务器日志获取详细错误信息
|
|||
|
|
|
|||
|
|
### 调试技巧
|
|||
|
|
|
|||
|
|
#### 日志分析
|
|||
|
|
|
|||
|
|
系统提供了详细的日志记录功能:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart TD
|
|||
|
|
Request[HTTP 请求] --> LogStart["记录请求开始<br/>时间戳, IP, 方法, 路径"]
|
|||
|
|
LogStart --> Process[处理请求]
|
|||
|
|
Process --> LogEnd["记录请求结束<br/>状态码, 延迟, 错误信息"]
|
|||
|
|
LogEnd --> Response[返回响应]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图表来源**
|
|||
|
|
- [logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
|||
|
|
|
|||
|
|
#### 错误监控
|
|||
|
|
|
|||
|
|
- **状态码分类**:4xx 错误记录为警告,5xx 错误记录为错误
|
|||
|
|
- **请求 ID 追踪**:每个请求都有唯一的 ID 便于追踪
|
|||
|
|
- **查询参数记录**:记录原始查询参数便于调试
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [logger.go:1-46](file://internal/middleware/logger.go#L1-L46)
|
|||
|
|
- [mysql.go:14-47](file://internal/database/mysql.go#L14-L47)
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
|
|||
|
|
品牌管理接口设计合理,实现了清晰的分层架构和良好的错误处理机制。接口提供了灵活的响应格式选项,能够满足不同客户端的需求。通过合理的性能优化和完善的故障排除机制,该接口能够在生产环境中稳定运行。
|
|||
|
|
|
|||
|
|
建议在未来版本中考虑添加:
|
|||
|
|
- 品牌数据缓存机制
|
|||
|
|
- 更详细的查询参数验证
|
|||
|
|
- 增强的日志记录和监控功能
|
|||
|
|
- 单元测试覆盖率提升
|
|||
|
|
|
|||
|
|
## 附录
|
|||
|
|
|
|||
|
|
### API 使用示例
|
|||
|
|
|
|||
|
|
#### 获取所有品牌
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:8080/audio/getBrand"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 按名称查询品牌
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:8080/audio/getBrand?brandName=sony"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 禁用 Base64 编码
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:8080/audio/getBrand?brandName=sony&base64Resp=false"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 客户端实现指南
|
|||
|
|
|
|||
|
|
#### JavaScript 实现
|
|||
|
|
```javascript
|
|||
|
|
// 基础查询
|
|||
|
|
async function getBrands(brandName = '', useBase64 = true) {
|
|||
|
|
const params = new URLSearchParams();
|
|||
|
|
if (brandName) params.append('brandName', brandName);
|
|||
|
|
params.append('base64Resp', useBase64.toString());
|
|||
|
|
|
|||
|
|
const response = await fetch(`/audio/getBrand?${params}`);
|
|||
|
|
const data = await response.json();
|
|||
|
|
|
|||
|
|
if (useBase64 && typeof data === 'string') {
|
|||
|
|
// 如果是 Base64 编码,需要解码
|
|||
|
|
return JSON.parse(atob(data));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Python 实现
|
|||
|
|
```python
|
|||
|
|
import requests
|
|||
|
|
import base64
|
|||
|
|
import json
|
|||
|
|
|
|||
|
|
def get_brands(brand_name='', base64_resp=True):
|
|||
|
|
url = "http://localhost:8080/audio/getBrand"
|
|||
|
|
params = {
|
|||
|
|
'brandName': brand_name,
|
|||
|
|
'base64Resp': str(base64_resp).lower()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response = requests.get(url, params=params)
|
|||
|
|
data = response.json()
|
|||
|
|
|
|||
|
|
if base64_resp and isinstance(data, str):
|
|||
|
|
# Base64 解码
|
|||
|
|
decoded_data = base64.b64decode(data).decode('utf-8')
|
|||
|
|
return json.loads(decoded_data)
|
|||
|
|
|
|||
|
|
return data
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能优化建议
|
|||
|
|
|
|||
|
|
1. **数据库层面**
|
|||
|
|
- 为品牌名称字段添加索引
|
|||
|
|
- 实施查询结果缓存
|
|||
|
|
- 优化模糊查询性能
|
|||
|
|
|
|||
|
|
2. **应用层面**
|
|||
|
|
- 合理设置连接池大小
|
|||
|
|
- 实施请求限流
|
|||
|
|
- 添加健康检查端点
|
|||
|
|
|
|||
|
|
3. **网络层面**
|
|||
|
|
- 启用 HTTP/2 支持
|
|||
|
|
- 实施 Gzip 压缩
|
|||
|
|
- 配置 CDN 加速
|
|||
|
|
|
|||
|
|
**章节来源**
|
|||
|
|
- [README.md:101-109](file://README.md#L101-L109)
|