feat(impedance): 新增用户耳机阻抗功能模块

- 设计并添加 user_headphone_impedance 表,包含唯一复合索引保证数据完整性
- 实现阻抗上报API接口 /audio/reportImpedance,支持设备上传阻抗数据
- 使用Redis Hash结构缓存阻抗数据,键为 "headphone_impedances"
- 新增定时持久化任务,每5分钟从Redis读取数据批量写入数据库
- 对品牌和型号数据进行trim+lower归一化处理,支持数据去重更新
- 优化查询性能,确保mac_addr与品牌型号归一化组合唯一索引生效
- 更新故障排查指南,新增Redis缓存及唯一索引相关问题检查
- 新增阻抗持久化配置开关,允许按需启用该功能
This commit is contained in:
eafonyang
2026-07-07 19:16:02 +08:00
parent 5d2910e89e
commit c1547f9a8f
8 changed files with 1567 additions and 398 deletions
@@ -33,6 +33,12 @@
- [README.md](file://README.md)
</cite>
## 更新摘要
**变更内容**
- 更新了等化曲线API端点的查询参数处理说明,现在使用标准的Gin查询参数处理
- 添加了关于URL编码中加号字符处理的详细说明
- 更新了相关接口的请求示例和注意事项
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
@@ -214,6 +220,10 @@ G-->>C : "HTTP 响应(JSON/可选base64)"
- 失败:code 非 0message 为错误描述
- base64Resp
- 可选查询参数 base64Resp=true|1|空 时,将响应体 JSON 再进行自定义 Base64 编码返回;默认开启。
- **更新** URL参数编码规范
- 所有查询参数现在使用标准的Gin查询参数处理,遵循标准HTTP URL编码规范
- 加号字符(+)在查询参数中被解释为空格,这是标准HTTP URL编码行为
- 如果需要在参数中使用字面量加号,应将其编码为 %2B
**章节来源**
- [internal/router/router.go:27-38](file://internal/router/router.go#L27-L38)
@@ -483,6 +493,13 @@ G-->>C : "HTTP 响应(JSON/可选base64)"
- 示例
- curl: `curl "http://localhost:8080/audio/getCurve?brand=Sony&name=WH-1000XM4&target=Harman%20over-ear%202018&base64Resp=true"`
**更新** URL参数编码注意事项
- 等化曲线API端点现在使用标准的Gin查询参数处理,遵循标准HTTP URL编码规范
- 当target参数包含特殊字符(如空格、加号等)时,需要进行正确的URL编码
- 例如:`Harman over-ear 2018` 应该编码为 `Harman%20over-ear%202018`
- 如果需要传递字面量的加号字符(+),应将其编码为 `%2B`,因为标准HTTP会将+解释为空格
- 客户端库通常会自动处理URL编码,但手动构造URL时需要特别注意
**章节来源**
- [internal/router/router.go:70-71](file://internal/router/router.go#L70-L71)
- [internal/handler/curve.go:56-198](file://internal/handler/curve.go#L56-L198)
@@ -656,6 +673,7 @@ Router --> Middleware_CacheControl
- **新增**:检查 EQ API 调用与响应解析;确认 S3 CSV 读取权限;验证缓存结构与分布式锁。
- **新增**:关注 fr 数据独立存储与合并逻辑。
- **新增**:检查缓存控制中间件的缓存策略是否正确应用。
- **更新**:检查URL参数编码问题,特别是target参数中的特殊字符处理。
- 统一错误响应
- 所有错误均通过统一响应体返回,code 非 0 表示失败,message 描述错误原因。
@@ -677,6 +695,7 @@ Router --> Middleware_CacheControl
- 等化曲线管理支持多种目标曲线的参数化 EQ 计算,具备智能缓存优化和 CSV 数据读取能力。
- S3 存储集成支持 CSV 数据读取,为 Eafonyoung 源的等化曲线处理提供测量数据。
- 缓存控制中间件提供针对不同接口的差异化缓存策略,提升系统性能与用户体验。
- **更新**:等化曲线API端点现在使用标准的Gin查询参数处理,提供更好的URL编码兼容性。
## 附录
@@ -818,4 +837,40 @@ end
```
**图表来源**
- [internal/cache/curve_cache.go:18-148](file://internal/cache/curve_cache.go#L18-L148)
- [internal/cache/curve_cache.go:18-148](file://internal/cache/curve_cache.go#L18-L148)
### URL参数编码最佳实践
**更新** 客户端实现建议
对于等化曲线API端点,建议使用标准的URL编码库来处理查询参数:
```javascript
// JavaScript/Node.js 示例
const target = "Harman over-ear 2018";
const url = `/audio/getCurve?brand=Sony&name=WH-1000XM4&target=${encodeURIComponent(target)}`;
// Python 示例
from urllib.parse import quote_plus
target = "Harman over-ear 2018"
url = f"/audio/getCurve?brand=Sony&name=WH-1000XM4&target={quote_plus(target)}"
// Go 示例
import "net/url"
target := "Harman over-ear 2018"
params := url.Values{}
params.Set("brand", "Sony")
params.Set("name", "WH-1000XM4")
params.Set("target", target)
url := fmt.Sprintf("/audio/getCurve?%s", params.Encode())
```
**重要提示**
- 现代编程语言的标准URL编码库会自动处理特殊字符
- 如果需要传递字面量的加号字符(+),应使用 `%2B` 而不是 `+`
- 空格字符应编码为 `%20` 或使用 `+`(两者在HTTP中都被解释为空格)
- 避免手动拼接URL字符串,使用标准的URL编码函数
**章节来源**
- [internal/handler/curve.go:144-153](file://internal/handler/curve.go#L144-L153)
- [internal/handler/curve.go:55-58](file://internal/handler/curve.go#L55-L58)