优化部署流程

This commit is contained in:
eafonyang
2026-06-30 13:50:29 +08:00
parent a52adf7e27
commit 23f712cf86
9 changed files with 362 additions and 204 deletions
@@ -44,11 +44,10 @@
## 更新摘要
**变更内容**
- 新增分享代码处理器(ShareCodeHandler):实现EQ数据分享功能,支持创建、查询、导入、删除分享码,包含Redis缓存、分布式锁和异步持久化
- 新增等化曲线处理器(CurveHandler):实现频响曲线计算和参数化EQ生成功能,支持多种目标曲线和设备源
- 新增分享码持久化任务:定时将Redis中的分享码操作记录刷入MySQL数据库
- 新增分享码配置:支持灵活的TTL配置格式(分钟、小时、天)
- 更新路由集成:分享码和等化曲线功能已集成到/audio路由组中
- OTA处理器内部逻辑已简化:移除了paw相关字段处理,现在专注于标准OTA升级流程
- 处理器接口保持不变,继续提供/api/v1/audio/ota端点
- 查询逻辑已更新以适配简化的OTA结构,但仍保持原有的黑名单过滤和定向升级功能
- 数据库结构保持不变,仍包含ota、black_list、ota_target_device表
## 目录
1. [简介](#简介)
@@ -168,7 +167,7 @@ MODELLIST --> ENCODE
- **型号查询处理器**:按品牌或型号关键字查询型号列表,现在依赖 ModelRepository 实例。
- **型号检索处理器**:基于 Meilisearch 执行全文检索,依赖搜索客户端实例。
- **设备上报处理器**:接收设备信息(MAC、型号、版本、来源 IP),依赖 Redis 客户端。
- **OTA固件升级处理器**:处理固件升级请求,支持黑名单过滤、目标设备分布和版本选择等OTA固件升级能力。
- **OTA固件升级处理器**:处理固件升级请求,支持黑名单过滤、目标设备分布和版本选择等OTA固件升级能力。**已简化内部逻辑,移除了paw相关字段处理**。
- **等化曲线处理器**:处理频响曲线计算和参数化EQ生成,支持多种目标曲线和设备源。
- **分享代码处理器**:处理EQ数据分享功能,支持创建、查询、导入、删除分享码。
@@ -457,6 +456,8 @@ RespOK --> End
- [internal/handler/device.go:14-85](file://internal/handler/device.go#L14-L85)
### OTA固件升级处理器(OTAHandler
**更新** OTA处理器内部逻辑已简化,移除了paw相关字段处理,现在专注于标准OTA升级流程。
- **职责**:处理固件升级请求,支持黑名单过滤、目标设备分布和版本选择等OTA固件升级能力。
- **输入参数**
- 查询字符串:model(必填)
@@ -475,6 +476,7 @@ RespOK --> End
- 黑名单或定向设备检查失败返回统一内部错误
- **数据模型**OTA、BlackList、OTATargetDevice
- **依赖注入**:通过 NewOTAHandler 构造函数注入 OTARepository 和 zap.Logger
- **API端点**/audio/ota(保持不变)
```mermaid
flowchart TD
@@ -902,6 +904,7 @@ ALL --> LOG["zap.Logger"]
- 关注"query ota failed"、"check black list failed"、"check target device failed"等错误日志。
- 检查数据库连接,确认ota、black_list、ota_target_device表存在且结构正确。
- 验证OTA状态、硬件版本号、灰度标识等字段是否符合预期。
- **更新**:OTA处理器内部逻辑已简化,不再处理paw相关字段,如遇相关错误请检查其他字段。
- **等化曲线异常**
- 校验必填参数 brand、name 是否传入且格式正确。
- 关注"get curve point failed"、"get model curve failed"等错误日志。
@@ -946,7 +949,7 @@ ALL --> LOG["zap.Logger"]
- /audio/getModel -> ModelHandler.GetModel
- /audio/modelList -> ModelListHandler.ModelList
- /audio/reportDevInfo -> DeviceHandler.ReportDevInfo
- /audio/ota -> OTAHandler.GetOTA
- /audio/ota -> OTAHandler.GetOTA**已简化内部逻辑**
- /audio/getCurve -> CurveHandler.GetCurve
- /audio/modelCurve -> CurveHandler.ModelCurve
- /audio/shareCreate -> ShareCodeHandler.ExportShareCode
@@ -984,6 +987,11 @@ ALL --> LOG["zap.Logger"]
- black_list表:存储OTA黑名单
- ota_target_device表:存储OTA定向设备
- share_code_log表:存储分享码操作日志
- **OTA处理器内部逻辑更新**
- 移除了paw相关字段处理,专注于标准OTA升级流程
- 保持原有API端点:/audio/ota
- 查询逻辑已更新以适配简化的OTA结构
- 仍支持黑名单过滤和定向升级功能
- **常用调用示例(路径引用)**
- 品牌查询:[internal/handler/brand.go:25](file://internal/handler/brand.go#L25)
- 型号查询:[internal/handler/model.go:25](file://internal/handler/model.go#L25)
@@ -31,20 +31,20 @@
- [pkg/encode/base64.go](file://pkg/encode/base64.go)
- [sql/model.sql](file://sql/model.sql)
- [sql/ota.sql](file://sql/ota.sql)
- [sql/ota_target_device.sql](file://sql/ota_target_device.sql)
- [sql/black_list.sql](file://sql/black_list.sql)
- [sql/share_code_log.sql](file://sql/share_code_log.sql)
- [sql/user_device.sql](file://sql/user_device.sql)
- [sql/user_active.sql](file://sql/user_active.sql)
- [sql/ota_target_device.sql](file://sql/ota_target_device.sql)
- [cmd/server/main.go](file://cmd/server/main.go)
</cite>
## 更新摘要
**变更内容**
- 新增分享代码数据模型(ShareCodeData)和相关处理流程
- 新增目标数据模型(Target),支持曲线目标配置
- 增强OTA模型,支持布尔值序列化和更多字段
- 新增分享码持久化任务和Redis缓存机制
- 扩展路由配置以支持分享码相关API端点
- OTA模型字段简化:移除了pawVerCode、pawVerName、pawUrl、pawMd5四个冗余字段,OTA结构现在更加简洁
- OTA模型现在包含核心字段:verCode、verName、url、md5、force、desc、model、hw、target、beta、startTime、endTime、status
- 数据库表结构同步更新,移除了对应的冗余列
- 仓库层和处理器层相应调整,移除了对冗余字段的处理
## 目录
1. [简介](#简介)
@@ -158,7 +158,7 @@ CACHE --> SHARE_TTL
- [internal/handler/brand.go:19-50](file://internal/handler/brand.go#L19-L50)
- [internal/handler/model.go:19-51](file://internal/handler/model.go#L19-L51)
- [internal/handler/model_list.go:19-57](file://internal/handler/model_list.go#L19-L57)
- [internal/handler/ota.go:14-133](file://internal/handler/ota.go#L14-L133)
- [internal/handler/ota.go:14-145](file://internal/handler/ota.go#L14-L145)
- [internal/handler/device.go:15-83](file://internal/handler/device.go#L15-L83)
- [internal/handler/share_code.go:1-383](file://internal/handler/share_code.go#L1-L383)
- [internal/handler/curve.go:1-582](file://internal/handler/curve.go#L1-L582)
@@ -170,7 +170,7 @@ CACHE --> SHARE_TTL
- [internal/repository/curve.go:1-66](file://internal/repository/curve.go#L1-L66)
- [internal/model/brand.go:3-7](file://internal/model/brand.go#L3-L7)
- [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15)
- [internal/model/ota.go:5-67](file://internal/model/ota.go#L5-L67)
- [internal/model/ota.go:5-63](file://internal/model/ota.go#L5-L63)
- [internal/model/user_device.go:5-12](file://internal/model/user_device.go#L5-L12)
- [internal/model/user_active.go:5-13](file://internal/model/user_active.go#L5-L13)
- [internal/model/share_code.go:14-25](file://internal/model/share_code.go#L14-L25)
@@ -180,11 +180,12 @@ CACHE --> SHARE_TTL
- [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72)
- [internal/config/share_code_ttl.go:12-60](file://internal/config/share_code_ttl.go#L12-L60)
- [sql/model.sql:20-38](file://sql/model.sql#L20-L38)
- [sql/ota.sql:23-44](file://sql/ota.sql#L23-L44)
- [sql/ota.sql:23-40](file://sql/ota.sql#L23-L40)
- [sql/ota_target_device.sql:23-31](file://sql/ota_target_device.sql#L23-L31)
- [sql/black_list.sql:23-30](file://sql/black_list.sql#L23-L30)
- [sql/share_code_log.sql:8-23](file://sql/share_code_log.sql#L8-L23)
- [sql/user_device.sql:23-32](file://sql/user_device.sql#L23-L32)
- [sql/user_active.sql:23-32](file://sql/user_active.sql#L23-L32)
- [sql/ota_target_device.sql:23-31](file://sql/ota_target_device.sql#L23-L31)
- [internal/task/device_persist.go:14-167](file://internal/task/device_persist.go#L14-L167)
- [internal/task/share_code_persist.go:1-232](file://internal/task/share_code_persist.go#L1-L232)
@@ -230,7 +231,7 @@ CACHE --> SHARE_TTL
**章节来源**
- [internal/model/brand.go:3-7](file://internal/model/brand.go#L3-L7)
- [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15)
- [internal/model/ota.go:5-67](file://internal/model/ota.go#L5-L67)
- [internal/model/ota.go:5-63](file://internal/model/ota.go#L5-L63)
- [internal/model/share_code.go:14-25](file://internal/model/share_code.go#L14-L25)
- [internal/model/target.go:5-14](file://internal/model/target.go#L5-L14)
- [internal/model/user_device.go:5-12](file://internal/model/user_device.go#L5-L12)
@@ -244,7 +245,7 @@ CACHE --> SHARE_TTL
- [internal/handler/brand.go:26-50](file://internal/handler/brand.go#L26-L50)
- [internal/handler/model.go:26-51](file://internal/handler/model.go#L26-L51)
- [internal/handler/model_list.go:26-57](file://internal/handler/model_list.go#L26-L57)
- [internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- [internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
- [internal/handler/share_code.go:15-383](file://internal/handler/share_code.go#L15-L383)
- [internal/handler/curve.go:27-582](file://internal/handler/curve.go#L27-L582)
@@ -402,42 +403,41 @@ ModelRepository --> Model : "返回"
### OTA 固件升级模型
- **设计理念**
- OTA模型用于管理固件升级信息,支持强制升级、灰度发布、定向升级等功能。
- **更新**OTA模型已简化,移除了pawVerCode、pawVerName、pawUrl、pawMd5四个冗余字段,现在只包含核心升级信息字段。
- **字段定义与约束**
- OTA模型:
- id:整数,主键,自增。
- verCode:整数,版本号,用于排序。
- verName:字符串,版本名称。
- url:字符串,固件下载地址。
- md5:字符串,固件MD5校验值。
- forceBoolInt,是否强制升级(true/false)。
- desc:字符串指针,升级描述。
- model:字符串指针,对应设备型号。
- hw:整数,硬件版本号。
- targetBoolInt,是否定向升级(true/false)。
- betaBoolInt,是否灰度发布(true/false)。
- pawVerCode:整数,配套软件版本号
- pawVerName:字符串,配套软件版本名称
- pawUrl:字符串,配套软件下载地址
- pawMD5:字符串,配套软件MD5校验值。
- startTime:时间戳指针,升级开始时间。
- endTime:时间戳指针,升级结束时间。
- status:整数,状态(1-可用,0-不可用)。
- VerCode:整数,版本号,用于排序。
- VerName:字符串,版本名称。
- URL:字符串,固件下载地址。
- MD5:字符串,固件MD5校验值。
- ForceBoolInt,是否强制升级(true/false)。
- Desc:字符串指针,升级描述。
- Model:字符串指针,对应设备型号。
- HW:整数,硬件版本号。
- TargetBoolInt,是否定向升级(true/false)。
- BetaBoolInt,是否灰度发布(true/false)。
- StartTime:时间戳指针,升级开始时间
- EndTime:时间戳指针,升级结束时间
- Status:整数,状态(1-可用,0-不可用)
- BlackList模型:
- id:整数,主键,自增。
- ota_id:整数,关联OTA记录ID。
- mac:字符串,设备MAC地址。
- create_at:时间戳,创建时间。
- OTAID:整数,关联OTA记录ID。
- Mac:字符串,设备MAC地址。
- CreateAt:时间戳,创建时间。
- OTATargetDevice模型:
- id:整数,主键,自增。
- ota_id:整数,关联OTA记录ID。
- mac_addr:字符串,设备MAC地址。
- type:整数,类型(1-白名单,2-黑名单)。
- create_at:时间戳,创建时间。
- OTAID:整数,关联OTA记录ID。
- MacAddr:字符串,设备MAC地址。
- Type:整数,类型(1-白名单,2-黑名单)。
- CreateAt:时间戳,创建时间。
- **业务含义**
- 支持复杂的固件升级策略,包括强制升级、灰度发布、定向升级和黑名单管理。
- 简化的字段结构提高了数据模型的清晰度和维护性。
- **数据库映射**
- 表名:ota、black_list、ota_target_device。
- 字段:完整映射关系详见数据库表结构。
- **更新**OTA表不再包含pawVerCode、pawVerName、pawUrl、pawMd5字段。
- **ORM 映射配置**
- 使用 sql.NullString 和 sql.NullTime 扫描可空列。
- BoolInt类型支持数据库整型与JSON布尔值的双向转换。
@@ -449,37 +449,33 @@ ModelRepository --> Model : "返回"
```mermaid
classDiagram
class OTA {
+int id
+int verCode
+string verName
+string url
+string md5
+BoolInt force
+*string desc
+*string model
+int hw
+BoolInt target
+BoolInt beta
+int pawVerCode
+string pawVerName
+string pawUrl
+string pawMD5
+*time startTime
+*time endTime
+int status
+int ID
+int VerCode
+string VerName
+string URL
+string MD5
+BoolInt Force
+*string Desc
+*string Model
+int HW
+BoolInt Target
+BoolInt Beta
+*time StartTime
+*time EndTime
+int Status
}
class BlackList {
+int id
+int ota_id
+string mac
+time create_at
+int ID
+int OTAID
+string Mac
+time CreateAt
}
class OTATargetDevice {
+int id
+int ota_id
+string mac_addr
+int type
+time create_at
+int ID
+int OTAID
+string MacAddr
+int Type
+time CreateAt
}
class OTARepository {
-db *sql.DB
@@ -495,15 +491,15 @@ OTARepository --> OTATargetDevice : "返回"
```
**图表来源**
- [internal/model/ota.go:29-67](file://internal/model/ota.go#L29-L67)
- [internal/model/ota.go:29-63](file://internal/model/ota.go#L29-L63)
- [internal/repository/ota.go:19-159](file://internal/repository/ota.go#L19-L159)
- [sql/ota.sql:24-44](file://sql/ota.sql#L24-L44)
- [sql/ota.sql:24-40](file://sql/ota.sql#L24-L40)
- [sql/ota_target_device.sql:24-31](file://sql/ota_target_device.sql#L24-L31)
**章节来源**
- [internal/model/ota.go:5-67](file://internal/model/ota.go#L5-L67)
- [internal/model/ota.go:5-63](file://internal/model/ota.go#L5-L63)
- [internal/repository/ota.go:19-159](file://internal/repository/ota.go#L19-L159)
- [sql/ota.sql:23-44](file://sql/ota.sql#L23-L44)
- [sql/ota.sql:23-40](file://sql/ota.sql#L23-L40)
- [sql/ota_target_device.sql:23-31](file://sql/ota_target_device.sql#L23-L31)
### 分享码数据模型
@@ -714,6 +710,7 @@ DeviceRepository --> UserActive : "返回"
- **OTA处理器特殊逻辑**
- 支持参数校验、黑名单检查、定向设备检查等复杂业务逻辑。
- 根据不同情况返回不同的OTA升级信息。
- **更新**:OTA处理器现在处理简化的字段结构,移除了对paw*字段的处理。
- **设备处理器特殊逻辑**
- 将设备信息写入Redis缓存,支持异步持久化。
- 提供设备信息上报接口。
@@ -760,7 +757,7 @@ H-->>C : "200 OK + EQ数据"
- [internal/handler/brand.go:26-50](file://internal/handler/brand.go#L26-L50)
- [internal/handler/model.go:26-51](file://internal/handler/model.go#L26-L51)
- [internal/handler/model_list.go:26-57](file://internal/handler/model_list.go#L26-L57)
- [internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- [internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
- [internal/handler/share_code.go:15-383](file://internal/handler/share_code.go#L15-L383)
- [internal/handler/curve.go:27-582](file://internal/handler/curve.go#L27-L582)
@@ -777,6 +774,7 @@ H-->>C : "200 OK + EQ数据"
- 支持按model+hw+beta+status=1查询最新OTA记录。
- 支持黑名单检查和定向设备检查。
- 提供多种查询策略以适应不同的升级场景。
- **更新**:OTA查询现在使用简化的字段列表,移除了对paw*字段的查询。
- **设备查询**
- 支持按MAC地址查询设备信息。
- 支持按MAC地址和日期查询活跃记录。
@@ -882,7 +880,7 @@ Task_Share --> Redis
- [internal/handler/brand.go:14-50](file://internal/handler/brand.go#L14-L50)
- [internal/handler/model.go:14-51](file://internal/handler/model.go#L14-L51)
- [internal/handler/model_list.go:14-57](file://internal/handler/model_list.go#L14-L57)
- [internal/handler/ota.go:14-133](file://internal/handler/ota.go#L14-L133)
- [internal/handler/ota.go:14-145](file://internal/handler/ota.go#L14-L145)
- [internal/handler/device.go:15-83](file://internal/handler/device.go#L15-L83)
- [internal/handler/share_code.go:15-383](file://internal/handler/share_code.go#L15-L383)
- [internal/handler/curve.go:27-582](file://internal/handler/curve.go#L27-L582)
@@ -909,6 +907,7 @@ Task_Share --> Redis
- UserActive表对(mac_addr, active_date)建立联合索引,支持按日期分区查询。
- share_code_log表对(mac_addr, share_code, create_at)建立索引,支持分享码查询。
- 查询时优先按品牌名匹配,减少 LIKE 的范围。
- **更新**:OTA查询现在使用简化的字段列表,减少了不必要的字段扫描。
- **扫描与内存**
- 使用 sql.NullString 扫描可空列,避免零值歧义;转换为指针字符串减少冗余存储。
- OTA模型使用BoolInt类型处理布尔值,支持数据库整型与JSON布尔值的双向转换。
@@ -927,7 +926,7 @@ Task_Share --> Redis
**章节来源**
- [sql/model.sql:34-35](file://sql/model.sql#L34-L35)
- [sql/ota.sql:24-44](file://sql/ota.sql#L24-L44)
- [sql/ota.sql:24-40](file://sql/ota.sql#L24-L40)
- [sql/share_code_log.sql:20-23](file://sql/share_code_log.sql#L20-L23)
- [sql/user_device.sql:24-32](file://sql/user_device.sql#L24-L32)
- [sql/user_active.sql:24-32](file://sql/user_active.sql#L24-L32)
@@ -957,6 +956,7 @@ Task_Share --> Redis
- 检查Redis:确认设备信息、分享码数据是否正确写入Redis缓存。
- 监控任务:确认设备持久化任务和分享码持久化任务是否按预期执行。
- 检查分布式锁:确认分享码操作的分布式锁状态和超时处理。
- **更新**:检查OTA表结构,确认paw*字段不存在,验证简化的字段结构。
**章节来源**
- [internal/config/database.go:57-72](file://internal/config/database.go#L57-L72)
@@ -965,12 +965,16 @@ Task_Share --> Redis
- [internal/handler/model_list.go:39-42](file://internal/handler/model_list.go#L39-L42)
- [internal/handler/ota.go:31-48](file://internal/handler/ota.go#L31-L48)
- [internal/handler/device.go:33-39](file://internal/handler/device.go#L33-L39)
- [internal/handler/share_code.go:46-81](file://internal/handler/share_code.go#L46-81)
- [internal/handler/share_code.go:46-81](file://internal/handler/share_code.go#L46-L81)
- [internal/handler/curve.go:302-368](file://internal/handler/curve.go#L302-L368)
- [internal/response/response.go:30-37](file://internal/response/response.go#L30-L37)
## 结论
本项目的数据模型设计简洁明确:Brand 与 Model 分别承担品牌与型号的维度,通过仓库层的原生 SQL 访问实现高效查询;处理器层统一响应与可选编码,提升传输效率与前端体验。新增的分享码功能、目标曲线模型和增强的OTA模型进一步完善了系统的数据模型体系,支持复杂的固件升级策略、设备信息跟踪、用户行为分析和EQ数据分享功能。数据库层面通过唯一索引与合理字段设计保障一致性与性能。Redis缓存层提供了高性能的临时数据存储和分布式锁机制。建议在后续迭代中引入显式的校验与转换层,增强健壮性与可维护性,同时考虑添加更多的监控指标和告警机制。
本项目的数据模型设计简洁明确:Brand 与 Model 分别承担品牌与型号的维度,通过仓库层的原生 SQL 访问实现高效查询;处理器层统一响应与可选编码,提升传输效率与前端体验。新增的分享码功能、目标曲线模型和增强的OTA模型进一步完善了系统的数据模型体系,支持复杂的固件升级策略、设备信息跟踪、用户行为分析和EQ数据分享功能。数据库层面通过唯一索引与合理字段设计保障一致性与性能。Redis缓存层提供了高性能的临时数据存储和分布式锁机制。
**更新**:OTA模型经过简化重构,移除了pawVerCode、pawVerName、pawUrl、pawMd5四个冗余字段,现在只包含核心升级信息,提高了数据模型的清晰度和维护性。新的字段结构更加简洁,减少了不必要的数据冗余,同时保持了完整的升级策略支持能力。
建议在后续迭代中引入显式的校验与转换层,增强健壮性与可维护性,同时考虑添加更多的监控指标和告警机制。
## 附录
@@ -979,8 +983,9 @@ Task_Share --> Redis
- 字段:id(主键)、brand_name、name、form、rig、source、eq_key、create_at。
- 约束:唯一索引 (brand_name, name)。
- **表:ota**
- 字段:id(主键)、verCode、verName、url、md5、force、desc、model、hw、target、beta、pawVerCode、pawVerName、pawUrl、pawMd5、startTime、endTime、status。
- 字段:id(主键)、verCode、verName、url、md5、force、desc、model、hw、target、beta、startTime、endTime、status。
- 约束:无显式约束。
- **更新**:移除了pawVerCode、pawVerName、pawUrl、pawMd5字段。
- **表:black_list**
- 字段:id(主键)、ota_id、mac、create_at。
- 约束:无显式约束。
@@ -1003,33 +1008,29 @@ Task_Share --> Redis
- Model.id ↔ model.id
- Model.brandName ↔ model.brand_name
- Model.name ↔ model.name
- OTA.id ↔ ota.id
- OTA.verCode ↔ ota.verCode
- OTA.verName ↔ ota.verName
- OTA.url ↔ ota.url
- OTA.md5 ↔ ota.md5
- OTA.force ↔ ota.force
- OTA.desc ↔ ota.desc
- OTA.model ↔ ota.model
- OTA.hw ↔ ota.hw
- OTA.target ↔ ota.target
- OTA.beta ↔ ota.beta
- OTA.pawVerCode ↔ ota.pawVerCode
- OTA.pawVerName ↔ ota.pawVerName
- OTA.pawUrl ↔ ota.pawUrl
- OTA.pawMD5 ↔ ota.pawMD5
- OTA.startTime ↔ ota.startTime
- OTA.endTime ↔ ota.endTime
- OTA.status ↔ ota.status
- BlackList.id ↔ black_list.id
- BlackList.ota_id ↔ black_list.ota_id
- BlackList.mac ↔ black_list.mac
- BlackList.create_at ↔ black_list.create_at
- OTATargetDevice.id ↔ ota_target_device.id
- OTATargetDevice.ota_id ↔ ota_target_device.ota_id
- OTATargetDevice.mac_addr ↔ ota_target_device.mac_addr
- OTATargetDevice.type ↔ ota_target_device.type
- OTATargetDevice.create_at ↔ ota_target_device.create_at
- OTA.ID ↔ ota.id
- OTA.VerCode ↔ ota.verCode
- OTA.VerName ↔ ota.verName
- OTA.URL ↔ ota.url
- OTA.MD5 ↔ ota.md5
- OTA.Force ↔ ota.force
- OTA.Desc ↔ ota.desc
- OTA.Model ↔ ota.model
- OTA.HW ↔ ota.hw
- OTA.Target ↔ ota.target
- OTA.Beta ↔ ota.beta
- OTA.StartTime ↔ ota.startTime
- OTA.EndTime ↔ ota.endTime
- OTA.Status ↔ ota.status
- BlackList.ID ↔ black_list.id
- BlackList.OTAID ↔ black_list.ota_id
- BlackList.Mac ↔ black_list.mac
- BlackList.CreateAt ↔ black_list.create_at
- OTATargetDevice.ID ↔ ota_target_device.id
- OTATargetDevice.OTAID ↔ ota_target_device.ota_id
- OTATargetDevice.MacAddr ↔ ota_target_device.mac_addr
- OTATargetDevice.Type ↔ ota_target_device.type
- OTATargetDevice.CreateAt ↔ ota_target_device.create_at
- UserDevice.id ↔ user_device.id
- UserDevice.mac_addr ↔ user_device.mac_addr
- UserDevice.model ↔ user_device.model
@@ -1059,14 +1060,15 @@ Task_Share --> Redis
**章节来源**
- [sql/model.sql:24-35](file://sql/model.sql#L24-L35)
- [sql/ota.sql:24-44](file://sql/ota.sql#L24-L44)
- [sql/ota.sql:24-40](file://sql/ota.sql#L24-L40)
- [sql/ota_target_device.sql:24-31](file://sql/ota_target_device.sql#L24-L31)
- [sql/black_list.sql:24-30](file://sql/black_list.sql#L24-L30)
- [sql/user_device.sql:24-32](file://sql/user_device.sql#L24-L32)
- [sql/user_active.sql:24-32](file://sql/user_active.sql#L24-L32)
- [sql/share_code_log.sql:9-23](file://sql/share_code_log.sql#L9-L23)
- [sql/target.sql:24-31](file://sql/target.sql#L24-L31)
- [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15)
- [internal/model/ota.go:29-67](file://internal/model/ota.go#L29-L67)
- [internal/model/ota.go:29-63](file://internal/model/ota.go#L29-L63)
- [internal/model/user_device.go:5-12](file://internal/model/user_device.go#L5-L12)
- [internal/model/user_active.go:5-13](file://internal/model/user_active.go#L5-L13)
- [internal/model/share_code.go:14-25](file://internal/model/share_code.go#L14-L25)
@@ -1096,7 +1098,8 @@ Task_Share --> Redis
- 方法:GET
- 参数:model(必需)、hw(必需)、mac(可选)、beta(可选)、base64Resp(可选)
- 返回:OTA对象或 Base64 编码后的 JSON
- 参考路径:[internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- **更新**:返回的OTA对象现在包含简化的字段结构
- 参考路径:[internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- **设备信息上报**
- 路由:/audio/reportDevInfo
- 方法:GET
@@ -1133,7 +1136,7 @@ Task_Share --> Redis
- [internal/handler/brand.go:26-50](file://internal/handler/brand.go#L26-L50)
- [internal/handler/model.go:26-51](file://internal/handler/model.go#L26-L51)
- [internal/handler/model_list.go:26-57](file://internal/handler/model_list.go#L26-L57)
- [internal/handler/ota.go:23-133](file://internal/handler/ota.go#L23-L133)
- [internal/handler/ota.go:23-145](file://internal/handler/ota.go#L23-L145)
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
- [internal/handler/share_code.go:40-125](file://internal/handler/share_code.go#L40-L125)
- [internal/handler/share_code.go:192-211](file://internal/handler/share_code.go#L192-L211)
@@ -1146,11 +1149,13 @@ Task_Share --> Redis
- 对可空字段提供默认值策略,避免前端空值判断复杂化。
- OTA模型支持复杂的升级策略,建议在业务层添加更多的参数验证。
- 分享码模型支持多种设备型号,建议添加设备型号验证和限制。
- **更新**:OTA模型简化后,减少了字段验证的复杂度,但仍需确保核心字段的完整性。
- **版本管理与向后兼容**
- 通过 API 版本号(如 /api/v1)隔离变更;新增字段采用可选策略,保持旧字段必填。
- 对于破坏性变更,提供迁移脚本与双写策略。
- OTA升级策略的变更需要谨慎处理,确保向后兼容性。
- 分享码功能的新增不影响现有API,保持向前兼容。
- **更新**:OTA模型的简化属于向后兼容的重构,不会影响现有API调用。
- **性能优化**
- 为高频查询字段建立索引;避免 SELECT *,仅选择必要字段。
- 对大列表启用可选 Base64 编码;结合分页与缓存策略。
@@ -1158,6 +1163,7 @@ Task_Share --> Redis
- OTA查询使用复合索引,支持快速定位最新OTA记录。
- 分享码使用Redis缓存,支持TTL自动过期和分布式锁。
- 目标曲线使用Redis缓存,优化fr数据的独立存储。
- **更新**:OTA查询现在使用简化的字段列表,减少了查询开销。
- **错误处理与可观测性**
- 统一错误码与消息格式;记录关键链路日志;对数据库与外部服务增加超时与重试。
- OTA查询失败需要详细的日志记录,包括参数、查询结果等。
@@ -1176,4 +1182,5 @@ Task_Share --> Redis
- 添加数据库连接池监控,避免连接泄漏。
- 添加任务调度监控,确保持久化任务正常执行。
- 添加分布式锁监控,防止死锁和资源竞争。
- 添加S3访问监控,确保CSV文件读取正常。
- 添加S3访问监控,确保CSV文件读取正常。
- **更新**:监控OTA表结构变化,确保简化的字段结构得到正确应用。
@@ -46,13 +46,10 @@
## 更新摘要
**变更内容**
- 新增分享代码仓储层(ShareCodeRepository),支持分享码日志管理与数据库操作
- 增强曲线仓储层(CurveRepository),支持频响曲线数据查询与缓存合并
- 新增分享码缓存层(ShareCodeCache),提供高级Redis缓存功能与Lua原子操作
- 新增分享码持久化任务(ShareCodePersistTask),实现异步数据同步
- 新增分享码处理器(ShareCodeHandler),支持完整的分享码生命周期管理
- 扩展Handler层以支持分享码创建、查询、导入、导出和删除操作
- 增强缓存策略,支持fr数据分离存储和分布式锁机制
- OTA仓库层实现已移除pawVerCode、pawVerName、pawUrl、pawMd5字段,简化了查询逻辑
- OTA模型结构已精简,移除了不必要的字段,提高了数据传输效率
- OTA查询方法的SQL语句已优化,减少了字段选择和扫描操作
- OTA表结构已更新,移除了相关字段定义
## 目录
1. [简介](#简介)
@@ -246,7 +243,7 @@ SHARE_LOG_TBL --> DB_SQL
- **BrandRepository**:负责品牌列表查询,支持缓存感知的全量查询和按名称模糊过滤,返回 Brand 领域对象切片。
- **ModelRepository**:负责型号列表查询,支持缓存感知的按品牌精确匹配、按型号名模糊匹配和全量查询,返回 Model 领域对象切片,并对可空字段进行 NullString 到指针字符串的安全转换。
- **DeviceRepository**:负责设备信息管理,支持按MAC地址查询设备、插入新设备、更新设备版本信息,以及用户活跃信息的查询和更新。
- **OTARepository**:负责固件升级信息查询,支持按型号、硬件版本、灰度标识查询最新OTA记录,黑名单检查、定向设备筛选等功能。
- **OTARepository**:负责固件升级信息查询,支持按型号、硬件版本、灰度标识查询最新OTA记录,黑名单检查、定向设备筛选等功能。**已精简**:移除了pawVerCode、pawVerName、pawUrl、pawMd5字段,简化了查询逻辑和数据处理流程。
- **CurveRepository**:负责频响曲线数据查询,支持按品牌+型号查询Model信息和按标签查询Target信息,为曲线缓存提供数据支撑。
- **ShareCodeRepository**:负责分享码日志管理,支持插入分享码操作日志、查询导出日志等数据库操作,提供完整的分享码数据持久化能力。
- **CurveCache**:新增的曲线缓存层,支持fr数据分离存储、分布式锁机制、缓存合并逻辑,优化曲线数据访问性能。
@@ -526,6 +523,7 @@ DeviceRepository --> UserActive : "活跃信息"
- 定向设备检查:检查设备是否在指定OTA的定向设备列表中
- 可空字段处理:使用 sql.NullString 和 sql.NullTime 安全处理数据库可空字段
- 复杂查询:支持子查询、条件筛选、时间范围检查等复杂业务逻辑
- **已精简**:移除了pawVerCode、pawVerName、pawUrl、pawMd5字段,简化了查询逻辑和数据处理流程
- **业务逻辑**
- 支持灰度发布(beta=1)和正式发布(beta=0)两种模式
- 支持强制升级(force=1)和普通升级(force=0
@@ -550,16 +548,12 @@ class OTA {
+string VerName
+string URL
+string MD5
+int Force
+BoolInt Force
+*string Desc
+*string Model
+int HW
+int Target
+int Beta
+int PawVerCode
+string PawVerName
+string PawURL
+string PawMD5
+BoolInt Target
+BoolInt Beta
+*time StartTime
+*time EndTime
+int Status
@@ -1120,7 +1114,7 @@ MD_CACHE --> REDIS_CLIENT
- BrandRepository:按名称模糊匹配,建议在 name 上建立合适索引;对大结果集引入分页。
- ModelRepository:按品牌名精确匹配或按型号名模糊匹配,建议为 brand_name 与 name 建立索引;对大结果集引入分页。
- DeviceRepositoryuser_device 表的 MAC 地址建立唯一索引,user_active 表建立复合索引(mac_addr, active_date)。
- OTARepositoryota 表建立复合索引(model, hw, beta, status),black_list 表建立索引(ota_id, mac),ota_target_device 表建立索引(ota_id, mac_addr)。
- OTARepositoryota 表建立复合索引(model, hw, beta, status),black_list 表建立索引(ota_id, mac),ota_target_device 表建立索引(ota_id, mac_addr)。**已优化**:移除了pawVerCode、pawVerName、pawUrl、pawMd5字段,减少了查询字段数量,提升了查询性能。
- CurveRepositorymodel 表建立复合索引(brand_name, name),target 表建立索引(label)。
- ShareCodeRepositoryshare_code_log 表建立索引(mac_addr, share_code, create_at)。
- 应用层过滤:在缓存命中时进行过滤,减少数据库压力。
@@ -1175,7 +1169,7 @@ MD_CACHE --> REDIS_CLIENT
- 排查:检查设备持久化任务日志,确认Redis连接正常;验证user_device和user_active表结构;检查JSON数据格式;确认定时任务正常运行。
- **OTA查询错误**
- 现象:OTA升级查询返回错误或结果不符合预期。
- 排查:检查OTA表数据完整性,确认status=1且有效时间范围内;验证黑名单和定向设备表数据;检查参数传递(model、hw、beta、mac)。
- 排查:检查OTA表数据完整性,确认status=1且有效时间范围内;验证黑名单和定向设备表数据;检查参数传递(model、hw、beta、mac**注意**OTA查询已移除pawVerCode、pawVerName、pawUrl、pawMd5字段,确保查询逻辑正确
- **曲线查询错误**
- 现象:曲线查询返回错误或结果不符合预期。
- 排查:检查CurveRepository查询的Model和Target数据;确认EQ API可访问;验证Redis缓存键格式;检查分布式锁状态;确认fr数据分离存储正确。
@@ -1225,7 +1219,11 @@ MD_CACHE --> REDIS_CLIENT
- [internal/repository/share_code.go:20-58](file://internal/repository/share_code.go#L20-L58)
## 结论
Luxsin 的数据访问层经过重构后,采用了更加完善的缓存感知查询逻辑,实现了多级缓存策略和智能数据刷新机制。新增的设备持久化仓库、OTA仓库、曲线仓库和分享码仓库进一步完善了数据访问层的功能,支持设备信息上报、固件升级查询、频响曲线计算和分享码管理等核心业务场景。新增的CurveCache和ShareCodeCache提供了更高级的缓存策略,包括fr数据分离存储、分布式锁机制、Lua原子操作等,显著提升了系统的响应性能和数据一致性。通过集成 Redis 缓存层和异步持久化任务,系统在高并发场景下表现出色。建议后续继续优化缓存策略,增加缓存监控指标,完善缓存失效和更新机制,并持续改进监控与日志体系。
Luxsin 的数据访问层经过重构后,采用了更加完善的缓存感知查询逻辑,实现了多级缓存策略和智能数据刷新机制。新增的设备持久化仓库、OTA仓库、曲线仓库和分享码仓库进一步完善了数据访问层的功能,支持设备信息上报、固件升级查询、频响曲线计算和分享码管理等核心业务场景。新增的CurveCache和ShareCodeCache提供了更高级的缓存策略,包括fr数据分离存储、分布式锁机制、Lua原子操作等,显著提升了系统的响应性能和数据一致性。通过集成 Redis 缓存层和异步持久化任务,系统在高并发场景下表现出色。
**重要更新**:OTA仓库层已成功移除了pawVerCode、pawVerName、pawUrl、pawMd5等冗余字段,简化了查询逻辑和数据处理流程,提升了系统性能和维护性。OTA模型结构已精简,移除了不必要的字段,提高了数据传输效率。
建议后续继续优化缓存策略,增加缓存监控指标,完善缓存失效和更新机制,并持续改进监控与日志体系。
## 附录:扩展新 Repository 指南
- **设计原则**