From b2c11adebaded3000391716de6c031369b7a557c Mon Sep 17 00:00:00 2001 From: yangy Date: Thu, 28 May 2026 15:30:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(cache):=20=E5=AE=8C=E5=96=84=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=B3=BB=E7=BB=9F=E5=AE=9E=E7=8E=B0=E5=8F=8A=E9=9B=86?= =?UTF-8?q?=E6=88=90=E6=95=B0=E6=8D=AE=E8=AE=BF=E9=97=AE=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增BrandCache与ModelCache,实现多级缓存和TTL管理 - 引入缓存预热机制,启动时自动加载品牌与型号数据 - 实现缓存穿透防护和数据库降级策略,提升服务稳定性 - 优化缓存键命名和数据序列化策略,增强管理便捷性 - 数据访问层新增缓存感知查询,品牌与型号仓库支持缓存优先 - 调整整体架构,增强组件解耦及依赖注入链路清晰度 - 提供详细的性能优化建议和故障排查指南 - 补充监控指标说明,便于后续运维与监控扩展 --- .../repowiki/zh/content/基础设施/缓存系统.md | 568 ++++++++++-------- .../zh/content/核心模块/业务处理器.md | 445 +++++++++----- .../zh/content/核心模块/数据访问层.md | 411 +++++++++---- .../repowiki/zh/content/系统架构/路由系统.md | 256 +++++--- .../repowiki/zh/meta/repowiki-metadata.json | 2 +- 5 files changed, 1086 insertions(+), 596 deletions(-) diff --git a/.qoder/repowiki/zh/content/基础设施/缓存系统.md b/.qoder/repowiki/zh/content/基础设施/缓存系统.md index cf974b0..06d1ac0 100644 --- a/.qoder/repowiki/zh/content/基础设施/缓存系统.md +++ b/.qoder/repowiki/zh/content/基础设施/缓存系统.md @@ -3,324 +3,388 @@ **本文引用的文件** - [cmd/server/main.go](file://cmd/server/main.go) +- [internal/cache/brand_cache.go](file://internal/cache/brand_cache.go) +- [internal/cache/model_cache.go](file://internal/cache/model_cache.go) - [internal/cache/redis.go](file://internal/cache/redis.go) - [internal/config/config.go](file://internal/config/config.go) - [internal/config/redis.go](file://internal/config/redis.go) - [internal/router/router.go](file://internal/router/router.go) -- [internal/handler/device.go](file://internal/handler/device.go) +- [internal/repository/brand.go](file://internal/repository/brand.go) +- [internal/repository/model.go](file://internal/repository/model.go) +- [internal/handler/brand.go](file://internal/handler/brand.go) +- [internal/handler/model.go](file://internal/handler/model.go) +- [internal/model/brand.go](file://internal/model/brand.go) +- [internal/model/model.go](file://internal/model/model.go) - [go.mod](file://go.mod) +## 更新摘要 +**变更内容** +- 新增完整的Redis缓存系统架构,包含BrandCache和ModelCache组件 +- 实现TTL过期管理和自动缓存预热功能 +- 添加缓存穿透防护和数据库降级机制 +- 优化缓存键命名规范和数据序列化策略 +- 增强缓存失效策略和数据一致性保证 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) -6. [依赖关系分析](#依赖关系分析) -7. [性能考虑](#性能考虑) -8. [故障排查指南](#故障排查指南) -9. [结论](#结论) -10. [附录](#附录) +6. [缓存策略设计](#缓存策略设计) +7. [依赖关系分析](#依赖关系分析) +8. [性能考虑](#性能考虑) +9. [故障排查指南](#故障排查指南) +10. [结论](#结论) +11. [附录](#附录) ## 简介 -本文件面向 Luxsin 应用 API 的缓存系统,聚焦 Redis 缓存客户端的初始化流程、连接配置与使用方式。当前代码库实现了最小可用的 Redis 客户端封装与配置加载,并在设备上报接口中演示了哈希写入的典型用法。本文将从系统架构、组件职责、数据流、错误处理到性能优化与故障恢复进行系统化梳理,帮助初学者快速上手,同时为高级用户提供深入的技术细节与最佳实践参考。 +本文件全面介绍Luxsin应用API的完整Redis缓存系统实现。该系统包含BrandCache和ModelCache两个核心组件,支持TTL过期管理、自动缓存预热、缓存穿透防护和数据库降级机制。系统通过三层架构设计(缓存层、仓库层、数据访问层)实现了高性能的数据访问模式,显著提升了品牌和型号数据的查询性能。 ## 项目结构 -与缓存系统直接相关的模块分布如下: -- 配置层:负责加载环境变量与默认值,生成 RedisConfig 并进行基础校验 -- 缓存层:基于 RedisConfig 构造 Redis 客户端实例 -- 应用入口:在启动时加载配置、初始化缓存客户端并注入路由 -- 路由与处理器:将 Redis 客户端注入到需要缓存能力的处理器中 -- 外部依赖:通过 go.mod 指定 Redis 客户端版本 +完整的缓存系统分布在以下模块中: +- **缓存层**:BrandCache和ModelCache组件,负责Redis数据的读写和TTL管理 +- **仓库层**:BrandRepository和ModelRepository,实现缓存与数据库的协调访问 +- **应用层**:处理器和路由,提供RESTful API接口 +- **配置层**:Redis配置加载和验证 +- **模型层**:Brand和Model数据结构定义 ```mermaid graph TB subgraph "应用入口" MAIN["cmd/server/main.go
启动与生命周期管理"] -end -subgraph "配置层" -CFG["internal/config/config.go
统一配置加载"] -REDIS_CFG["internal/config/redis.go
Redis 配置与校验"] +WARMUP["warmUpCache
缓存预热"] end subgraph "缓存层" -CACHE["internal/cache/redis.go
NewClient 构造 Redis 客户端"] +BRAND_CACHE["BrandCache
品牌缓存组件"] +MODEL_CACHE["ModelCache
型号缓存组件"] +REDIS_CLIENT["Redis Client
连接管理"] end -subgraph "路由与处理器" -ROUTER["internal/router/router.go
路由注册与依赖注入"] -DEVICE["internal/handler/device.go
设备上报使用 Redis"] +subgraph "仓库层" +BRAND_REPO["BrandRepository
品牌数据访问"] +MODEL_REPO["ModelRepository
型号数据访问"] end -subgraph "外部依赖" -MOD["go.mod
Redis 客户端版本"] +subgraph "应用层" +BRAND_HANDLER["BrandHandler
品牌API"] +MODEL_HANDLER["ModelHandler
型号API"] +ROUTER["Router
路由注册"] end -MAIN --> CFG -CFG --> REDIS_CFG -MAIN --> CACHE -CACHE --> DEVICE -ROUTER --> DEVICE -MOD --> CACHE +subgraph "配置层" +REDIS_CONFIG["RedisConfig
配置加载"] +end +MAIN --> WARMUP +WARMUP --> BRAND_CACHE +WARMUP --> MODEL_CACHE +MAIN --> REDIS_CLIENT +BRAND_CACHE --> REDIS_CLIENT +MODEL_CACHE --> REDIS_CLIENT +BRAND_REPO --> BRAND_CACHE +MODEL_REPO --> MODEL_CACHE +BRAND_HANDLER --> BRAND_REPO +MODEL_HANDLER --> MODEL_REPO +ROUTER --> BRAND_HANDLER +ROUTER --> MODEL_HANDLER +MAIN --> REDIS_CONFIG ``` -图表来源 -- [cmd/server/main.go:22-62](file://cmd/server/main.go#L22-L62) -- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) -- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56) -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) -- [internal/router/router.go:14-25](file://internal/router/router.go#L14-L25) -- [internal/handler/device.go:26-78](file://internal/handler/device.go#L26-L78) -- [go.mod:9](file://go.mod#L9) +**图表来源** +- [cmd/server/main.go:25-131](file://cmd/server/main.go#L25-L131) +- [internal/cache/brand_cache.go:1-45](file://internal/cache/brand_cache.go#L1-L45) +- [internal/cache/model_cache.go:1-70](file://internal/cache/model_cache.go#L1-L70) +- [internal/repository/brand.go:1-100](file://internal/repository/brand.go#L1-L100) +- [internal/repository/model.go:1-181](file://internal/repository/model.go#L1-L181) -章节来源 -- [cmd/server/main.go:22-62](file://cmd/server/main.go#L22-L62) -- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) -- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56) -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) -- [internal/router/router.go:14-25](file://internal/router/router.go#L14-L25) -- [internal/handler/device.go:26-78](file://internal/handler/device.go#L26-L78) -- [go.mod:9](file://go.mod#L9) +**章节来源** +- [cmd/server/main.go:25-131](file://cmd/server/main.go#L25-L131) +- [internal/cache/brand_cache.go:1-45](file://internal/cache/brand_cache.go#L1-L45) +- [internal/cache/model_cache.go:1-70](file://internal/cache/model_cache.go#L1-L70) +- [internal/repository/brand.go:1-100](file://internal/repository/brand.go#L1-L100) +- [internal/repository/model.go:1-181](file://internal/repository/model.go#L1-L181) ## 核心组件 -- RedisConfig:定义 Redis 连接所需的主机、端口、密码与数据库编号,并提供校验逻辑 -- NewClient:根据 RedisConfig 创建 Redis 客户端实例,设置 Addr、Password、DB 等选项 -- 配置加载:Load 统一加载应用配置,其中包含 Redis 配置加载与校验 -- 启动流程:main 在启动阶段创建 Redis 客户端并注入路由,服务关闭时释放连接 -- 使用示例:设备上报接口在请求上下文中向 Redis 写入哈希字段 -章节来源 -- [internal/config/redis.go:9-14](file://internal/config/redis.go#L9-L14) -- [internal/config/redis.go:51-56](file://internal/config/redis.go#L51-L56) -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) -- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) -- [cmd/server/main.go:22-62](file://cmd/server/main.go#L22-L62) -- [internal/handler/device.go:70-78](file://internal/handler/device.go#L70-L78) +### 缓存组件 +- **BrandCache**:专门处理品牌数据的缓存,支持全量品牌列表缓存和TTL管理 +- **ModelCache**:专门处理型号数据的缓存,支持按品牌分组缓存和全量缓存 +- **Redis Client**:统一的Redis连接管理,支持连接池和超时配置 + +### 仓库组件 +- **BrandRepository**:实现品牌数据的缓存优先访问模式,包含缓存穿透防护 +- **ModelRepository**:实现型号数据的多级缓存策略,支持按品牌和全量缓存 + +### 处理器组件 +- **BrandHandler**:提供品牌查询API,支持模糊匹配和Base64响应编码 +- **ModelHandler**:提供型号查询API,支持按品牌和型号名称查询 + +**章节来源** +- [internal/cache/brand_cache.go:18-45](file://internal/cache/brand_cache.go#L18-L45) +- [internal/cache/model_cache.go:19-70](file://internal/cache/model_cache.go#L19-L70) +- [internal/repository/brand.go:14-100](file://internal/repository/brand.go#L14-L100) +- [internal/repository/model.go:14-181](file://internal/repository/model.go#L14-L181) +- [internal/handler/brand.go:13-49](file://internal/handler/brand.go#L13-L49) +- [internal/handler/model.go:13-50](file://internal/handler/model.go#L13-L50) ## 架构总览 -下图展示了从应用启动到 Redis 客户端被注入处理器的整体流程: - -```mermaid -sequenceDiagram -participant Boot as "启动器(main)" -participant Cfg as "配置加载(Config.Load)" -participant RdsCfg as "Redis 配置(loadRedis)" -participant Cache as "NewClient" -participant Router as "路由(router)" -participant Dev as "设备处理器(DeviceHandler)" -Boot->>Cfg : 加载配置 -Cfg->>RdsCfg : 读取 Redis 配置并校验 -RdsCfg-->>Cfg : 返回 RedisConfig -Cfg-->>Boot : 返回完整 Config -Boot->>Cache : 基于 RedisConfig 创建客户端 -Cache-->>Boot : 返回 *redis.Client -Boot->>Router : 注入 Redis 客户端 -Router-->>Dev : 初始化处理器并传入 Redis 客户端 -``` - -图表来源 -- [cmd/server/main.go:22-62](file://cmd/server/main.go#L22-L62) -- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) -- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56) -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) -- [internal/router/router.go:14-25](file://internal/router/router.go#L14-L25) - -## 详细组件分析 - -### Redis 客户端初始化与配置 -- NewClient 实现要点 - - 将 Host 与 Port 组合为 Addr 字符串 - - 设置 Password 与 DB - - 返回 redis.Client 实例供后续调用 -- 配置来源与优先级 - - 若存在环境变量 REDIS_HOST,则以环境变量 REDIS_HOST/REDIS_PORT/REDIS_PASSWORD/REDIS_DATABASE 为准 - - 否则根据运行环境(开发/生产)选择默认主机与端口,并从环境变量读取密码与数据库编号 -- 校验规则 - - RedisConfig.validate 校验 Host 必填;其他字段如 Password、Database 可为空或按需提供 - -```mermaid -flowchart TD -Start(["开始"]) --> CheckEnv["检查是否存在 REDIS_HOST"] -CheckEnv --> |是| FromEnv["从环境变量读取 Redis 配置"] -CheckEnv --> |否| SwitchEnv["根据运行环境选择默认配置"] -FromEnv --> Validate["执行 validate 校验 Host"] -SwitchEnv --> Validate -Validate --> |通过| BuildClient["调用 NewClient 构造客户端"] -Validate --> |失败| Error["返回错误"] -BuildClient --> End(["结束"]) -Error --> End -``` - -图表来源 -- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56) -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) - -章节来源 -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) -- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56) -- [internal/config/redis.go:51-56](file://internal/config/redis.go#L51-L56) - -### 启动流程与生命周期 -- 启动阶段 - - 加载配置后,创建 Redis 客户端并记录连接信息 - - 将客户端注入路由,随后启动 HTTP 服务器 -- 关闭阶段 - - 优雅关闭时调用 Close 释放连接 - -```mermaid -sequenceDiagram -participant M as "main" -participant R as "Redis 客户端" -participant S as "HTTP 服务器" -M->>M : 加载配置 -M->>R : NewClient(cfg.Redis) -M->>S : 启动监听 -S-->>M : 服务运行中 -M->>R : 关闭时调用 Close -``` - -图表来源 -- [cmd/server/main.go:22-62](file://cmd/server/main.go#L22-L62) -- [cmd/server/main.go:87-94](file://cmd/server/main.go#L87-L94) - -章节来源 -- [cmd/server/main.go:22-62](file://cmd/server/main.go#L22-L62) -- [cmd/server/main.go:87-94](file://cmd/server/main.go#L87-L94) - -### 设备上报接口中的缓存使用 -- 典型场景 - - 从请求参数构造设备信息,序列化为 JSON - - 在请求上下文基础上向 Redis 写入哈希字段 devices,键为 MAC 地址 -- 错误处理 - - HSet 失败时记录日志并返回系统错误响应 +缓存系统采用分层架构设计,实现了缓存优先的访问模式和智能降级机制: ```mermaid sequenceDiagram participant Client as "客户端" -participant Handler as "DeviceHandler" -participant Redis as "Redis 客户端" -Client->>Handler : GET /audio/reportDevInfo?mac=...&model=... -Handler->>Handler : 参数校验与日志记录 -Handler->>Handler : 构造设备信息并序列化 -Handler->>Redis : HSet(ctx, "devices", mac, json) -alt 成功 -Handler-->>Client : 返回成功响应 -else 失败 -Handler-->>Client : 返回系统错误 +participant Handler as "处理器" +participant Repo as "仓库层" +participant Cache as "缓存层" +participant DB as "数据库" +Client->>Handler : 发起查询请求 +Handler->>Repo : 调用数据访问 +Repo->>Cache : 尝试从缓存获取 +alt 缓存命中 +Cache-->>Repo : 返回缓存数据 +Repo-->>Handler : 返回数据 +Handler-->>Client : 返回响应 +else 缓存未命中 +Cache-->>Repo : 返回错误 +Repo->>DB : 降级到数据库查询 +DB-->>Repo : 返回数据库数据 +Repo->>Cache : 写入缓存回写 +Cache-->>Repo : 缓存写入成功 +Repo-->>Handler : 返回数据 +Handler-->>Client : 返回响应 end ``` -图表来源 -- [internal/handler/device.go:26-78](file://internal/handler/device.go#L26-L78) +**图表来源** +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) -章节来源 -- [internal/handler/device.go:26-78](file://internal/handler/device.go#L26-L78) +**章节来源** +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) + +## 详细组件分析 + +### BrandCache组件实现 +BrandCache专门处理品牌数据的缓存,具有以下特性: + +- **缓存键设计**:使用`brand:all`作为全量品牌列表的缓存键 +- **TTL管理**:设置30分钟的过期时间,平衡内存使用和查询性能 +- **数据序列化**:使用JSON格式存储品牌列表,支持快速序列化和反序列化 +- **错误处理**:优雅处理缓存读取失败,支持降级到数据库 -### 类图:配置与客户端关系 ```mermaid classDiagram -class RedisConfig { -+string Host -+int Port -+string Password -+int Database -+validate() error +class BrandCache { +-rdb : redis.Client ++GetAll(ctx) []Brand, error ++SetAll(ctx, []Brand) error } -class NewClient { -+NewClient(cfg RedisConfig) *redis.Client +class RedisClient { ++Get(ctx, key) *Cmd ++Set(ctx, key, value, expiration) *Cmd ++Bytes() []byte, error } -class Config { -+string Env -+string Host -+int Port -+Database DatabaseConfig -+Meilisearch MeilisearchConfig -+Redis RedisConfig -+Addr() string -} -NewClient --> RedisConfig : "接收配置" -Config --> RedisConfig : "包含" +BrandCache --> RedisClient : "使用" ``` -图表来源 -- [internal/config/redis.go:9-14](file://internal/config/redis.go#L9-L14) -- [internal/config/redis.go:51-56](file://internal/config/redis.go#L51-L56) -- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) -- [internal/config/config.go:9-16](file://internal/config/config.go#L9-L16) +**图表来源** +- [internal/cache/brand_cache.go:18-45](file://internal/cache/brand_cache.go#L18-L45) + +**章节来源** +- [internal/cache/brand_cache.go:13-45](file://internal/cache/brand_cache.go#L13-L45) + +### ModelCache组件实现 +ModelCache处理型号数据的多级缓存策略: + +- **分组缓存**:按品牌名称建立独立的缓存键,如`model:brand:{brandName}` +- **全量缓存**:维护完整的型号列表缓存键`model:all` +- **TTL管理**:统一使用30分钟过期时间 +- **键命名规范**:采用`前缀:类型:标识`的命名约定,便于管理和清理 + +```mermaid +flowchart TD +Start(["型号查询开始"]) --> CheckBrand{"是否指定品牌?"} +CheckBrand --> |是| BrandCache["查询品牌缓存
model:brand:{brandName}"] +CheckBrand --> |否| CheckModelName{"是否指定型号?"} +BrandCache --> ReturnBrand["返回品牌型号列表"] +CheckModelName --> |是| AllCache["查询全量缓存
model:all"] +CheckModelName --> |否| Empty["返回空列表"] +AllCache --> Filter["应用层模糊过滤"] +Filter --> ReturnFiltered["返回过滤后的列表"] +ReturnBrand --> End(["结束"]) +ReturnFiltered --> End +Empty --> End +``` + +**图表来源** +- [internal/cache/model_cache.go:27-69](file://internal/cache/model_cache.go#L27-L69) + +**章节来源** +- [internal/cache/model_cache.go:13-70](file://internal/cache/model_cache.go#L13-L70) + +### 缓存预热机制 +系统在启动时自动执行缓存预热,确保服务启动后具备完整的缓存数据: + +- **预热策略**:启动时从数据库加载所有品牌和型号数据到Redis +- **异步执行**:预热过程不影响服务启动时间 +- **错误处理**:预热失败不会阻止服务正常启动,但会记录警告日志 +- **数据完整性**:预热完成后记录缓存条目数量,便于监控和验证 + +**章节来源** +- [cmd/server/main.go:103-131](file://cmd/server/main.go#L103-L131) +- [cmd/server/main.go:67-68](file://cmd/server/main.go#L67-L68) + +### 缓存穿透防护 +系统实现了多层次的缓存穿透防护机制: + +- **缓存空值处理**:当数据库查询结果为空时,仍会写入空值缓存,防止重复查询 +- **降级机制**:缓存读取失败时自动降级到数据库查询 +- **错误隔离**:缓存异常不会影响整体服务的可用性 +- **日志记录**:记录缓存访问失败和降级事件,便于问题排查 + +**章节来源** +- [internal/repository/brand.go:34-52](file://internal/repository/brand.go#L34-L52) +- [internal/repository/model.go:27-79](file://internal/repository/model.go#L27-L79) + +## 缓存策略设计 + +### TTL过期管理 +- **过期时间**:所有缓存数据设置30分钟过期时间 +- **过期策略**:使用Redis的TTL机制自动清理过期数据 +- **内存管理**:合理的过期时间平衡内存使用和查询性能 +- **数据新鲜度**:定期过期确保缓存数据与数据库保持同步 + +### 键命名规范 +- **品牌缓存**:`brand:all` - 全量品牌列表 +- **型号缓存**:`model:brand:{brandName}` - 按品牌分组的型号列表 +- **全量型号**:`model:all` - 完整的型号列表 +- **命名约定**:采用`类型:子类型:标识`的层次化命名 + +### 数据序列化策略 +- **JSON格式**:使用标准JSON格式进行数据序列化 +- **二进制存储**:Redis存储二进制数据,提高传输效率 +- **错误处理**:序列化和反序列化失败时返回明确的错误信息 + +**章节来源** +- [internal/cache/brand_cache.go:13-16](file://internal/cache/brand_cache.go#L13-L16) +- [internal/cache/model_cache.go:13-17](file://internal/cache/model_cache.go#L13-L17) +- [internal/cache/brand_cache.go:38-44](file://internal/cache/brand_cache.go#L38-L44) +- [internal/cache/model_cache.go:43-69](file://internal/cache/model_cache.go#L43-L69) ## 依赖关系分析 -- Redis 客户端版本 - - 通过 go.mod 指定 github.com/redis/go-redis/v9 版本 -- 模块耦合 - - cache/redis.go 仅依赖 internal/config 中的 RedisConfig - - cmd/server/main.go 依赖 cache/redis.go 与 internal/config - - internal/router/router.go 依赖 redis.go 与 handler 层 - - internal/handler/device.go 依赖 redis.go 与 zap 日志 +缓存系统各组件之间的依赖关系清晰明确: ```mermaid graph LR -MAIN["cmd/server/main.go"] --> CACHE["internal/cache/redis.go"] -MAIN --> CFG["internal/config/config.go"] -CFG --> REDISCFG["internal/config/redis.go"] -ROUTER["internal/router/router.go"] --> DEVICE["internal/handler/device.go"] -DEVICE --> CACHE -MOD["go.mod"] --> CACHE +MAIN["cmd/server/main.go"] --> CACHE["internal/cache/*"] +MAIN --> REPO["internal/repository/*"] +REPO --> CACHE +REPO --> MODEL["internal/model/*"] +HANDLER["internal/handler/*"] --> REPO +ROUTER["internal/router/router.go"] --> HANDLER +CONFIG["internal/config/redis.go"] --> MAIN +CACHE --> REDIS["github.com/redis/go-redis/v9"] +REPO --> REDIS ``` -图表来源 -- [cmd/server/main.go:13-18](file://cmd/server/main.go#L13-L18) -- [internal/cache/redis.go:6-7](file://internal/cache/redis.go#L6-L7) -- [internal/router/router.go:10](file://internal/router/router.go#L10) -- [internal/handler/device.go:10](file://internal/handler/device.go#L10) -- [go.mod:9](file://go.mod#L9) +**图表来源** +- [cmd/server/main.go:13-23](file://cmd/server/main.go#L13-L23) +- [internal/repository/brand.go:3-12](file://internal/repository/brand.go#L3-L12) +- [internal/router/router.go:3-14](file://internal/router/router.go#L3-L14) -章节来源 -- [cmd/server/main.go:13-18](file://cmd/server/main.go#L13-L18) -- [internal/cache/redis.go:6-7](file://internal/cache/redis.go#L6-L7) -- [internal/router/router.go:10](file://internal/router/router.go#L10) -- [internal/handler/device.go:10](file://internal/handler/device.go#L10) -- [go.mod:9](file://go.mod#L9) +**章节来源** +- [cmd/server/main.go:13-23](file://cmd/server/main.go#L13-L23) +- [internal/repository/brand.go:3-12](file://internal/repository/brand.go#L3-L12) +- [internal/router/router.go:3-14](file://internal/router/router.go#L3-L14) ## 性能考虑 -- 连接池与并发 - - 当前 NewClient 未显式设置连接池参数,Redis 客户端默认行为将复用连接;在高并发场景建议结合业务压力测试评估连接数上限 -- 超时与上下文 - - 所有 Redis 操作均使用请求上下文,便于在上游取消或超时控制 -- 数据过期与键空间 - - 当前示例未设置过期时间;对于临时数据可考虑在写入时设置 TTL,避免无界增长 -- 键命名规范 - - 示例使用固定字段名 devices;建议采用前缀+业务域+标识的命名规范,便于运维与清理 -- 批量与流水线 - - 对于批量写入场景,可考虑使用 Pipeline 或 MSET/MGET 提升吞吐 + +### 缓存命中率优化 +- **预热策略**:启动时预热常用数据,提高初始命中率 +- **分层缓存**:按查询频率和数据特征设计不同的缓存策略 +- **TTL调优**:根据数据更新频率调整过期时间 + +### 内存使用优化 +- **数据压缩**:JSON序列化相比其他格式更节省空间 +- **键空间管理**:合理的键命名减少内存碎片 +- **过期清理**:Redis自动清理过期数据,无需手动干预 + +### 网络延迟优化 +- **连接复用**:Redis客户端自动管理连接池 +- **批量操作**:支持Pipeline批量执行多个命令 +- **超时控制**:每个操作都有明确的超时限制 + +### 错误处理与容错 +- **降级机制**:缓存失败时自动降级到数据库 +- **重试策略**:关键操作支持有限次重试 +- **监控告警**:缓存异常时触发告警通知 ## 故障排查指南 -- 连接失败 - - 检查 REDIS_HOST/REDIS_PORT/REDIS_PASSWORD/REDIS_DATABASE 是否正确 - - 确认 validate 校验未返回“redis host is required” -- 写入失败 - - 查看 HSet 返回的错误并结合日志定位 - - 确认 Redis 服务状态与网络连通性 -- 优雅关闭 - - 确保在服务关闭时调用 Close,避免资源泄漏 -章节来源 -- [internal/config/redis.go:51-56](file://internal/config/redis.go#L51-L56) -- [internal/handler/device.go:70-78](file://internal/handler/device.go#L70-L78) -- [cmd/server/main.go:87-94](file://cmd/server/main.go#L87-L94) +### 缓存相关问题 +- **缓存不生效** + - 检查Redis连接配置是否正确 + - 验证缓存键是否符合预期格式 + - 确认TTL设置是否合理 + +- **缓存数据过期** + - 检查TTL配置和Redis过期策略 + - 验证数据更新后是否及时刷新缓存 + - 查看缓存预热是否成功执行 + +- **缓存穿透** + - 检查空值缓存是否正确设置 + - 验证降级机制是否正常工作 + - 查看数据库查询是否频繁失败 + +### 性能问题诊断 +- **查询缓慢** + - 分析缓存命中率和未命中率 + - 检查数据库查询性能 + - 监控Redis连接池使用情况 + +- **内存占用过高** + - 检查缓存键数量和大小 + - 验证TTL设置是否合理 + - 分析数据更新频率 + +**章节来源** +- [cmd/server/main.go:103-131](file://cmd/server/main.go#L103-L131) +- [internal/repository/brand.go:34-52](file://internal/repository/brand.go#L34-L52) +- [internal/repository/model.go:27-79](file://internal/repository/model.go#L27-L79) ## 结论 -当前缓存系统以简洁的方式完成了 Redis 客户端的初始化与注入,满足基本的键值写入需求。建议在后续迭代中补充连接池配置、过期策略、键命名规范与监控告警,以提升稳定性与可观测性。同时,可在更多处理器中引入缓存读取与写入,形成统一的缓存访问模式。 +Luxsin应用API的缓存系统实现了完整的Redis缓存解决方案,包含以下关键特性: + +- **完整的组件体系**:BrandCache和ModelCache提供了专业的缓存功能 +- **智能的缓存策略**:支持TTL管理、自动预热和多级缓存 +- **可靠的降级机制**:缓存失败时自动降级到数据库,确保服务可用性 +- **良好的扩展性**:清晰的架构设计便于添加新的缓存组件 + +建议在后续版本中进一步完善监控指标、缓存统计和动态配置功能,以提升系统的可观测性和运维效率。 ## 附录 -### 配置项一览 -- 应用层 - - APP_ENV:运行环境(development/production) - - APP_HOST:监听地址 - - APP_PORT:监听端口 -- Redis 层 - - REDIS_HOST:Redis 主机(优先级最高) - - REDIS_PORT:Redis 端口(默认 16279) - - REDIS_PASSWORD:Redis 密码(默认 eafon123!) - - REDIS_DATABASE:数据库编号(默认 1) +### 缓存配置参数 +- **TTL设置**:30分钟(brandTTL = 30 * time.Minute) +- **Redis连接**:默认数据库1,端口6379 +- **缓存键格式**: + - 品牌:`brand:all` + - 型号:`model:brand:{brandName}` + - 全量型号:`model:all` -章节来源 -- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) -- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56) \ No newline at end of file +### API接口说明 +- **品牌查询**:`GET /audio/getBrand?brandName={name}&base64=true` +- **型号查询**:`GET /audio/getModel?brandName={name}&modelName={name}&base64=true` + +### 监控指标 +- 缓存命中率 +- 缓存未命中率 +- 缓存写入成功率 +- 数据库查询次数 +- Redis连接池使用情况 + +**章节来源** +- [internal/cache/brand_cache.go:13-16](file://internal/cache/brand_cache.go#L13-L16) +- [internal/cache/model_cache.go:13-17](file://internal/cache/model_cache.go#L13-L17) +- [internal/handler/brand.go:25-48](file://internal/handler/brand.go#L25-L48) +- [internal/handler/model.go:25-49](file://internal/handler/model.go#L25-L49) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/核心模块/业务处理器.md b/.qoder/repowiki/zh/content/核心模块/业务处理器.md index 504095d..e7b8956 100644 --- a/.qoder/repowiki/zh/content/核心模块/业务处理器.md +++ b/.qoder/repowiki/zh/content/核心模块/业务处理器.md @@ -20,48 +20,59 @@ - [internal/middleware/request_id.go](file://internal/middleware/request_id.go) - [internal/model/brand.go](file://internal/model/brand.go) - [internal/model/model.go](file://internal/model/model.go) +- [internal/cache/brand_cache.go](file://internal/cache/brand_cache.go) +- [internal/cache/model_cache.go](file://internal/cache/model_cache.go) +## 更新摘要 +**变更内容** +- 更新依赖注入模式:所有处理器现在通过构造函数接收依赖项实例 +- 新增仓储层依赖:BrandHandler 和 ModelHandler 现在依赖仓储实例而非直接数据库连接 +- 更新路由装配:路由在启动时集中装配依赖并传递给处理器 +- 简化处理器实现:移除了对全局数据库连接的直接依赖 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) -6. [依赖分析](#依赖分析) -7. [性能考虑](#性能考虑) -8. [故障排查指南](#故障排查指南) -9. [结论](#结论) -10. [附录](#附录) +6. [依赖注入模式详解](#依赖注入模式详解) +7. [依赖分析](#依赖分析) +8. [性能考虑](#性能考虑) +9. [故障排查指南](#故障排查指南) +10. [结论](#结论) +11. [附录](#附录) ## 简介 -本文件面向 Luxsin 应用 API 的业务处理器模块,系统性梳理各处理器的职责、接口设计与实现细节,覆盖 BrandHandler、ModelHandler、ModelListHandler、DeviceHandler 与 HealthHandler。文档同时阐述依赖注入模式、错误处理机制、响应格式化策略,以及与 Gin 框架的集成方式;并通过流程图与类图展示处理器间的协作关系与数据流转过程,帮助初学者快速上手,同时为高级开发者提供深入的技术参考。 +本文件面向 Luxsin 应用 API 的业务处理器模块,系统性梳理各处理器的职责、接口设计与实现细节,覆盖 BrandHandler、ModelHandler、ModelListHandler、DeviceHandler 与 HealthHandler。文档重点阐述新的依赖注入模式、错误处理机制、响应格式化策略,以及与 Gin 框架的集成方式;并通过流程图与类图展示处理器间的协作关系与数据流转过程,帮助初学者快速上手,同时为高级开发者提供深入的技术参考。 ## 项目结构 -业务处理器位于 internal/handler 目录,围绕“控制器-仓储-搜索-缓存-响应”的分层组织,配合中间件与路由装配,形成清晰的控制流与依赖注入入口。 +业务处理器位于 internal/handler 目录,采用依赖注入模式,围绕"控制器-仓储-搜索-缓存-响应"的分层组织,配合中间件与路由装配,形成清晰的控制流与依赖注入入口。 ```mermaid graph TB subgraph "应用入口" MAIN["cmd/server/main.go
启动与配置加载"] -end +END subgraph "路由与中间件" -ROUTER["internal/router/router.go
路由注册与中间件装配"] +ROUTER["internal/router/router.go
路由注册与依赖注入"] CORS["internal/middleware/cors.go"] LOGMW["internal/middleware/logger.go"] REQID["internal/middleware/request_id.go"] end subgraph "业务处理器" -HEALTH["internal/handler/health.go"] -BRAND["internal/handler/brand.go"] -MODEL["internal/handler/model.go"] -MODELLIST["internal/handler/model_list.go"] -DEVICE["internal/handler/device.go"] +HEALTH["internal/handler/health.go
NewHealthHandler()"] +BRAND["internal/handler/brand.go
NewBrandHandler(brandRepo, log)"] +MODEL["internal/handler/model.go
NewModelHandler(modelRepo, log)"] +MODELLIST["internal/handler/model_list.go
NewModelListHandler(searchClient, log)"] +DEVICE["internal/handler/device.go
NewDeviceHandler(redis, log)"] end subgraph "基础设施" RESP["internal/response/response.go
统一响应体"] ENCODE["pkg/encode/base64.go
自定义Base64编码"] SEARCH["internal/search/meilisearch.go
Meilisearch客户端"] +CACHE["internal/cache/*
Redis缓存"] end MAIN --> ROUTER ROUTER --> CORS @@ -77,43 +88,42 @@ MODEL --> RESP MODELLIST --> RESP DEVICE --> RESP MODELLIST --> SEARCH +BRAND --> CACHE +MODEL --> CACHE BRAND --> ENCODE MODEL --> ENCODE MODELLIST --> ENCODE ``` -图表来源 -- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96) -- [internal/router/router.go:14-42](file://internal/router/router.go#L14-L42) -- [internal/handler/health.go:8-19](file://internal/handler/health.go#L8-L19) -- [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/device.go:14-85](file://internal/handler/device.go#L14-L85) -- [internal/response/response.go:9-37](file://internal/response/response.go#L9-L37) -- [pkg/encode/base64.go:8-52](file://pkg/encode/base64.go#L8-L52) -- [internal/search/meilisearch.go:13-46](file://internal/search/meilisearch.go#L13-L46) +**图表来源** +- [cmd/server/main.go:25-101](file://cmd/server/main.go#L25-L101) +- [internal/router/router.go:16-52](file://internal/router/router.go#L16-L52) +- [internal/handler/health.go:10](file://internal/handler/health.go#L10) +- [internal/handler/brand.go:18](file://internal/handler/brand.go#L18) +- [internal/handler/model.go:18](file://internal/handler/model.go#L18) +- [internal/handler/model_list.go:19](file://internal/handler/model_list.go#L19) +- [internal/handler/device.go:19](file://internal/handler/device.go#L19) -章节来源 -- [internal/router/router.go:14-42](file://internal/router/router.go#L14-L42) -- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96) +**章节来源** +- [internal/router/router.go:16-52](file://internal/router/router.go#L16-L52) +- [cmd/server/main.go:25-101](file://cmd/server/main.go#L25-L101) ## 核心组件 -- 健康检查处理器:提供轻量级健康状态返回,便于外部探活与编排。 -- 品牌查询处理器:按品牌名模糊查询品牌列表,支持可选的自定义 Base64 响应。 -- 型号查询处理器:按品牌或型号关键字查询型号列表,支持可选的自定义 Base64 响应。 -- 型号检索处理器:基于 Meilisearch 执行全文检索,支持可选的自定义 Base64 响应。 -- 设备上报处理器:接收设备信息(MAC、型号、版本、来源 IP),写入 Redis Hash。 +- **健康检查处理器**:提供轻量级健康状态返回,便于外部探活与编排。 +- **品牌查询处理器**:按品牌名模糊查询品牌列表,现在依赖 BrandRepository 实例。 +- **型号查询处理器**:按品牌或型号关键字查询型号列表,现在依赖 ModelRepository 实例。 +- **型号检索处理器**:基于 Meilisearch 执行全文检索,依赖搜索客户端实例。 +- **设备上报处理器**:接收设备信息(MAC、型号、版本、来源 IP),依赖 Redis 客户端。 -章节来源 +**章节来源** - [internal/handler/health.go:8-19](file://internal/handler/health.go#L8-L19) -- [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/device.go:14-85](file://internal/handler/device.go#L14-L85) +- [internal/handler/brand.go:13-23](file://internal/handler/brand.go#L13-L23) +- [internal/handler/model.go:13-23](file://internal/handler/model.go#L13-L23) +- [internal/handler/model_list.go:14-24](file://internal/handler/model_list.go#L14-L24) +- [internal/handler/device.go:14-24](file://internal/handler/device.go#L14-L24) ## 架构总览 -下图展示从请求进入至响应返回的关键路径,以及处理器与仓储、搜索、缓存、日志等组件的交互。 +下图展示从请求进入至响应返回的关键路径,以及处理器与仓储、搜索、缓存、日志等组件的交互,体现了完整的依赖注入架构。 ```mermaid sequenceDiagram @@ -130,149 +140,162 @@ alt "品牌/型号查询" H->>REPO : "List(ctx, filters)" REPO-->>H : "结果集" else "型号检索" -H->>S : "SearchWithContext(key, opts)" +H->>S : "ModelList(ctx, key, count)" S-->>H : "命中结果" else "设备上报" -H->>RC : "HSet(mac, json)" +H->>RC : "HSet(ctx, key, mac, json)" RC-->>H : "OK 或错误" end H->>L : "记录日志/错误" H-->>C : "JSON 或自定义Base64响应" ``` -图表来源 -- [internal/router/router.go:27-38](file://internal/router/router.go#L27-L38) -- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49) -- [internal/handler/model.go:26-50](file://internal/handler/model.go#L26-L50) -- [internal/handler/model_list.go:26-56](file://internal/handler/model_list.go#L26-L56) -- [internal/handler/device.go:26-84](file://internal/handler/device.go#L26-L84) -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) -- [internal/repository/model.go:20-61](file://internal/repository/model.go#L20-L61) +**图表来源** +- [internal/router/router.go:32-36](file://internal/router/router.go#L32-L36) +- [internal/handler/brand.go:29](file://internal/handler/brand.go#L29) +- [internal/handler/model.go:30](file://internal/handler/model.go#L30) +- [internal/handler/model_list.go:37](file://internal/handler/model_list.go#L37) +- [internal/handler/device.go:71](file://internal/handler/device.go#L71) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) - [internal/search/meilisearch.go:22-45](file://internal/search/meilisearch.go#L22-L45) ## 详细组件分析 ### 健康检查处理器(HealthHandler) -- 职责:对外暴露健康检查端点,返回统一响应体中的状态字段。 -- 接口设计:无状态对象,构造函数仅初始化空实例。 -- 实现要点: +- **职责**:对外暴露健康检查端点,返回统一响应体中的状态字段。 +- **接口设计**:无状态对象,构造函数仅初始化空实例。 +- **实现要点**: - 使用统一响应体封装返回值。 - 适合被反向代理或编排系统定期探测。 -- 典型调用路径:/api/v1/health +- **典型调用路径**:/api/v1/health -章节来源 +**章节来源** - [internal/handler/health.go:8-19](file://internal/handler/health.go#L8-L19) -- [internal/response/response.go:9-37](file://internal/response/response.go#L9-L37) -- [internal/router/router.go:29](file://internal/router/router.go#L29) +- [internal/response/response.go:15-21](file://internal/response/response.go#L15-L21) +- [internal/router/router.go:40](file://internal/router/router.go#L40) ### 品牌处理器(BrandHandler) -- 职责:根据品牌名称模糊查询品牌列表。 -- 输入参数: +- **职责**:根据品牌名称模糊查询品牌列表。 +- **输入参数**: - 查询字符串:brandName(可选) - 查询字符串:base64Resp(可选,默认开启) -- 处理流程: +- **处理流程**: - 读取查询参数并解析 base64Resp。 - 调用仓储层执行数据库查询。 - 若开启 base64Resp,则对结果进行 JSON 编码后返回字符串;否则直接返回 JSON。 -- 错误处理: +- **错误处理**: - 仓储查询失败时记录错误并返回统一内部错误。 - 编码失败时同样返回统一内部错误。 -- 数据模型:Brand +- **数据模型**:Brand +- **依赖注入**:通过 NewBrandHandler 构造函数注入 BrandRepository 和 zap.Logger ```mermaid classDiagram class BrandHandler { --repo : "BrandRepository" --log : "zap.Logger" -+GetBrand(c) +- repo : "BrandRepository" +- log : "zap.Logger" ++ NewBrandHandler(repo, log) : "BrandHandler" ++ GetBrand(c) } class BrandRepository { --db : "sql.DB" -+List(ctx, brandName) : "[]Brand,error" +- db : "sql.DB" +- cache : "BrandCache" ++ NewBrandRepository(db, cache) : "BrandRepository" ++ List(ctx, brandName) : "[]Brand,error" } class Brand { -+int id -+string name ++ ID : "int" ++ Name : "string" } -BrandHandler --> BrandRepository : "依赖" +BrandHandler --> BrandRepository : "依赖注入" BrandRepository --> Brand : "返回" ``` -图表来源 -- [internal/handler/brand.go:14-50](file://internal/handler/brand.go#L14-L50) -- [internal/repository/brand.go:12-50](file://internal/repository/brand.go#L12-L50) +**图表来源** +- [internal/handler/brand.go:13-23](file://internal/handler/brand.go#L13-L23) +- [internal/handler/brand.go:25-48](file://internal/handler/brand.go#L25-L48) +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) - [internal/model/brand.go:3-7](file://internal/model/brand.go#L3-L7) -章节来源 -- [internal/handler/brand.go:14-50](file://internal/handler/brand.go#L14-L50) -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) +**章节来源** +- [internal/handler/brand.go:13-48](file://internal/handler/brand.go#L13-L48) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) - [internal/model/brand.go:3-7](file://internal/model/brand.go#L3-L7) ### 型号处理器(ModelHandler) -- 职责:根据品牌或型号关键字查询型号列表。 -- 输入参数: +- **职责**:根据品牌或型号关键字查询型号列表。 +- **输入参数**: - 查询字符串:brandName(可选) - 查询字符串:modelName(可选) - 查询字符串:base64Resp(可选,默认开启) -- 处理流程: +- **处理流程**: - 读取查询参数并解析 base64Resp。 - 调用仓储层执行数据库查询。 - 结果处理与品牌处理器一致。 -- 错误处理: +- **错误处理**: - 仓储查询失败时记录错误并返回统一内部错误。 - 编码失败时同样返回统一内部错误。 -- 数据模型:Model +- **数据模型**:Model +- **依赖注入**:通过 NewModelHandler 构造函数注入 ModelRepository 和 zap.Logger ```mermaid classDiagram class ModelHandler { --repo : "ModelRepository" --log : "zap.Logger" -+GetModel(c) +- repo : "ModelRepository" +- log : "zap.Logger" ++ NewModelHandler(repo, log) : "ModelHandler" ++ GetModel(c) } class ModelRepository { --db : "sql.DB" -+List(ctx, brandName, modelName) : "[]Model,error" +- db : "sql.DB" +- cache : "ModelCache" ++ NewModelRepository(db, cache) : "ModelRepository" ++ List(ctx, brandName, modelName) : "[]Model,error" } class Model { -+int id -+string brandName -+string name -+*string form -+*string rig -+*string source -+*string eqKey -+time createAt ++ ID : "int" ++ BrandName : "string" ++ Name : "string" ++ Form : "*string" ++ Rig : "*string" ++ Source : "*string" ++ EqKey : "*string" ++ CreateAt : "time.Time" } -ModelHandler --> ModelRepository : "依赖" +ModelHandler --> ModelRepository : "依赖注入" ModelRepository --> Model : "返回" ``` -图表来源 -- [internal/handler/model.go:14-51](file://internal/handler/model.go#L14-L51) -- [internal/repository/model.go:12-61](file://internal/repository/model.go#L12-L61) +**图表来源** +- [internal/handler/model.go:13-23](file://internal/handler/model.go#L13-L23) +- [internal/handler/model.go:25-49](file://internal/handler/model.go#L25-L49) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) - [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15) -章节来源 -- [internal/handler/model.go:14-51](file://internal/handler/model.go#L14-L51) -- [internal/repository/model.go:20-61](file://internal/repository/model.go#L20-L61) +**章节来源** +- [internal/handler/model.go:13-49](file://internal/handler/model.go#L13-L49) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) - [internal/model/model.go:5-15](file://internal/model/model.go#L5-L15) ### 型号检索处理器(ModelListHandler) -- 职责:基于 Meilisearch 执行全文检索,返回匹配的型号元数据。 -- 输入参数: +- **职责**:基于 Meilisearch 执行全文检索,返回匹配的型号元数据。 +- **输入参数**: - 查询字符串:key(必需) - 查询字符串:count(可选,默认 100) - 查询字符串:base64Resp(可选,默认开启) -- 处理流程: +- **处理流程**: - 读取查询参数并解析 base64Resp。 - 限制 count 的最大值以避免过大的返回量。 - 调用搜索客户端执行检索。 - 结果处理与前两个处理器一致。 -- 错误处理: +- **错误处理**: - 检索失败时记录错误并返回统一内部错误。 - 编码失败时同样返回统一内部错误。 -- 数据模型:map[string]any(由搜索结果解码而来) +- **数据模型**:map[string]any(由搜索结果解码而来) +- **依赖注入**:通过 NewModelListHandler 构造函数注入 search.Client 和 zap.Logger ```mermaid sequenceDiagram @@ -283,41 +306,42 @@ participant E as "自定义Base64" participant R as "统一响应" C->>ML : "GET /audio/modelList?key=...&count=..." ML->>ML : "解析参数与count限制" -ML->>S : "SearchWithContext(key, limit, attributes)" +ML->>S : "ModelList(ctx, key, count)" S-->>ML : "hits" ML->>E : "可选:EncodeJSON(hits)" ML-->>C : "JSON 或 Base64(JSON)" ``` -图表来源 +**图表来源** - [internal/handler/model_list.go:26-56](file://internal/handler/model_list.go#L26-L56) - [internal/search/meilisearch.go:22-45](file://internal/search/meilisearch.go#L22-L45) - [pkg/encode/base64.go:35-51](file://pkg/encode/base64.go#L35-L51) - [internal/response/response.go:15-36](file://internal/response/response.go#L15-L36) -章节来源 +**章节来源** - [internal/handler/model_list.go:14-57](file://internal/handler/model_list.go#L14-L57) - [internal/search/meilisearch.go:22-45](file://internal/search/meilisearch.go#L22-L45) - [pkg/encode/base64.go:35-51](file://pkg/encode/base64.go#L35-L51) ### 设备上报处理器(DeviceHandler) -- 职责:接收设备上报信息(MAC、型号、版本、来源 IP),写入 Redis Hash。 -- 输入参数: +- **职责**:接收设备上报信息(MAC、型号、版本、来源 IP),写入 Redis Hash。 +- **输入参数**: - 查询字符串:mac(必填) - 查询字符串:model(必填) - 查询字符串:ver(可选) -- 处理流程: +- **处理流程**: - 校验必填参数,若缺失则返回统一错误响应。 - 组装设备信息结构体(含活跃日期、来源 IP、版本)。 - 将结构体序列化为 JSON 并写入 Redis Hash。 - 返回统一成功响应。 -- 错误处理: +- **错误处理**: - 参数校验失败返回统一错误。 - JSON 序列化失败返回统一错误。 - Redis 写入失败返回统一错误。 -- 并发与安全: +- **并发与安全**: - Redis HSet 是原子操作,适合高并发场景。 - 建议对 MAC 去除空白字符,避免重复键。 +- **依赖注入**:通过 NewDeviceHandler 构造函数注入 redis.Client 和 zap.Logger ```mermaid flowchart TD @@ -327,7 +351,7 @@ Validate -- 否 --> RespFail["返回统一错误响应"] Validate -- 是 --> BuildInfo["组装设备信息结构体"] BuildInfo --> Marshal{"JSON序列化成功?"} Marshal -- 否 --> RespFail -Marshal -- 是 --> HSet["Redis HSet(mac, json)"] +Marshal -- 是 --> HSet["Redis HSet(ctx, key, mac, json)"] HSet --> SetOK{"写入成功?"} SetOK -- 否 --> RespFail SetOK -- 是 --> RespOK["返回统一成功响应"] @@ -335,20 +359,102 @@ RespFail --> End(["结束"]) RespOK --> End ``` -图表来源 +**图表来源** - [internal/handler/device.go:26-84](file://internal/handler/device.go#L26-L84) -章节来源 +**章节来源** - [internal/handler/device.go:14-85](file://internal/handler/device.go#L14-L85) +## 依赖注入模式详解 + +### 依赖注入架构 +所有处理器现在都采用构造函数依赖注入模式,通过 New 函数接收所需的依赖项实例: + +```mermaid +graph LR +MAIN["main.go
应用启动"] --> ROUTER["router.New()
集中装配依赖"] +ROUTER --> DB["sql.DB
数据库连接"] +ROUTER --> RDB["redis.Client
Redis客户端"] +ROUTER --> SEARCH["search.Client
Meilisearch客户端"] +ROUTER --> LOG["zap.Logger
日志器"] +ROUTER --> BRANCACHE["cache.BrandCache
品牌缓存"] +ROUTER --> MODELCACHE["cache.ModelCache
型号缓存"] +ROUTER --> BRANDREPO["repository.NewBrandRepository()
品牌仓储"] +ROUTER --> MODELREPO["repository.NewModelRepository()
型号仓储"] +ROUTER --> HEALTH["handler.NewHealthHandler()
健康检查处理器"] +ROUTER --> BRAND["handler.NewBrandHandler()
品牌处理器"] +ROUTER --> MODEL["handler.NewModelHandler()
型号处理器"] +ROUTER --> MODELLIST["handler.NewModelListHandler()
型号检索处理器"] +ROUTER --> DEVICE["handler.NewDeviceHandler()
设备上报处理器"] +``` + +**图表来源** +- [cmd/server/main.go:53-69](file://cmd/server/main.go#L53-L69) +- [internal/router/router.go:16-36](file://internal/router/router.go#L16-L36) + +### 依赖注入优势 +- **测试友好**:可以轻松注入模拟对象进行单元测试 +- **解耦**:处理器不再直接依赖具体实现,只依赖抽象接口 +- **可配置**:运行时可以注入不同的实现 +- **生命周期管理**:依赖项的创建和销毁由路由集中管理 + +### 仓储层依赖 +BrandRepository 和 ModelRepository 现在接收 Redis 缓存实例作为依赖: + +```mermaid +classDiagram +class BrandRepository { +- db : "sql.DB" +- cache : "BrandCache" ++ NewBrandRepository(db, cache) : "BrandRepository" ++ List(ctx, brandName) : "[]Brand,error" ++ ListFromDB(ctx, brandName) : "[]Brand,error" +} +class ModelRepository { +- db : "sql.DB" +- cache : "ModelCache" ++ NewModelRepository(db, cache) : "ModelRepository" ++ List(ctx, brandName, modelName) : "[]Model,error" ++ ListAllFromDB(ctx) : "[]Model,error" ++ ListByBrandFromDB(ctx, brandName) : "[]Model,error" ++ ListByModelFromDB(ctx, modelName) : "[]Model,error" +} +class BrandCache { +- rdb : "redis.Client" ++ NewBrandCache(rdb) : "BrandCache" ++ GetAll(ctx) : "[]Brand,error" ++ SetAll(ctx, list) : "error" +} +class ModelCache { +- rdb : "redis.Client" ++ NewModelCache(rdb) : "ModelCache" ++ GetByBrand(ctx, brandName) : "[]Model,error" ++ SetByBrand(ctx, brandName, list) : "error" ++ GetAll(ctx) : "[]Model,error" ++ SetAll(ctx, list) : "error" +} +BrandRepository --> BrandCache : "依赖注入" +ModelRepository --> ModelCache : "依赖注入" +``` + +**图表来源** +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) + +**章节来源** +- [internal/router/router.go:16-36](file://internal/router/router.go#L16-L36) +- [cmd/server/main.go:53-69](file://cmd/server/main.go#L53-L69) + ## 依赖分析 -- 依赖注入模式: - - 控制器通过构造函数注入仓储、搜索客户端、Redis 客户端与日志器。 +- **依赖注入模式**: + - 所有处理器通过构造函数注入依赖项,包括仓储、搜索客户端、Redis 客户端与日志器。 - 路由在应用启动时集中装配,保证依赖一次性构建与共享。 -- 组件耦合: +- **组件耦合**: - 处理器与仓储之间为单向依赖,职责清晰。 - 搜索与缓存作为外部服务,通过客户端封装接入。 -- 可能的循环依赖: +- **可能的循环依赖**: - 当前结构未见循环导入,符合 Go 包管理最佳实践。 ```mermaid @@ -363,6 +469,10 @@ BRAND --> BREPO["repository/brand.go"] MODEL --> MREPO["repository/model.go"] MODELLIST --> SEARCH["search/meilisearch.go"] DEVICE --> REDIS["Redis 客户端"] +BRAND --> BREPO +BREPO --> BCACHE["cache/brand_cache.go"] +MODEL --> MREPO +MREPO --> MCACHE["cache/model_cache.go"] BRAND --> ENCODE["pkg/encode/base64.go"] MODEL --> ENCODE MODELLIST --> ENCODE @@ -370,62 +480,70 @@ ALL["各处理器"] --> RESP["internal/response/response.go"] ALL --> LOG["zap.Logger"] ``` -图表来源 -- [cmd/server/main.go:64](file://cmd/server/main.go#L64) -- [internal/router/router.go:21-25](file://internal/router/router.go#L21-L25) -- [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) -- [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) -- [internal/handler/model_list.go:19-24](file://internal/handler/model_list.go#L19-L24) -- [internal/handler/device.go:19-24](file://internal/handler/device.go#L19-L24) -- [internal/repository/brand.go:16](file://internal/repository/brand.go#L16) -- [internal/repository/model.go:16](file://internal/repository/model.go#L16) +**图表来源** +- [cmd/server/main.go:67-70](file://cmd/server/main.go#L67-L70) +- [internal/router/router.go:27-36](file://internal/router/router.go#L27-L36) +- [internal/handler/brand.go:18](file://internal/handler/brand.go#L18) +- [internal/handler/model.go:18](file://internal/handler/model.go#L18) +- [internal/handler/model_list.go:19](file://internal/handler/model_list.go#L19) +- [internal/handler/device.go:19](file://internal/handler/device.go#L19) +- [internal/repository/brand.go:19](file://internal/repository/brand.go#L19) +- [internal/repository/model.go:19](file://internal/repository/model.go#L19) - [internal/search/meilisearch.go:17](file://internal/search/meilisearch.go#L17) - [pkg/encode/base64.go:8](file://pkg/encode/base64.go#L8) - [internal/response/response.go:9](file://internal/response/response.go#L9) -章节来源 -- [internal/router/router.go:14-42](file://internal/router/router.go#L14-L42) -- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96) +**章节来源** +- [internal/router/router.go:16-52](file://internal/router/router.go#L16-L52) +- [cmd/server/main.go:25-101](file://cmd/server/main.go#L25-L101) ## 性能考虑 -- 响应体积优化 +- **响应体积优化** - 对于大结果集,优先启用自定义 Base64 响应,减少传输体积与字符转义开销。 - 检索处理器对 count 进行上限控制,避免超大数据量返回。 -- 数据库查询 +- **数据库查询** - 品牌与型号查询均使用 ORDER BY 与 LIKE,建议在数据库侧建立合适索引以提升模糊查询性能。 -- 搜索与缓存 + - 仓储层现在支持缓存降级,当缓存不可用时自动回退到数据库查询。 +- **搜索与缓存** - Meilisearch 适合全文检索,建议合理设置属性检索范围与分页大小。 - Redis 写入为单键 HSet,具备良好吞吐能力;建议评估内存占用与持久化策略。 -- 中间件与日志 + - 缓存层现在支持全量缓存和按品牌缓存两种策略,提升查询性能。 +- **中间件与日志** - 开启 Recovery、CORS、Logger、RequestID 中间件,有助于可观测性与稳定性;注意日志级别与输出频率对性能的影响。 -- 并发安全 +- **并发安全** - Redis HSet 为线程安全操作;处理器方法本身无共享可变状态,天然并发安全。 -- 最佳实践 + - 依赖注入模式减少了全局状态,提升了并发安全性。 +- **最佳实践** - 在生产环境启用 Release 模式,降低框架开销。 - 对外部依赖(数据库、搜索、缓存)增加超时与重试策略,提升鲁棒性。 + - 利用缓存预热机制,在应用启动时加载常用数据到缓存。 ## 故障排查指南 -- 健康检查失败 +- **健康检查失败** - 确认路由已正确注册到 /api/v1/health。 - 查看统一响应体是否返回状态字段。 -- 品牌/型号查询异常 +- **品牌/型号查询异常** - 检查数据库连接与 SQL 查询逻辑。 - - 关注日志中“query brand”、“query model”的错误堆栈。 -- 型号检索异常 + - 关注日志中"get brand list failed"、"get model list failed"的错误堆栈。 + - 验证缓存是否正常工作,检查 Redis 连接状态。 +- **型号检索异常** - 检查 Meilisearch 配置与索引可用性。 - - 关注“meilisearch search”与“decode meilisearch hit”的错误。 -- 设备上报异常 + - 关注"model list search failed"与"decode meilisearch hit"的错误。 +- **设备上报异常** - 校验必填参数 mac 与 model 是否传入。 - - 关注 JSON 序列化与 Redis HSet 的错误日志。 -- 统一响应与错误码 + - 关注"marshal device info failed"与"redis hset failed"的错误日志。 +- **依赖注入相关问题** + - 确认所有处理器都通过构造函数正确注入了依赖项。 + - 检查路由装配顺序,确保依赖项在处理器之前创建。 +- **统一响应与错误码** - 使用 internal/response/response.go 提供的 OK/Fail/BadRequest/InternalError 方法,确保错误码与消息格式一致。 -- 日志与追踪 +- **日志与追踪** - 通过 RequestID 中间件串联一次请求的全链路日志,结合 Logger 中间件定位问题。 -章节来源 +**章节来源** - [internal/handler/health.go:14-18](file://internal/handler/health.go#L14-L18) -- [internal/handler/brand.go:31-35](file://internal/handler/brand.go#L31-L35) -- [internal/handler/model.go:32-36](file://internal/handler/model.go#L32-L36) +- [internal/handler/brand.go:30-34](file://internal/handler/brand.go#L30-L34) +- [internal/handler/model.go:31-35](file://internal/handler/model.go#L31-L35) - [internal/handler/model_list.go:38-42](file://internal/handler/model_list.go#L38-L42) - [internal/handler/device.go:61-78](file://internal/handler/device.go#L61-L78) - [internal/response/response.go:15-36](file://internal/response/response.go#L15-L36) @@ -433,25 +551,34 @@ ALL --> LOG["zap.Logger"] - [internal/middleware/request_id.go:20-31](file://internal/middleware/request_id.go#L20-L31) ## 结论 -本处理器模块遵循清晰的分层与依赖注入原则,通过统一响应体与自定义 Base64 编码实现灵活的输出策略,结合 Gin 中间件与外部服务(数据库、Meilisearch、Redis)形成稳定高效的业务处理链路。建议在生产环境中进一步完善超时与重试、索引优化与缓存策略,持续提升性能与可靠性。 +本处理器模块采用全新的依赖注入模式,通过构造函数注入依赖项,实现了更好的解耦和可测试性。通过统一响应体与自定义 Base64 编码实现灵活的输出策略,结合 Gin 中间件与外部服务(数据库、Meilisearch、Redis)形成稳定高效的业务处理链路。新的架构模式简化了处理器实现,提升了代码质量,建议在生产环境中进一步完善超时与重试、索引优化与缓存策略,持续提升性能与可靠性。 ## 附录 -- 路由与处理器映射 +- **路由与处理器映射** - /api/v1/health -> HealthHandler.Check - /audio/getBrand -> BrandHandler.GetBrand - /audio/getModel -> ModelHandler.GetModel - /audio/modelList -> ModelListHandler.ModelList - /audio/reportDevInfo -> DeviceHandler.ReportDevInfo -- 常用调用示例(路径引用) - - 品牌查询:[internal/handler/brand.go:26](file://internal/handler/brand.go#L26) - - 型号查询:[internal/handler/model.go:26](file://internal/handler/model.go#L26) +- **依赖注入示例** + - 品牌处理器:BrandHandler.NewBrandHandler(brandRepo, log) + - 型号处理器:ModelHandler.NewModelHandler(modelRepo, log) + - 型号检索处理器:ModelListHandler.NewModelListHandler(searchClient, log) + - 设备上报处理器:DeviceHandler.NewDeviceHandler(redis, log) +- **常用调用示例(路径引用)** + - 品牌查询:[internal/handler/brand.go:25](file://internal/handler/brand.go#L25) + - 型号查询:[internal/handler/model.go:25](file://internal/handler/model.go#L25) - 型号检索:[internal/handler/model_list.go:26](file://internal/handler/model_list.go#L26) - 设备上报:[internal/handler/device.go:26](file://internal/handler/device.go#L26) - 健康检查:[internal/handler/health.go:14](file://internal/handler/health.go#L14) -- 配置与启动 +- **配置与启动** - 配置加载与环境变量:[internal/config/config.go:18-64](file://internal/config/config.go#L18-L64) - - 服务器启动与优雅关闭:[cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96) -- 中间件 + - 服务器启动与优雅关闭:[cmd/server/main.go:25-101](file://cmd/server/main.go#L25-L101) +- **中间件** - CORS:[internal/middleware/cors.go:7-21](file://internal/middleware/cors.go#L7-L21) - Logger:[internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45) - - RequestID:[internal/middleware/request_id.go:20-31](file://internal/middleware/request_id.go#L20-L31) \ No newline at end of file + - RequestID:[internal/middleware/request_id.go:20-31](file://internal/middleware/request_id.go#L20-L31) +- **缓存策略** + - 品牌缓存:brand:all 键,30分钟TTL + - 型号缓存:model:brand:{brand} 和 model:all 键,30分钟TTL + - 启动时预热缓存,提升首次查询性能 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/核心模块/数据访问层.md b/.qoder/repowiki/zh/content/核心模块/数据访问层.md index e6c70d9..4893ffe 100644 --- a/.qoder/repowiki/zh/content/核心模块/数据访问层.md +++ b/.qoder/repowiki/zh/content/核心模块/数据访问层.md @@ -4,8 +4,12 @@ **本文引用的文件** - [internal/repository/brand.go](file://internal/repository/brand.go) - [internal/repository/model.go](file://internal/repository/model.go) +- [internal/cache/brand_cache.go](file://internal/cache/brand_cache.go) +- [internal/cache/model_cache.go](file://internal/cache/model_cache.go) +- [internal/cache/redis.go](file://internal/cache/redis.go) - [internal/database/mysql.go](file://internal/database/mysql.go) - [internal/config/database.go](file://internal/config/database.go) +- [internal/config/redis.go](file://internal/config/redis.go) - [internal/config/config.go](file://internal/config/config.go) - [internal/model/brand.go](file://internal/model/brand.go) - [internal/model/model.go](file://internal/model/model.go) @@ -17,29 +21,38 @@ - [go.mod](file://go.mod) +## 更新摘要 +**变更内容** +- 新增缓存感知查询逻辑,增强品牌和型号仓库的缓存策略 +- 引入多级缓存架构,支持全量缓存和按品牌缓存 +- 实现智能数据刷新和预热机制 +- 添加缓存降级和错误处理策略 +- 更新架构图以反映新的缓存层集成 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) -6. [依赖关系分析](#依赖关系分析) -7. [性能考量](#性能考量) -8. [故障排查指南](#故障排查指南) -9. [结论](#结论) -10. [附录:扩展新 Repository 指南](#附录扩展新-repository-指南) +6. [缓存策略详解](#缓存策略详解) +7. [依赖关系分析](#依赖关系分析) +8. [性能考量](#性能考量) +9. [故障排查指南](#故障排查指南) +10. [结论](#结论) +11. [附录:扩展新 Repository 指南](#附录扩展新-repository-指南) ## 简介 -本文件聚焦于 Luxsin 应用 API 的数据访问层(Repository 层),系统性阐述 BrandRepository 与 ModelRepository 的设计模式、实现原理与职责边界;解释其在整体架构中的位置与交互方式;深入分析数据库连接管理、SQL 查询优化与事务处理机制;给出使用示例路径、错误处理与异常管理策略;总结并发安全、连接池管理与资源清理的最佳实践,并提供扩展新 Repository 的指导原则与注意事项。文档兼顾初学者与资深开发者的需求,既提供高层架构视图,也给出可落地的实现细节。 +本文件聚焦于 Luxsin 应用 API 的数据访问层(Repository 层),系统性阐述 BrandRepository 与 ModelRepository 的设计模式、实现原理与职责边界;解释其在整体架构中的位置与交互方式;深入分析数据库连接管理、SQL 查询优化与事务处理机制;详细介绍新增的缓存感知查询逻辑、多级缓存策略和智能数据刷新机制;给出使用示例路径、错误处理与异常管理策略;总结并发安全、连接池管理与资源清理的最佳实践,并提供扩展新 Repository 的指导原则与注意事项。文档兼顾初学者与资深开发者的需求,既提供高层架构视图,也给出可落地的实现细节。 ## 项目结构 -数据访问层位于 internal/repository 目录,配合 internal/database 提供底层数据库连接,internal/model 定义领域模型,internal/handler 通过注入的 Repository 执行业务逻辑,最终由 Gin 路由暴露接口。 +数据访问层位于 internal/repository 目录,配合 internal/cache 提供缓存层,internal/database 提供底层数据库连接,internal/model 定义领域模型,internal/handler 通过注入的 Repository 执行业务逻辑,最终由 Gin 路由暴露接口。 ```mermaid graph TB subgraph "应用入口" MAIN["cmd/server/main.go
启动服务与依赖初始化"] -end +END subgraph "路由与控制器" ROUTER["internal/router/router.go
注册路由与中间件"] BRAND_H["internal/handler/brand.go
品牌处理器"] @@ -49,9 +62,15 @@ subgraph "数据访问层" BR_REPO["internal/repository/brand.go
BrandRepository"] MD_REPO["internal/repository/model.go
ModelRepository"] end +subgraph "缓存层" +BR_CACHE["internal/cache/brand_cache.go
BrandCache"] +MD_CACHE["internal/cache/model_cache.go
ModelCache"] +REDIS["internal/cache/redis.go
Redis 客户端"] +end subgraph "数据库与配置" DB_SQL["internal/database/mysql.go
sql.DB 连接与池配置"] CFG_DB["internal/config/database.go
数据库配置加载"] +CFG_REDIS["internal/config/redis.go
Redis 配置加载"] CFG_APP["internal/config/config.go
应用配置聚合"] MODEL_TBL["sql/model.sql
表结构定义"] end @@ -64,57 +83,74 @@ ROUTER --> BRAND_H ROUTER --> MODEL_H BRAND_H --> BR_REPO MODEL_H --> MD_REPO +BR_REPO --> BR_CACHE +MD_REPO --> MD_CACHE +BR_CACHE --> REDIS +MD_CACHE --> REDIS BR_REPO --> DB_SQL MD_REPO --> DB_SQL DB_SQL --> CFG_DB CFG_APP --> CFG_DB +CFG_APP --> CFG_REDIS BR_REPO --> M_BRAND MD_REPO --> M_MODEL MODEL_TBL --> DB_SQL ``` -图表来源 -- [cmd/server/main.go:38-48](file://cmd/server/main.go#L38-L48) +**图表来源** +- [cmd/server/main.go:103-130](file://cmd/server/main.go#L103-L130) - [internal/router/router.go:22-25](file://internal/router/router.go#L22-L25) - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) +- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) - [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46) - [internal/config/database.go:17-40](file://internal/config/database.go#L17-L40) +- [internal/config/redis.go:9-57](file://internal/config/redis.go#L9-L57) - [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) - [sql/model.sql:24-35](file://sql/model.sql#L24-L35) -章节来源 -- [cmd/server/main.go:38-48](file://cmd/server/main.go#L38-L48) +**章节来源** +- [cmd/server/main.go:103-130](file://cmd/server/main.go#L103-L130) - [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41) - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) +- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16) - [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46) - [internal/config/database.go:17-40](file://internal/config/database.go#L17-L40) +- [internal/config/redis.go:9-57](file://internal/config/redis.go#L9-L57) - [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) - [sql/model.sql:24-35](file://sql/model.sql#L24-L35) ## 核心组件 -- BrandRepository:负责品牌列表查询,支持按名称模糊过滤,返回 Brand 领域对象切片。 -- ModelRepository:负责型号列表查询,支持按品牌名精确匹配或按型号名模糊匹配,返回 Model 领域对象切片,并对可空字段进行 NullString 到指针字符串的安全转换。 -- 数据库连接:通过 sql.DB 统一管理连接池,设置最大打开连接数、空闲连接数与连接生命周期,并在启动时进行 Ping 校验。 -- 配置加载:从环境变量或默认值加载数据库配置,生产环境要求提供密码。 -- Handler 注入:Gin 控制器通过 NewXxxHandler 构造函数注入 *sql.DB,再由 Handler 内部构造对应的 Repository 实例,形成清晰的依赖注入链路。 +- **BrandRepository**:负责品牌列表查询,支持缓存感知的全量查询和按名称模糊过滤,返回 Brand 领域对象切片。 +- **ModelRepository**:负责型号列表查询,支持缓存感知的按品牌精确匹配、按型号名模糊匹配和全量查询,返回 Model 领域对象切片,并对可空字段进行 NullString 到指针字符串的安全转换。 +- **缓存层**:BrandCache 和 ModelCache 提供多级缓存策略,支持全量缓存和按品牌缓存,具有智能刷新和降级机制。 +- **数据库连接**:通过 sql.DB 统一管理连接池,设置最大打开连接数、空闲连接数与连接生命周期,并在启动时进行 Ping 校验。 +- **配置加载**:从环境变量或默认值加载数据库和 Redis 配置,生产环境要求提供密码。 +- **Handler 注入**:Gin 控制器通过 NewXxxHandler 构造函数注入 *sql.DB 和缓存实例,再由 Handler 内部构造对应的 Repository 实例,形成清晰的依赖注入链路。 -章节来源 -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) -- [internal/repository/model.go:20-95](file://internal/repository/model.go#L20-L95) +**章节来源** +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) +- [internal/cache/brand_cache.go:26-44](file://internal/cache/brand_cache.go#L26-L44) +- [internal/cache/model_cache.go:31-69](file://internal/cache/model_cache.go#L31-L69) - [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46) - [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72) +- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57) - [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) ## 架构总览 -数据访问层采用“仓储模式”(Repository Pattern)封装数据库访问,将查询逻辑与业务逻辑解耦。Handler 仅依赖 Repository 接口,Repository 依赖 *sql.DB,配置与数据库模块负责基础设施初始化。整体流程如下: +数据访问层采用"仓储模式"(Repository Pattern)封装数据库访问,将查询逻辑与业务逻辑解耦。新增的缓存层提供多级缓存策略,支持智能数据刷新和降级机制。Handler 仅依赖 Repository 接口,Repository 依赖 *sql.DB 和缓存实例,配置与数据库模块负责基础设施初始化。整体流程如下: ```mermaid sequenceDiagram @@ -122,83 +158,131 @@ participant Client as "客户端" participant Router as "Gin 路由" participant Handler as "BrandHandler/ModelHandler" participant Repo as "BrandRepository/ModelRepository" +participant Cache as "BrandCache/ModelCache" participant DB as "sql.DB" +participant Redis as "Redis 服务器" participant MySQL as "MySQL 服务器" Client->>Router : "HTTP 请求" Router->>Handler : "分发到对应处理器" Handler->>Repo : "调用 List(...)" +alt 缓存命中 +Repo->>Cache : "GetAll/GetByBrand" +Cache->>Redis : "执行 GET" +Redis-->>Cache : "返回缓存数据" +Cache-->>Repo : "返回缓存数据" +else 缓存未命中或异常 +Repo->>Cache : "GetAll/GetByBrand" +Cache->>Redis : "执行 GET" +Redis-->>Cache : "返回错误或空值" Repo->>DB : "QueryContext(ctx, query, args...)" DB->>MySQL : "执行 SQL" MySQL-->>DB : "返回结果集" DB-->>Repo : "Rows" +Repo->>Cache : "SetAll/SetByBrand" +Cache->>Redis : "执行 SET" +Redis-->>Cache : "确认存储" +end Repo-->>Handler : "领域对象切片" Handler-->>Client : "JSON 或 Base64 响应" ``` -图表来源 -- [internal/handler/brand.go:30-35](file://internal/handler/brand.go#L30-L35) -- [internal/handler/model.go:31-36](file://internal/handler/model.go#L31-L36) -- [internal/repository/brand.go:31-35](file://internal/repository/brand.go#L31-L35) -- [internal/repository/model.go:42-46](file://internal/repository/model.go#L42-L46) +**图表来源** +- [internal/handler/brand.go:25-48](file://internal/handler/brand.go#L25-L48) +- [internal/handler/model.go:25-49](file://internal/handler/model.go#L25-L49) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) +- [internal/cache/brand_cache.go:26-44](file://internal/cache/brand_cache.go#L26-L44) +- [internal/cache/model_cache.go:31-69](file://internal/cache/model_cache.go#L31-L69) - [internal/database/mysql.go:28-43](file://internal/database/mysql.go#L28-L43) ## 详细组件分析 ### BrandRepository 设计与实现 -- 设计模式:仓储模式,面向领域模型 Brand,封装查询逻辑。 -- 关键点: - - 支持按品牌名称模糊过滤,无参数时返回全部记录并按名称升序排序。 - - 使用 QueryContext 传递请求上下文,便于超时与取消控制。 - - 使用 defer rows.Close() 确保资源释放。 - - 使用 fmt.Errorf 包裹底层错误,保留调用栈信息。 -- 错误处理:对查询、扫描、迭代阶段分别进行错误包装,便于定位问题。 -- 性能优化建议: - - 若品牌名称查询频繁,可在 name 字段建立索引(当前表结构未见显式索引,但可考虑)。 - - 对于大结果集,建议引入分页参数(limit/offset)避免一次性返回过多数据。 +- **设计模式**:仓储模式,面向领域模型 Brand,封装查询逻辑,现已集成缓存感知功能。 +- **关键特性**: + - 支持缓存感知的全量品牌查询,优先从 Redis 获取全量品牌数据 + - 缓存未命中或 Redis 异常时自动降级到数据库查询 + - 支持按品牌名称模糊过滤,无参数时返回全部记录并按名称升序排序 + - 使用 QueryContext 传递请求上下文,便于超时与取消控制 + - 使用 defer rows.Close() 确保资源释放 + - 使用 fmt.Errorf 包裹底层错误,保留调用栈信息 + - 缓存回写机制:成功从数据库获取数据后自动回写全量缓存 +- **缓存策略**: + - 缓存键:`brand:all` + - TTL:30分钟 + - 应用层过滤:在缓存命中时进行模糊过滤,减少数据库压力 +- **错误处理**:对缓存读取、数据库查询、扫描、迭代阶段分别进行错误包装,便于定位问题。 ```mermaid classDiagram class BrandRepository { -db : "*sql.DB" -+NewBrandRepository(db) BrandRepository +-cache : "*cache.BrandCache" ++NewBrandRepository(db, brandCache) BrandRepository +List(ctx, brandName) []Brand,error ++ListFromDB(ctx, brandName) []Brand,error +-filterBrands(list, brandName) []Brand +} +class BrandCache { +-rdb : "*redis.Client" ++GetAll(ctx) []Brand,error ++SetAll(ctx, list) error } class Brand { +int ID +string Name } BrandRepository --> Brand : "返回领域对象" +BrandRepository --> BrandCache : "使用缓存" +BrandCache --> Brand : "返回缓存数据" ``` -图表来源 -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) +**图表来源** +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) - [internal/model/brand.go:3-6](file://internal/model/brand.go#L3-L6) -章节来源 -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) +**章节来源** +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) - [internal/model/brand.go:3-6](file://internal/model/brand.go#L3-L6) ### ModelRepository 设计与实现 -- 设计模式:仓储模式,面向领域模型 Model,封装查询逻辑。 -- 关键点: - - 支持两种查询条件:按品牌名精确匹配或按型号名模糊匹配;两者皆为空时返回空切片。 - - 使用自定义 scanModel(rows) 将 sql.NullString 安全转换为 *string,避免空值导致的序列化问题。 - - 使用 QueryContext 传递上下文,defer rows.Close() 保证资源释放。 - - 对扫描与迭代阶段进行错误包装。 -- 表结构要点:model 表包含唯一索引 model_name(brand_name, name),有利于去重与高效检索。 -- 性能优化建议: - - 为 brand_name 建立索引以提升按品牌筛选性能。 - - 为 name 建立前缀匹配索引(如使用 LIKE '%pattern%' 的场景)。 - - 引入分页参数,限制单次查询返回数量。 +- **设计模式**:仓储模式,面向领域模型 Model,封装查询逻辑,现已集成缓存感知功能。 +- **关键特性**: + - 支持三种查询条件:按品牌精确匹配、按型号名模糊匹配、全量查询;两者皆为空时返回空切片 + - 缓存感知查询:按品牌查询优先从缓存获取,按型号模糊查询从全量缓存过滤 + - 缓存未命中或 Redis 异常时自动降级到数据库查询 + - 使用自定义 scanModel(rows) 将 sql.NullString 安全转换为 *string,避免空值导致的序列化问题 + - 使用 QueryContext 传递上下文,defer rows.Close() 保证资源释放 + - 对扫描与迭代阶段进行错误包装 + - 缓存回写机制:成功从数据库获取数据后自动回写相应缓存 +- **缓存策略**: + - 按品牌缓存:键格式为 `model:brand:{brandName}`,TTL 30分钟 + - 全量缓存:键为 `model:all`,TTL 30分钟 + - 应用层过滤:在全量缓存命中时进行模糊过滤,减少数据库压力 +- **表结构要点**:model 表包含唯一索引 model_name(brand_name, name),有利于去重与高效检索。 ```mermaid classDiagram class ModelRepository { -db : "*sql.DB" -+NewModelRepository(db) ModelRepository +-cache : "*cache.ModelCache" ++NewModelRepository(db, modelCache) ModelRepository +List(ctx, brandName, modelName) []Model,error ++ListAllFromDB(ctx) []Model,error ++ListByBrandFromDB(ctx, brandName) []Model,error ++ListByModelFromDB(ctx, modelName) []Model,error +-filterModels(list, modelName) []Model +} +class ModelCache { +-rdb : "*redis.Client" ++GetByBrand(ctx, brandName) []Model,error ++SetByBrand(ctx, brandName, list) error ++GetAll(ctx) []Model,error ++SetAll(ctx, list) error } class Model { +int ID @@ -211,55 +295,110 @@ class Model { +time CreateAt } ModelRepository --> Model : "返回领域对象" +ModelRepository --> ModelCache : "使用缓存" +ModelCache --> Model : "返回缓存数据" ``` -图表来源 -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) -- [internal/repository/model.go:20-95](file://internal/repository/model.go#L20-L95) +**图表来源** +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) - [internal/model/model.go:5-14](file://internal/model/model.go#L5-L14) -章节来源 -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) -- [internal/repository/model.go:20-95](file://internal/repository/model.go#L20-L95) +**章节来源** +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) - [internal/model/model.go:5-14](file://internal/model/model.go#L5-L14) - [sql/model.sql:34](file://sql/model.sql#L34) ### Handler 与 Repository 的协作 -- Handler 通过 NewBrandHandler/NewModelHandler 注入 *sql.DB,内部构造对应 Repository 实例。 +- Handler 通过 NewBrandHandler/NewModelHandler 注入 *sql.DB 和缓存实例,内部构造对应 Repository 实例。 - Handler 在 GetBrand/GetModel 中读取查询参数,调用 Repository.List(...),并将结果以 JSON 或 Base64 编码返回。 - 错误处理:若 Repository 返回错误,Handler 记录日志并返回统一的内部错误响应。 +- 缓存感知:Handler 不需要关心缓存逻辑,只需调用 Repository 的标准方法即可享受缓存优势。 ```mermaid sequenceDiagram participant C as "客户端" participant H as "BrandHandler" participant R as "BrandRepository" -participant DB as "sql.DB" +participant RC as "Redis 客户端" C->>H : "GET /audio/getBrand?brandName=..." H->>R : "List(ctx, brandName)" +R->>RC : "GetAll(ctx)" +RC-->>R : "缓存命中/未命中" +alt 缓存命中 +R-->>H : "[]Brand" +else 缓存未命中 R->>DB : "QueryContext(ctx, ...)" DB-->>R : "rows" +R->>RC : "SetAll(ctx, allBrands)" R-->>H : "[]Brand" +end H-->>C : "JSON 或 Base64" ``` -图表来源 -- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49) -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) +**图表来源** +- [internal/handler/brand.go:25-48](file://internal/handler/brand.go#L25-L48) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) - [internal/database/mysql.go:28-43](file://internal/database/mysql.go#L28-L43) -章节来源 +**章节来源** - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) -- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49) +- [internal/handler/brand.go:25-48](file://internal/handler/brand.go#L25-L48) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) -- [internal/handler/model.go:26-50](file://internal/handler/model.go#L26-L50) -- [internal/repository/brand.go:20-50](file://internal/repository/brand.go#L20-L50) -- [internal/repository/model.go:20-95](file://internal/repository/model.go#L20-L95) +- [internal/handler/model.go:25-49](file://internal/handler/model.go#L25-L49) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) + +## 缓存策略详解 + +### 多级缓存架构 +数据访问层采用了多级缓存策略,分为以下层级: + +1. **应用层缓存**:Redis 缓存,提供高性能的数据访问 +2. **内存缓存**:应用进程内的缓存,提供最快的访问速度 +3. **数据库缓存**:MySQL 查询缓存,利用数据库自身的缓存机制 + +### 缓存键设计 +- **品牌全量缓存**:`brand:all` - 存储所有品牌信息 +- **型号按品牌缓存**:`model:brand:{brandName}` - 存储特定品牌的所有型号 +- **型号全量缓存**:`model:all` - 存储所有型号信息 + +### 缓存策略实现 +- **缓存优先策略**:优先从缓存获取数据,缓存未命中时才查询数据库 +- **智能降级策略**:Redis 异常时自动降级到数据库查询,保证系统可用性 +- **自动回写策略**:成功从数据库获取数据后自动回写到缓存 +- **TTL 策略**:所有缓存设置 30 分钟过期时间,平衡性能和数据新鲜度 + +### 预热机制 +应用启动时会自动预热缓存,从数据库加载全量数据到 Redis: + +```mermaid +flowchart TD +A[应用启动] --> B[创建缓存实例] +B --> C[创建仓库实例] +C --> D[查询品牌全量数据] +D --> E[写入 brand:all 缓存] +E --> F[查询型号全量数据] +F --> G[写入 model:all 缓存] +G --> H[缓存预热完成] +``` + +**图表来源** +- [cmd/server/main.go:103-130](file://cmd/server/main.go#L103-L130) + +**章节来源** +- [internal/cache/brand_cache.go:13-16](file://internal/cache/brand_cache.go#L13-L16) +- [internal/cache/model_cache.go:13-16](file://internal/cache/model_cache.go#L13-L16) +- [cmd/server/main.go:103-130](file://cmd/server/main.go#L103-L130) ## 依赖关系分析 -- 外部依赖:Go MySQL Driver、Gin、Zap 日志、Redis 客户端、Meilisearch 客户端。 -- 内部依赖:Handler 依赖 Repository;Repository 依赖 *sql.DB;数据库模块负责连接池与 Ping 校验;配置模块负责环境变量解析与校验。 -- 循环依赖:未发现循环依赖,职责边界清晰。 +- **外部依赖**:Go MySQL Driver、Gin、Zap 日志、Redis 客户端、Meilisearch 客户端。 +- **内部依赖**:Handler 依赖 Repository;Repository 依赖 *sql.DB 和缓存实例;缓存层依赖 Redis 客户端;数据库模块负责连接池与 Ping 校验;配置模块负责环境变量解析与校验。 +- **循环依赖**:未发现循环依赖,职责边界清晰。 +- **新增依赖**:缓存层增加了对 Redis 客户端的依赖,以及对缓存配置的依赖。 ```mermaid graph LR @@ -270,105 +409,147 @@ GO_MOD --> REDIS["github.com/redis/go-redis/v9"] GO_MOD --> MEILI["github.com/meilisearch/meilisearch-go"] MAIN["cmd/server/main.go"] --> DB_OPEN["internal/database/mysql.go::Open"] MAIN --> CFG_LOAD["internal/config/config.go::Load"] +MAIN --> WARM_UP["warmUpCache 预热缓存"] CFG_LOAD --> CFG_DB["internal/config/database.go::loadDatabase"] +CFG_LOAD --> CFG_REDIS["internal/config/redis.go::loadRedis"] ROUTER["internal/router/router.go"] --> BRAND_H["internal/handler/brand.go"] ROUTER --> MODEL_H["internal/handler/model.go"] BRAND_H --> BR_REPO["internal/repository/brand.go"] MODEL_H --> MD_REPO["internal/repository/model.go"] +BR_REPO --> BR_CACHE["internal/cache/brand_cache.go"] +MD_REPO --> MD_CACHE["internal/cache/model_cache.go"] +BR_CACHE --> REDIS_CLIENT["internal/cache/redis.go::NewClient"] +MD_CACHE --> REDIS_CLIENT BR_REPO --> DB_SQL["*sql.DB"] MD_REPO --> DB_SQL +BR_CACHE --> REDIS_CLIENT +MD_CACHE --> REDIS_CLIENT ``` -图表来源 +**图表来源** - [go.mod:5-11](file://go.mod#L5-L11) -- [cmd/server/main.go:38-48](file://cmd/server/main.go#L38-L48) +- [cmd/server/main.go:25-69](file://cmd/server/main.go#L25-L69) - [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) - [internal/config/database.go:17-40](file://internal/config/database.go#L17-L40) +- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57) - [internal/router/router.go:22-25](file://internal/router/router.go#L22-L25) - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) -章节来源 +**章节来源** - [go.mod:5-11](file://go.mod#L5-L11) -- [cmd/server/main.go:38-48](file://cmd/server/main.go#L38-L48) +- [cmd/server/main.go:25-69](file://cmd/server/main.go#L25-L69) - [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52) - [internal/config/database.go:17-40](file://internal/config/database.go#L17-L40) +- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57) - [internal/router/router.go:22-25](file://internal/router/router.go#L22-L25) - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) ## 性能考量 -- 连接池配置 +- **连接池配置** - 最大打开连接数:25 - 最大空闲连接数:5 - 连接最大生命周期:5 分钟 - 启动时使用 PingContext 进行健康检查,失败则关闭连接并返回错误 -- 查询优化 +- **缓存性能优化** + - 缓存命中率:通过多级缓存策略最大化缓存命中率 + - TTL 设置:30分钟的TTL平衡了性能和数据新鲜度 + - 预热机制:启动时预热缓存,避免冷启动时的缓存穿透 + - 降级机制:Redis异常时自动降级到数据库,保证系统可用性 +- **查询优化** - BrandRepository:按名称模糊匹配,建议在 name 上建立合适索引;对大结果集引入分页。 - ModelRepository:按品牌名精确匹配或按型号名模糊匹配,建议为 brand_name 与 name 建立索引;对大结果集引入分页。 -- 并发安全 + - 应用层过滤:在缓存命中时进行过滤,减少数据库压力。 +- **并发安全** - *sql.DB 是并发安全的,可在多个 goroutine 中共享使用;Repository 实例不持有状态,亦可并发安全使用。 -- 资源清理 + - Redis 客户端是并发安全的,支持多goroutine同时访问。 +- **资源清理** - 使用 defer rows.Close() 保证结果集关闭;在 main 中 defer db.Close() 保证应用退出时关闭连接池。 -- 事务处理 + - Redis 连接在应用退出时自动关闭。 +- **事务处理** - 当前实现均为只读查询,未涉及事务;如需写操作,应在 Repository 层封装事务,使用 sql.Tx 并在错误时回滚,成功时提交。 -章节来源 +**章节来源** - [internal/database/mysql.go:33-43](file://internal/database/mysql.go#L33-L43) -- [internal/repository/brand.go:31-35](file://internal/repository/brand.go#L31-L35) -- [internal/repository/model.go:42-46](file://internal/repository/model.go#L42-L46) -- [cmd/server/main.go:42](file://cmd/server/main.go#L42) +- [internal/cache/brand_cache.go:13-16](file://internal/cache/brand_cache.go#L13-L16) +- [internal/cache/model_cache.go:13-16](file://internal/cache/model_cache.go#L13-L16) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) +- [cmd/server/main.go:103-130](file://cmd/server/main.go#L103-L130) ## 故障排查指南 -- 连接失败 +- **连接失败** - 现象:启动时 Ping 失败或无法连接数据库。 - 排查:检查 DATABASE_HOST/DATABASE_PORT/DATABASE_NAME/DATABASE_USER/DATABASE_PASSWORD 等环境变量;确认网络连通性;核对生产环境必须提供 DATABASE_PASSWORD。 -- 查询错误 +- **Redis 连接失败** + - 现象:应用启动时无法连接 Redis 或缓存预热失败。 + - 排查:检查 REDIS_HOST/REDIS_PORT/REDIS_PASSWORD/REDIS_DATABASE 等环境变量;确认 Redis 服务正常运行;验证认证信息正确。 +- **缓存查询错误** + - 现象:Handler 返回内部错误或缓存数据格式异常。 + - 排查:查看日志中错误上下文(cache read/write/brand/model),定位具体环节;检查 Redis 连接状态;确认缓存数据格式正确。 +- **查询错误** - 现象:Handler 返回内部错误。 - 排查:查看日志中错误上下文(query brand/query model/scan brand/scan model/iterate brand/iterate model),定位具体环节;检查 SQL 参数绑定与字段映射。 -- 结果为空 +- **结果为空** - 现象:ModelRepository 在两种条件都为空时返回空切片。 - 排查:确认传入的查询参数是否正确;检查表中是否存在匹配数据。 -- 资源泄漏 +- **资源泄漏** - 现象:长时间运行后连接数异常。 - 排查:确认是否遗漏 rows.Close();检查连接池配置是否合理;观察连接生命周期与空闲连接上限。 +- **缓存未命中** + - 现象:频繁出现缓存未命中,数据库压力过大。 + - 排查:检查缓存键是否正确;确认 TTL 设置是否合理;验证缓存预热是否成功;检查 Redis 内存使用情况。 -章节来源 +**章节来源** - [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72) -- [internal/handler/brand.go:30-35](file://internal/handler/brand.go#L30-L35) -- [internal/handler/model.go:31-36](file://internal/handler/model.go#L31-L36) -- [internal/repository/brand.go:32-47](file://internal/repository/brand.go#L32-L47) -- [internal/repository/model.go:43-58](file://internal/repository/model.go#L43-L58) +- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57) +- [internal/handler/brand.go:25-48](file://internal/handler/brand.go#L25-L48) +- [internal/handler/model.go:25-49](file://internal/handler/model.go#L25-L49) +- [internal/repository/brand.go:23-52](file://internal/repository/brand.go#L23-L52) +- [internal/repository/model.go:23-79](file://internal/repository/model.go#L23-L79) ## 结论 -Luxsin 的数据访问层采用清晰的仓储模式,将数据库访问与业务逻辑解耦,具备良好的可维护性与扩展性。通过合理的连接池配置、上下文传播与错误包装,实现了稳定可靠的查询能力。建议后续在查询性能上引入索引与分页,在写操作上引入事务封装,并持续完善监控与日志体系。 +Luxsin 的数据访问层经过重构后,采用了更加完善的缓存感知查询逻辑,实现了多级缓存策略和智能数据刷新机制。通过集成 Redis 缓存层,显著提升了查询性能和系统可用性。缓存感知查询逻辑、智能降级策略、预热机制和自动回写功能共同构成了一个健壮的数据访问层。建议后续继续优化缓存策略,增加缓存监控指标,完善缓存失效和更新机制,并持续改进监控与日志体系。 ## 附录:扩展新 Repository 指南 -- 设计原则 - - 保持 Repository 无状态,仅依赖 *sql.DB。 +- **设计原则** + - 保持 Repository 无状态,仅依赖 *sql.DB 和缓存实例。 - 查询方法接收 context.Context,便于超时与取消控制。 - 对外返回领域模型(Model),避免直接暴露数据库结构。 - 对可空字段使用 sql.NullString 到指针字符串的安全转换。 -- 实现步骤 + - 集成缓存感知查询逻辑,提供智能降级和自动回写功能。 +- **实现步骤** - 定义领域模型(Model)与 Repository 接口/实现。 - - 在 Handler 中注入 *sql.DB,构造 Repository 实例。 + - 创建对应的缓存结构体,定义缓存键和TTL策略。 + - 在 Handler 中注入 *sql.DB 和缓存实例,构造 Repository 实例。 - 在路由中注册对应处理器。 - - 在 main 中确保 *sql.DB 注入到 Handler。 -- 注意事项 + - 在 main 中确保 *sql.DB 和缓存实例注入到 Handler。 + - 实现缓存预热逻辑,确保应用启动时缓存可用。 +- **注意事项** - 必须在每个查询后 defer rows.Close()。 - 使用 fmt.Errorf 包裹底层错误,保留调用栈信息。 - 生产环境务必提供数据库密码等敏感配置。 - 如需写操作,封装事务并在错误时回滚,成功时提交。 - 对高频查询建立合适的索引,必要时引入分页参数。 + - 实现缓存降级机制,确保Redis异常时系统仍可正常工作。 + - 设计合理的缓存键和TTL策略,平衡性能和数据新鲜度。 + - 实现缓存预热和自动回写机制,提升用户体验。 -章节来源 -- [internal/repository/brand.go:12-18](file://internal/repository/brand.go#L12-L18) -- [internal/repository/model.go:12-18](file://internal/repository/model.go#L12-L18) +**章节来源** +- [internal/repository/brand.go:14-21](file://internal/repository/brand.go#L14-L21) +- [internal/repository/model.go:14-21](file://internal/repository/model.go#L14-L21) +- [internal/cache/brand_cache.go:18-24](file://internal/cache/brand_cache.go#L18-L24) +- [internal/cache/model_cache.go:19-25](file://internal/cache/model_cache.go#L19-L25) - [internal/handler/brand.go:19-24](file://internal/handler/brand.go#L19-L24) - [internal/handler/model.go:19-24](file://internal/handler/model.go#L19-L24) - [internal/router/router.go:22-25](file://internal/router/router.go#L22-L25) -- [cmd/server/main.go:64](file://cmd/server/main.go#L64) \ No newline at end of file +- [cmd/server/main.go:103-130](file://cmd/server/main.go#L103-L130) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/系统架构/路由系统.md b/.qoder/repowiki/zh/content/系统架构/路由系统.md index 9b341af..55d1544 100644 --- a/.qoder/repowiki/zh/content/系统架构/路由系统.md +++ b/.qoder/repowiki/zh/content/系统架构/路由系统.md @@ -16,6 +16,13 @@ - [config.go](file://internal/config/config.go) - [base64.go](file://pkg/encode/base64.go) - [README.md](file://README.md) +- [redis.go](file://internal/cache/redis.go) +- [brand_cache.go](file://internal/cache/brand_cache.go) +- [model_cache.go](file://internal/cache/model_cache.go) +- [brand.go](file://internal/repository/brand.go) +- [model.go](file://internal/repository/model.go) +- [redis.go](file://internal/config/redis.go) +- [meilisearch.go](file://internal/config/meilisearch.go) ## 目录 @@ -36,39 +43,50 @@ - 路由分组策略(/api/v1 与 /audio) - 中间件执行顺序与职责(CORS、日志、请求 ID) - 各端点功能、参数与返回规范 +- 依赖注入链:缓存与仓库实例的初始化与装配 - 最佳实践与性能优化建议 - 典型调用序列与中间件链路分析 ## 项目结构 -路由系统位于 internal/router,入口在 cmd/server/main.go,配合中间件、处理器、统一响应体与配置模块协同工作。 +路由系统位于 internal/router,入口在 cmd/server/main.go,配合中间件、处理器、统一响应体、缓存与仓库模块协同工作。**更新**:路由系统现已增强,负责初始化缓存和仓库实例,建立完整的依赖注入链。 ```mermaid graph TB subgraph "服务入口" MAIN["cmd/server/main.go
启动 HTTP 服务器"] -end +ENDSUBGRAPH subgraph "路由与中间件" ROUTER["internal/router/router.go
路由工厂与分组注册"] CORS["internal/middleware/cors.go
CORS 中间件"] LOGMW["internal/middleware/logger.go
日志中间件"] REQID["internal/middleware/request_id.go
请求 ID 中间件"] -end +ENDSUBGRAPH +subgraph "缓存与仓库层" +BRANDCACHE["internal/cache/brand_cache.go
品牌缓存"] +MODELCACHE["internal/cache/model_cache.go
型号缓存"] +BRANDREPO["internal/repository/brand.go
品牌仓库"] +MODELREPO["internal/repository/model.go
型号仓库"] +ENDSUBGRAPH subgraph "处理器层" HEALTH["internal/handler/health.go"] BRAND["internal/handler/brand.go"] MODEL["internal/handler/model.go"] MODELLIST["internal/handler/model_list.go"] DEVICE["internal/handler/device.go"] -end +ENDSUBGRAPH subgraph "基础设施" RESP["internal/response/response.go
统一响应体"] ENCODE["pkg/encode/base64.go
Base64 编解码"] CONFIG["internal/config/config.go
配置加载"] -end +ENDSUBGRAPH MAIN --> ROUTER ROUTER --> CORS ROUTER --> LOGMW ROUTER --> REQID +ROUTER --> BRANDCACHE +ROUTER --> MODELCACHE +ROUTER --> BRANDREPO +ROUTER --> MODELREPO ROUTER --> HEALTH ROUTER --> BRAND ROUTER --> MODEL @@ -83,40 +101,37 @@ BRAND --> ENCODE MODEL --> ENCODE ``` -图表来源 -- [router.go:14-41](file://internal/router/router.go#L14-L41) -- [main.go:64-69](file://cmd/server/main.go#L64-L69) -- [cors.go:7-19](file://internal/middleware/cors.go#L7-L19) -- [logger.go:10-44](file://internal/middleware/logger.go#L10-L44) -- [request_id.go:20-29](file://internal/middleware/request_id.go#L20-L29) -- [health.go:14-18](file://internal/handler/health.go#L14-L18) -- [brand.go:26-49](file://internal/handler/brand.go#L26-L49) -- [model.go:26-49](file://internal/handler/model.go#L26-L49) -- [model_list.go:26-55](file://internal/handler/model_list.go#L26-L55) -- [device.go:26-84](file://internal/handler/device.go#L26-L84) -- [response.go:15-36](file://internal/response/response.go#L15-L36) -- [base64.go:44-51](file://pkg/encode/base64.go#L44-L51) -- [config.go:18-56](file://internal/config/config.go#L18-L56) +**图表来源** +- [router.go:16-52](file://internal/router/router.go#L16-L52) +- [main.go:59-70](file://cmd/server/main.go#L59-L70) +- [brand_cache.go:18-44](file://internal/cache/brand_cache.go#L18-L44) +- [model_cache.go:19-69](file://internal/cache/model_cache.go#L19-L69) +- [brand.go:14-52](file://internal/repository/brand.go#L14-L52) +- [model.go:14-79](file://internal/repository/model.go#L14-L79) -章节来源 -- [router.go:14-41](file://internal/router/router.go#L14-L41) -- [main.go:22-95](file://cmd/server/main.go#L22-L95) +**章节来源** +- [router.go:16-52](file://internal/router/router.go#L16-L52) +- [main.go:25-101](file://cmd/server/main.go#L25-L101) - [README.md:19-123](file://README.md#L19-L123) ## 核心组件 -- 路由工厂函数 New:集中初始化 Gin 引擎、注册全局中间件、创建各处理器实例,并完成路由分组与注册。 +- 路由工厂函数 New:集中初始化 Gin 引擎、注册全局中间件、创建各处理器实例,并完成路由分组与注册。**更新**:现负责初始化缓存和仓库实例,建立完整的依赖注入链。 - 路由分组: - /api/v1:版本化健康检查端点 - /audio:音频设备相关业务端点 - 中间件链:Recovery -> RequestID -> Logger -> CORS - 统一响应体:OK/Fail/BadRequest/InternalError,保证一致的返回结构 +- **新增**:依赖注入链路 + - 缓存层:BrandCache、ModelCache + - 仓库层:BrandRepository、ModelRepository + - 处理器层:HealthHandler、BrandHandler、ModelHandler、ModelListHandler、DeviceHandler -章节来源 -- [router.go:14-41](file://internal/router/router.go#L14-L41) +**章节来源** +- [router.go:16-52](file://internal/router/router.go#L16-L52) - [response.go:15-36](file://internal/response/response.go#L15-L36) ## 架构总览 -下图展示了从请求进入至响应返回的完整链路,包括中间件执行顺序与处理器调用。 +下图展示了从请求进入至响应返回的完整链路,包括中间件执行顺序、依赖注入与处理器调用。 ```mermaid sequenceDiagram @@ -139,8 +154,8 @@ H-->>G : "写入响应" G-->>C : "HTTP 响应" ``` -图表来源 -- [router.go:14-41](file://internal/router/router.go#L14-L41) +**图表来源** +- [router.go:16-52](file://internal/router/router.go#L16-L52) - [logger.go:10-44](file://internal/middleware/logger.go#L10-L44) - [request_id.go:20-29](file://internal/middleware/request_id.go#L20-L29) - [cors.go:7-19](file://internal/middleware/cors.go#L7-L19) @@ -149,14 +164,44 @@ G-->>C : "HTTP 响应" ### 路由工厂与中间件链 - 工厂函数 New 创建 Gin 引擎并按顺序注册中间件,确保异常恢复、请求追踪、日志记录与跨域支持贯穿所有路由。 +- **更新**:在处理器创建前完成缓存和仓库实例的初始化,形成完整的依赖注入链。 - 中间件顺序决定日志统计的粒度与错误兜底能力,建议保持现有顺序以获得最佳可观测性与稳定性。 -章节来源 -- [router.go:14-19](file://internal/router/router.go#L14-L19) +**章节来源** +- [router.go:16-52](file://internal/router/router.go#L16-L52) - [logger.go:10-44](file://internal/middleware/logger.go#L10-L44) - [request_id.go:20-29](file://internal/middleware/request_id.go#L20-L29) - [cors.go:7-19](file://internal/middleware/cors.go#L7-L19) +### 依赖注入链详解 + +#### 缓存层初始化 +- BrandCache:管理品牌全量数据缓存,键为 "brand:all",TTL 30 分钟 +- ModelCache:管理型号数据缓存,支持按品牌和全量两种缓存策略 +- 缓存键空间: + - 品牌:brand:all + - 型号按品牌:model:brand:{brand} + - 型号全量:model:all + +#### 仓库层初始化 +- BrandRepository:封装品牌数据访问,支持缓存优先策略 +- ModelRepository:封装型号数据访问,支持多维度缓存策略 +- 仓库层具备缓存降级能力,Redis 异常时自动回退到数据库 + +#### 处理器层初始化 +- HealthHandler:健康检查处理器 +- BrandHandler:品牌列表处理器,依赖 BrandRepository +- ModelHandler:型号列表处理器,依赖 ModelRepository +- ModelListHandler:型号搜索处理器,依赖 Meilisearch 客户端 +- DeviceHandler:设备信息上报处理器,直接依赖 Redis 客户端 + +**章节来源** +- [router.go:23-36](file://internal/router/router.go#L23-L36) +- [brand_cache.go:13-44](file://internal/cache/brand_cache.go#L13-L44) +- [model_cache.go:13-69](file://internal/cache/model_cache.go#L13-L69) +- [brand.go:14-52](file://internal/repository/brand.go#L14-L52) +- [model.go:14-79](file://internal/repository/model.go#L14-L79) + ### 路由分组与端点清单 - /api/v1 分组 - GET /api/v1/health → 健康检查 @@ -166,8 +211,8 @@ G-->>C : "HTTP 响应" - GET /audio/modelList → 模型搜索列表 - GET /audio/reportDevInfo → 设备信息上报 -章节来源 -- [router.go:27-38](file://internal/router/router.go#L27-L38) +**章节来源** +- [router.go:38-49](file://internal/router/router.go#L38-L49) - [README.md:83-110](file://README.md#L83-L110) ### 中间件详解 @@ -177,21 +222,21 @@ G-->>C : "HTTP 响应" - 对预检请求直接返回状态码 - 放行后续处理器执行 -章节来源 +**章节来源** - [cors.go:7-19](file://internal/middleware/cors.go#L7-L19) #### 日志中间件 - 记录请求路径、方法、耗时、状态码、客户端 IP、请求 ID、查询参数与错误信息 - 按状态码分级输出(info/warn/error) -章节来源 +**章节来源** - [logger.go:10-44](file://internal/middleware/logger.go#L10-L44) #### 请求 ID 中间件 - 从请求头读取或生成唯一标识,注入上下文并回传给客户端 - 用于全链路追踪与问题定位 -章节来源 +**章节来源** - [request_id.go:20-29](file://internal/middleware/request_id.go#L20-L29) ### 处理器与端点行为 @@ -201,7 +246,7 @@ G-->>C : "HTTP 响应" - 参数:无 - 返回:统一响应体,data 包含状态字段 -章节来源 +**章节来源** - [health.go:14-18](file://internal/handler/health.go#L14-L18) - [response.go:15-21](file://internal/response/response.go#L15-L21) @@ -211,11 +256,12 @@ G-->>C : "HTTP 响应" - brandName:品牌名称(可选) - base64Resp:是否返回 Base64 编码结果(默认 true) - 行为: - - 调用仓库层查询 + - 调用仓库层查询,优先使用缓存 + - 缓存未命中时回退到数据库 - 可选地对结果进行 JSON 编码后返回 -章节来源 -- [brand.go:26-49](file://internal/handler/brand.go#L26-L49) +**章节来源** +- [brand.go:25-48](file://internal/handler/brand.go#L25-L48) - [base64.go:44-51](file://pkg/encode/base64.go#L44-L51) #### 型号列表 /audio/getModel @@ -225,11 +271,12 @@ G-->>C : "HTTP 响应" - modelName:型号名称(可选) - base64Resp:是否返回 Base64 编码结果(默认 true) - 行为: - - 调用仓库层查询 + - 调用仓库层查询,支持多种查询策略 + - 缓存优先,异常时回退到数据库 - 可选地对结果进行 JSON 编码后返回 -章节来源 -- [model.go:26-49](file://internal/handler/model.go#L26-L49) +**章节来源** +- [model.go:25-49](file://internal/handler/model.go#L25-L49) - [base64.go:44-51](file://pkg/encode/base64.go#L44-L51) #### 模型搜索列表 /audio/modelList @@ -242,8 +289,8 @@ G-->>C : "HTTP 响应" - 调用搜索引擎客户端查询 - 可选地对结果进行 JSON 编码后返回 -章节来源 -- [model_list.go:26-55](file://internal/handler/model_list.go#L26-L55) +**章节来源** +- [model_list.go:26-56](file://internal/handler/model_list.go#L26-L56) - [base64.go:44-51](file://pkg/encode/base64.go#L44-L51) #### 设备信息上报 /audio/reportDevInfo @@ -254,10 +301,10 @@ G-->>C : "HTTP 响应" - ver:版本号(可选) - 行为: - 校验必填参数 - - 组装设备信息并写入缓存 + - 组装设备信息并写入 Redis Hash - 返回统一响应体 -章节来源 +**章节来源** - [device.go:26-84](file://internal/handler/device.go#L26-L84) ### 统一响应体 @@ -266,13 +313,15 @@ G-->>C : "HTTP 响应" - BadRequest:客户端错误 - InternalError:服务端错误 -章节来源 +**章节来源** - [response.go:15-36](file://internal/response/response.go#L15-L36) ### 路由注册流程(工厂模式) - 初始化 Gin 引擎 - 注册全局中间件(Recovery、RequestID、Logger、CORS) -- 实例化各处理器(数据库/搜索引擎/缓存客户端注入) +- **新增**:初始化缓存实例(BrandCache、ModelCache) +- **新增**:初始化仓库实例(BrandRepository、ModelRepository) +- **新增**:初始化处理器实例(注入相应依赖) - 创建路由分组并注册端点 - 返回引擎供 HTTP 服务器使用 @@ -283,7 +332,9 @@ Init --> UseRecovery["注册 Recovery 中间件"] UseRecovery --> UseReqID["注册 RequestID 中间件"] UseReqID --> UseLogger["注册 Logger 中间件"] UseLogger --> UseCORS["注册 CORS 中间件"] -UseCORS --> NewHandlers["创建各处理器实例"] +UseCORS --> NewCache["初始化缓存实例
BrandCache, ModelCache"] +NewCache --> NewRepo["初始化仓库实例
BrandRepository, ModelRepository"] +NewRepo --> NewHandlers["创建各处理器实例
注入相应依赖"] NewHandlers --> GroupV1["创建 /api/v1 分组"] GroupV1 --> RegHealth["注册 /api/v1/health"] NewHandlers --> GroupAudio["创建 /audio 分组"] @@ -294,12 +345,14 @@ GroupAudio --> RegDevice["注册 /audio/reportDevInfo"] RegDevice --> ReturnEngine["返回引擎"] ``` -图表来源 -- [router.go:14-41](file://internal/router/router.go#L14-L41) +**图表来源** +- [router.go:16-52](file://internal/router/router.go#L16-L52) ## 依赖关系分析 - 路由层依赖中间件层与处理器层 -- 处理器层依赖响应体与编码工具 +- **更新**:处理器层依赖响应体、编码工具与底层存储 +- **更新**:仓库层依赖缓存层与数据库连接 +- **更新**:缓存层依赖 Redis 客户端 - 服务启动层负责装配配置、数据库、搜索引擎与缓存,并将它们注入路由工厂 ```mermaid @@ -308,6 +361,8 @@ MAIN["cmd/server/main.go"] --> ROUTER["internal/router/router.go"] ROUTER --> MW_REQID["internal/middleware/request_id.go"] ROUTER --> MW_LOG["internal/middleware/logger.go"] ROUTER --> MW_CORS["internal/middleware/cors.go"] +ROUTER --> CACHE["internal/cache/*"] +ROUTER --> REPO["internal/repository/*"] ROUTER --> H_HEALTH["internal/handler/health.go"] ROUTER --> H_BRAND["internal/handler/brand.go"] ROUTER --> H_MODEL["internal/handler/model.go"] @@ -320,22 +375,32 @@ H_DEVICE --> RESP H_MODELLIST --> ENCODE["pkg/encode/base64.go"] H_BRAND --> ENCODE H_MODEL --> ENCODE +CACHE --> REDIS["Redis 客户端"] +REPO --> DB["MySQL 数据库"] ``` -图表来源 -- [main.go:64](file://cmd/server/main.go#L64) -- [router.go:21-25](file://internal/router/router.go#L21-L25) +**图表来源** +- [main.go:59-70](file://cmd/server/main.go#L59-L70) +- [router.go:23-36](file://internal/router/router.go#L23-L36) - [response.go:15-36](file://internal/response/response.go#L15-L36) - [base64.go:44-51](file://pkg/encode/base64.go#L44-L51) -章节来源 -- [main.go:32-62](file://cmd/server/main.go#L32-L62) -- [router.go:14-41](file://internal/router/router.go#L14-L41) +**章节来源** +- [main.go:25-101](file://cmd/server/main.go#L25-L101) +- [router.go:16-52](file://internal/router/router.go#L16-L52) ## 性能考量 - 中间件顺序与开销 - Recovery 放在首位,避免重复包裹 - RequestID/CORS/LR 等轻量中间件顺序合理,尽量减少阻塞 +- **新增**:缓存策略优化 + - 品牌全量缓存:brand:all,TTL 30 分钟 + - 型号按品牌缓存:model:brand:{brand},TTL 30 分钟 + - 型号全量缓存:model:all,TTL 30 分钟 + - 缓存降级:Redis 异常时自动回退到数据库 +- **新增**:预热机制 + - 启动时从数据库加载数据到 Redis + - 品牌和型号分别进行全量预热 - 日志中间件 - 建议仅在必要时记录查询参数,避免大对象日志 - 控制错误日志频率,防止雪崩 @@ -348,6 +413,13 @@ H_MODEL --> ENCODE - 健康检查失败 - 检查 /api/v1/health 是否可达 - 关注日志中间件输出的状态码与耗时 +- **新增**:缓存相关问题 + - Redis 连接失败:检查 Redis 配置与网络连通性 + - 缓存数据异常:验证缓存键空间与 TTL 设置 + - 缓存降级:确认数据库连接正常 +- **新增**:仓库层问题 + - SQL 查询超时:检查数据库索引与查询条件 + - 仓库初始化失败:确认依赖的缓存和数据库连接正常 - CORS 相关问题 - 确认浏览器预检请求已正确处理 - 核对允许的方法与头字段 @@ -359,14 +431,14 @@ H_MODEL --> ENCODE - 编码异常 - base64Resp 开启时确认客户端解析逻辑 -章节来源 +**章节来源** - [logger.go:33-43](file://internal/middleware/logger.go#L33-L43) - [request_id.go:22-27](file://internal/middleware/request_id.go#L22-L27) - [cors.go:9-12](file://internal/middleware/cors.go#L9-L12) - [response.go:23-36](file://internal/response/response.go#L23-L36) ## 结论 -本路由系统采用清晰的工厂模式与中间件链设计,结合版本化与业务域分组,具备良好的可维护性与扩展性。遵循现有中间件顺序与统一响应体规范,有助于提升可观测性与稳定性。建议在新增端点时严格复用现有中间件与响应体,确保一致性与性能。 +本路由系统采用清晰的工厂模式与中间件链设计,结合版本化与业务域分组,具备良好的可维护性与扩展性。**更新**:路由系统现已增强,负责初始化缓存和仓库实例,建立了完整的依赖注入链,提升了系统的整体性能与可靠性。遵循现有中间件顺序与统一响应体规范,有助于提升可观测性与稳定性。建议在新增端点时严格复用现有中间件与响应体,确保一致性与性能。 ## 附录 @@ -403,12 +475,12 @@ H_MODEL --> ENCODE - ver:字符串(可选) - 返回:统一响应体 -章节来源 -- [router.go:29](file://internal/router/router.go#L29) -- [brand.go:27-28](file://internal/handler/brand.go#L27-L28) -- [model.go:27-28](file://internal/handler/model.go#L27-L28) -- [model_list.go:27-35](file://internal/handler/model_list.go#L27-L35) -- [device.go:27-28](file://internal/handler/device.go#L27-L28) +**章节来源** +- [router.go:38-49](file://internal/router/router.go#L38-L49) +- [brand.go:25-48](file://internal/handler/brand.go#L25-L48) +- [model.go:25-49](file://internal/handler/model.go#L25-L49) +- [model_list.go:26-56](file://internal/handler/model_list.go#L26-L56) +- [device.go:26-84](file://internal/handler/device.go#L26-L84) ### 中间件链路分析(序列图) ```mermaid @@ -430,8 +502,54 @@ Handler-->>Engine : "写入响应" Engine-->>Client : "响应" ``` -图表来源 -- [router.go:16-19](file://internal/router/router.go#L16-L19) +**图表来源** +- [router.go:18-21](file://internal/router/router.go#L18-L21) - [logger.go:16](file://internal/middleware/logger.go#L16) - [request_id.go:28](file://internal/middleware/request_id.go#L28) -- [cors.go:18](file://internal/middleware/cors.go#L18) \ No newline at end of file +- [cors.go:18](file://internal/middleware/cors.go#L18) + +### 依赖注入链路图 +```mermaid +graph TB +subgraph "应用启动" +MAIN["cmd/server/main.go
warmUpCache()"] +ENDSUBGRAPH +subgraph "路由工厂" +ROUTER["internal/router/router.go
New()"] +ENDSUBGRAPH +subgraph "缓存层" +BC["BrandCache
brand:all"] +MC["ModelCache
model:brand:, model:all"] +ENDSUBGRAPH +subgraph "仓库层" +BR["BrandRepository
缓存+数据库"] +MR["ModelRepository
缓存+数据库"] +ENDSUBGRAPH +subgraph "处理器层" +HH["HealthHandler"] +BH["BrandHandler"] +MH["ModelHandler"] +MLH["ModelListHandler"] +DH["DeviceHandler"] +ENDSUBGRAPH +MAIN --> BC +MAIN --> MC +MAIN --> BR +MAIN --> MR +ROUTER --> BC +ROUTER --> MC +ROUTER --> BR +ROUTER --> MR +ROUTER --> BH +ROUTER --> MH +ROUTER --> MLH +ROUTER --> DH +``` + +**图表来源** +- [main.go:103-130](file://cmd/server/main.go#L103-L130) +- [router.go:23-36](file://internal/router/router.go#L23-L36) +- [brand_cache.go:18-44](file://internal/cache/brand_cache.go#L18-L44) +- [model_cache.go:19-69](file://internal/cache/model_cache.go#L19-L69) +- [brand.go:14-52](file://internal/repository/brand.go#L14-L52) +- [model.go:14-79](file://internal/repository/model.go#L14-L79) \ No newline at end of file diff --git a/.qoder/repowiki/zh/meta/repowiki-metadata.json b/.qoder/repowiki/zh/meta/repowiki-metadata.json index 8c21e30..4b91693 100644 --- a/.qoder/repowiki/zh/meta/repowiki-metadata.json +++ b/.qoder/repowiki/zh/meta/repowiki-metadata.json @@ -1 +1 @@ -{"knowledge_relations":[{"id":1,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"523107ca-244f-43c5-a4fe-4649e36a88ad","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e 523107ca-244f-43c5-a4fe-4649e36a88ad","gmt_create":"2026-05-27T16:00:38.0397713+08:00","gmt_modified":"2026-05-27T16:00:38.0397713+08:00"},{"id":2,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e f4014d47-467e-4cfe-8549-1dfb69cbc325","gmt_create":"2026-05-27T16:00:38.0417677+08:00","gmt_modified":"2026-05-27T16:00:38.0417677+08:00"},{"id":3,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"5910d326-0408-450d-b403-06a19f3da81b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e 5910d326-0408-450d-b403-06a19f3da81b","gmt_create":"2026-05-27T16:00:38.0417677+08:00","gmt_modified":"2026-05-27T16:00:38.0417677+08:00"},{"id":4,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"e8e5fe7e-cc7c-4259-95d0-f6b46d888ed8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e e8e5fe7e-cc7c-4259-95d0-f6b46d888ed8","gmt_create":"2026-05-27T16:00:38.0417677+08:00","gmt_modified":"2026-05-27T16:00:38.0417677+08:00"},{"id":5,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"5a04f737-b877-4908-a4fc-67a88614aafc","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e 5a04f737-b877-4908-a4fc-67a88614aafc","gmt_create":"2026-05-27T16:00:38.0427691+08:00","gmt_modified":"2026-05-27T16:00:38.0427691+08:00"},{"id":6,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e d1a696b8-5a9e-4ad2-8777-04eecc0bb424","gmt_create":"2026-05-27T16:00:38.0427691+08:00","gmt_modified":"2026-05-27T16:00:38.0427691+08:00"},{"id":7,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"599c0bda-3332-415c-a535-362503079473","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e 599c0bda-3332-415c-a535-362503079473","gmt_create":"2026-05-27T16:00:38.0437677+08:00","gmt_modified":"2026-05-27T16:00:38.0437677+08:00"},{"id":8,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"97c42095-5b4f-4cec-bbbb-1ba8bb9981d4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e 97c42095-5b4f-4cec-bbbb-1ba8bb9981d4","gmt_create":"2026-05-27T16:00:38.0437677+08:00","gmt_modified":"2026-05-27T16:00:38.0437677+08:00"},{"id":9,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"699a84c5-5140-4267-861e-62bffbffccb4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e 699a84c5-5140-4267-861e-62bffbffccb4","gmt_create":"2026-05-27T16:00:38.0442739+08:00","gmt_modified":"2026-05-27T16:00:38.0442739+08:00"},{"id":10,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"6f1fe170-ae35-4660-91dc-ab89735274b7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e 6f1fe170-ae35-4660-91dc-ab89735274b7","gmt_create":"2026-05-27T16:00:38.0452805+08:00","gmt_modified":"2026-05-27T16:00:38.0452805+08:00"},{"id":11,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"6af33e3a-220d-4e68-87ed-bfb96bda4c3a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e 6af33e3a-220d-4e68-87ed-bfb96bda4c3a","gmt_create":"2026-05-27T16:00:38.0452805+08:00","gmt_modified":"2026-05-27T16:00:38.0452805+08:00"},{"id":12,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"e1ed4fc8-f1d6-4e8a-907b-9c39bbe13b92","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e e1ed4fc8-f1d6-4e8a-907b-9c39bbe13b92","gmt_create":"2026-05-27T16:00:38.0452805+08:00","gmt_modified":"2026-05-27T16:00:38.0452805+08:00"},{"id":13,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"0fc3d59c-d219-4f97-af10-473ee62f4de5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e 0fc3d59c-d219-4f97-af10-473ee62f4de5","gmt_create":"2026-05-27T16:00:38.0462819+08:00","gmt_modified":"2026-05-27T16:00:38.0462819+08:00"},{"id":14,"source_id":"cfbcaa79-26f5-402f-8746-9fe524993684","target_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfbcaa79-26f5-402f-8746-9fe524993684 -\u003e 795a5202-49be-4c11-a2b4-44312eca8ae7","gmt_create":"2026-05-27T16:00:38.0462819+08:00","gmt_modified":"2026-05-27T16:00:38.0462819+08:00"},{"id":15,"source_id":"cfbcaa79-26f5-402f-8746-9fe524993684","target_id":"d0c2dea0-a71a-4f16-9889-b37e1e7996e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfbcaa79-26f5-402f-8746-9fe524993684 -\u003e d0c2dea0-a71a-4f16-9889-b37e1e7996e3","gmt_create":"2026-05-27T16:00:38.0462819+08:00","gmt_modified":"2026-05-27T16:00:38.0462819+08:00"},{"id":16,"source_id":"cfbcaa79-26f5-402f-8746-9fe524993684","target_id":"23a2ffc3-fa50-41ba-b7a6-55354d68a95a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfbcaa79-26f5-402f-8746-9fe524993684 -\u003e 23a2ffc3-fa50-41ba-b7a6-55354d68a95a","gmt_create":"2026-05-27T16:00:38.0472824+08:00","gmt_modified":"2026-05-27T16:00:38.0472824+08:00"}],"wiki_catalogs":[{"id":"78b906f9-f81c-4bb2-b076-5c5609c7eb41","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"项目概述","description":"project-overview","prompt":"为 Luxsin 应用 API 项目创建全面的项目概述内容。详细介绍项目的目标、核心功能和技术架构。解释这是一个基于 Gin 框架的 Go 语言 Web API 服务,专注于音频设备(耳机)数据管理。阐述项目的整体设计理念、分层架构模式和设计原则。包含技术栈概览(Go 1.22+、Gin、MySQL、Redis、Meilisearch),项目结构说明,以及与其他组件的关系。提供适合初学者的概念性介绍和面向经验丰富开发者的技术细节。使用与代码库一致的术语,展示常见使用场景的实际示例。","progress_status":"completed","dependent_files":"README.md,cmd/server/main.go,go.mod","gmt_create":"2026-05-27T15:42:25.0250549+08:00","gmt_modified":"2026-05-27T15:44:16.3667749+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wV7ojrH0+b4JMz5OewwhBN1HmP/0rRww9hUnTCEZmNJO3yBTSwzDP2RxlM1vNSo2miB47OWpHJe/fbeK8YpuBtRbc1xpai4QWWh4AweGy0HEvW9apev3dOSAiTr8UoRTgRToJyEaxWrqZcs+MtHKRAsIrcUTt6ZOh39uAbnNwRxK9M2/DiD+kawezpj/AwiANKfd4KpHSMbzYKq9YTP0ksJkGEAjH/XwM331T75uP1oZ/psvBENTK57EgxUJQIxxl/qi9stybX0Smmey1LJ+iJDAfMqZYbs5BbkxPPLpvmXX8GX/lHaSvSv8bbbhTLnYiN+DawAvAhSIRex/qStKvjVXbzHUwrLiXLR5XSvCX75e6L5cIB4b+Mx86121DipgZvZjF7zEMzArfk0N5yZkwD5XI7a3kzfmH2BaXJoEdULrvDFX7ssODrPjklVgc2gbh9DYJXJ/eua5QA3Xx1lsmOuAQB7a98gCmD6wgY1fk9B5rsKGk7vjeRpn+VjuxS6i0t9dcHlhvXCrR7IAI7ElFcmatn18jtjyzt08iJ/2HJB3lwVKEHvC/D131ZrYoMax215Ho63ABv5IhWhlOacH3EHlX6kLvYaCiaCq7fkoW8IUfIUEJGPYMNiPdNXw8BHHJaE8Emy4eKyw7+C0K//+SPmGgkpVUXe5QBHZUCVde9qeHWFvjX7tIKhxv6DuRjUgaCTjlup8gJ49u24zpnUWcnA8qT/jl0wsGHfJi8eD0LLh0kE8XKQQ/x7QONSqCBwUYpVE0TaFITaD9jPqrfRmH7pcAVggsg7CrxVJKwukwntI7yyj4r0gvzmECsd41Q9FYOoPHu3IjRxN+OlXsp7yXlO8Bk3HtmqmpIVzy3rg5kNXkrwf98MEdjBWvI1SfpRXoliuppIkKLvshYbDq9zj7Gt5l1fDkWJrFTA59HAAa3qxQ1UvtlTV3x563VZo0DZofv2rHQaWxyL8gslH21B3jt1SClPzpPPC2ERp1waFgf/K6NltgqZg+qvCivqr8SOjn4ASj8olJuvcUYIqGIh4Glws6tboVkX7ItQuueGikKKhSflv4RIB28KosR6Y5EvB8oDFTNknPtjjj8fDMAdLye5AhzMlBtH3Ozvd7tR8DbP77ZPX3WIncMv8HHSXGmn8IwwggXYIKJ5fpuepkStOcJLSafRsijI2Jji/9y8ULNSvIJgGHlfsd+ytl0t8xFik3QfYqBtbBaYKauIWmP3opbaM="},{"id":"67d62b58-6970-45ca-a17f-f48cb2ea679a","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"业务处理器","description":"business-handlers","prompt":"为 Luxsin 应用 API 项目的业务处理器模块创建详细文档。深入解释各个处理器的职责分工、接口设计和实现细节。详细说明 BrandHandler、ModelHandler、ModelListHandler、DeviceHandler 和 HealthHandler 的具体功能和使用方法。包含依赖注入模式的实现、错误处理机制和响应格式化。提供具体的代码示例展示如何调用各个处理器,以及它们与 Gin 框架的集成方式。解释处理器之间的协作关系和数据流转过程。涵盖性能优化建议、并发安全考虑和最佳实践。确保内容对初学者易懂,同时为高级开发者提供深入的技术细节。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","progress_status":"completed","dependent_files":"internal/handler/brand.go,internal/handler/model.go,internal/handler/model_list.go,internal/handler/device.go,internal/handler/health.go","gmt_create":"2026-05-27T15:42:38.0124453+08:00","gmt_modified":"2026-05-27T15:51:42.2445399+08:00","raw_data":"WikiEncrypted:mHLzoBKW/ak+KVdbda4A2TGAInZDJgXlECT8druWKh8OykgsyIoYcoUTqr4Fw4DzZjw9/0iaTuDDaCPF2bZgsMHxE08kUup5hhcoUYECp7d99GeMS8R4CTVERl7REkP2utRFDlwT9Jh0g0hSxDMtpdcR958E75ZBS/W2oWkIWPAto9enmDcw/sSxKCuMQXp9fsT1MXN9kOOiVzWleDEY0U3oTuHKLmEvs+dWYfSsDFTXDRcIVEALSBQVqRIEd/c92EKkhvg/lLEO7L++t+YXcsZTkRHoDJEIh+OIC+pkdL0MIwxYY4wahv5b4uzryipaEvpnxxfPOFygc5zYX9CHqL2Btxke54KRUKEajsMBPOxaTbtDyLRwU+132qz+vehrvktcPAcSuQyBUgAf29NhKu5oQthYO8cpbrkOAWdi/Ygch6bORtmWxWLVMbtJ61Y0yXjwQeO8PnygcWa8Iez2tpvLK24vFSF/8Sqe+oh43zL3nziMqBPAdUVZpdLVqIzLkNKJSxjKTYFKp55K1Yi+mLCzwS82tNnR9FDzpH71pSQYLb5w8CoRhfHaUX2fWGQDgPUFinfC1h49jYb8WvCPmw5SFP9hvGjETRu8Pv78NWur40ODvurxm5kpdWlQLMfB4XXHy5bEXYHwDW4Jd29ACDCnc0UO8wI8/nayfLjwMLuGIsS2U+6ma3cLaEj5pPEOVIXl1WFCj63pTaGf9bOIu+P8j9ZmphdohoCVkEKbVWSHAanwB8tIuKxG+v93M9qpoIhkzilwT8n33wFinGv/kTHivLXzTie9NBTW31qrWjdRiYEpBsvmIbCi196i19NlSzuE/n82ArLDwkBwiMgTU+fcOq9L9EPhNHUJx3FOK4JIO6wqNpMwoBx0mDq2y426Vr/62xFnwLZKZgtNKMvxXhfsyGvqtweslKECMH5FzCgWdME/yyrXGjv7JOaLAYjZsTu4PUDYIaVQcvG37AzS4ij8xV81jhsAnHn4gAgPHvGFh2oysEMDEjnlb1H7a1zsTLpcmrVupZ4fR/PdK9FgUJc275uwCGUAv2va940tBBStlC8lFA/yLTEabls3eY++qFdm7fnn0O+NUustVzyLTVCIkGRisgMJciRjFUTn3buxuhYGb+6/TZnz0/f1YmIGrrfSCx427GNPglWuztbwVgSJMHP9mllbS8jP+Yz5eqHFV8CKefug3SgyjwjadCvkx4ykxwu69lNxPPTPhfFnxet6Irz9yB4C5NdnpQxeeIFARl7LWYTb8pZBuwGx9IHG/+PObGh+pzpoXEljzdsoVJ5RUaIpeqI2mjw47chGdNfpVjPO9aCUW/tVEpJunWwFCPD9SrGnofnOh7b5Ojur+auqtRdDv3RCef4lkmdz3qZzRHWgkO4/420Di1JCJPFAuZBrt0QLwcmCyTVrAaukE+YJk0wXynCPh5Qkw0HU9OShCva8Z2NxEy2gXL59E5phikfBQzdXTY6mnEqri4EJ4HpG5GadVZxqY+e78wWoqyykG4eonHnoUlMvlCN9sV+MFBSox11gnGZZFglKwPxhxRdu1ygdSH4EjCh+0tjdpq6fFoFUZKnTlZYdhyfHCID9pnxb5okiUgp4G1SaJ6zsjABPhnl5Bb3iO1zs2OxaRoITJ7BZaUbnTrCk8cf00asF","layer_level":1},{"id":"591ea147-ba05-4d86-a671-941af668ca2f","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"品牌管理接口","description":"brand-management-api","prompt":"为品牌管理接口创建详细的 API 文档。记录获取品牌列表的接口规范,包括 HTTP 方法、URL 模式、请求参数(brandName 查询参数)、响应格式和错误处理。提供具体的请求示例和响应示例,说明如何查询特定品牌或所有品牌信息。详细说明 Base64 编码响应选项的使用方法和适用场景。包含常见的使用场景、客户端实现指南和性能优化建议。提供错误处理策略和调试方法。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","progress_status":"completed","dependent_files":"internal/handler/brand.go","gmt_create":"2026-05-27T15:42:40.190927+08:00","gmt_modified":"2026-05-27T15:52:20.2742155+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLtTQMJR2qutlXYM1eplHCPm9/Q2P6fWxhBRJ5bi1YZPWaHS/NqlGVpUFmW1DTLhf/76xGG0D1/eLqVfyND560PlQohHkNSJ7tG8q8rNN0PSoYa8X/dNeOTyE1A+uNuvpiB8VEfTp3tDUy+z3wJjo7Mac9XZxl3yz7HAEroJflv+CMaOLDNpuuFAizP+9X1/8yMamdkg455SQiJ4MA3tO8lvrplKeDtAsHnZMOuRb1k8H2J1Okf9ERLFkl/hajhx/ErZkMXJcVDAafq7dea3WDtuhkapO0hPBNT0jBx23jA9D7bdwpP8HUMhRQofKSrXSGWsNkOXGoTUbtKPcvqSXhQc/9ZnwEEWeVTez5dnt0TzIm14zjRSuX8WW7fn2EC5NSDXky9F0+kI+r1SW0lJAbI3S7/PzXMppdYjT5CIvUr4oUNfXpKuj0hpO8TqMLZU7tVSVTfLxNXN9GhtdNUotltCy+fTfIRE9oX+iVuqgGtGw1XfkviF0TKtN2+lC3tYHFIpPZl0lv2u1hS9qg5UQt86ZqNo0oyYG4iMTW1/PcJjvEh+ZouSCdeb1/NZXAghNVhgC+8CAFMY8ARl4571OoYbQgSJas0Ved/ljSKxbViyBTgk/eadCH+WuFgEUJPidhbhNV95LyTxjvd4d98Fz4GQj2038lVoj9NivalyW4v3H3DG7fUSW/wraV29VqX1jG8ICAA3c60Q5kE1oNPSUR1elSjYrLy3on9k9r8INUoZBOoRUyflFm5B6kmZvm44JlzVpRLRlNpa3erHjDw9LI3thWQq/NO7w72+KvFuF8zaQB3H1VyMGzou5eP9dokkthFbhCLnEofzO48Sc+x4zNRb2ub0rcxs3APyeA95SJ/c3J9UaFr94I+ITvJ+DlDyvoZNjoHZ4/PsNi22elB2RuhO7SsbQKIU3Nh9ngyjEqTmG6c+HSPzeLezD9npjOYrsjxTcnZkMSsIAqZRSPeW1VwP+1y42+EAhmnF9vQgYw4YM","layer_level":1},{"id":"fb8ae541-8bbc-4544-9133-e797be1433e0","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"分层架构设计","description":"layered-architecture","prompt":"为 Luxsin 应用 API 项目创建详细的分层架构设计文档。深入解释 MVC 模式的变体实现,包括表现层(Router/Handler)、业务层(Repository)、数据访问层(Database)和基础设施层(Middleware/Cache/Search)的设计理念和职责划分。详细说明各层之间的依赖关系和数据流向。文档化依赖注入模式的实现方式,展示如何通过构造函数注入依赖。解释分层架构的优势、约束和最佳实践。包含具体的代码示例展示层间通信机制。提供架构图表说明组件间的交互关系。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","progress_status":"completed","dependent_files":"internal/router/router.go,internal/handler/brand.go,internal/repository/brand.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:44.0573625+08:00","gmt_modified":"2026-05-27T15:53:50.4735252+08:00","raw_data":"WikiEncrypted:Cbw4rSSRJFTkFIVuyRiw4IoOVu9h4U/miV8kuFep2zRCWdjPBNlat3QQ8xqzDjxqnwEXQuPFqO2rdKF2PS2SXAKzDQAtOrwT0N0Bb1cVz1ybTiUFKF4yLIfZkQvmd4aTaafAMRNgGZZmW7p4Ef5Gb7g6VLCa1ky2b8mBvNur7HulgiwcdOzHhqi+XnXEdfba/+4TOqQvhA8OEJsD8r89uJDnH3WUxmiulVTnh8wTsjZ/sG6IRexTh8wnXF2Z3Pp3eoQrztwivE/v2tdi/tM+xK1ZLq6CQH87mEfFjtJjTQg257NwlL8OIUf7otektOR1U4nLWYMIIFT9ZnLxCRer9o+2+pnhIDCkzxWjQGwexhyS9T7Sq09AQ78taySEDIKsmPoPyWrRxYn284OLFkbbnE1kES3YlzGpQ1BX1HzOz4I69saOR3KsmELHh7P7qZT9s8U17TqLBKRo4LWPb9lfHPc2n9CNtaojQSYBresLm4Ta7KRF27FZXJKCUr2Y7A4p1QODq8Xxz7oxjv9ItKra6FFGv7FB+vqalxx2iPAp824obAuXeSRgvdRFeIQJ6R5siQRJFuZpQJW/aigbXEWcoP3A9m/wfRe0jaxEI100Oj9QQGRz3OGUeAoz62DjwUXCX4AUuMqRKjmjvBQP/xSKnA3j/lKtduUs9QoLJ/g3nrBj+jDR9Q6FoGxuKVUCy9+0QH35x8onGEu4z2bXyyujjA6eCclxoq7ck1+KWQfmShbEqnk+bd9dTRVQMaDBv2VgymZnIMvJEvLJFyAlmW6Bqc3qZkv9C8OH+uS90l66JlXniuUHlPinlQ+3/eJiqqMldDvT3oLvYeXLWjHUquxR0LFTQ9XFrzdxuOzsjbxhKaN+FjNZWN1d/J2TdK3LtYlEMaaxGQGsUxdTQuCIQqyQTc6n+yoXpTJ7xGtIitcxvZ6lOtQnLu2VN9ID29ySBKUeNTEDo6F486yfARaPMVjKVssURgEKlt5pEWVPnPPxd5YgYqn0dNm3g+hU3Esrx9pH0r2T8ity7CL28QWZWdthEpldnZLRdQHK7yf5ZTWBjij9h7ozRglKkjrqYtDyBCwmGNGnlUN/zURSFldO1RvnFPaGPmkGSGZaMA5jBaIqKElGCIIeGQcHEvM5reoBNq6Y71tWRTS7ei1SPsvnw2EYGGgUPzY8HealmML7QlT7utxN8WnldmX+B9tvQ0HNKwQBmMzgxPI0ycy7vcx4Pb95uK2tkKZfyxCAqZBZo2/oFspYlsMKwqPF7RMfFxnD5cQi90gF48iJKU/WEb6aXUbCDZrVdhXzg6IMu6iuziM3fdFSU20A8HaJB5hfLpDSE9S7","layer_level":1},{"id":"6e42204e-3d78-4997-a95a-3311c8fcaa43","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"缓存系统","description":"cache-system","prompt":"为 Luxsin 应用 API 项目的缓存系统创建详细文档。深入介绍 Redis 缓存客户端的初始化过程、连接配置和使用方法。详细说明 NewClient 函数的实现原理,包括地址配置、密码认证、数据库选择等参数设置。解释缓存策略的设计思路和应用场景,包括数据过期时间设置、键值命名规范、缓存穿透防护等。提供具体的使用示例,展示如何在业务逻辑中集成缓存操作。包含性能优化建议、连接池配置和故障恢复机制。涵盖缓存失效策略、数据一致性保证和监控告警配置。确保内容既适合初学者快速上手,又为高级用户提供深入的技术细节和最佳实践指导。","parent_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","progress_status":"completed","dependent_files":"internal/cache/redis.go,internal/config/redis.go","gmt_create":"2026-05-27T15:42:51.5485979+08:00","gmt_modified":"2026-05-27T15:53:16.9929309+08:00","raw_data":"WikiEncrypted:dAMSC70bWva9SabC1uic9iE9nBlehG2+ui1IUMoCFjuHkunhijRkYjoVeVmKZwBm6ViPeVjUgdsTTfn5QNXituCAV63Dn4Vd4VU86FgHDUU8FFzBLhAO5CuaH9Y/oW+aNZ7pULLF6O4VpGo1zKxd+l1Dcbs5xEnd4y5BAwWyvogeJAGi8RKD5jKJiiqqH/bM5ltk+Bn4SyxvdAjHmAvipyhqqByv3c8d4DUOGnuj3Qn0OZLqSBw5+OaTL+t8G9q7B3WLFshxuJEcrrfg8XGMKetFXb45MPrgd2bqP2G57trgchjth6a0arYWIZxaBkVE514Xr2z4V+ugHohpYYQryj6JOR0A/u+L+C7bkdSMLt1jh0fu8lnj52FVwZo/Y4OjPy87RixxGb19v+mI+G/jWsXbn1FTFbTD1n3G0MevS6sxuH68ipZGNTb6E9KYJ2tySmMUuRIEojJIIP4frWcu7tArF8UR05c5poOHDXBfz3T6gH4+4BHaa1G5IMYHYTLY9oPiOxeOHZXFlXUamTUYcJG+ZuEqKK4k3eluLx4Fb3n98xZ3kzMiNMzXK8G/VwwmEeLhklpt+BjEfEzIim59fRGFRmn/LDw8ltlZBcJ+rfSGbV7VYPZ2lyW5F6D2xii+Ixww4jJ9iavDQdfJm6GvtqZC/Qzv/sbAv46jKeJ7BmQ9yjVRL4MfqnfXgmTWzSeZARfXK7ybkMW1a39ADJVqiPe8oGdrjjUxNBVwljylOYcVsVHUR26fiEi2Rugi0q2M4q6CV2djPU3eQhQewJLiJPgMEYKuUJnr5E5js1KPIJyW/HErpZKKm4oLHxAjeoZKl8bLpctLBTgckr2UTtsLSjixopn3Mo40PK2N0gj8N+XnvvqO06uSTQtsaWv4uWQoeRA9DC6Fe/kx02moWmzIZ/PAxxOy3qj0JA2qXMByM7QwJQhKAd7GKk7FnUitpTLu912fxM9BERyuHQZfFHIXIbuhzuJWx1wd19H0zlK5pnPbncZ1ULiQAYxwxZkVS8MiktlyUe/XCcrTJNahdhjsDsmLovXEJh7NefBWeN20O8qvXoOcawQJgCj0rVc7T/Vd/tWQcl55pHgjz3K5qkHTZatA70BAiIM9P0ywZLJSKA5UUqqPxnDmGfeTIyHhW6JGX8jlXpb7twh7ESw8auy7UbJhUGnOwaJFk/6JEtbd7VQ1cGnoCE0ULPmSyHTXzXDM67SJ8aNutInzdaO+QLIfPfk1Zi1f8TMlmQRwlAtu3fnQW4c8LLiIlAaMOG9d03OqmwpuIdzGIqTScDr8ihEYS6VFl70eJL9grTMc+GlNgeDDBjqKlyL9OBGopmouTorddrNJ88fo02rfiUxL2aXDgPJHAW7fVBSe7keArddrISpvv8OLWkDdlLY3bAICA42wCZEdsHbuUNBkKbe9EiNEQko8nE1qsEif5Ob5ATgpXGFxu4DwCWqsXyDrejUAPK25","layer_level":1},{"id":"6de9a03e-f360-4daa-97ac-dc1cd1937916","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"快速开始","description":"getting-started","prompt":"创建 Luxsin 应用 API 项目的快速开始指南。详细说明环境要求(Go 1.22+)、依赖安装步骤(go mod tidy)、配置设置(.env 文件配置)和运行方法。包含开发环境和生产环境的不同配置方式,数据库连接配置,以及如何使用 Makefile 进行构建和运行。提供具体的命令行示例和配置文件模板。解释 APP_ENV、APP_HOST、APP_PORT 等关键环境变量的作用。包含健康检查、品牌查询等基本 API 接口的使用示例。确保新手开发者能够快速搭建开发环境并运行项目。","order":1,"progress_status":"completed","dependent_files":"README.md,Makefile,cmd/server/main.go","gmt_create":"2026-05-27T15:42:25.0297402+08:00","gmt_modified":"2026-05-27T15:45:02.5503172+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRS0qKOV1Xow/Q40Lf5w81YuuThtu0J6OFTGB2L0Nm95mISVZMGD73nREHXw2e/m/hzrb+N8ZuuUYDQ1FQZZcmT6YP+CSB9cZx9b8UZDJ08MCgp50aJvLLku23MEdwFc0gj3Vn9X1djLPuceJ7dwpUG3aeQmdLHCtxnEu4d1LuWHOx9SORMidWdUkvBpxZh1Mhj875BKw8zi1Bb10CuOVR0o/umWOKMxS7pa+P+krzS6ZwgQk/HiWvQgzcfGvyyQkIUoEtVfRQGP8gB4azIvJ540SopfP4dNI7lFdjUOwyTR0oyYuzDc8Y4dPgrwjMNGFkwRmsbMB5f9fKw1JT8+BoOVDOPoK1gHP/uXWcZx9Yg92aHtloj/wlf0IvlSbGhTfmFJrO/wjuSVP5sooJD9GCuVzNgSDitGoZkvsycpn320vlVFUPXtnf/VH0JOo5PM7BMj/zshAL+vsXkYjllDwZWM6DYEyETEwa0kfHBm7pTZ2bMQ4goUU1UQAPAjjbYf9VJAWxLZYVJf25SxXbn1u/PDKifLJNxgXRJg5OyBhyIL6jTJf2fuXyNcczL0GyfRvunp1WzofE6bAl15iIFcNABHPqdtKOV347seHgIIbxupRt/eFgrh5u1k/i5XAKbSXEquVhICmh4waR9rf3HeYisd/Nvj/4cpJISkhNXsY6Y4AsIpbPl0jiMSVt6jMRFgTGG51WgeuZoVPzdIDJMhk5Rc9mot1q4rK434Mrv6TJamzkwU5v7z7zy3gNx1C7wf2f4tHTVCj/Gc4KfVU+uuMRKcAAPB9bBC4uoO6zcPRroMIr+NLZN+g2CdsZ3FbJvsw/j0KEtYP8EeQ3bYak8dmhOc3c/A8LN+8UIlfyxmY1xVgbu/fvkIh9NW+GktKxQZcPfzS9ZE4KL1oKMxW9uavN/xE3hjtivmOAdhyqBhchbo6uwaAtv18ZMNOPoWLrgOW58/NlHdF4abXrwuX3YUwJHiMsjsgV6C7ZnTsYDrwXYRETPr7XXOmztvG+nYXkaHujEQtdAh/mf1KjWTbyY9qBthEG3zBTZ4AVcKt15anR6l8x7Of1pepg67m1lo31a+QlxkvmZdH6vV16tMnYHUR/UHYdSIb1yknP96PdGpWChgEZL4bynWLBFveZQSEhM057qMj39UgMZjHQd6YGbwA3ma+BnBwAMHKZSvFAMWN5arlTN9ZP2iLxhhiNniYPMQXdTviDJPYW2mRXPAgEhheln74="},{"id":"948e0792-2de7-47b1-b73b-e7b246e749ff","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"数据访问层","description":"data-access-layer","prompt":"为 Luxsin 应用 API 项目的数据访问层创建综合文档。详细介绍 BrandRepository 和 ModelRepository 的设计模式和实现原理。解释数据访问层在整体架构中的作用和职责边界。深入分析数据库连接管理、SQL 查询优化和事务处理机制。包含具体的代码示例展示如何使用 Repository 进行数据操作,以及错误处理和异常管理策略。说明 Repository 与数据库层的交互模式和性能优化技巧。涵盖并发安全、连接池管理和资源清理的最佳实践。提供扩展新 Repository 的指导原则和注意事项。确保内容既适合初学者理解架构概念,又为经验丰富的开发者提供实现细节。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","order":1,"progress_status":"completed","dependent_files":"internal/repository/brand.go,internal/repository/model.go","gmt_create":"2026-05-27T15:42:38.0130833+08:00","gmt_modified":"2026-05-27T15:54:10.7298081+08:00","raw_data":"WikiEncrypted:M8uljGDGJ//mcfRJly0hh2/mWMVZAXEARazEIIgMSV+7zh4rlxI5/PWj1ISX6NLHyPgijvBuT/wC8NCYThAUwGbCq0wFFWqYUW2q3UwppLUwwfZ0AIqAHKU2Gc3xbc16+/wux1miLsKUaF5mG7PT6uyZcDb0OdT1doaZdo6WGBLTuHp6Aea5nbksPwxOZOGkdhjve82LoYA5uDLJTHF+SzQ9TP8XLA4REY4I7GnrxuYVQMaPG9LXMwedj1gN+sco3muL2Gq4BiyTrodBizQeJh749NlNh713Oy84ZVmE4/3qrYufhYh7eMwUSf8nk/EnfOKXjLWJc6VCfqFwkGs6HBxK4lbTdLwrrP6ZBJAs7DJ37qA/0xvE0o6EX8/BlsM7gIL+/jRuLOrg3AdlyZGOWcqxG6U25NSgmt0oZnVeaB9y1Dt/f4a0eZzUyqS5BS74xR+oXWwaeqgQWkJCJ2CwMA48yuiv1X7JLfC480rolCVAVNZrB1pyhPdhNqcKupCjsZOzMzt3e4Y6McRCJs+2HSENGVOoZn1dn6kZaSVvuzpdJzcmv9M0J5JFo0WgHhnjm/PG/Exz8na+Cz0Vuh5FwFjR3qL3w+7WfyY908JoRd4TvTvdTcuoTBafKPAncBRD6geMAGcEP/YJQr1Knjh0AYEKNzdIQfu0FId6ViGxikPsTwGFt3aJDxNnBlM68ZN3H48+Xj0esfIPBW1UT+5dKIKWyhBtceP7BCJvwk45uQPufdCajPzlpUw0ivRtr8vkyww7zr5KkK2rXNFESFvuNwO4esKDleLUuAhG323ZPMzK4LDx+Ch2oPjoiPEzQiwtUYrI7IGd8ytgU1ia2mHvPqY6oovuN+it5sgt4M440EjJH2W3onCugmVb/yH3BiIQJOgtGroHKlsUzCZm1siDdMUTjmn1oVEzHd43wzJEzqjU55i7wxWOeXngHAqPT8WXATEGYWNbfE4sfGPgS3gvI/IEGBF/7//NiWRqpXn5xtg1qCTaI1WtnpGvWwOXrRji8CkIEEAyfsjIx5DhYrnolPwuNYsY35p9eKbmu9sNIObZVxUiKF1XORBniHfieK9Tj0rF4/Xz+kWH6QOV4OTqvFXOZdeN685Lj6n2PsL9iPmgcB2yL6OV6+Z6BFLfamg/+OgLuo1UGWYSOk2p8oJpiLtevo0WyGCeIXatzCPpFx1g5gcqwR5w3q1hXeT66Ud+NZ8gq1KHUtAFwZ27WEkCJg343JPXcpRw/DlnH+mb5qJGFsoqnvY4E4PMllw8Y4H1hpoLYSpncRooKOqotsZbZwq6N/HI/LjAqtcvS4gBQml6GKZZNn16/MKKnJhl9+PaSc1lxs8c9DmWY5EuEovW2T5hMbx4RAjhz2pNQHaEX0The69OwE5DgDcuNBx9D6HP3x7J1ctrh5AViYhj7H5B7p/Ia4y31GHo+ucVq7CwLZWfmsvRnAjXc0uLXuL7HWGKWKsND1WMkid+R4BXENMi8Q==","layer_level":1},{"id":"8b3ba473-1cf0-4471-a203-9a87732dc227","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"型号管理接口","description":"model-management-api","prompt":"为型号管理接口创建完整的 API 文档。详细记录获取型号信息和搜索型号列表的接口规范。对于获取型号信息接口,说明 HTTP 方法、URL 模式、请求参数和响应格式。对于搜索型号列表接口,详细说明搜索参数、搜索条件和结果排序规则。提供具体的请求示例和响应示例,展示不同查询场景下的使用方法。包含搜索优化建议、分页处理和性能考虑。说明与其他组件的集成方式和最佳实践。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","order":1,"progress_status":"completed","dependent_files":"internal/handler/model.go,internal/handler/model_list.go","gmt_create":"2026-05-27T15:42:40.190927+08:00","gmt_modified":"2026-05-27T15:54:37.2236089+08:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT5dIP53cxEH82N4y2QAmkutwkd0KP3KAvEyUQN0CgerucfElkuIsDGzyGuldlZZBSDX//XqOqGZKP+QnmlgMLhVVCpCNWw9EHW/qmIVTQJxBtumOVtR8RGgSMrfzxaMVsu0eL8ZY2bOrDST6r17lVTgdrEdY1nQ8/+B+bkzQ65abRsvYiYrspSgJteye8d8XhEaqyOpAsROLv0P50tvHHJp3pH0uNG7lrGmAIe93f1OqwLCINSCxfZ8qPHLxTT/1qsC8mBTfx6bux1+J+Dfuz0Fr25e9dCzBo06yz2oIHMpYHNOV9TTNo0Cb2bY4Etp7T7BAVAWYdmCPqkIp4muaajavVH/dsG3SIH9RE15781XFeLnZpjK3/6SyXbQzhkntGT6UDzd1f7YIF/wsYN+uji3Ytz2tKz+YuJAr2Eu+YAeR5ONhXxZJufNXZqE6lFG0h7UGc4EYAADRkXK2AefSD9qXzxvGet5VJqYDwvW+BBTRWQB3HtSC4RgwTj0pGPjrHyjdXRtYabw+1Z/3qmXraEjCkcBZqY83T3pyfSdpygE/Tp7yYYmPu94xft9AqhG0xbLEJMTwW0ad3sFR22W7PkIMegzWRGtSSosiRq883B7ZAuea6PE+DdpILgCSAnEaNFgOXp9T09825iKyPsJ7V/ePwhLdj5Lg1Sf2Ar4u2WoKKzKmVNMqngve7AIqYVhGA6hn2tryumcq512jTxKeeMrtTR1kI+kuiFb4598z0y5j8dx7XsYW4ySYNYOvKIRMNvH2r3hnqBb5pvFv9gmk5vsVg/gSNlN4VOQsszd/o2lXQfYUaon0zYsdmR73UvkjhZMnufNa5tiCXZIFdcP1BTWDeBT/f2uOsftIky+JZFoyv9ZKzVesewLPArJaSxOT++MD/ggK/zn1vWZEgWgNcONx3sbyJnPoWEw1TiNMe6pxO3VXzMjnyIL0cie5BeVP1kiQ4S3XzkediOL2bQt4hjEMPkSuuLR7ryE23zbkEZpvwV/2TORoBY12Ii6KK5Ezg9F+aFO5SG2MvF2IZyMgpmnH7KIBfag8sIb3o2RSK6zo9lgRYbXsw7lfxPpBtPyHNpHfqIYgOLYptNzC/GBTVdTQYRLULRlp1XeXxGw8mlViYBltq/GwBlmKbMKrLjsczQPuxFX9mgcnTntc2Op+0ITGX/cW8pMa+UlI2Jgvay8k","layer_level":1},{"id":"ccdbaf47-6cde-4ad7-95f8-5b92d33e2440","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"路由系统","description":"routing-system","prompt":"为 Luxsin 应用 API 项目创建详细的路由系统文档。深入解释 Gin 框架的路由配置和中间件机制。详细说明路由组的组织方式(/api/v1 和 /audio),以及各路由端点的功能和参数。文档化中间件的执行顺序和作用,包括 CORS 处理、日志记录、请求 ID 生成等。解释路由工厂模式的实现,展示如何通过 New 函数创建路由实例。提供路由配置的最佳实践和性能优化建议。包含具体的路由注册示例和中间件链路分析。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":1,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/middleware/cors.go,internal/middleware/logger.go,internal/middleware/request_id.go","gmt_create":"2026-05-27T15:42:44.0579461+08:00","gmt_modified":"2026-05-27T15:56:02.5839243+08:00","raw_data":"WikiEncrypted:SO0rhsjN3o9FBa91nwv0dk3VK0BayJJDenMPYPQ2W6nsAe4EsEoXai/KYnlADa535L7x3WaIsKFkMYttaagselo7oWM7opNJkcwivprxnWIphyBYwD26ctwJUwDo1KsugbEiaXda/z7cUfwKCOeX1dHuc8SyfobvirT1iA8qBPBd3DGmXR/P0ueb9Zxbqiv/8ewGdP+K4kCitCLeXMp0YPxLL7IgFBZY3NBIXsoX2M0H8v85XPrqQwGU5YVXEGCU1Gmm+0RB0sL0zh29UP6pX6qaaUB2bP4nhDCIIl24jYHGA4tXrgQjE7imxnwjFfMIFF4iKTGXCt2kdaR80fUv5jLH/6w7JohL6eiAEj5J6uD5VIo3ckOFTPcdvhi96uuyWDnj7mD8INXL159q4j5N0RaZv+FtCToPAu71s1dumj4kEgKjj+4aJeG/d+4k/m6nmrf6ej3xQCIu1e7a7bUlWGB/SDsTBx1CDgP8Jvf/IJFfRtO5uoX/4ampar7/3Vw63QJlIfgxhqBR2pwtVB8j+lxLHd1zKklTfEtUuioZRaWBcbrqTp47y99/Nl94kLoG/v7l4ehL9QMCUmhwktpzJ9LWJOj6QJS68TksNHWGYr0Ezcs1pIOFk+ek5Kp7IMWOq4625jBUKj03wUuUcL16LYBRkZNl4RdCY5fkjWqc5tiDY1k8ygrLDCjgv6WPUGtPmXz77etCt2D+NCH7tlFw1yylQFFmXe3JFrW76cwmUbSTgTb1bJ1Dn3ku4fy+vaOZ4A0di3ZGvTqximo1UjyeY38t4jgHHXzFXbAOoBrDyLOjkearcgj40ei2Jc5zu7yeB+ZCiueDFmuJo53DLfCa5ZsBya6HnxPmGyEsb6TGRbNrJ+d7e4xH8FNXwxEZ1ywqyg6kc565Elr5QbezNtafHoS6rEaMtwSFsV9L+oGlPx7fTsNkTH7RJx9B6l69ASP7845lrEInMB5xwOScxqfif960tgRuds/au3r/FPAvjUfGHzrIYHNvuMYNWNADBIwB0MBO79bxuO5yZ+j7UQVGvWttpfVuxTv98YHIOsLEaqKn0UtEzTw+W61zTdclPiTSy/H9C0oUP+WxXDnXIhVFMHrBFswS0b73fCFHKy4dkSbqHi6WlMc1af0MlLM8b/pELQAN0kPhAQuSa2VUmQBghO2XvCE8eSMjOYLwSoIL/wj0dNgu56qSrGtjR5dQegYcXORsnPCCWb1yCBhl17JBUKey1UcyhTEILZUvg8iqB3o=","layer_level":1},{"id":"5b9847ff-f7b8-488b-821b-6fdfe2dbde40","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"搜索引擎","description":"search-system","prompt":"为 Luxsin 应用 API 项目的搜索引擎创建综合文档。详细介绍 Meilisearch 搜索引擎的集成方式、初始化配置和核心功能。说明搜索客户端的创建过程、连接参数设置和索引管理策略。解释全文搜索的实现原理,包括文本分词、索引构建、查询优化等关键技术。提供搜索 API 的使用示例,展示如何进行设备型号搜索、品牌过滤和结果排序。包含搜索性能优化技巧,如索引预处理、查询缓存、分页策略等。涵盖搜索结果的高亮显示、自动补全和相关性排序等功能。提供故障排除指南,包括连接问题诊断、索引重建和性能调优。确保内容从基础概念到高级应用的完整覆盖,满足不同层次开发者的需求。","parent_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","order":1,"progress_status":"completed","dependent_files":"internal/search/meilisearch.go,internal/config/meilisearch.go","gmt_create":"2026-05-27T15:42:51.549218+08:00","gmt_modified":"2026-05-27T15:55:50.6500526+08:00","raw_data":"WikiEncrypted:uPtIvUbMezH0ofnqqRSEthHE63LUAQzlPWMsHoJP+/Xvzp1zu9yMhdQo5+5IhHnrHX4ZOoo974Mq5SbaZHfjDGkMYXk9L6JwG6+nNMpoyLz7Yvtg+8V5E/tIsJ5Kc6+iYBU1An8SAJrGuA0Rg8PKKB2Lomw8RjlQO6aFo5tapv4T8ZcTSCEzPetfEDt4Ire/BS8D0NCO9C5peTRlECqqOr+U+OC5BfaXaEvAAPhu0+2LKV5pUWuqhJB8wS0sZ1C5WaKdq3GSgEsQPwvpw2BQ1jRzPp5Gw92/L6CiOkLBRkvHdCH9dpObT+Fc2bTPTxchCzPA1QxWkqYjFOEzIs4+c9QWuFqGuEbrHq+Ferc28nVGyeEv7Tu6l6m0Xe3CTg9tqdBgkd6r9Y4uV4bh0didngLNjO9xEjQiYo/ssQ7aeCgh5CY89JkKjbhy8iWFLtMr0REWD9B4Tb/USBDRMoljXzRJ+rOWL0o28fL4U5wl0ZRerKn1Z4oHbe2uKMx1+wXerr7aDOXN5JCqdJfUuX0X6xn/ZHUrsqiQHGXkRCXBeXGZYjdzLtsrL01/BtT1EzCiD0xUVjPPE9dWXXwHexSANSMPsC/RJmvwwlMon5lzHXlWN+FkX1N1OEax+N8FY1eBxIWLiwUWps0/IwghwilZeXcNGiuUf7skRlvM6iTjpc9QQeyE1h7qrU5x4xCrlcYc2S4pQv+WEFB6Va33skBqhNrCO1vIUjki6nAesFzcnPJkaWwnmEBipsjs1BuIUK3wxXWrnpgcFUZbb6WvFF2WRI15NCO+jImJ4SSo2vAvVRKF5JFtZlABOifDyJCkfMwUyU227ch0TmMp55pYqp3NoLQ7ixrqRxaPvxFda40SlBqKe2Yzuiqm/73r4Oc0T1zXequgzmTkaZtRaq5yqAJ115HA1HLcYITiZngQbSWTnPeVbWsb+DCPd33lIKZ8fXEGiNBs7vdikdYx+6vF+1EsrQeSjHfD0Ihmk87cLn4d9La5SoLzDfOVJEy5iZpWO3AaUZMZ4EcPE1r6ZMeZ8EUGqXQ9Nlpb4InQHP4W7ghwsYHtL5FFeja4OeMJNBxHgnOAypiJ8tPVobpLX600FfUsZDv09Mcr1xhbylBxsRrlqA7Gn3sOfbt0DZUG0uo0Rk1ME1x2rP5Xfa5lQH0t+tS5FpyP34T6dwqMGEtcccz6Je3BiN5IyE+vUyFHw+FdZ7gNtZ0hDEfzwP2qOWZT+c3Qsu+6MyhWHPs437C1isiJNawoEnOiqCV9kWhig5+ztneMD35zhcCTEgPu/Bm/bEThy3Rdd7iZFBdoU4vYaqKC7n7/DByj71DHngfpIkzvddxnNY3z+MxRPwwc3khnmY7jvA+4rooEThszp2Uu51YkzKA3R8OCZX8akGsfWwzUIQK2BB/CZUj5Y837fb7vEzAC6+ILo7N1OoawujgMXPweHQI6XDnpbNfOnLfNxXqPfgUApYzsPZoGGtPp5WSaiLcCw6qMXPNJVzEQq2wysa7phID6rq9Pl1LQxzlIH6h9p8v0IkxQMMloAiN3ufObHM9ygq7zggt971iApCCae3R6XOA=","layer_level":1},{"id":"0506348d-993b-48f2-936c-908972f149bc","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"系统架构","description":"architecture-design","prompt":"为 Luxsin 应用 API 项目创建详细的系统架构文档。描述高层设计、架构模式和系统边界。详细说明分层架构(表现层、业务层、数据访问层、基础设施层)的设计理念和实现方式。解释依赖注入模式、中间件模式和工厂模式的应用。文档化组件交互、数据流和集成模式。说明技术决策、权衡和约束条件。包含基础设施要求、可扩展性考虑和部署拓扑。提供系统上下文图和组件分解图。涉及横切关注点如安全性、监控和灾难恢复。记录技术栈、第三方依赖和版本兼容性。","order":2,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/config/config.go,internal/middleware/logger.go","gmt_create":"2026-05-27T15:42:25.0297402+08:00","gmt_modified":"2026-05-27T15:45:15.0922502+08:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5QXmatSKh1iukhkKRz99kcWlEvnOwuqXvA4ZgQ6tN+ytovQp8yiqJicl84VZMQ0QFU2VsQju8IpcRws9R+O5UqWqyS/p2d/juMO7CcvH5Z71CG7eM55PPWPy+SJ+QNdupFqroK3bd/LSj0CxhfnVajICVNkUN5WBZxRD776A1wRS/9o+f2rU9gRAuwITsrHMLAbGKP2R4CWvSRvdssG+ipznfcduSvnmuao6OKPuV4jqBbRKw4zcI6RvA8OzqjvEzd71LQGHM4pSLSZHCpXNsVLsyx66RKMz2ehGMgRX9mmwX6tatCTNGRawqOaeHsAdZQVRO5F/B6eOmBUnLjBLXMFaj9NiCqZXNSC4hsNcV2NHNsgCUG4d5ZrRt08xhKOHc0qnU6uPcmCoIrcH7BzrDe0ZgsfQ5XPv2VLskL9VH7jP/iok3665UNTbFEMp+0VrHrtj3MGwZoOPjci63/k3b7LG2CemZFYRL/bBs4bMFcslJ5zofo0Udc21Z14UtDMqmtYl8JWFBrQXBiQmeSQ1WnHwlcbw4u7v98svD3w+hug0ZVtbBIzPxwFMvWxUfRg4bYDfaYuu9TTbJDDZVS6Ob7p0LyJNbyCA5QPrEI1J8F8PhZ4Q4jLG7aMJugVeyzmc86juCVMOMHEp/N4hziN6xK/qRiJHM3tNljxXReJi4IufNYJTXLNXYKvDPvBIyDFn2dE2mCCXqEozsEjZ+v1q0e/qlU1dunYg8xPxrsTLDcF9K1BoyCvSx+UQiB4ONUP+JxX64QXTtp+IU0v0seB2KMrqPn0/L+A8OWuXVZTvRwPavFOv5itZOdJAwA/V5N2eufZbLHqMglD8xPwtGKDElVmGnIo3BZVNSoRZySK0fotmIw3xMqHf/TIgp731ZvXaZCaKCnXvHmW1NCCQkqFwBHBcq3S04NwWv8UMSj+HNCHd++vSABXVmaVxgqblXcKffFrA/gNTjqBgt3JGZZI97/WtLhJ5rCuiZXimpuKRBCG9Mt4/TZBFvL8EtkrKKRM7s3qaiXo4+rxMwzBW5q7TSyuCkv7qZLVNg0tvqAaU87jlHeLK1szXHS95TJbbbwjv67i8S5YYoSfZZg4iWUWizvHjGv9xeSfB5oZEfizx8EkEkD6rutxWWUarg7NVOH0fJqslwz3lkocZU2+RLK2kbH+JbCdYfCoZ6SYU+W5JDYAfSxLyvGhW5sDb3XXYFtD9X30uW8TOYGcvIRawRJbAjmJmdlrT+9rFcYHVaBJHtLDAkEnSUMNTxZgsSUCulSQNjxAV66NfhnKRsTJ2+M3dqXj4LldBrlK0CwEZUrmzutKSXsYqB/x3yFnXshPVlWG0HqDXi77z/VH2PwAlmUZi30yCiL3c+D3rtHVruIK0y7+TJeQIcHCK8c8WmqIMeA6Zauq0wgWtGrI4ShyR+BKhcQEtCGA0ZPrOitzD+oByp9nJy/p/jyDoJ2KbQk+UK+DxYjyyeOGMh023Ioq+pZwhbHjNF8MPtVdr/ZTBpHSWIfgC"},{"id":"e81027fa-c24e-4492-8100-f051facb89c9","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"数据模型","description":"data-models","prompt":"为 Luxsin 应用 API 项目的数据模型创建详细文档。全面介绍 Brand 和 Model 数据模型的设计理念和字段定义。详细解释每个字段的数据类型、约束条件和业务含义。包含模型与数据库表结构的映射关系和 ORM 映射配置。提供具体的代码示例展示如何创建、更新和查询模型实例。说明模型验证规则、数据转换和序列化机制。涵盖模型扩展、版本管理和向后兼容性的最佳实践。解释模型在不同层之间的传递方式和性能考虑。确保内容对初学者友好,帮助理解数据建模的基本概念,同时为高级开发者提供深入的设计考量。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","order":2,"progress_status":"completed","dependent_files":"internal/model/brand.go,internal/model/model.go","gmt_create":"2026-05-27T15:42:38.0130833+08:00","gmt_modified":"2026-05-27T15:56:31.7808704+08:00","raw_data":"WikiEncrypted:klcgW2PbPxJambbKMzvFtzxL0nPpsuPMPxr5hj83lS7zLbVY013R4TC8XNEUYbb5qxIyzNIzP0UIL5gcgWgb2JN3lLqRFiolKSir3QefPwOA9n9PyEgt3UyqdWtF063zcOhUCuBNMrBuPrwe5CLRNYPjpeT80bmhf1WCbW0Wc4soOdqZfNatqkw2uzcHw6lRPr2OtTCqznVFik3UW5X7OSPl2Ttad8DOmCF+RIgP5/y9rHCmETZIEnQAjeyLbBXbw6UgR8f5iLkYVBNC7MFGFybSCmqrbPvzuYIucnF8DA/OBQbccvz8He0YhGp5Ug4qlUVtOLmA0SeYTnT3k5tD1obbgsTO4qQabKiW63BMDIgOoTKlnAxC1I4m+7qzShvq8Br3qYdH05fujRftdqvZ3vwdt/v22MmEtMVDy773q7E6UAWYYM5ZFpzQm0FMEmNSl01+1H3g/6NLTH9eP8bwh87Xu2V+U7zgrLU0hd3RZ0OahjypNpLHcMl2lXk/R7L7r4rqIN25hBQ6UmXVTgJaiLUx3de0ar0mjZESOIFPklc2p7+a+gJKnsuZ302S24Iqoj7AavR3Pi+VN/ZiDIP5Jeq/kr9vnhFkMn6zcXxG9uhrYtLkssRve9T9PQea2j7e01+V/IRE1erymaIw4LR2+ujdhB0V60mQlH0Z/YHMAaj2SBzGB+QTLKTIYabYR2UvD5j+cjFoa+Gbv0JVt7WMtqYL+CA4hSSdAuR8tMIXc2t2CcnnQa5O6Tn0MfMrcJ7Vdd5GeLy3KLSJMiyAdGf8tQ+JZ89A+1fQXxuEAa7TZZ3BB2Y832o5/9JIpgOQz/5oUXiHMQMoJPg6JwkfMJgMgWRzYBfhqRR15ceTQaxuMvii3FPvdiqa6G37kowws9zAmlHMZWT58FopOSivkLJCWodvWMrHAkMS8z8bai5nPSMfxSVyZw1PIyfCY16u8WPVBvxU4hqjJyB5Bp8wM0yN5480l3wa1Q3fuEzaJKj7nPjtU4N9gPI8QOahBMHpDjUDymEe2pFTNRoGiNEP45Jp4RyxlYSX4cFgV4meLKhbXpXHiY0dnAaKfBc9jAtgWdWnmviK0GLQ/jILxdrqE0PICXi9+4yqSRI2Ry0zpRi3qp0Y//pb6taUy+j56Vo8zoIsZTAucPdhoOaagkLsFMjiBClhwGTCL4ddbbDqwou29yxIdZ74gd0bOsbOrVf2Cle+fOknD4NoXKDGYaQ+KHd3gixYUsoET/IXmUN0vFu/IGEzI0R0XrwFDPtjlVbg16+Sht26Ty4kWon1FNcLN3BCZRX167pLM/oB/mh/MdCRdaEZ0DoXfwegSeXYwGho7HJZDjiwFdafr+1MXjd4UgRw874LAKL9N5H4GLBDCG6lvCQ=","layer_level":1},{"id":"8b7558c2-be32-47b8-99e2-1964009b4337","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"设备管理接口","description":"device-management-api","prompt":"为设备管理接口创建详细的 API 文档。记录设备信息上报接口的完整规范,包括 HTTP 方法、URL 模式、请求参数结构、响应格式和错误处理。详细说明设备信息的数据格式要求、必填字段和可选字段。提供具体的上报示例和验证示例,展示不同类型设备的上报流程。包含数据验证规则、重复上报处理和数据一致性保证。说明与 Redis 缓存系统的交互方式和性能优化策略。提供故障排除指南和监控建议。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","order":2,"progress_status":"completed","dependent_files":"internal/handler/device.go","gmt_create":"2026-05-27T15:42:40.190927+08:00","gmt_modified":"2026-05-27T15:57:09.2032126+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvOUiHqohKn6BWshWHivzY4jjRdHovfIvtJ2sB9MDcSrupgUsB93CF5gLCd86HZ+9K0WcrorZ9lipKx/OS3vd+kUisB7ExUabBXlss9QTm91m5fLHe0jeTIgrcbTRB/E6TiCq7LQKIbDT/vX8e7gGsXm7c6bJS+oGkiX4dvfSGGxPsTJAzByQh9zKq0+EB1Cdehda7LhobHHhD/zrFU8gTYLmATkOqk43kMtWFXfUxZx4vfa6jkkrn2Yy9ZXvHFDce0ofKtOVLfq3hKZi9k4owDfhOWo1Diy53e4Nq65RlOEImu+zThrRgYRk0za0MnIJRjTpwcuh6BKDwprXShIUp4xbiPG3TFnnTMAA93o2zAcKGb2Ca0Qt/QT8wY2uCxaVwD0GXGQGpI93ttiS+EfxOpjoxc+xkTy77AI8niJq+SBImduJC+de4cefpYZZm2E9MmZSUbEbDEvXBi0kIgnFiSH/BigSv1UA9JM4cWf7m3AvwqqCGKN7CNtERiJxTyhs8xDKqxeoR4CRHtZ0Po30nTlEXMrgkyjlnvdlkRokDUi1ZrRl7UvaUc7IAQFie+6dHuwt4/iZkuQJMydlgb3ysz010zMUXCSWtnqb6yQi0Y16jkKXmPgBl1ifYkUYzIrMzr+UZZHq7EwLVVjj0SWvnNnHeWgSst509csZcp36C60qyP/+8XjGBbVMUoTVonu89qUrotxb4Dr07k7YzT100WjET+IOcrQfLKiHM2SO/HyTfGKSpS9/T3JoW4mI+tVwFQ0QFEey51AmMN72D9I83sYo/INqWjC4cAhHr/IiAxVTtcj0s5xI5pGgOAv7XNXGFPmc4X+rf4C8k6zxIWMCOirykNyiIF2cm8i/LUJFrD+sqdGCVdilSQlsEgs0Gf0faUDYAUNQdylOw+rNDrJMNPGktUsoxfdb2WBc63/L7nV6pPm7NnpU0xCDhtdG0/jq9hEyEESN6V7L7bOvG/csrwRuKnJZ65RFZNlodDK+JNRUhn6yPOkrG9uC0NU12cyBY+r8Su9MV/6ozEnnNWpxhuM=","layer_level":1},{"id":"bc6825c8-9aa3-4f0e-96ca-ef4925af0570","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"依赖注入模式","description":"dependency-injection","prompt":"为 Luxsin 应用 API 项目创建详细的依赖注入模式文档。深入解释构造函数注入的实现方式,展示如何在路由初始化时注入数据库连接、日志记录器、Redis 客户端和搜索客户端。详细说明依赖注入容器的替代方案,即手动依赖注入的工厂模式实现。解释依赖注入带来的好处,包括测试性增强、松耦合设计和配置灵活性。提供具体的代码示例展示不同组件的依赖注入过程。文档化依赖生命周期管理和循环依赖的避免策略。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":2,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/handler/brand.go,internal/config/config.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:44.058506+08:00","gmt_modified":"2026-05-27T15:57:20.0074643+08:00","raw_data":"WikiEncrypted:Mh1qeXd3vDrFfJakTA2LVPk895/C8yZ/nxc225NJgc/vaOsdHkI/4otOCFkjHjzGbvDeu3NfvNrTVuHfsGzx3dTon6sTOx2eqYzt8f1TpTMBkynZ464lQq/2wtKdG64LJ046YBidJFw0ZIeaCnDrSGq0XciHKDBtepVmFvc3BWHO81I8gofhmEgiJhls+KdsMfDjsRa7M0G749YeIbqdVds5ERm7uOgH8tBY2YpTkxOsuOlArfwWtnc/XtjHNW1JrezQd9Mid0eOpxaMqgE8yaFeTmGavv8vNNdwkPtoQaRIZjrbbiqxTvEUceUQYbCYQRtN8pZ3IPUSyl/t5LmjfI8kcvGH9WDuz9YzeYHPRMxg8qhmGItUtY5Mpls5ivH/EIhLrZokNcrV5iUHEjmqb+XCRa4yG0StkWI/9ZNKERgMX67LixsijqQn0vqlkUufnCRPCP87EnYdQqECcP+43/+HHmvfgNL2YqVlrJqTwAbRfkIOiR3RzC77UVxXk9TDkvoSu55Qg5T1DUnOUSH3YHIkfOdMt11bVZaQveJDn8eKF6fBu1S2w0nsgVRJUYN4xWDBb67St1qj/284vBE3o80iLbKGZuKALFUmDfFJrRWZxKz0EkrEzGEHLZlY8gqCMlDvpIDasl1U8U3c4akb4qk+YO/zjLohUFROnbeKRIrU66oQ5vJmycIgrt6M4+rjAVUkaEguxq+ntt2xZNdA99vs2cNQGXIFbb3h6nnwxQfKvVVV//1SMfISmnCs34BYxkwVXBcadfbrEOM6CtcYBMqCXvzWJ33/FXvJZmH/A2KAbLgQ/kpz2RPmPzOUT7cKpJqB9MhC3DXdQfZ4kFUFzF+13sJwXPOJvel1igPgOiAs1rrZV85YJXrrc9ZY46pVGQKQ3yekIrqt0EK0vaAgj5oZyrRLz94KdhvIpCIUMd+M05SmsY00TRk827U95uJFIInVhtoOKMS1CqgSM1yQIa/IIKz/s4LEl2UelFpJEOmaXLT9gan8Bsdu2mXOWE2iDgTUhjhHSx1rYeN5EPajgxJq2tyvfti61Ohcm+s2CPxSV7LBjGbAZq0X/r6myA7lLsQQo8uf5F/GMloMEPtiXUyyLW0EJI19rEx68+ZtpIUPNoESaao/sS5ANWs2d2VH+YVdF+I/ZvuMKKkfIgFbf+JvjYdCHS0qZ94BTAzNJdhWzOqdw0ImHLop6nEwvJI2oJ5GWhZGw9jP0WFmwV65RfKVPOZRZTPvo9W2tCb0ZQo=","layer_level":1},{"id":"f5a7db4b-765d-46e4-9395-af7bbe8d8fd3","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"日志系统","description":"logging-system","prompt":"为 Luxsin 应用 API 项目的日志系统创建全面文档。详细介绍基于 Zap 的结构化日志系统的设计和实现。说明日志客户端的初始化过程、配置选项和输出格式设置。解释不同日志级别的使用场景,包括 Debug、Info、Warn、Error 等级别在系统中的应用。提供日志记录的最佳实践,包括字段命名规范、上下文传递和性能考虑。展示如何在中间件、处理器和业务逻辑中正确使用日志功能。包含日志轮转配置、文件管理和存储策略。涵盖日志聚合、监控告警和故障排查的实际应用。提供调试技巧和常见问题解决方案。确保内容既包含理论概念又提供实用的操作指南,帮助开发者建立完善的日志体系。","parent_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","order":2,"progress_status":"completed","dependent_files":"pkg/logger/logger.go","gmt_create":"2026-05-27T15:42:51.5497484+08:00","gmt_modified":"2026-05-27T15:58:35.6424946+08:00","raw_data":"WikiEncrypted:U7R4DE1TfAUvjZuFqogRLnOghdG8YONf1+EXGFfCCKN64XPQEDdUeRHtBVRbgq1RTfu+PHdhhtH3Ub4edjV7OQOmQQeOhgljoi3HGtSqPVCQvF+mHbx8hRLjpVdCwHdXLvW1Ns4CDnqx/UVLCA1IVbunG2no8Z4rHywszGt/xnqU1gTE2kg8t6xAVG7XfQvH3irlIr1G7/Y2/+RWxJWLz/5H7tsKGpmrGhw8RSd3hVQPhG3iSp62UpI4Jxk/d+OrEUWPuwqJKtZElc7QKOmFaL2Ou0Xm32XwADHOmjYzJyNTlscSdcecUG5KctRPumjoy0gNP7qCfrs8gUDdHMzL6ttn23qdEEZPNbh+TYWVIWnXigmIb8ZizIpBBvi8lgdSE6OX/M698aF13vXXWYsV/gWx1aMFvyo0U2/RQWwm33tMeBdIwK+36gcgiSFDbE0S4b5hb02VMCuasWvPPhMQloVwTmpRX9jLlSWIxElvqhN6JW9Sj3tn9asGgB2y7sZ5hd9DmoUifCyNwMYaKDr87XcM5YtUgyXFquhGaFcY2+CEND5OlVHePB/BTWoyBiDCLgXpicJborNdI7/Nscjq6w3smcCa0ShFdrQ2c1oxL/nowS+0Np2YD/mGUBQfJGct62LTGIm3ejRTFJcHn9bsk38oD3Cjniur0JFTE+jhM3c2BIpd1A8qaNgOfFPuLR038U+ZzBwSYPk0ujoLLSuHOTfKvppASu1MMZuPFcqe8LG+ceVp0xjkx0BKLaD6HrjbpSDMXXMVbNnJU9shT522RABkZEeCFibRDEdFCO6l4jLtyCPaHZCPmGOvHOj5lizmbQtmuBYHEEG+eGYYgOBv/wev3hPI59DkbhTIXpIUwxQ1+0vjVdabnEPEBVxCuGVGDC1Aea1CzWgqA3FLHFtIDExYaEo5YGKlWQn85tDudAmcoD/Ru2NWdGGcW1Ypp7/NWX/VOzYfaGmEEYVbZm41M/SfkgFawUphZc5M5cRj4OG4/tI8ZvDx7IcwIwu4FwPm+21LyFqD1gm86CbkOJ7lK1BH1kl9o+SMXw9VA3snaZ4GGhpaHvgBFvZLH1oT5ZI8GXrTUvuCfq+i3DrDdnuhElM+h3ewW+lMfyvo6DUCbSK3PvLQbsO8EEhz7rAUVsLkZVc1MS4u5dgtYaZte4H71gQszMPb5kdmZW8ys3JTlZlpjsCOMDj+LregbU7ysvd1xZC+GFB1f9RtMNfyIvB0/60vzV8BkymNhb+K5giaTcSKv94wsV+wIVqxR3DGo/CyCs7AbdIof2wAC5ApaWIxrX7XM87JVZkSCS1I8KGN2fVloq5p/lFHvEn+z0UdPd7f4wsFgOlczB3xEz0FolPe/utaK7QT5lmhGjbdBcGumMq8QwGZYYsZk8z3RCjTxi+NXI9NIx1lGzzdjHtr/l0gIU/8oiKa8KYSVjsH58LX3gtmmM2UImLU6+FrVEaFDK8wBB23SJgK41j/mcvuuwJNAg==","layer_level":1},{"id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"核心模块","description":"core-modules","prompt":"为 Luxsin 应用 API 项目的核心模块创建综合文档。详细介绍业务处理器(Handler)、数据访问层(Repository)、数据模型(Model)和统一响应(Response)的设计和实现。解释各模块之间的依赖关系和协作模式。包含具体的代码示例、接口定义和使用模式。说明模块的职责分离、依赖注入实现和错误处理机制。提供扩展新模块的最佳实践和注意事项。涉及性能优化、缓存策略和并发安全考虑。确保内容对初学者友好,同时为经验丰富的开发者提供足够的技术深度。","order":3,"progress_status":"completed","dependent_files":"internal/handler,internal/repository,internal/model,internal/response","gmt_create":"2026-05-27T15:42:25.030488+08:00","gmt_modified":"2026-05-27T15:48:30.8195851+08:00","raw_data":"WikiEncrypted:bpQ1QlMq61uqjeQzqQaeFJ8lEiuSQp7TFZGpUgKRJgaf7PT+zt7MmzNkqVEU0hd1ivmcFoQ5NrDuJye6YrJgMhvUC8x94MX9xPrGNOjZI+5X4c+vLlR4Y9di8UWaiF3ePMWFHZ+l5JpFZY14y0Gmj+mg2jg6ynoSHd4F8iD94Ksscd/cHjiFkz5KV1ZDKSVo0Zk43RijuZRD+ZvrVDu0XmtFrZ3alp/u48vDDtq64kS9QZdDuR6Wlu7qiT9NwgX7AiaDJqJ4R7dPgxgm6Mui+BQ08Oeq08iURJiXTO07UxLp+uzs2JqJsTrShJlYr/1DePotYHyji38fNP/IbITC4bmDtRqP/5BMbZ7k9hlh8bGx0EWkS6uNkxCgFDuaNHgykTVXSiKrKRDSWgLmKInyhnzBbCcH73bVc+oVtcoSBXixSUbTl5gP1Ig+Y7wyWeOoPHPDdUn77U/OcrSdTkZNXYm4+/I1eIujWEUg4gc3eye74LI568bySPdOk6ZoKG7u8TBv2E0BC3tLW6pJFD6RRArV26sWYSdHsaCumsfOVUgYjGHkhQhsYwKt6buEJZTy7sv9olRDHoi1qy0k9PbRIDacX2cJll7l0u0jXnnztZGx+9+HQ3H08P26RSQB9mNCVtihrb3zqn+nn/fHaVP6TLlA/fFESM0VIGwPT/3NXgKCrGhgeLaw610W73Kv7Ad4zTf/FWsHJ6uv/LC2qfCo9Zt20Voo8N5CmmqTJah6KgVEvW8v7BoekBUzC7ZPGH4oCJeTk4kIoVfGbX7ACMu5mplivQVLaQWQfMElRG+s7oBrbN95CCShpR7S7J59DpnFX/IbgIScrW6X9QGEyoBrPe4S0LA4tnTBU7d2g8RsZDWloZJZbIBi+isLt1JA6fWqwfZ//t8ItkkzPmQJIFJNOR30i9z3wqQAHliGK0F+EqacD6YYn1Ryvt/d8nhRJJDZ526J2xz8X2pZKja+oeGAwU+edSxkfqjTZ87fqFunqnQMbZ5zjs/JzrFvTHlR43EYFU2vuK9YgZ9UJIHtxvPBAubNcuFc5aP4J6GqrxUrF6h/ZAfD1Zpj43GWztuTnhRy2w8l4xy/B722d+K8VBXpE6k7/b8KNnkM/5fSrqgzE1pAlbi0AWtXWfP8pgWRLo+r+wE+BALUxNC80jMVfYGnnIvWU2rzgcJ1YmWOyznQOZu/mNvoUI5AqEDSCzI/ow+21CW0sEvfypb9HKynhsg0JfiAAPvdBZlGmCYs1rcrjp5RoagygMzTGEu3jQYQqwRC8ctiOr0SIvoGaRfcZ2XBEPnjYwAQv2ZdUT7MB3cDleI6Eevvvz1GwXLldlBytA6hHLrkC3mCCZW0+qJiwahbJ5Ayi4uuem08ScBJFqUVxqndMyTN7+7v98xiEKLumUia0Wn4eDjobEwAEosPbMS2pI94b5xVXHj/QHiBfCTdbnlX+vTiLOFU1YW+322ZmO8m/7EPabziKO20Mgff19WPSw=="},{"id":"e2d8da89-04c9-4fee-8dfe-adfaff79c9c1","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"统一响应","description":"unified-response","prompt":"为 Luxsin 应用 API 项目的统一响应模块创建详细文档。深入解释统一响应格式的设计原则和实现机制。详细介绍响应结构、状态码定义和错误处理策略。包含具体的代码示例展示如何使用统一响应格式,以及如何处理不同类型的业务场景。说明响应格式在 API 设计中的重要性和一致性保证。涵盖错误码定义、国际化支持和调试信息的处理方式。解释响应格式的扩展机制和自定义选项。提供性能优化建议和最佳实践指导。确保内容既适合初学者理解响应设计的重要性,又为高级开发者提供实现细节和扩展方法。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","order":3,"progress_status":"completed","dependent_files":"internal/response/response.go","gmt_create":"2026-05-27T15:42:38.0136404+08:00","gmt_modified":"2026-05-27T15:58:41.4408299+08:00","raw_data":"WikiEncrypted:iaIcfwdLscso9uJYzNYkBwQmMSDrN359f9FMHjOmg7ClR23tbv3dTo6S+mZPVOhFdDzmxIISHKSsp2mIHtSHucIsRTVIuVJBLVgxbLtBw+vYpBthrkKp7ZsmnvjWGy5He35k2/5gy4bT+0fHVhDxJakT8MktDZ/BR/eSlGlnIY5RrC7zFB41KSVM+DwzGHJ6wFsSBTONLyyruobUVduEU7vzMZj9sgtAiHvFL9P2SHh3KcDKpQJaSF6kzMxfuHz+RjE2JrSS7jCHMh0pHTgddYdXs0A21pKoq1Cz9ewRb59irUcIZIJum0fCoYabjhhlkabgVWpIZZl9yI9tYbNT404kkRaJxst4Jxb567lxVXj7z99S7Tl5HxaCXddNPmiUawv0vJsTzd40DhW2ZDAviR3GRAUDUyfw3/+7dQvIEQR/e/MrQlblG6A55TurcS4CgAI1GLwDIWQneG1pO+BCAgXtQPSmpqB7BgjGxlBSb0Mc7Ozk3IATXCWF2Gz/3rMiwdu/lCfL7wtHHu7F/8j5tAKZVzSyjHmJfXLPZ5kHt6Y7AdIc5TZNDyi/LrJoXnYx7u7cHY15CrJc/tEbrztzQ1iElkaTNZ08r7RV7F32Es2t0ynCOMCVirx+HAUHpAOaAdrSai+26wUse4xRm/FkwNZtv+w2OCnTZs5KwT9H5tUVsmqVWyBhSeXHtGkuvUyqx0IINIHQnBhkIpxCdOwzkXTumXWy8tolLEPQSJECMUeYwxFHpvtC6vAQckxS2amrDMWK/GTvxacGzKQom2peJWZZJ0bUQ3pgm7a7YDJZHCC3jH0cq0BoCXXUU9d95pauWlQP2/IZMyuUcH0X72/xZ5xKYPNJuyeVPVzFTjkaZDzPAbyCCKrXJFs8tjyuNkSuRpPaAh4kSgxL6/G5WXR2Fwe/QG2rpK9IUOEv17HBevzn6Dbty0HUFB3zxObA10u7Kx+3rfpfr6yzO3k7y7wWuKpzPhYJhrIS+TCgBZjcTIteFPYWuoj87paGFovSmvqEB9DkBU7xawc9cRduspe3fMlYvFSHJJnaIDWeejeQuwwFd0JoBgOkeMPtCVTkj/SaZimKyefQLYyw5AAu0rj+5IqJ+HGhiB456prnmou8yIC9ws2NUc/LeK3qMNaM1Tkf4lPPKffZ282PoNA1rMelkw4Vu6gXVHkuVRLdCqcUZteXbuH+Qyr/pATu1oc3mOV34LzJDJs8AC1k47iZmX/sSGNZ957wolJ0WWZow24CiUWZtP4/Pg51r9qwhsqMAp7p602Sup+i5M11Gg09u0cyRanD+hMX7HCnsebpyCyxZVvB9jhaZJ4sNdDLWZKhRcBfm4gGm5v3l1Ep8tABF5fwEQ==","layer_level":1},{"id":"4b0e33d8-28d6-44dd-b90a-57af5c6cfaa9","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"系统监控接口","description":"system-monitoring-api","prompt":"为系统监控接口创建 API 文档。详细记录健康检查接口的规范,包括 HTTP 方法、URL 模式、响应格式和状态码含义。说明健康检查的各个维度,如数据库连接状态、缓存服务状态、搜索引擎状态等。提供具体的请求示例和响应示例,展示正常状态和异常状态的返回格式。包含监控集成指南、告警配置和故障诊断方法。说明与其他监控系统的对接方式和自定义扩展点。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","order":3,"progress_status":"completed","dependent_files":"internal/handler/health.go","gmt_create":"2026-05-27T15:42:40.1914576+08:00","gmt_modified":"2026-05-27T15:58:27.2611572+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjCM7vFjnlRAhPoaEN0ftdCdBUTnleag+HHtjerxF8Yo/aNSQCvWghRAmFaNP5Ate+OnNgrZtWxUTlolKrwVliK7qFYneTgLhtk2O0DExsEj8rE3wciXyMoLthA27VSFS1hEh1vYjSsYzEvIq9/P7ebtCx3WZIPnPyfLgw1cXSj9siM5kzk0nmt4Ccf6gZaDZuw0Bp7WplXSset9XbcxKPL+MMIzax7BxVHZuxA+Xr0km0IickRzt8NBUEER7TSRBv327JwCiAS8fQqpTdjIoYZaoZD0fB/NTnHP+9Ak0Q0/FKYlXGSAVzh3CgkU+Bn+Cg5ZTP9yyUsZCouns8PsujUZ2npUR1PLdj9hkBS03HbNE8lSbaX8OU3ViNNk1DL+T4pp2AQ8kjAuM3wbk0fgx0dNKLVy5WY3PlBQ20Fx/tZebK5ym8FUGSHChyldzRq6ZYkNg/glvq7d32Xl8fO5iVdMwkqg1pt1O211CYPFuEOhq+EKjmlkG0WCs/2ee5aQCsJwhqN/Ya6IeDgL+9Db+zeM6x5OiHG8FmYl+N582mzAbn2+xbvZqxlMTJOHjWoHb2LewryAHz2W6QEWwOHKtx09+ET8stLXhUowUkW1gy8qjK+E8U+dj3UNXDeo8cAiAnEvjdmuNwCC15pArY6OHVC9X2U5Vpj5U5NUQu2JMoFgwLq4N3PTIxjJ0A+VzuBk/QcYMjmo7LrfP3y+wJaUZn2vsFEIBQ2eTRD5a1Pe13jvgLYJNHUEI8RJfy1p2pZIQyFO8NTC8GoKJhnSQ+gTu14mmS4S08TCy0fu79yKHrmq1Mxpx9FQeGvkkDg0fwa8pu4D5GP0ERsG/CD6v72/U0UcOO7d7Ncz6OJ+WItEmGuCm3eGoUCNtiJjI5slrLxxlLM3hEF/nte/d/5N2XBVG/xn6/YDvrzqEyAFgYUT/UCUiuGiHkv23qhBSjI24q6ODYIHl3EPfycQLGVtjFwMMFxs=","layer_level":1},{"id":"f351f338-eeb0-4243-921a-eed11d063072","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"中间件模式","description":"middleware-pattern","prompt":"为 Luxsin 应用 API 项目创建详细的中间件模式文档。深入解释 Gin 中间件的工作原理和执行顺序。详细说明 CORS 中间件的安全策略配置,包括跨域请求处理和安全头设置。解释日志中间件的结构化日志记录机制,展示如何统一记录请求信息和响应状态。文档化请求 ID 中间件的分布式追踪支持,说明如何在整个请求链路中保持唯一标识符。提供中间件开发的最佳实践和性能考虑。包含自定义中间件的开发指南和调试技巧。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":3,"progress_status":"completed","dependent_files":"internal/middleware/cors.go,internal/middleware/logger.go,internal/middleware/request_id.go","gmt_create":"2026-05-27T15:42:44.058506+08:00","gmt_modified":"2026-05-27T16:00:02.1508768+08:00","raw_data":"WikiEncrypted:KoBWq/Q7Adld3nvKT6YAXjbeYGdbE/D4CStunsqJjgl0jPyMgacfbAcsG69IjV6W+YAUulkiH6yJh6guJ8xsLC0r674enptjON7n1TyvEmDvQ0ts2hwoFwrID/aMzsWc6ykTfCUAJOOlgk4w+ArbzUldUGx6slnJqOHO15q0hPQH7GaO0RDoayr+zF5Md89ka3FMbDJBSe7XpA6zdP+wNXSd04XmKPO4VRjZqmJkxAGC8VFm4yVB97+PFqSyh68UCvChI56FzzpLF/5BFK7vdhB4RKqA66aNRDf4DW25UaKG5whiuqjk/HYzMhxcvIfnxNNQENyjxYlMX1sZy4HsMgkgx/uFM4++tYIvF03t17sV6inMrzPeJGGPuhlz/8276En11T0U+vrBLHt5cuHwwfT9/TbnmX6ii+DQAK6bIQ4TouGACknzbAKKYD527I1FVSQgI9EoSN0pbR8fm6ONx31WoIHCHWp/YV+KoNG4BqHkATQ6ytaki/qaUL/ng+odBZvDmXBjiEPo39VVePVK04bIdD705zKajkzvowecnVXm2AKaMJ69AGERz8Yh8e6TmJNgzoBcYyY4mEun80jcRmapIRl8c8YHgH0NMwaVSwcLqiudxnv3oQr59HZzPqbA2lsjZbIb2PrDETb2QeWum0Fm6rN2Un2jJWVpT0EznojYQrzEaNxrIPMOL2v27AiWIqzQv0GQ3sqciy6SmZiuq2wPG7HlS2A2zZkroeKz2FOR+HQnQPJAYla49YW7f6gn/xufwFLQ2P09Vv1PN1pyxXpNDEuiTqHaVp2kzhv9oqymB7xkMgUWjzJxA3LCPmaLv++QPEBFdy6p8cW4yb4I4EhhEKGmNSkUraKRcmosg4NWFDcipy8qHZXRbF6teMWiB3RRRisWUnfoZUcGgAFFGscCtU6FRbrdh8FZz1dO6dwy+o2iUkSDe5kR8tnRRbjY/fvtiPqMjoBsHuvLo8VgUj/8p4Z2FzifMlFm47HXFcnhNcTyNHadq/BKt32asbZMkyf5mwAazzbaJZ9zE72kKw3V+IXEq2k8PQFilZeDtHzxWba+6jseqSydPEZeopZAtR8inj9373angdQRcahgfTWP2Tu1JM7pp/nx4e/XGXgcV/eAY6K6bheHMiVhe8uqpViCaPM56DFwiJSu8jM4uJ7c2z87Ru/IU7jBjcCel2qrMTwxGrIxl3LJQWNXYmFvWXKFkw1YzGjfH/CiNBiu4ygHy7YalDmDnEePypwhiyZ25shL/pX1OxbV8m/tNZmv4AAk3Q9YjR6tRGu+hpIeQQ==","layer_level":1},{"id":"8085e1b7-3658-4490-8b52-9a61f3e79976","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"API 接口文档","description":"api-documentation","prompt":"为 Luxsin 应用 API 项目创建完整的 API 接口文档。详细记录所有 RESTful API 端点,包括 HTTP 方法、URL 模式、请求参数、响应格式和错误处理。针对每个接口提供具体的请求示例、响应示例和使用场景。包含品牌管理接口(获取品牌列表)、型号管理接口(获取型号信息、搜索型号列表)、设备管理接口(上报设备信息)和系统接口(健康检查)。详细说明认证方法、速率限制和版本信息。提供客户端实现指南和性能优化建议。包含协议特定的调试工具和监控方法。如果适用,提供已弃用功能的迁移指南和向后兼容性说明。","order":4,"progress_status":"completed","dependent_files":"internal/handler/brand.go,internal/handler/model.go,internal/handler/model_list.go,internal/handler/device.go,internal/handler/health.go","gmt_create":"2026-05-27T15:42:25.0310242+08:00","gmt_modified":"2026-05-27T15:49:27.8891715+08:00","raw_data":"WikiEncrypted:aJsVvsatVVT+Oax9nwx6A6Ka1Sy3/Ax3fbdr8CSPsFwpSinOHdKPUiaO43Q3eH/wzCti2uFNYtfdvQWqQWpEsnbUBpqKCbRzHWFAT9Lm270y0Q6B1UE3nx+gx/6onwH05kgU4aSL6Vyf/ZaJTFKBZpR/hASnZEkssdX1yTnZq4HGLCbeLR5p3acQeZtqIab449ZqM5BfhYg1nC4veZGNU0ZbTVY2/+9U92yhi84zrKmyuO7gZe6RpeJW+3R+pbFduijY8FtGcUobIv+f3QcPEH7ZWqwynHO+v7PrlM8OHoMZ4jNowBv+/rK9cg9v/ZMBmZfMQEKxsZsOp3fl4F4qYtSm10mD/w81n+As4xiJhZiEZyEFs5J1d8Z9Vy8wXGEIR7fqm+a9zy8Fsu5byzXecYMhxZS2ERHZx240veYTNST0o1BZbq+K36QEct8vD7FCALNKAcaZ6AOkQ3ZeFQRkF77ySrit0wubK5Y8hJZIiie/lo/zKRe7AcNPttvBv8m/fwMlN9KEVR4OUGV/gJU1svwYIsZZEnrCMvG+y67NRx0KVjqb6L6X54uvguKz7kxDUMczgIfViz8ratyBmUtc4FfEAPRsjCROGGkVoDEN/5w+ZyQXhLxP3xXUKd1/P4J1avMlerh1CuO5ejlxXeucDZUHgRDjHUwBXfwGOMvhjOjwHiCV+WGml1tKFYFwCTMROq63PKS+JNp0RfgSHK+FtVbauDr08rz2vyPg98+5DPKjnqfdczGey2EZtF3aUyS0f+eIwXUXUtiq/w14fn2wmUy4I611KQjjMiUaXGeOEzE6IIDLjUY2tTTxx/aPpqJvhEJsora8N2/6a3xsw6yT6z46cc9FiIhyEApe9UKpdjI1fdeQuYjErjck7jRAWTUhfVXtQU4SeD3ehMV7Y6r1A8qOMU0h/oidZfO1nAE/JYP3YBXGYHS5oK7bg1MAtFEpo1o6sSWrginCktGk52hMNSGoV8nehuwtZxdhXoyY4IXjvpfAFsXH1Hb/mkNuAue8aL73FijK+a6EhDh03TFe0zLWJHxx6x6Auvo7AXWOBCnZmEjakamzlcsky5YeF79LZz5GwUfWnRavEY3T6FwU1CLhWG4vTlOctHSDbxPcek4EYQrGDGh3pm9EKWAbxxjSxaOj+mjfVS/BResVW35tX7QJikLDMO3bAgq1R7pKwJkOq6LKlFGQid7IX3oBWU3vnf68+OZYTo3XbhF1ibJBtGKJo9LJnus5LWKyXL8OlPBZ6O9My/LGSv/u8SgYidk1IqHF9E0GEd1n1XivRudgVPhOyyChOZRTjrfkGYZyCG9JFtb07mHqu1GTttkO+yrSl02PBotGLbcN6fVq9tA+nKBe9hyXj1jRm77qabudCbBq1WfADA3BI1naBKwjd/hkC2WRFu+OobhwEa5BWjLR0S5hhbkX9l8NggWqYhlkNoAGqfQHPfV6TRRUMT+YxiAtQS4xyBRe3hdSlLTfFn2DqhwtS2Lz3mdjaYxot+rBGShwUkEN2YW8NTWAPTsPtxYLGPhsJEGRMeC0e/0pGacNmr/a7f0BDYZipNYXZEpoLO6TRDR2814xSzHlyQHssJNrGjQ7GSSOz1iSfL3l8GvofUZpMwsaNKmd0njucNMBp0oxVTp+o5hLPEwLl45Rkmvpz8NLlhicrw4UvoIUrMW1vLOUsZsH+zfQu//Xuf5MvVE="},{"id":"c79882f1-420e-4d6c-a40c-dff8c7e8988f","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"组件交互机制","description":"component-interaction","prompt":"为 Luxsin 应用 API 项目创建详细的组件交互机制文档。深入解释从请求接收到响应返回的完整数据流路径。详细说明 Router → Handler → Repository → Database 的调用链路和参数传递。解释各组件间的解耦机制和接口设计原则。文档化错误传播机制和异常处理策略。提供组件交互的时序图和数据流图。解释异步处理和并发控制的实现方式。包含组件间通信的性能优化和监控策略。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":4,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/handler/brand.go,internal/repository/brand.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:44.058506+08:00","gmt_modified":"2026-05-27T16:00:37.8856299+08:00","raw_data":"WikiEncrypted:4Zqjl5aZEo1Vv5NKBpebTvIjOs8PtjUiIDyDFsBcQ7xcxPCSMrQFGywF92hdzdj0/Ns2K9dSEDwOkKxz9EMCD21sNknfTIWpC88CWR1X7WuNlX6UdseDM8NhczwhCNaZN3vgjI2RCnPQ3swJEmcffGwsCSYh9whfm7CRrmT1BsJAsL0IISPTl0j7Dypz7NiXQSwlVYOWLyyU9AbzCZDbJ3PpxFYDDzPxaDuVWPVPXLf/wiv9mA5vqzDDmAe1dkhs/NMef3G3n7dFGNy8bE2Kb89TGY1mWlLXsD5yz8TOX2FASKkcwVpddx7H1G4BCCeVxnXrAcc8YtLwtNLqhtYwO9sMQvaZN2pzzBQEBT+bF1KsPSISX/kKBTBc8lKQzbtXgZmpqxMtrqwNvB4AFvHvruBwy5i5usgPxShB0x2ZSOxEQKepTRqJ0sEJxpCG19CRKrqMYxxZMufZecyJcMUUEey9yDRO/hzyy2/pZqn2ZFzkp5KdT+gamSrlq3mJSAJwW1wr584b5P2Bept3By31QHtVKY46YC4WYYzzF1oCjY4mxHTxeyK3KpEfyLa/UEH4JnKUxpA+XrgAxuGhWNQ1XSDiZSY0bXbpklSWH5wVZx9XrhNt1Uv4/Y71JhvdR+D6xb0dEQGbyblvvsAJ/FVnU0+D7VEY0HA3iF8VkSWyCEqfQ/JIf8Ek9Q5LAgQNfEMhoPlzjGIQgoKYiJiPUQYjn0iYa7VDL7waXMyHlwcRIghsmI3fkNu8lRCggKYPTT7Q5qbf+1dABN8HQfKSQ4G3Fyki8uSSBxsxPNBAv1YZhpejX8VnKJ4bcTlb7j+urjrCDfKdzBS3GxW7JA4R3YybG4pIpCHM1znO6FBc0Vw6nOB3lfGW47z0MjpFN3fcV2sOG8ckI47G7KXLi5mabdHP+LyR6s3mSWlLLu59L/RXid0QNasUkkPc7dDbDL9DeRvMlBo5s/BB0qZ3OplmHq79N7OvD8hC8Exo5pNRlCuQXyk/ki56Z2SI5K/AGP1lMNV0tGKe91nJRDGKcxar2YY7tk+dtyGPslSVCeJXmY6OBED+ODDNJ8Ro8sqnENFk2pjIC2z7i8EinBYXDVCn8Fne/tZy4ylO64uHF66MPf3pwmepe2hwAyEDF06K+eddiX3JlmF9xi7EaZS+y+R6h3ktk3ku4KD0Qd86UyfJ5b+r1X4JFTmE2KfIaTeUpCRtOdXJ","layer_level":1},{"id":"cc6acec0-b687-417f-9c93-00f59162cfed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"数据库设计","description":"database-design","prompt":"为 Luxsin 应用 API 项目创建全面的数据模型文档。详细说明实体关系、字段定义和数据类型。记录主键/外键、索引和约束条件。解释数据验证规则和业务规则。包含数据库模式图和示例数据。说明数据访问模式、缓存策略和性能考虑。指定数据生命周期、保留策略和归档规则。包含数据迁移路径和版本管理。涉及数据安全、隐私要求和访问控制。详细说明 Brand 和 Model 实体的设计理念、字段含义和业务逻辑。提供数据库连接配置和查询优化建议。","order":5,"progress_status":"completed","dependent_files":"sql/model.sql,internal/model/brand.go,internal/model/model.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:25.031564+08:00","gmt_modified":"2026-05-27T15:47:52.3231001+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkBwdhOAmcMQTz+AJLOFORhNFeFTAN7xitXLxeRr3T1sKrh0z/6NFLuxfhi+XJSCnWiA4bOgOqwoJp44HwLqumks3fTrub2qfkx3kGo8Vv0zwaj7mBYt8gy+IsUDExaTSt3z0xSYoiMJRoiBXhAlNc3py65rPX7myyVo7X5aWc6AOTgywn0pmK3XweYJTp/OGuhexu3owdi0ojlyjLM5fhrVaPCMSjZlCmYDKjdRDiJgH8SUT81h6jSMp8DVFvov1TzHKQO6fEt1yGV1rxGiKDrIs4QHO32th+o7k9tQYH6CSnDoMYk4ZYZUaCxNKZcIp1I2u8cv/mKHnKyIHV6o157UJotCffdSghARHRgXNbZRFJKw2LlW0eFfRB4rXMpkNhwxyCyfJuS9HOpH2lBPYNg37sMa1V/Eu3/Q6COF5ALxno0JO2w0V8DANenW4lwqay9TduAWeV/Wd4/dgnc0kGDAAqO5EpRQJ05PlZiAK5WPSeJcE1FMCShp43SRUeu0Is+TvJKih/ixtdr5ZN0vVE+0okdcGzxP1GZGfVlqDy80vdMZ4WJdIHu89JzvzkS2ptiMw834+utWhBxxpJRRDvJl4Zrs1QcGgN5sZCKlUYb1Fb2NOabQvc5fyx8yVZnMaEZpko17DLilQmJCCgrVdi3p2OeIBmnS81Vz5vmsF+754mz9081paU05Zvu1Rlqpklsnxlsn1KOJaq7CxyN1Vcn7SR3cBEu7L2hL7vLqTSlTilbnVUdfG+udOd7z4QHQfU7qOkWy5HkYrcuXrTycl2ufPlCeAr479dPNQ0Xk947AQs7w9xu97C9uZA8SNXmqVZxe/h+O5HjlMfIT6tt8mxvEaeqK8VOrAJKUIyPjs/joJZGQbF1Elfpx5bcIUUpIPc/JZZJaeEsgIox2ZEwOooQJ8nd8HwCEY747ONvgtaJ5q1ezLwIyrBIAmhB7hha3NW5XM3pTSnhhVF5uzeW/SrLPa7/kLcN+z6qciY2+1f1Di3u1j5vjLI3vVhWYxtJeb1HFtQ00iXdel0aXgFh1WDymjQp+3kFFEFC7ujRqludkNuXwc4VxtV1bCbiMRuM9Me/1hxMYQsxfUqeYWXsbBN+TUkt5+5dKDAfjIrRn1uSgSIvVIhez+1s+xqnAoLrGJnH10tSz3gtZIy6HHkEXNgV+uGynd+yFYQPyVzqFl6ycwI4QJr3nkZe2cmn6FJQbfcuksp/k6A7IRaJ1aeEl9xJZ2aGXJYapB8ZgUNClFNIABpvB/G/YA2vmhfZp0uQPvIRc1ND/6GmGWg8sdS3QLzprJuywzZHaPbYAlocEixTYrXFTgWuXbhn803vpaRzzwcwy39VcvjxmM8EPgA8UchNi9kMeRVrOORtsa4ws4iQcDlrdOvw9lPOco6pAgMVqHWw=="},{"id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"基础设施","description":"infrastructure","prompt":"为 Luxsin 应用 API 项目创建基础设施组件文档。详细介绍缓存系统(Redis)、搜索引擎(Meilisearch)和日志系统(Zap)的配置和使用。说明各组件的初始化过程、连接管理和配置选项。包含缓存策略、搜索优化和日志记录的具体实现。解释组件间的协作关系和数据流向。提供性能优化建议和故障排除指南。涉及监控告警、扩展性和可靠性设计。包含具体的配置示例、最佳实践和安全考虑。确保内容既适合初学者理解,又为专家提供足够的技术细节。","order":6,"progress_status":"completed","dependent_files":"internal/cache/redis.go,internal/search/meilisearch.go,internal/config/redis.go,internal/config/meilisearch.go,pkg/logger/logger.go","gmt_create":"2026-05-27T15:42:25.031564+08:00","gmt_modified":"2026-05-27T15:49:51.0048099+08:00","raw_data":"WikiEncrypted:sbHxgqwNaIQfuetky2uLRyIOX0QcV4F0AILzzQc9GWKM9RbXWkeyZypYurT6q6/jdshRRky9i8euWVz+RwzDEjLSf/5TBE5hqVfwtdoniolHNIvg/V4U6o0Uy5LnDr8i+8lIxu2oIBTUlsaoAv7w5iNfekHSt0q6goXepa4aMrqdtCXd78BSUFzGGoqTjFCImp9K2wkx2G0tXqpmpVp7tEiupbmaekaydnQiLfWCTsuAhiIixmNf7zhMvQddDdz/vFMxg8EgQjBYCRrLJfa59w1dwNOsh7LD7B0xejH7YnQkazsXQPDc/l1CAXfLcIcNw18T1VJ8pdgRZVu74q4BhQ1oz+mkyNXOXO7uFYyROvZ9+SHCV/p2M5/xkEo3CqCAP+CEI+59/1ozZqaYwitDifyO7wkSXdFb88+pXlAGZCDRQ9iQ/cMLmgrf0UWW3ZQdLAgo9PRlh3nTWGEe+/rkwMoVKFhvAJBooUPS4OIGSMvMAHQrbwvx/poFrNYVDC84lwkm0R3PHjhB1K9cOk9+6tZ/6F7kp3XdCVAhc2U62dBlI8hDoyGxT1Jl75o1y6mLlxFRleUEYQIFasnt0X1GgKG3oeRJfDQBnoW5H7CZ2Q2VQG/Mam6+pMMK/r9diCnIYM5ogiqUj7tr7iypIS+cfkJESScxOnrfQlCN0Qkd8sEGP4K1s0MOXaL2n/I8jL0akBuCdC6r/XwkXXVuwyvONhBo8AKhjlw4Z80l8g9IfCLE516hSHdAvPrqJdQ+uv2kxoDUCbdnki86NLEmUIu9E8Cg/ctAE8bB/3EZ8W0jCiwjkJMG/7zWgjmRnEZEB3qTVgtRa2KlCUd2QJmlRplYoHxZpXr+SKdJwnlA3vad9yfoc20k1McD/WIU1xyYcMO0RlCh7D9YFySaMEU0ajxvhY0IaEzEkSksTTGrckLMEjYGic+cCNwIIo2yh4+RiMTixfUw95/Beb5C6YA4wOzhKhEYwBsyKI1mRNwEf9R87hDhmK7a83qw/cRy9X8q37PVUu4kfKUP00SAvuQVxgyEp5jO+UOmYubsAjFLqt+BLYCvX1BLVs34bTjTZ7UdPkyCewtgeK88zHgLljGSzyR1bspq4eozKjqoiqavFLVqYzTtwTuTtg5HzkqhFBkHceFCQzoxpbcgdyvxHj7rIeuao76nbRqwWFxM0CL/w2bwd3YhIHOUtNX1PHq5deeuo3macM8moQOj2mgBCoh3lJdc8w+9qpT/nooQSlJfOQ8o9+an8h4sgvMbAbGt6Xt34gkJnbQ57qn+h6fXefwWrxaekNiXWaEYYRQlaazmSk/IH+Shr0OZVtpWlkFn7FjYCqe68ScAMyhmZUJ5Pkw+Y1rENFipss0BlI+diw2G12+r1GuERworaWCvas6w5A3FkFKC66BELhQjLk0vsY9c19ea9GihiHshbDr4OSKya8FZ5nM1jK+4vN63WFEnIS/vVAg4NxpzpBa91cZOB3hHRNKWuG9Zv2L5ASdR8D+2EwNxXV+A0vv1YgBt6lCQ/uDGyRePhYr0xyoQ7QfWpRQ+EkUPCA=="},{"id":"f4f8585d-1446-4f49-85b2-efc715bda6cf","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"部署运维","description":"deployment-operations","prompt":"为 Luxsin 应用 API 项目创建部署运维文档。详细说明构建过程、部署配置和环境管理。包含开发环境和生产环境的配置差异、环境变量设置和数据库连接配置。提供 Docker 容器化部署方案和 Kubernetes 部署示例。说明监控告警、日志收集和性能优化策略。包含故障排除指南、备份恢复和版本升级流程。涉及安全配置、权限管理和合规要求。提供自动化部署脚本和 CI/CD 集成方案。确保运维人员能够高效地部署、监控和维护系统。","order":7,"progress_status":"completed","dependent_files":"Makefile,internal/config/config.go,.gitignore","gmt_create":"2026-05-27T15:42:25.0321059+08:00","gmt_modified":"2026-05-27T15:49:39.6683467+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w2XbjO+yyEmY3ONOjrL5GjA3YcCk7HFAQ1etKc5i1P7UH3oVY8Um0qaAPkZpvBj4kR5+MfLB2lNNE8Rq4eigRbWcSc/FwkPYo+Lgq1jG1nwAdVBamYbeC5rJp9miML32uAYGdDFNBUjcZautOKk/RnMVJbDBhxk06H3YR9uha+agF827jtBxrCN+YUD41ewpmu39XkuD0mIkISY0mw2kTQ3+d3o8egfEhqEtpYEFWDr4W3bjpZzdlqibicqkrLymwjSHLQ25Yk3RDRLQh41MEe9NzR7Dq9pho9nnzV6lVFI/+D3aLuQmEW30BSE9ANU6hjMLS2wzjZI20qiE3EYf9+/cetjKX3PuzziuE6FOa9zkRQET5Avno4lvS+dZE+/NCsoLeLBSpEpHChwy1FLMangpeABL3DMfOcjKBI10Zckgxc6knhlzmH7BYem/MGjE3gGbpXcSOYO91tlzjpTzkA6o8IN0BBKnVEm5ZsnA1/bpvtl8iPNcBLSvEh8r9nsvT61wFloxMMEwoqk4pfGxfYLYpLzHK4/B7kcP2F2ZxPsLNKguH2P+W5Onf/VEoeoeUie2shjfuxNczO0o+tk08s7YDF0suC+hauvXM8A5MtTJFjGAcXk0PepsGbBA15NaUxXQL+T9g4ZmHiM+HpXAVuFUtKMwAoMX7ejSmhK0Uu3abxpuatBFVQMyMn2CtFqbZ7qowCiFy8R+N8iJK+CNvcQX2UDetV403Hy9t8wz9Mb7zjigKo8EExeqBR+6tdzkd2jCxuo8oGTUNED9jyF3yEdLlhvryX6R8fmWeX6XaIUdEfwqd3lefqvppQLJ082CWs43k5Sa3wBYSrhvhINvH+qH2TvKZHwT6jdxjjHkPO23f0RWwLtVr0KwjqIYa2C5ujlLLUzPccXXZozTajzaXs4y1GIXIkjQyN9gkvew0CQdmqcwIakk6B1cd6GSvR2R7jI9aORlvoBPkZZZZaWccD23SJpY8S49pk6J1f4pp8SY58Cs5Tyhzyr9Jx/g0sdQhX5jT4NOD4vFTMDi/QwlxJVK5aAMEoni1Xixkn86Mvy6YO+C0syQmDIeaWwTw3oaJtKkp0rbEph8ikP8GV+vYas27rEHT5ikXy+qKaSpRTrS6pIvqMDTr46wYVA48CocbQCKuCxz+8aN1rxEOyVvF4BZIOGK94UT/86do17dVZDlKWyrMHyapzdcsG77AQVqx3wFdVBRhW+LLPtZ7DjrJ9MbZlWCzqTN+MPtV2pqJpf2QM5tK7xYlv8Yb6jOUmKXAJ+GSoB6Lnv55zJALFR7zYrYJqdnAOfLrd0Tx7cB5v+9"},{"id":"29142a7a-fa93-4a61-8ad8-c35c1b047599","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"开发指南","description":"development-guide","prompt":"为 Luxsin 应用 API 项目创建开发指南文档。详细说明代码规范、测试策略和调试技巧。包含添加新接口的标准流程、代码审查要求和最佳实践。提供单元测试、集成测试和性能测试的编写指南。说明调试工具的使用方法和常见问题的排查步骤。包含扩展开发的指导原则、插件机制和自定义中间件的开发。涉及代码重构、性能优化和安全加固的建议。提供开发环境的配置和团队协作的工作流程。确保新加入的开发者能够快速上手并遵循项目的开发标准。","order":8,"progress_status":"completed","dependent_files":"internal/response/response.go,pkg/encode/base64.go,internal/middleware,Makefile","gmt_create":"2026-05-27T15:42:25.0321059+08:00","gmt_modified":"2026-05-27T15:50:56.1828091+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9C/ucQxiwh0okVA48AmODs5RKNS8ZgNngqmnHSFcG/1UaJxx+3dUn+EkMTpYUsOg40sht54cXVXsXhnq+u5RoF+QCaIHA1bGkkQVYVJAIxj7oosqEK59VnFAy3/dJV3KPSb/Ak2NMFBLBF1vGpBDxfvX3bT23bfnsRo4s15uorwKaV7X3HasHsjQoW0eNqTYHiGBulek8S0+90Xknrv9THoJiqpJqkBeofpQiXqX5V618tXTFFsKRJ6phlpbQWf2cbMabajttNJ3B44KtoJSJow48koViUqq1GW3BavJLaIXKMSMHmg9oSjXlTiTYcEEZKa/kYEu4HzH+CTxYhmAZitafJJSGarLyIbemD6c9dKLK9Frtj68/dJRxA2JDgVe81LYeb/3xRsBom0r4YzT8A6hHZcszh4H3wvsJMywPaPsmmBX1tXvgqCTmKeNH7dyLyLi3kWUTw9ok4pV8mMbQVe+tyq+dAjkFZ19Gg1pa48jOuq3XNtyOUDkFwzf8ENVW6mMjhd6eh1Wngr55aY62gP2kA69TRUUa7xCg4pPwMd7kukU9I+311WRjxwqdx+K9z918Nh+Ehzce//3AN16rOPpfJiqCBsWoIGofgkkvOrhJXb7ZBSV8svzmyNFJAEwluR6iW6JSQF8aYcFWeQvuFotN33nkyOjukcXDEGZsNzH5UtAJyLrlT7/Or9ByIMARY/bLEe2ttw4LkzwPX0zVri6275Z+Tr+vS1tQvbizhQX+2d6jRwB57dWTT5wiNTTauC0iaRxAQAQpIiilb6edtE9uJDim04tl8b0GkMJvSCCVUwIKIl495jl1QK4bnCVwbXf+Nm9M8b2DoPU91RhXbRUH0oa9hiK/MMmM1pNPt8sIQPodxmby96ls9G7B9FZz54hyvdDRZXOoxueOW+qswnlAT8Pjzr7WYDEFWLqhVHl3YjAnYEyvqPyjLV10UlsnTu74OIH6TGCiFnRNdEUNrebnly9HRW/qPROmHDa6/S39zhxd/Wve8OTESmdoItuQITLhTn+hUnhZoQBVVqWJwAYFrayIms6xJZY8R31ZKxaxYGd9xNCp3P+7To8IS9yboFTqky2xkebLSLfn+HS7xe0MqZXcpzdCKfivdIbm1ebxh/61TCdDH2Wx1T0uqMlwy70jnT6dzzS860fOuXLUw+3uEIg/ohj+iqYOEEPHAIG/ADJxSwbTR4/RjVzy+yaWUiKWxLukEG89+389O2WLfiqMNBTDEZ4+iXaBOjZ2i8yTTW0xGChxJcCUGPmug6KyNPvoEDLiPot5cTWScQG04DSfIGUnVEqHKDxX3mS/pZDnfV2OkxwUfNtqXdYzFlWBWnI9TxnL3wxXTu3eI8SYHxflga+4BF6OXBwi8eu8DXYDarKNvnEn0JHi0Fh8VVcAoZmJeQkJUhcvnhyAKmJ0tD21XmK4/7ZcFZ8RuBkIEpDy"},{"id":"4d1d9a48-feab-42a0-815a-edf76dcaaf69","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"故障排除","description":"troubleshooting","prompt":"为 Luxsin 应用 API 项目创建故障排除文档。详细说明常见问题的诊断方法和解决方案。包含数据库连接问题、缓存失效、搜索异常和日志分析的排查步骤。提供错误代码对照表、日志分析技巧和性能诊断工具的使用方法。说明网络连接问题、配置错误和权限问题的解决策略。包含系统监控指标的解读和告警处理流程。提供生产环境问题的应急响应方案和回滚策略。涉及安全事件的处理和数据恢复的操作指南。确保运维和开发人员能够快速定位和解决系统问题。","order":9,"progress_status":"completed","dependent_files":"pkg/logger/logger.go,internal/response/response.go,internal/config/config.go","gmt_create":"2026-05-27T15:42:25.0326686+08:00","gmt_modified":"2026-05-27T15:51:51.4638338+08:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87Wqy/1Xzi+22LbOfczFZkieMj5WEpLZAHMOxW2WrQJBBBBLWDFSQSfMzyLUONYz2Nl7KEGwStUbBydq7XRqsFITwnt/V34PJe33lfOUHLZdte9ZHqIcBUofSz417l0pyB/LxfxiLi3iV7uxs4nc6n2EFO0hgr4tRmmgaEM1CEq4EgiztB5945G3QMRbLtVRjxhkZe9eWYo9vc2zRYWsyCp6nsjGToiqmfJff57lDOhyn0MhEnJamhFrscVK3DVyGf1SpxoYkDkFQ8OxuxWIHhAN31k2cpGQv9LmsRHcL8ratSFNuE0JPDtSTdY/ZWlXZReIKt/Phb2FMvUA2BI6cCF2Evsk8rpZnwjGsdOlJ+sGevLXEX+KO/9vz0AE6s+rE5u71DR5usC6vuuFgFV4FP7o+3Lcj81SBIu9V+wYU4GkJfPm9eZdFSFgsvHSuqFzrpdlcAeV0XMnU6wZcRaZy/8ZdaUJaIWp/K5jIqfGuxtPSOD1zDJ9Vw0jCLMjDlUTY0Wkzwykxog7i2SnG61vtu/eLORV6aTh8tjNhzdBwbROp3XlsxD0Jxg41JcDSyt4dpyQ35FAPBMPr7Mb3YeD4W1JWqrn8tR5Q1goBmPFlekKRd1XmyYQSZsK4FvBVOUBeCzX1UO7I505eXz/lN/ZG62xC3zhdCt+qCOxJogd4T1f1Nux404SmdsvewY4mg5PnyoinMtMIMX67YY+iFfZEedlNURipIOxssz0zcp+qeJXI9lwR58sgAvpu9JbTbVQJv4I7n1XM9CayA7Nhd0WXIh+yChGMyFdfq6BDje0NtSgi44k/h+mFUk3BqzfQWasqg7rPzAKjx23DY3Wf/8AvNN7IpP2CH4yRynuCGZim6B1AEqKfL6RCsXi3dpi6y6HmEO4DRk7XL8l9c+vWr+u/yI6A9OGZtzl8B7MoVhhEuuTvPbLCrwnHsU3VReA05fImoZPThjC0vYsQuP5jijDtjnjnShV/o1rLBat0xPAhTT0+Ba23IeZGODiU8yg7NtgprzmcJSS/wFzeapmPZYCB70qjxvW/HgkOhwl1TsfHNP/T6k6i1j6gSPIxgCbZzvcJrH9sumu84lcS6Yfg9Qvr7PpOAuDKDj7riCajk2RbdUVxrptqpZkD0kYIKictTHLnL48Uvp97xnspGQYkJA4BAv0grWVZFzqj7o0BlwD7oL/FLdBMSbXkNRCvjQjGnIZ2nq8MEZP3aofJTmW7e63/JTbcplJzE6wdft6ZBF4hroZE8TbT/pMlEMDkQDxYbgPETx9z/quiPJ+0p6dAD2TjJdiV2GfAFz6WEnJ3NljmFPBV2/5DJ4ugFlz6oBXJZArZyUzJlbmfIXasvwycIUFMx470AIl4o7bGCbGGL+tWgljzbkg7dly6G5lMTM+gWVGvWdUtXCOvYLq+oqCr5Uddgt0"}],"wiki_items":[{"catalog_id":"78b906f9-f81c-4bb2-b076-5c5609c7eb41","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"f30115a0-52c0-4f22-8486-ec2e6c334e6d","gmt_create":"2026-05-27T15:44:16.3635684+08:00","gmt_modified":"2026-05-27T15:44:16.367324+08:00"},{"catalog_id":"6de9a03e-f360-4daa-97ac-dc1cd1937916","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"61e1b102-9ad1-44f6-accb-0e27be48ceb7","gmt_create":"2026-05-27T15:45:02.5387528+08:00","gmt_modified":"2026-05-27T15:45:02.550849+08:00"},{"catalog_id":"0506348d-993b-48f2-936c-908972f149bc","title":"系统架构","description":"architecture-design","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","gmt_create":"2026-05-27T15:45:15.0879497+08:00","gmt_modified":"2026-05-27T15:45:15.0922502+08:00"},{"catalog_id":"cc6acec0-b687-417f-9c93-00f59162cfed","title":"数据库设计","description":"database-design","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"120f3824-43f7-4a38-9680-43b5b2f59e05","gmt_create":"2026-05-27T15:47:52.3181698+08:00","gmt_modified":"2026-05-27T15:47:52.3231001+08:00"},{"catalog_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","title":"核心模块","description":"core-modules","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","gmt_create":"2026-05-27T15:48:30.8129369+08:00","gmt_modified":"2026-05-27T15:48:30.8195851+08:00"},{"catalog_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","title":"API 接口文档","description":"api-documentation","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","gmt_create":"2026-05-27T15:49:27.8849802+08:00","gmt_modified":"2026-05-27T15:49:27.8891715+08:00"},{"catalog_id":"f4f8585d-1446-4f49-85b2-efc715bda6cf","title":"部署运维","description":"deployment-operations","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"1da760f2-e12f-4b50-bd2e-539ff08c2047","gmt_create":"2026-05-27T15:49:39.6657096+08:00","gmt_modified":"2026-05-27T15:49:39.6688705+08:00"},{"catalog_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","title":"基础设施","description":"infrastructure","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"cfbcaa79-26f5-402f-8746-9fe524993684","gmt_create":"2026-05-27T15:49:51.0000417+08:00","gmt_modified":"2026-05-27T15:49:51.0048099+08:00"},{"catalog_id":"29142a7a-fa93-4a61-8ad8-c35c1b047599","title":"开发指南","description":"development-guide","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"081f97c7-d774-43b7-aff8-4973d577a059","gmt_create":"2026-05-27T15:50:56.179658+08:00","gmt_modified":"2026-05-27T15:50:56.1833555+08:00"},{"catalog_id":"67d62b58-6970-45ca-a17f-f48cb2ea679a","title":"业务处理器","description":"business-handlers","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","gmt_create":"2026-05-27T15:51:42.2402901+08:00","gmt_modified":"2026-05-27T15:51:42.2445399+08:00"},{"catalog_id":"4d1d9a48-feab-42a0-815a-edf76dcaaf69","title":"故障排除","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"3ce5cfd0-f4f6-439a-b60d-6fb4c36a26bd","gmt_create":"2026-05-27T15:51:51.4591126+08:00","gmt_modified":"2026-05-27T15:51:51.4638338+08:00"},{"catalog_id":"591ea147-ba05-4d86-a671-941af668ca2f","title":"品牌管理接口","description":"brand-management-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"6f1fe170-ae35-4660-91dc-ab89735274b7","gmt_create":"2026-05-27T15:52:20.2715607+08:00","gmt_modified":"2026-05-27T15:52:20.2747568+08:00"},{"catalog_id":"6e42204e-3d78-4997-a95a-3311c8fcaa43","title":"缓存系统","description":"cache-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"795a5202-49be-4c11-a2b4-44312eca8ae7","gmt_create":"2026-05-27T15:53:16.9891352+08:00","gmt_modified":"2026-05-27T15:53:16.9929309+08:00"},{"catalog_id":"fb8ae541-8bbc-4544-9133-e797be1433e0","title":"分层架构设计","description":"layered-architecture","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"523107ca-244f-43c5-a4fe-4649e36a88ad","gmt_create":"2026-05-27T15:53:50.4703345+08:00","gmt_modified":"2026-05-27T15:53:50.4735252+08:00"},{"catalog_id":"948e0792-2de7-47b1-b73b-e7b246e749ff","title":"数据访问层","description":"data-access-layer","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"599c0bda-3332-415c-a535-362503079473","gmt_create":"2026-05-27T15:54:10.7247654+08:00","gmt_modified":"2026-05-27T15:54:10.7298081+08:00"},{"catalog_id":"8b3ba473-1cf0-4471-a203-9a87732dc227","title":"型号管理接口","description":"model-management-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"6af33e3a-220d-4e68-87ed-bfb96bda4c3a","gmt_create":"2026-05-27T15:54:37.220316+08:00","gmt_modified":"2026-05-27T15:54:37.2236089+08:00"},{"catalog_id":"5b9847ff-f7b8-488b-821b-6fdfe2dbde40","title":"搜索引擎","description":"search-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"d0c2dea0-a71a-4f16-9889-b37e1e7996e3","gmt_create":"2026-05-27T15:55:50.6464041+08:00","gmt_modified":"2026-05-27T15:55:50.6500526+08:00"},{"catalog_id":"ccdbaf47-6cde-4ad7-95f8-5b92d33e2440","title":"路由系统","description":"routing-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","gmt_create":"2026-05-27T15:56:02.5802842+08:00","gmt_modified":"2026-05-27T15:56:02.5839243+08:00"},{"catalog_id":"e81027fa-c24e-4492-8100-f051facb89c9","title":"数据模型","description":"data-models","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"97c42095-5b4f-4cec-bbbb-1ba8bb9981d4","gmt_create":"2026-05-27T15:56:31.7739386+08:00","gmt_modified":"2026-05-27T15:56:31.7808704+08:00"},{"catalog_id":"8b7558c2-be32-47b8-99e2-1964009b4337","title":"设备管理接口","description":"device-management-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"e1ed4fc8-f1d6-4e8a-907b-9c39bbe13b92","gmt_create":"2026-05-27T15:57:09.1993166+08:00","gmt_modified":"2026-05-27T15:57:09.2037555+08:00"},{"catalog_id":"bc6825c8-9aa3-4f0e-96ca-ef4925af0570","title":"依赖注入模式","description":"dependency-injection","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"5910d326-0408-450d-b403-06a19f3da81b","gmt_create":"2026-05-27T15:57:20.0015238+08:00","gmt_modified":"2026-05-27T15:57:20.0074643+08:00"},{"catalog_id":"4b0e33d8-28d6-44dd-b90a-57af5c6cfaa9","title":"系统监控接口","description":"system-monitoring-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"0fc3d59c-d219-4f97-af10-473ee62f4de5","gmt_create":"2026-05-27T15:58:27.2590583+08:00","gmt_modified":"2026-05-27T15:58:27.261717+08:00"},{"catalog_id":"f5a7db4b-765d-46e4-9395-af7bbe8d8fd3","title":"日志系统","description":"logging-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"23a2ffc3-fa50-41ba-b7a6-55354d68a95a","gmt_create":"2026-05-27T15:58:35.6388373+08:00","gmt_modified":"2026-05-27T15:58:35.6424946+08:00"},{"catalog_id":"e2d8da89-04c9-4fee-8dfe-adfaff79c9c1","title":"统一响应","description":"unified-response","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"699a84c5-5140-4267-861e-62bffbffccb4","gmt_create":"2026-05-27T15:58:41.4359+08:00","gmt_modified":"2026-05-27T15:58:41.4408299+08:00"},{"catalog_id":"f351f338-eeb0-4243-921a-eed11d063072","title":"中间件模式","description":"middleware-pattern","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"e8e5fe7e-cc7c-4259-95d0-f6b46d888ed8","gmt_create":"2026-05-27T16:00:02.1459491+08:00","gmt_modified":"2026-05-27T16:00:02.1508768+08:00"},{"catalog_id":"c79882f1-420e-4d6c-a40c-dff8c7e8988f","title":"组件交互机制","description":"component-interaction","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"5a04f737-b877-4908-a4fc-67a88614aafc","gmt_create":"2026-05-27T16:00:37.8802374+08:00","gmt_modified":"2026-05-27T16:00:37.8856299+08:00"}],"wiki_overview":{"content":"基于我对项目的深入分析,现在我可以生成一个全面的项目概述:\n\n\u003cblog\u003e\n\n# Luxsin 应用 API 项目架构分析\n\n## 1. 项目介绍\n\n### 目标与定位\nLuxsin 应用 API 是一个基于 Go 语言构建的音频设备(耳机)数据管理服务,主要为移动应用提供品牌、型号、设备信息等数据查询接口。该项目采用现代化的微服务架构设计,专注于音频设备数据的高效检索和管理。\n\n### 核心目标\n- 提供 RESTful API 接口,支持音频设备数据的查询和管理\n- 实现高性能的数据检索,结合 MySQL 和 Meilisearch 搜索引擎\n- 构建可扩展的缓存层,使用 Redis 提升系统性能\n- 确保生产环境的稳定性和可靠性\n\n### 目标用户\n- 移动应用开发者\n- 音频设备数据管理系统\n- 第三方集成商\n\n## 2. 技术架构\n\n### 整体架构设计\n\n```mermaid\ngraph TD\n A[客户端应用] --\u003e B[Gin Web框架]\n B --\u003e C[中间件层]\n C --\u003e D[路由层]\n D --\u003e E[处理器层]\n E --\u003e F[仓库层]\n F --\u003e G[数据库层]\n \n H[Meilisearch搜索] --\u003e E\n I[Redis缓存] --\u003e E\n \n C --\u003e J[CORS中间件]\n C --\u003e K[日志中间件]\n C --\u003e L[请求ID中间件]\n \n M[配置管理] --\u003e N[数据库连接]\n M --\u003e O[Redis连接]\n M --\u003e P[搜索客户端]\n```\n\n### 设计模式\n- **分层架构模式**:清晰的业务逻辑分层,便于维护和测试\n- **依赖注入模式**:通过构造函数注入依赖,提升代码可测试性\n- **工厂模式**:用于创建各种客户端和服务实例\n- **中间件模式**:统一处理跨域、日志、请求ID等功能\n\n### 系统关系图\n\n```mermaid\nflowchart TD\n Client[客户端请求] --\u003e Gin[Gin Engine]\n Gin --\u003e Middleware[中间件链]\n Middleware --\u003e Handler[业务处理器]\n Handler --\u003e Repository[数据仓库]\n Repository --\u003e DB[(MySQL数据库)]\n Handler --\u003e Search[Meilisearch]\n Handler --\u003e Cache[Redis缓存]\n \n subgraph \"核心组件\"\n Gin\n Middleware\n Handler\n Repository\n end\n \n subgraph \"外部服务\"\n DB\n Search\n Cache\n end\n```\n\n## 3. 关键实现\n\n### 主要入口点\n- **服务器启动**:`cmd/server/main.go` - 应用程序的主入口,负责初始化所有服务组件\n- **路由配置**:`internal/router/router.go` - 定义 API 路由和中间件配置\n- **配置管理**:`internal/config/config.go` - 统一的配置加载和验证机制\n\n### 核心模块\n\n#### 数据访问层\n- **数据库连接**:`internal/database/mysql.go` - MySQL 数据库连接管理\n- **品牌仓库**:`internal/repository/brand.go` - 品牌数据的 CRUD 操作\n- **型号仓库**:`internal/repository/model.go` - 型号数据的查询和管理\n\n#### 业务处理层\n- **品牌处理器**:`internal/handler/brand.go` - 品牌数据的业务逻辑处理\n- **型号处理器**:`internal/handler/model.go` - 型号数据的业务逻辑处理\n- **模型列表处理器**:`internal/handler/model_list.go` - 结合搜索功能的型号查询\n- **设备信息处理器**:`internal/handler/device.go` - 设备上报信息处理\n\n#### 缓存和搜索\n- **Redis客户端**:`internal/cache/redis.go` - Redis 连接和操作封装\n- **Meilisearch客户端**:`internal/search/meilisearch.go` - 搜索功能实现\n\n### 配置管理\n- **环境配置**:`internal/config/config.go` - 支持开发和生产环境的配置切换\n- **数据库配置**:`internal/config/database.go` - MySQL 连接参数配置\n- **Redis配置**:`internal/config/redis.go` - Redis 连接配置\n- **搜索配置**:`internal/config/meilisearch.go` - Meilisearch 搜索配置\n\n### 中间件系统\n- **CORS中间件**:`internal/middleware/cors.go` - 跨域资源共享处理\n- **日志中间件**:`internal/middleware/logger.go` - 请求日志记录\n- **请求ID中间件**:`internal/middleware/request_id.go` - 请求追踪标识\n\n### 日志系统\n- **日志配置**:`pkg/logger/logger.go` - 基于 Zap 的日志系统,支持开发和生产环境不同配置\n\n### 数据模型\n- **品牌模型**:`internal/model/brand.go` - 品牌数据结构定义\n- **型号模型**:`internal/model/model.go` - 型号数据结构定义\n\n### 响应处理\n- **统一响应格式**:`internal/response/response.go` - API 响应的标准格式化\n\n## 4. 核心特性\n\n### 功能架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 接收请求\n 接收请求 --\u003e 验证参数\n 验证参数 --\u003e 处理业务逻辑\n 处理业务逻辑 --\u003e 查询数据库\n 查询数据库 --\u003e 返回结果\n 处理业务逻辑 --\u003e 使用缓存\n 使用缓存 --\u003e 返回结果\n 处理业务逻辑 --\u003e 执行搜索\n 执行搜索 --\u003e 返回结果\n \n 返回结果 --\u003e 记录日志\n 记录日志 --\u003e [*]\n \n 验证参数 --\u003e 错误处理\n 错误处理 --\u003e 返回错误\n 返回错误 --\u003e 记录日志\n```\n\n### 实现亮点\n\n#### 多数据源架构\n- **混合存储策略**:结合传统关系型数据库和现代搜索引擎\n- **缓存优化**:使用 Redis 缓存热点数据,提升响应速度\n- **异步处理**:支持设备信息上报的异步处理机制\n\n#### 高可用设计\n- **优雅关闭**:支持服务器优雅启动和关闭\n- **信号处理**:正确处理系统信号,确保资源正确释放\n- **连接池管理**:数据库和缓存连接的生命周期管理\n\n#### 开发体验优化\n- **环境隔离**:开发和生产环境的配置分离\n- **统一日志**:结构化的日志输出,便于问题排查\n- **错误处理**:完善的错误处理和返回机制\n\n### 性能考虑\n\n```mermaid\ngraph LR\n A[请求到达] --\u003e B[中间件处理]\n B --\u003e C[缓存检查]\n C --\u003e D{缓存命中?}\n D --\u003e|是| E[直接返回缓存]\n D --\u003e|否| F[查询数据库]\n F --\u003e G[更新缓存]\n G --\u003e H[返回响应]\n E --\u003e H\n H --\u003e I[记录日志]\n```\n\n## 5. 项目特色\n\n### 架构优势\n- **模块化设计**:清晰的职责分离,便于团队协作和维护\n- **可扩展性**:支持添加新的数据源和业务功能\n- **可观测性**:完整的日志记录和监控支持\n- **安全性**:中间件层提供统一的安全控制\n\n### 技术选型\n- **Go 1.24**:现代化的编程语言,提供优秀的性能和并发能力\n- **Gin 框架**:高性能 HTTP Web 框架,适合构建 RESTful API\n- **MySQL**:成熟的关系型数据库,适合结构化数据存储\n- **Meilisearch**:快速的全文搜索引擎,提供优秀的搜索体验\n- **Redis**:高性能的内存数据结构存储,用于缓存和会话管理\n\n### 开发最佳实践\n- **依赖注入**:通过构造函数注入依赖,提升代码可测试性\n- **错误处理**:统一的错误处理机制,避免错误传播\n- **配置管理**:环境变量驱动的配置管理,支持容器化部署\n- **日志标准化**:结构化日志输出,便于日志分析和监控\n\n## 6. 总结与建议\n\n### 项目特点总结\nLuxsin 应用 API 项目展现了现代 Go 语言 Web 服务的最佳实践,采用了清晰的分层架构、依赖注入和中间件模式。项目在性能、可维护性和可扩展性方面都表现出色,为音频设备数据管理提供了可靠的基础设施。\n\n### 架构优势\n- **清晰的层次结构**:从路由到数据访问的完整分层设计\n- **现代化技术栈**:选择合适的技术解决特定问题\n- **完善的基础设施**:包含缓存、搜索、日志等完整的系统组件\n- **良好的工程实践**:遵循 Go 语言的最佳实践和编码规范\n\n### 改进建议\n1. **增加单元测试**:为关键业务逻辑添加更多的单元测试覆盖\n2. **API 文档**:集成 Swagger 或类似工具生成 API 文档\n3. **监控指标**:添加 Prometheus 指标收集,完善运维监控\n4. **健康检查**:扩展健康检查端点,提供更详细的系统状态信息\n5. **配置热更新**:支持部分配置的动态更新,减少重启需求\n\n### 下一步发展方向\n- **微服务拆分**:根据业务领域进一步拆分服务\n- **消息队列**:引入消息队列处理异步任务\n- **容器化部署**:完善 Docker 和 Kubernetes 部署配置\n- **性能优化**:持续优化查询性能和缓存策略\n\n---\n\n**Sources:**\n- [main.go](cmd/server/main.go)\n- [go.mod](go.mod)\n- [config.go](internal/config/config.go)\n- [router.go](internal/router/router.go)\n- [brand.go](internal/handler/brand.go)\n- [brand_repository.go](internal/repository/brand.go)\n- [brand_model.go](internal/model/brand.go)\n- [meilisearch.go](internal/search/meilisearch.go)\n- [redis.go](internal/cache/redis.go)\n- [cors.go](internal/middleware/cors.go)\n- [logger.go](pkg/logger/logger.go)\n- [database_config.go](internal/config/database.go)\n- [model.sql](sql/model.sql)\n\n\u003c/blog\u003e","gmt_create":"2026-05-27T15:40:06.9577463+08:00","gmt_modified":"2026-05-27T15:40:06.9577463+08:00","id":"5a60eb9b-0b2d-4d2f-99c6-dd1e4cd34dd3","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-05-27T15:38:58.8115445+08:00","gmt_modified":"2026-05-27T15:38:58.8115445+08:00","id":"cf8cd5f4-1600-41c4-9afb-1db3a1464c48","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc"},"wiki_repo":{"id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"app-api","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── _tmp_desc\\\\\\n├── cmd\\\\server\\\\\\n│ └── main.go\\n├── internal\\\\\\n│ ├── cache\\\\\\n│ │ └── redis.go\\n│ ├── config\\\\\\n│ │ ├── config.go\\n│ │ ├── database.go\\n│ │ ├── meilisearch.go\\n│ │ └── redis.go\\n│ ├── database\\\\\\n│ │ └── mysql.go\\n│ ├── handler\\\\\\n│ │ ├── brand.go\\n│ │ ├── device.go\\n│ │ ├── health.go\\n│ │ ├── model.go\\n│ │ └── model_list.go\\n│ ├── middleware\\\\\\n│ │ ├── cors.go\\n│ │ ├── logger.go\\n│ │ └── request_id.go\\n│ ├── model\\\\\\n│ │ ├── brand.go\\n│ │ └── model.go\\n│ ├── repository\\\\\\n│ │ ├── brand.go\\n│ │ └── model.go\\n│ ├── response\\\\\\n│ │ └── response.go\\n│ ├── router\\\\\\n│ │ └── router.go\\n│ └── search\\\\\\n│ └── meilisearch.go\\n├── pkg\\\\\\n│ ├── encode\\\\\\n│ │ └── base64.go\\n│ └── logger\\\\\\n│ └── logger.go\\n├── sql\\\\\\n│ └── model.sql\\n├── .gitignore\\n├── Makefile\\n├── README.md\\n├── go.mod\\n└── go.sum\\n\"","current_document_structure":"WikiEncrypted:So4AZgYdGg4fBppQFUaYszd5gcjnAW4otGGZwt2rR9FkA7j14W8KqurjTom80qix6QQDYzvtwjNwDlkBKuGYNaJxyvGjQQw4h8gwZ8oQwZ6gOxNi4Kn3s2j4umdmzBD+lElSW++qWPDSVlRH2WFxatrki7lImxFBVYJi1Q+gcGnMPeG6HTlUOK1zfWBR0hBS6r6xj7WZiIW89oX3uIdnrCjfLCaaVSXsZBlyH5YEpIsBf0k8s5DtanyoUTN3l59YvTR7Z9+T01Y87/xWKlsoz1hVfbPP6KS8ULp1ch9fv5SQXnZaryzf+Q/2b+Ehq+FSBOFCmPIgsnSpgtwWg8GrR24HrN3EYELhyaP6jhk2S0FsfUcWWYkMw6irZrXNucazX+nAyQoAWJjc0/PziER2LHR4DxtZglKYVBGsDFGYh/PDG1g+wo4hAw//VTHHkAuRxVTja6SvEBC9T7ahcFJhAyx7HFOKcsosTpkbLFY7xIoMbeQZJlRzEu84jagH8o3+oI1SbkuVDlkXSKsldfV1FDE31qzsFz7/IfwkCiOKkWjykiSdHPTOohhTgCP6hx02SyR/VVzs2Q8MBO1hEOfTS4D3OogMVodtBhIRhMUZTnfzNAxU2nwjsb/TFNE5BdsURNqDdxJfGAC7H/FA6I07asSlItC785wjyaNcHhAhyC3ucdWYg6PGYUB0Ob07F9gK3IOQBy1PHNpxmbftX6nxEVa5jBt1Sr6CEXbGYkESMWN/IBmYFkFFwb/j50DMv2YDhEeUXfXX0e4ZlT2ir6+3jJ8knFxCOJRJNI/VUwFbgbZPZ2uYt3xISHat8wLN4nj9C8GbPtXMziCxm6HPucVR7WrlNziYB4wukfmy2aVjIRE49NMX4f89V+GBIB0/9fzvLsBVze3jATSraCTTEL7lhCVwOx63iGG4SiBOPbNLbdcBoRLdQbCOMyoQQaapXshHA6G97r6d3lCLvCCsh8Be/QdfkPkAFCkMMagMve0OARLU0MJx7NueBEmNzjKIK7Z2vFiqpy7dwCd58CvRwvzHmpmI8987J6o3Wvj76IRNWdpH+P+V+ravqmQ3Vte6TXwrE91w8rpOvGDT8MYx7TRaD8D7XU097dXFChClBjqJ1ZYHp70dT0LQRwN4jZe93mCAgbupSjQ0P0aDIW0n0D5tcxvSgKUdbtxQFB5j5o7+MTvCEdVe9TuQFfORNVpSiOV9NAACWzmIYy5+nvF/oIXzPuKLQbcNspjxQrLWzrvkALsMLorvDEuU+PlmZw0ttA4TkNujsdLdz2tHTs4jGiFALq3FltlDRVofC3wax1TCD/Y/MLPUm9Ruk6R15DcKE4VMy50eJztugFsdlR3drxWrhdZhFG0oTmqP0qB6u89K6S4sWM59YvirGgwcv3fhXukqk+CgFcx+swVb9lYkYjDivjyCznMc/CNdaIpGx+AexsbvgzpggWUtrYAkZs/dIDGaepifo2t/+sjP82TufRfrN0pHX+lBmkz3t+KCP/iJaoBgJMZ0f6UjLSPlxGCNcTuEWDddbZxGeGtVEE5jIBEfx7BAZ7aNMRCj+reqL6pHNi7P5QM08mcQOe83qC3KqoRMU43rMdoLzhbB5bQRjCgHytG0mUU63h6DDMSPgUOjq5BJ9Ib38sfhDumwzGw/iExvW2d7Xax9yjn91xqQzo2VAKMT9UmY9tzl4lv+Zql1Bo+lbnopsQIULsWG8/c9Xmow0Caxtqnaj+pGpdlQuV3SQ/6Mx4UAov87Vz8XX4cdNF4JXcv7+75et3AMdxHuPHZ0KUknLzYHCqk7QUlC9hjdLcbmgYIwRITJFnxgBVgT3TSBo4WfldIuFXXCXoqGeqMReP4E4YP0xg/QRLy9ASeyzv8Z9xya379jB9Tou67dOt8RDUz8DXf+63H7zzTtJIemYqyIOcphr5181oUDOzel2Mm2npGE5KyBMNjAdIqW5/DGGX/pvJ091nHwMz6JVVyRCx/akdfof2r0455ODYWnYwybRaEvi0z5mYwcKZAMAB1do2VVpyKcZuubIyoClqTVIBD6QvQ7lAEcso8VJoRuoDgo4F+UN5QQtKZD9h/ULNNlQpM5qxnAnJMWvxUp1WiUDSuuPlNSOXneyiWbh/mvo9H/AFIYvzeGvm5FkYo2MllR8rjMQt+OsEgy7XrFdUyNA6TeBpPMtIdKeIBQZt8IkY17Ch080B+lYuXjVj4HqNbC6ydbNpiYG8lW7KphZLvK99H32QrVe5Tg5kaOZuwgM0CKiXklfTM/zewF8FR9t8hQsJGPbm+thN1rQT0xX35Uf+rS1d5mr4VrhoG4yiH5dc3xoJx3hJr9jF8GXmujVeMVk/x2NvzlhT8/KdiI1g+frNVVLG/aWsqRbOlEoK55lAIq70Bnv01vx+Gg46rGrPJwDx8Q2rJm9VJjBZD2h+WbesD0FF22mitWka1wni0ntJtkPMmuS9MFnMEabWHiThOvDAkjduCGp43TnTKQ0rq0uC+dRQKooBZrMHYcoe3ZpfD65A4k2/dLcJN58Ir03NQeL/KGmxYcz1p1B53+AelWklNCRKN2v0vNE3kd1PjGcYDWlqHJPCqe7r3Nmnfwy+Qxi66avQzkmo/fPqFZIJzmy2Dravh0A1DwuFXtbMeP5p4x50ZZOi5aIQfMRXamb1iekLrTqUw8G+pwTJqMshhY2kcwZbpCgj8SLxx2GeborWfxMLdawjTAPHiKGOSoW98ylIEOke+Vt8ffWhGXpZMjwCcWzWWxidPuuJQSzu5iQoFP5OFJHIEUHzxzDo0DAEO5u4H9yzcYGuAB0Go2DrYYmnbuFw/YhWzoGPBz367mM6pyTjclDtnaYGl6kr/ewQ6XvTl0MCtjLtQ/kzUd2BZcZMropU0sWZ1Z8EfdIUJHQmy9fUnoaXFu0bNK/pgpV6WpjQADraER6jNxJebcHMJIqiXnVxjYEmY59yBns2n+GTLcKzXJA4CSOUli+QKzDCZ8F3hyeXxo88zfWmHmD4RElONw63AzjzLU8bElfJnW/satLsVyA9JNHnHmzrKF1MkjLut4lMm9NMzOwguBRnwtWNxQntzYm6jBz2J1nxzAjB2paReMMp3fN4OPrNJdGPh9oQ3v5SOVqDR2wgZpHTZDy8yPfFbS5wfjLEy6hoWlrMwpiv6Xl6aBItuj3nlL8ZYou+GWT0athBWLAv5Agwngbwfspicn1CICryrL4CMX5u4Vfznv2ZqrwZu3+bKAbCdZXkH6GUkfYAgp9PCTZn3onWQ9RMkonS+UHnd7bGFynE7pG8DPa4qPmysRpvmAYKL5hTJ/xS+M74Jp42Sut0ihxJs1g4i4dxPu9ZXW7vFlIkwiFiMCy0c1t94vGKrCMX+/DU3FZOHbUZLjtvKdycGL7T18DnxMuJVwRcXDu0OoYf8hH16D4ZUEJJJzle6EP89sH/SOS9s4uNXQx2deRzPxteOqmBL7/yR1eqvPVlck9CjCooNRD/ZI6zep+P+S/57XPK6CuTW1umMEh7b5mejqyOh6vxariSNMYuTlIgu84/DOLZQRFX9HjVjoWPV0wDmit6bIXe91iju5rkVjObqXcCzhrmhxclwjL+t5fO57gzz3scVzB5m4n5Hkd4rQ14Np2LM5Z8rwQdn8Y66cw049/ISGFi0avpE3BoV057X/EOJeRSvRsihVu7WiLP/rZOLxSQmp+SPYX1o/nqsiiSxsP9dfgEjLGLUCNd3D8NXaydTzz4mSX0zAhimpINvpZZK8P/v3aroV+XOx+4qY2LX71LAYkvcSI1VtYaZcap4Fhl+PlR5qhb5o1+f9+FKtD9dKtE6ADKcrz+DfQucPcRGRl9W8FEfUAlkdrcWJMOXbGASiI+bVmWXsJ/0Qpx8BxqJDCJWmSqhYuSfmo+C7jikbhZ7cO1J/8AzuwCRC8wTXb8sEF7XLLQhyKTMeHyjYsjZBWbqj8aebT5iU7azjtGg/xU3r4q4zVkKGdabkYjG10dXmqHJAHmtTwYzRn2q7eaajCgx0DO4YXISb4MKYfnHfvki+Nw3Xvb1mIW4y2/ZTFg9j0vQ9zoZOMKg/ArSamxLTZgQHsRt1NlhCu4QyDK7ajVzrlNgY6ZdebaSX2VsdeOWfSutFNBouZNu05rj1eMgnT2rBQeK0KbIFlwGoCdHsNmQBNste7wGczyfXc/aoBshNx6hSUvWQqzk9tYRWq0NHRXGrZepNp2w+nlkkx/Qb16GS2NqI+ICP4PurG6AJxPefGtGR8O9ZTuEwrosMe1h2puywKIXlmnnLxzlKNC8I3xk3FvabT2yaXeEzBaB6xkepvFOzfCaVsnKfKmar71cD6rlOiuwp8NYti3YRdUgtSndgbmA5NWbX+coNPOADQRyUEdaCmOPPyj6DiMpTVVKpiLHyBDMbErnGivC8KiHY3tGwAbxLRxUF98B982mEgUbqkpmcsZCVwRUSvT03DjqSJ14QCH7i1KsCHLPNDado/Sy9o9+gb5psQruXUsjb+VKLWEVTEZ3R+NoR7KGNwqN9V1a27P92c6SotjWw+DwKJNkrRmOTys+3fG/ocezBO+d6q33Mbv6GswkxFMmNoP3/HYdQ4wd/41xJzSuTS+29lhBLvdkaeakrq9llLLJ3EAWqu7xeJJplX94YbxPE6H5qy0YIcUgDDVvS6cfip/r+F8i9Yv2MM4FmrQz7We+jcHP9ORS3zVrNt0MG9YTYq0cUePRaDx/TuJSi8Km0YtqVXWcOsayoFA2Pgfxt95x9i8TKPAZ7SqxeeTbuKCRlYieSOMCHXPYsp/LTp6CTvlIdySoPw32LD4pPGVPDjfq0zaf44covkabrJxKud4zX9QN9mdDelxiMNJyyYSWEc0OhBIGsUSmzA8ijF9Fc9TqBc8K7VsGqeMtfZhlO2BKxiThSgf3zGeb1HXZZKFtcGh4tP5sD/f4PQ1+BJmOCmrco1u9iqW4f5FppZN+SGt+KT0wxz7TsE7dwNOys3hh1Ar/p36EcWe/+ps7UpUjnJ4gix4bQ6n7mYTNQ066Sfgw9pMcSQK3vGE2crYoPHHN/tQaN3+9hBwnng/3yby04L8YDLjD2/0HdMhHZvQZGfTj72CKuV4NNzCWERQdHhLaOjELtAWra25OfnW7/Ri+hOmoA5vJL+G6g53Q7o+SQ/rFkJgzZZqWAOF5wMkgMv2Enc+z4zgJfLJr+s9csAAMGyJ1LXrZFt5/Hj5mDBeRShoTR7VsARlNvOiDh77rVlaSb2uhrwQNiKHz+xDY3XgFePhzYsJFGSxPgxPzuugHyyPdxbOd7DeAbHLDdumSH/9um1u0viR8U6XCtY8fie0VQrZQ+rIHGWtbJ5plAFq7Z/wmHw7FBiONvXqkybnBxup4IlxCq2F/fNxNkpcxGp5N8W4wCya7vDS6iRoT919bk41YPgY1SA1mJRQDrq7y8ppxpImKZyLk0tbzhyn82dNjEpiOX/8GLSWgV1E7Fp5pO/w296z4ZpGDFBzPWhx3ELnHs6Jo2l53mbmNcU6SZdCdVyy/p5tENoKXjZuO+w3+tCiGGAcFHdk1zdvvdYP1oOLELdthY5Q43yHllD9T42oEWpawG2zrkMlFdUgRE2mFeO9dOxIrUfxzejm/IUFHcYAbexWg748sCVGTMPLIkGMHT9/XUeyf7bR5b9sI+UR/W43ZqwzryJ3X/hWzJAHIovVFNz0Hv15aPpHJzUH9pKoPHQHcJC6XSmdFCS4HG59SwWoR6QFhjMmNR3VVJ/xPPU7uRWJDYg/+EiYLmmi+zFSOESf6MCIrv+d6V5CJAZevliDbq4mQKFX6XzoKRMKhzWdMZv0BEP3Nczs6uPpLJnRqmWGZ3xWqQ8nWvbMJA2vAmeg+vrs61PRHE/dr2PlhfHm4lIXZ9u5R7s4y5Sau0/47rWvkidUJR4giPBm1qhnb4xYLtx2bhA9Obimo8pahcAeTu+7FyMaezSnFavXQnn35GXe0/SWwLepTgXsYYML9lh1/9qDYuTwnXMjLcg1VvDZlc/kFiSKr7SmM03GE0HsGQXQ+2ARzKG1gAQVLjLdF10NaKnu68kpO0OuKJ5OzgocuYA5dlKjwpLDqY8+rqNi18hdb1OQRsxbb8JFcPDGSI8erfKG7hXGgDNRsteciTSbFbU6QZKS1uIT7F/BH4kQ/bqKs/VXlq4DZdoKpr+RFhyLrwWCrQh/JVZfehTLA3bLGsuFRgBhe4jpvy4ZM0xubC5UzIJBaAPNuyij+ag1+5i0xIAdcMtgciGNlDFzpQyDffBD2UktJmknYcdRBeC3zXhZTF6pxOVkj5+q89/Bduum3OqmpP2h2BUQU1QrNk0NylXGx2ecc5YD9fE92E6mABLWnJZpyIzi5qEV/ZgRnmRxdZJ9RcZAnbm+y6rk6LX0hC+TuwDM7JQ26wQyf2vGC99p7QValpBZfgakEgHV91zbnP3VG+oOtsNCduJTIszknPRrqgWtyaErMZ1a+SfMr7bG1JumKiFNd46yJ+Khn7bElo9f1pmDYO/lmy44U9e93ZexpNI+T51WCLfUFsJdVjVlYZzmLL/YkIuDf+dpf4llUBZGYopYC1QW7EjiEQudijGfyWJLDC1sCRgpNgXaNQMFiwdQNbdHCxph+EwGXt+34s8q4oL8skyEgI8nU7G3n9VTBsOzR60Ufo5DvAxAbIJZVt8Dij7rpITPE1EAeiUnfYlAOKfxxqju+0M/+aB8Jxu2rh3HPdnU4rkVE4YoxeEqI3cbBe5czzHOMTuZ8sVZmSjSqYXGKS5uDC7OYfHloVef5HhLSwt2DkKDUn0+tgbcZhk2hBmORJSCkSTqygvBSuZyDz0SzW2rU2jU26QUjyqz5Odnlf2024HGIuOBdGyHm+YPdappDfqXlNV4v4tH3BEWVSdyriLiigSxgXO4AlWwcEk6I8Entdzy9JoLqPQqwL0piOEsIXFf0zeSuVKz55dQJCV6wEJvh5GgSyipmojieVXiXeNBFM2MOb71FC9A5qpjPraNV/Rc6cdOpVH2yGQH58a/R1uWuyQeQORlA5PCH5+yYjZGAwLC7aTDVUpNQT/8kbe9iZS5XjZT7SCVqI+hLsSUDBxq88TBuZlJvTV0AIGLdKwdXjlbmVYWHKrBee3zsGJiswF9VcdaHZ2ML2v6+njv723fA9SBMkg49twV6kWGW3IOGYLQcEZoePumBuIM5rrZW6fhkxkHokXUeSoFxR//XiHzMQwmSBDZDE05cVUJ3YEwpVb9lOKITUNd3hhTvC09CJMySr7qg/iS6ZqVDLIW4zUKGSVuACSUQFGDs3BlrHCyP43Fhs4bisWCbwQef8XCM16eTGNxgojOvCFjLMsX4vMyWwAcD4LwrzpunZj1rcb92+e0UMtub2QhvclVR8u60rod+6P/UDZYwNGoFxeLiPAuUfD5mwAni1iNe4PAweHrXhdWAVWp8GtA3frSJMQFvCh5SSVCQhE4jbKsIpjtghcZrDgCV4HnENJjSrIiYFQJ7Vr8Vv6aiF8gFbgpCtawmRlmoVXnsp8rT5GkZD3be5lSWrheUxsyWsaB4g2fTGPSPpR2gRUE1AnldFKYSITtVj707Pj1/dFxlqdPSWNzc/Pryo6Q7dxIKxpXo+bDbafz6X9sJa+jX2A6yfwExlDud5ddZfvLkFVvyfHne9bXFacy8GUmxw1ZZC6/ioyMTffzBQ6X3vGbwFmoD1i4hiMjMwMIeTVyHatH+9NH/m3XdwPhXovd8xM7WKXqpyiz/pjJwxbUr9ugjG/8KjRjRM64ju1qhgQnZk05XcWV9wM5V7j0A3BWYd9lQQkN8a6pXuE9lQ7hkPn8ocIhCroXGXSrhXjcsgBRjWfzeWfuPkqwFc3XZgFMcxqJ7z8qYyhRoAQIVpu5W4VNOBrMI+4L2IfPA7IeOR3SFIWGMOcUoTpy2bUTrCePlbr5pF15m5OOhVCEX+7dI30G1uyJHD4+ZiTQtQ6oj5BZkz0njOCPyaZowym5Mnyo/x/M0wrye27jE6ti6rrq2mOqT7gzfWwLu3mKHxtzmkBYsu0EPIEoq+7RrA6FszGiD/xUNTHD/n2AqV4gH+7+blUNXVAmvk3EdVTabAOcDJi27YscjSHc+CNEqyLctn9dff4San1hRwbztDMhEnlDUHBz6mK+tr6BsPt3ACVuphSTP6t5OfFDxU2J6tA7c9WX1UowPnqWDnNEcUmvDZOQXbdFrkdEhEjlucxDBkxKpfrJBbxxB9MGFSuUrAX4myIrs8EwGlQ33CW6T614gpCL5/xvpQRasyZB9ha09CiF+Bpzwcb8YlfwIL6biMI4con/9PgzB1FKfno4upQP7Pu2gYPrDTb4lIZqWMixrC6DWNJy24rG2b9CkAoKTE1RakYr7uLmqU0QEqcmmxdXEkStfStc4aT5TB3CCM+m7ATH7kDiWdaREzyQUKwclXnviLbv5a5m4hu7LrPcyvAwKZjp6kMcELsgZ9dP+KOR0BzCzUFlkJBBBsaIZiTWB798kB4hq1pkfrVljIlLMRzD19HC8dPk/he/Ov2mDVovpa0h/TloDvZyu25G5UgxLTcq2j3ipYkNb9fyFVF6weewzWMyuAjCweEtmtB+CU4em3f9nUz5y3+K/p+cyCGkk4KDliJvjTGir45qSHtUM7iYnmrGL5Gxu6S6fyVHmnrmnTZW26WZ480NKRro70F6GNg8Eob/y4wc4RXs0vHKZVW95/E5DHoMbjRwMqwpC4q207n5f/yGQ369/g0fEEOEs5fU4/3dwcFRK1r8UMd1VKhPqlH6mQzqMS5seW7OAB/cysfTiJZ5BeqaghNfxAQHNEaLtr2KnVNBGqzHR+vnpfcmCQy1m8e6G/ymMBivqPL+7Xxm7WUffo9Uqi8HLIWqGLpmUtLKOC1BPLEW2ptvEox/0BA8UDg0zwto9CJHs2k5W2mvXsCcAwwz8gp+1XrowpxwigE6kzMo06ii+uWMKYlM9e8vbcud1FLp85CkNmoW14X/RleURhd/0ITTgouSWbKOmC3rxtwwW2MpuyvjIwvztfGls+jxkWCG2Mip1WnxAzXydcxs7GXKRVW1tGq86PmSS4bhFAb+7Hlib4b6i8VKmMkS1UZ9whUSNmh+KYjbZKrGrDaaaLVURu6IVW4PwW7Ewf9cY7zYkT5FITOo4tftY5XJtQ5+7yKhn9iPEjmzZSYq0uL2aH0iAwttQzDEryBY/vLX3P10XOhGmTNn4wey7XHkAETVvDmon+yrIa456KkkG7AeJY/l093iioUvTcTWqY4wl/FhNHEsAQOzHqbbcqiquh6GD9ANRWMZG7REoyyEz2Unsiw9S5mY//+QfCmfRvcqwj2H6zulmDtWM9d05fePwz6GmbeviB3Waq/TJ6uVojYd0PJGBSrDy/ZJQxm8ibWF3gMtOhkDBNW1mHJfMkMEue9rgl+gQALXv5LeoYsytdHnS0iqN7VLvy7uh0TVyBCyfs6FauacJyKNsObAmuCs04u2Iwb+K2BGo6uNe3XEWWADXF/lI1kRScq4XFzg7vHG6MG2w2SEwTErVxfmz/HewMfYDGYhVwKW0Wi4Iw/BxbqNyqO3Y/vLAUfTW+/G2MK31oh8Ib0KfT4d2hB//oZ5ksg0bxbKVWx3+iepFFiVoc/i03VjhFXb7vkPMVwOc+id0IUzRXLipqUzD/90x4bSVfbmYfdIxqE0fSVjaATKnNAYrEjrtYVzeMeW7Uli5/xN0wGmoy+F1F+iKZVWHQwFWMlIl+4OWw96YZE151gsUjut5T362ipZyELB4L8SbAMEusYpCGnvFuzqMBPPJRCB3Z0q13KzT9Fkf5+99O0FbN/k/UmaP+vI6pPDtEfnqRE0ETsJo0S706K1VBXHsfBfFqmgqGDlsFq1+eIcCjTtl57RR9fJksofPmovJCtsbDCql8grpvImPOUipqOgpK6MEvByqiyE8QlWHJpqxHSobuFMIq1w+sNGBEHGCn4jluF4i0D/xCNZw7I5FGudXtPTOjHVMtvwgK3HnmuyfMdv0RSC/iv64sj5aBaWfshk13dFlJEOaynF/LWC3P8oE9favr7ghGNaa8aoj7MZn1TJMi/+0xARscXUf1AU4aCv5a5mA8YB9Srq3GwAdHkcXiPGzranMPWn2jfp8W9HfiaAJlL3G9RmvCEq3yrem305QQ+HGuQ71jHMWoHPnOxSlFj4rF67bvRLRFjCBLGhFeKY1wFAmGVJai4Rut61a8dEsQ5lye/VHEUGfo/KZ2j6Zv5ZWjxA7Abzv6nL+eCfBBdFM91+jY3pdIDVnTcZwysWPlH9bJzq3In+w+EH6dcfoDZ4TtZ2dyAWwRKYu/aZmmvww/jAv18rHfGk8xglCP5VB+Bd0fjonTr7NEUy1EhcQ15E3Td2UApaYj8dVjPnFMSw5J/eOXuJ7vlLOX1hImXUcKHUeRE7CcE2rKG1FNgPKK2rXhIhbcKMaNikYrvc0TNu04DHfbXVxQoaFN4oCgqtyaF/ljl9KDPM1mgJnK2+OEq3hZbfSXWA+evfrMeNsb0V22VZnpVnWvgv3dSlG+EIpJpUcQ/aZEtizzAFnM5JVKMnYYqyez+2d76Tx12keKgsltF0jxGE/Kpia1zTEK+q4Txk3f5/9et+GseIS5GR4NDiqHBTYrrMJPc+9yYLd+uaAHhoDbF+26Ey8W64XDxPD/iEslOkGNDMIfCsyrvZGLCWzqCWk2NoiyQ+nTScz+UQ4nuf+Bn6o97nooZwrb2eKWS7zmFqoKzrS0joxYqmBBYuGlHSsgQfuvgsvqLxnA9oRoM6h7mKXnref1d2II7+ZN8TvXI02nkMlg2zjHbmfLD35OoMhtbkfcI8nuWij6sN8Ud9SXZygcT/1myFwKG23fYgje55imjaZf+xa7DRODjuj1u1xD3HLCP2JuhKjErOdnU1jK+bujPQSvcxtp6D+EvlPHHJKg/MKPT4ZOFq70AJ2QAEToFv2koQ3t5SjnGJh1/UF5nj7gjymEu1fNx9irEoHFAn3Bgz7oWoc/jgaR5a2Sp/FlGuvDNOCqxtwDKql8l3ot+4/oNV6z+cSHfDo+xP8NWyVZgS26gnLTnsda+CPjbEsRlEX6v6D8QXcn7JrzlGdqjiJd9sE9qQO1dwxpFHnbUBauFTjDcT+uuhmaVy6qQ3oDNFcHSOZDcF6OxEIt/JrNV708r2I/o0XVx9nUONAdN5zacPu55ZCfArz8tgIVXH0bYJ+8jQfUcdvf0CC0O8s6c0VG8haW6m2pqOfzp8xf7IUSAFbPdMDwfudgD+puWad+L1v5a0IKfaFp12xGp46d0quwr3pICGhRSzQvaL6GzUOLBXQq6ZD5kOD3iw8iL9R9UVAPgjxAwNirQVpBWAOaYIj4EcTCV8VA1PMviItuXYWfH6m8VBPtRA4y5gcp1zPKpk5ViTs2owlPp+EbZmWusDLKr5zYsUkFUar/1ZI/QN02QGjCoWgwxrGJ/DWuNR2bu2RTbqxcn+46r5Rscsg0NQiLIXOSAFJvSmzvQR0RS7+Y6xrzfrLHbc2HAkOJSwFQnudcY9anKD7JkcbNeyLTpCQ661dti5U4NhCpuwA9xetT/aEyw8+2AllKO0IQmmnx5zanc1UnY+0OaQF4TupDSrgiNlS9QgF/WZrkgft16P/qnB8CmkuJwNODKqxS9WCirHtzRyELo1bMV/YDnzz63SmDMkWhEC+xxvVayFX0G+xc2HnU6DdidoHY9Of1p8EUan9XBTpoedNOKpA8XtyUtX1fI391wC+xrmhOu5ViCNc+TnhdoXCjIR7koUQ9daCYbSC1PB9pn4NM3bu1BgonTHeSt8qIRzWuRJSnrAXelvVA04qfSfSp7ohtKjuXRdIZ5ZZJTmAR43hf05xrhI3XV9DsjduwV0iHb83yoRSjdVieS4EvXqq9A53q5oUo42bFBT1noENCd7GFSlLCQINFveMH2Jiy1YbE4P+bwQ7912sCLL7kesVnzKpTtxOu2w4C77gKLfWdnUIMWWm15ont/MpZstxxeeJ94mV33mjEwlky9b/ZThbzVBNUn+FtXBi9oPIsAQat+oFGSswopGwXVw8RIZ/xFRzB8OtO4H9hfWZC/n8fDaSD9VcIniX/4pRkbGXbzh09BIOE0OHCMMkUOwb65dnuLbj4feMoiIc8VBCyFZqr25PP//LT8POFtNNNQympg6LHaaEruGxpeHOqVQOV0OjyPRO7pRVM/7YGVdsRKNcFW6BJfNt0JZP4pcFolqdnVpodFKhKvtWoC9dwzMIhG+B5tCpRTX9i0AePFRiPUdYZuAoYzPbfTszG2IMB2Ma8Ip7kOIAXNYgglU78xfHJMz4BSGSOITf8kQYTzdtxWZnkUVuldtgRzW7c8z7USA70Jcjknj6ooVZq8sNBIy0Jx3/tVOaR1KNr5s+E8t4Pudvr6SwoOMuMy6OvcNxNS+5HACu+JRcryqEySreus7wtYhD0OpAWWACoc8WwkSx5+8v2dSCH+n1GedFSCNwQKMvHqXsxWdoxwxyUAb5ksidreUSgPUKoppSuIRYTWv1s2A6Lyllhj6mFOIaKwSbfSZn/zM63zlPwUgVl7nnLaCnqEwRCb9uyHFxoRAW4qzDj/SVq5TbsOJFPVQUMOZh77h7VxxnbV1a4UuHjsMPUm2aCQEiy6e2IB+ZqXjWBB4vDcvtn5DwNiJW3463Hrm3Y79pXM1MYjqVlDnmd14wRMZ0+QAIfpxy6lJUNCYnmNAmqo5a8Pm1S53jytgiXan9KTerHz11lfVm3xC6cxnxoZBL8tv12ZtEc0kDkxtkECMm5xu7K6C6UrQRiIc3vc/oSSXrKfG4uSCoPz9J+FJip9vMOIvErk0uqKXIs0Tupcy/uYx1omx3zD8khNM8peWhfSi41nvUNbJrO7Wm32oeOPpi8tedpKCbki+4qoZFmnLhZ2u9Ns7Yh6uxO2jrBzoP8HtaLgY1aH9S99kb8moSYmGBEmudO3mUpv/o0QR1hZEBsqJNXW/WUfUt9/JK1Ohcvnj+IZgcaO8Shc0BrJOka/i7VsSprDDUOfgXLkuVw4eHJEu2DL/6CtUAuPAH3MeVWhmSE4qPkx69VBiavXRs5J6EdWFjIEIY8yDXdnC+efF4ziU9v5Yk0IscCmwSfG2VvXUmwx5JnMN7kZdsKneft6fKNRjcJgvlx5+iQ7AiE60+JS8xEyXmmok61jGX2/hK0/JkoQ/a9yUcpxg7qifvbZia6vZ4sUSwcnygRosUjHFVNGsiEDzmDfYDUD/ceq8uBtwU4ocBD7G2JbDQHRSE2MkRb/ZSVNVY9jzxfLBDZaV7LcgfypB11mw0HMeoC7oa81rXDKnc+HL9dyv7kSc0ghJUx7RtztlG1hOPNxVycvNvEozZeslwbzaq2adX1mnRa7WKRkTRXZUGRlFpXac/b33OrxvFtGxh7VW5QnfodrW+O1+LCu8fK2Oq0UNw9+MhoENEibBJIBD/jZgTcazoM0b1K6QRt9X4p9wYcoqjYYMJqNh3uFYbTj02VKMFNEsfqRMJ+5QfBvWQUmeOlxTXe02EAqTqQk6Gnc2As5UWZJURMmjNquhV8BYBCiFt0ddZ8QPHnuKyMIBQZTnAVWmRlVp4dDn9DlZuvnrMWQsjVHUF4aR69RbhB+APMXB4H79hKqPZgjDv4/vQvX8NOxLUmFoVm+W4szPG188Ipp1MympJ0omJQMhuAZ0u9nfK5yUx3GMJJzG97mIbn8aTImMqBO5MPfYZjrKGI+mZ3Bcb7D0TKn11heCbBEw7Dx2uqJC4v6vKgagqNzvkwNA/TEjeF8TLG580oRWNSwHzpXHSt43ffoOVh5iaeQpiYMSDJ2cw6OjmOvAuryMHBd1Rt2T9lIztIBaLCNE8uptSFs4JLacTFyc2Sf/yDLVQnpIGscRycwRWuAQmTKDD6g/OOX9cIckw+bxIzyq85zz6dXSxEA3JSRhPtELBk/9aFtCUZF77t6Mb66/QCjVXdynnvPbahhumH/KBI54EHKzZRIrt02Ck753zrQIteO8b8MOYA0DZa21Yo/+cst9v3w11ERnQXWfU6Sz9k/c9Q1UTPdrBNd6clXHkf/eo/sBt/U/btVj1SfkKeL4IrfrNKqSeTwJVBthNUFeRkSEEVSRMJwcobbMFE4RLm0YaSs11plkg1JITGE4Sl7AcseifKbXQqN/m+pZh2V1JyUhnj4EHsuITmrhajgUAAz8BYf0inruSsE233iXoLqeoetu6kmjVlyeHFUdZCwOMXgmR4mxFPo7yPhqBPms6BaB5ZS/gATTjO+itf1Wo8V5Y4rhC0XR12JxAYKiWMN0uAegrNMU3l6aDF6SFcRFeHaoOi7UWfffziWhLuU2RDettxeI0NrYAaDw0rm3mQqLC7kLmIeWTBhEaWdDq/8IgIFcNfcdFw4Ulxgev0jzgk51dGoitkBHOe74n7S1OgMtigX3bXUvKziwP2Cyh30Xh4ZnG3WSlhfSnraEHpNk/NNdockM1H6HFBkdky2ghqQhSFtf4G/EVyfMp4AE7zc0BYOX0JA8OOZDvAojNXc457MtFxzuPGU8VaWik7zmJXJ7wuJe59tIOkBXVvK7ARwjjQqaJ/dpdhtmIcKH390o8a07SnZWO2M9EzystK3QVFagMh4d0Yvf1Od1TYKu25ngU874vue7bmrMQOJEHh71hp463R/gSiDgiCfTi9BmwxtdY+nBMpvp10tUSl7wdkJnFcsIkUOn4G+E2Z0PecatKXP5+J1fyZQ4xR30x643ZpnEY7lvFy5vIyjQ6GKTE8ONx1i2XiTTbF6pNI+jrkRVlUa969nWj/YWXsT8hZBsLtSQVJjZqKNFQEIFWQgxRmDlhNY8Y57nIqLejFH5G2Lc86CKeI2uf7lOIJ4zwixr/BKbuRlm5/Kp0CtM2MyWEr91ahAUfdjhW/fsIs+ANdJYXKXjMyYZMIgbknSbRpYEMGSlarj3gESjsoUWOn0XVMmh3C7W8DctKP+qiKTtPKJ98WaKk8RSGbWSASjejEWNiap4l4YhYOHsLfh8aOLZeX7hiHOdJrwA4TuauZd1yzWxs0XW2pmxpObPihyFpLZ1L3w+8ej2wejt7hHGULb3A2e+L8lML0ovc350EgAsI4gj3AwMMcTPaQLOCbMt1ENF2kepCDTCGfs2AoMdywKAyz6EzITnI4K55PiCc1EwW7CkyUqE+Z6vpvQUYtruR49+gPENbj5Tsc9OFGkNlhgXE41HSvF1trHefmApJEEbSt87gTofH76nRVfbGSRYOvSruw5OEZx0l5eS88rJ4NFwLCeXT0DjVzM6+Hf+TLw2J1f2cUT560u2x5HeLhvaIWIvR995R4aOp1gJMEtUMqu7R+bd/TFP90nZa/UxvrPXVvHRKMMazaAXHTTH0bimkm3exCRRvnypfMGYCaCJ0kGAbQ09dJBw1PmmCdX8VzK00v6D4Fa7jBMyDp25FX7iwCj9BzdibO0u+bt9TxoGkwD/0KxLM33YUIgPXKlMkpMxDeYIcfx2D7RV+Z38TAh3YIbkHHTGR4zgYKjH/YNrcuZTihyLKYGaEINaSOQXduHgBcAbmLIheKCsfg4U5Ov4UUQU5XeKT68dNKhsC4F/i29Am6bWA1zUzofPj7RC9OnWRkRPkmQS4KnX1jgq2hu7vBR7RC8HnYQ6d1uR2/lL6vHQqhs1465DbcAk244PgFSmbe4RCI/ZAZTl2FYUIcXBxzNO/ETF2LDY4syPrUGdtAqlm6eiuKcszELkOkfQdYdiSzrrojNzQmakuniZ1WlrW/YrqV2C6vyVNzT31pzy2wEzK/DU40P+qi/BEblkbspon5kpJ/bX2xiWWPQ4nEMaqts5MmTz5VpyTfHLBg9hIQVNKog2c8DZwHmiLnxBgsh+5ImzMOZGRNjSFiU4wHKnYGX+TC/2fs0LNE4wc2MJdrREOrDgGURUHwAZzjT+3TTWQLk0CVxTyVeGv1P/rC2uamfUjwszOGlxZOXKOu4dTk8XtwdQ7dT3z2BGcZcBH+wnwFGv45E7EDqvvNJXQB9F3yPJJkeQ3NX0+aAwZmqTuKdwCGXfZjFBqLx+gsvzvxTU1TC+lw4X2sJ6GFM1PjcFi3aDBfEfGcEqiZDyzrayyp2yLQL9yH7bZ34sjn30cObzkYKYPKx2xk8Ggb5b4wumBRpvTIyUg+EimG5AYpTPXF0XH9wn11ztl+6/+3SZQ+vxPzEBwFcM2GZSuUNB45ApHCJTqLvmtVn+eSg8XxA3Ys7BLGN5rrtgVsy4+JgryuyxuHhoD8qYh0moqklQZq/X7ap8vZs1ollUMSp52IFbx5duncTpjJOl72koqf0MAybKhDw5TDPxns5uaREeZ79IUNFJXIGVoyyBRicA7oOBOwTVn3QvJCyTkxxRsjosvwIEbY392bS2k0mtUK9hMRh9fia33rgdyrxloJ4ECHQltwwNl/0BfqfsP/j68SPkp1PN0yMxbU0BeDp1yQZdFO89OTct0kCT4xK4RHEEnY1iPymTHGU787uB+bvgsUclvrRZYrvquOFpQL2Vh6EDNOXVnn9Jv46YccxUMdTFwtNKR6Mwe1HsGD8YdhJFjgJTD7scszutcUmr8DzuU36ffmg5LQvpti7zdp3VML9t2j8rJAWlGiqmRFUCJd4OPSSyn7wt8aAE95MSjM7RogAr/AYs7SfP33ZWApUTLLD5G9/p/XKbTa7OyQx/0mGo0RDg2fRKQijW2q+rQmUnKAffvlwN654PssvHjmstZMXMAc8KSQV0RvDoN6Xn6eLBfn8Opf1usYVKkhcUKcaTYTg6qYk8a8Sn2ghmDNuv7gxlE6iyW2/CV8hhi936IcqrAPXeTV0jngCrfSzlZeHVZWM9DjG07mXUN1Os0kfNn0C5uB9O9sjWiJTpe00wkyVxzrlmSNLqbFbfAK6w0tSPeasM4BSivyN3sZ7nHQ1HdqqsUtjNC9ZEAfJKRlhxwNk/zjWVprb7xitkl+Opib6gQXIRffb34KCkdIoDxzklytZdJR7tZQDimQXtC7s7JYpOj6Boq//VxpArvyCY4nLkMFQ6atLmKX9suxP0TyGCQZDwMN+0epl1dNjQ4hm4v2BHkm2wro9hnKaHRKaHBv8A6tAeEnnoFFoviYldNOctO+hbqtp2ZPKxzqHQ+IoadbwCQOEOBbyUv+atF5Bgr8doUlySAp3qa1N7KQOk62IGp+9Z7m5y5tJNc4rYtRALuerfN0itVphX8tLuE2p6QXkbKdwOflWWGWluAezXmEWIxgeIeNaxRoT1ue0vWbplh4KQSXb5cVmlHmp8NBd+e81mvUwVD/25lPGZ/LT4QPPtqSDJXv6N9gW4q28R9+/7vp22EiN1gwcUmHLuqxOJMx/0k3XdZsQl0/7loOyZTctFJ4OWqc4EYC0NRiy2Me6NTwdn5wA+7gwy+Pm+aEcTvXzMWV5cEmAC+iTZfBYoH5qkap0dF4xwCcijFdesV3xFdVT0Hi3/OlCTJ6mWhTw0XZw4Hq8/MXRCoTooAJghmuwxILKyE6UKRgRQKov1oF+5SUgE1F6LQ8VQxbny/CsB1oCOauX6tg6RO+SmXtjAHhCxve/VfGY1vKHwid90oPoEvb8ckTT4uLP1zGW1Tao+IuOM0FiVJ59jSCQoH+5m0x1SXa2f4EdsciPyEaJ58tKGKI+Xv9FvDlgUYyFGgRN9qjpXQP0nYvmM/kyT7hOegfn8S95gPNPEhJNkFDRYxJUljvYs3B/eOWbajKlhxs2v/Z0QSHyV27nut/2ZpY6fAAWsHqRj4NYHwpnN4wzICL6Yzrjf6GOKkLzQMzBc3k+nAg6vL4xgcLucjQGx6O13T+hYAUa3n0+fBrpoQhFS3YCouilNsAXcbtvKyqk+Mmgo4Ecc2fW47esGvwI2eDm9K/yQrIpFmu51+hVowTmZC4l6ZmMujJt1YVw989/5hFAhYIKrGdmMpdCoC8x/L+FJwNXX4NULHx/0DPEUZ36GDlk4oVN5h3vV2oQcqd3uZSqwvuUNf5PMpqAvo5XAITsZjnVKOOStSXCwpn3lgAXdEw4oGd3A090HrIKupWeX4bFfxcVKjWKpb0hYETjQUR+TYgkU/IwUdQbj7ZKw0Hj7XPj15bKBL2o1/OqFCeiS0DgJrnPLU+bpEHarXujcGcxuWG4j+trFI2kzt442RLrHR4uUv6VrlV8cF3ZAQdjqL+py9ePjXzpn09tZHx0O9cJ3aiSio6W+F4xizP64+5kATrxlR590AGl45RUZO6trx3KlP2BSEN/88pz3lqNsHy39FpIg28gAJA5eZVhhfUX5LioSRSITpVjMX3pfa3rMv+tI6u6MIZarwGfLm9rk7qhk5KJ6sM+AV9HGiCSNfCw5kwwU79HHOaRSGZAhc/1siNg3QKpqlsreufErq3JyTTf0KqUxPIYeGaMq0QGkK4wZCcwZQjT6cM9jBSZAI16fpnhnNpSkw9NcBJ0TSE4mbvEajj/FZYitDcXjVJ1QZxJ4HzkTa5U1bh5D+D2JeHWksSt5ObxY+FJM+275QVkYQviiiduSa0gHrgbHmTsnYsFyBrHG9cUNa0V2ZSrqc8VgT0HGhr4FypiWvVB5V2D1l5qz20qfCgwyxQv5o5ay2PUzsZmFKeHIVA5lPnBJmGUD9YGF7H1+/FOgRqCimkSzaUzSy0Gy0vWyje8AYkw6g8nY8AHmjXhNck97by3m+sDxMzk2GDfW4AdJuBPklFkOHX0IaEXmh/tBd42Bzj67Ii208tQ8cBmyQumelXATMmlQQIfLcy+5cI98CkCjBj7e6Nt32/ceNPUMwJRdoh3+a7Y0sz00PUYslrDxY06edLVTNaB3pCOHAlOcKlqOaAn4iAibkIFmqrpjOZQbzlM3G4UtbiwvMP8vK5pes6rEHsXVvzkB6JZnmLHnzjyTnAflSYzJ5n/wFqQ+0DntNKDdIo8p22oWXkgD1UI+Ry+qiUTvazDkddqT+kWG4dEai9JhjVp87mjEtsK6ishWzq2QHgGbJFWPjwyloE5EHNfergdTL1fegN43BjJEvzzmZJaYVH7YE2Tp2lib/wHCSbXVAxOZetTX6hYANmybi20wMaaNCnff4aYmd8dRZX1E51xT+7ucn2mI2CNnIhVYz28rFTty39D47r1Vs3Ih0uiZ7Gwn7gWsuwXOU/PFWW+Fapi9SOLQoD0PcdtrHe55R2/dtpzLEllKHAerFts79xmY9WYFfTqinjjhg9c7ICz+lmJBPx3TzInG/nbtPSYDBInkWlGoBVKYRyVPCZ1QlCOAmgyiaBDl/rBS4HF/PUw77EGK3jPJ2Lw3n7IB/Ut8K2BZK0YpfcR7HOGNPPcZViOJOEfbu98QL9B1CWuAlewr9euZxWTWGQUrcTP27vYPYEm0Ui0kPJkBqD640C72KFvNoQtm6SrTZc7nsR8VT7+z0TDjyLTcA4NFB+qYRFkzPC9w+mZ1L9xouvRceiZOxw6fjq2VxeRQfjnJKP+Do5zXn33cWKq94tyH9PiSWtbMz0L7u1lPA4cTL3Ewx8QSZA7rU9wJQjDF3v1239DBblIWRR8nsb62dUC7Tbpit3+CKTUWCAInMZ1DM4CFgpzgi+kniSkPL9TyMXBA5oD9J/g8AfRJ4F7m8MSj1L2FtTeWJ1k7BtmasAh08EmJgZkJKczMLUbzRiwo4oTiqSC6SlpuAmSRAKkNAJ+g/3JFYNgC+faSKKJ9hMCHw8fYKhf5QZXhTzv2XSVXICCsP/lsUtK1lCk/PmgtFT1yRduRyF/PnzAEMvevdiV9N6f/BUaWuffG/FCBT4HBAuLbteqzk9YZQvhXIwQDgG8P8zqsjULSTUoHgwW/u/bCne+MBU0fXUFOL4cmqS5bX/SKmf+VQ8NTJpsc5PkFc9ifC782/TpDJu4dmNDfzHnlegdWZcKozQ0ewAmAcLaix5L0/sAhI36SBMCPeidVRJ7lfRSrsh+DrSgOfTWcOAVBDrTR2wIshAoASpxGn6vUFukl5A/86rZG0QESoIzWgoVugkMc+1FcC3duBScjs6SFVokdnBrPIAygBiqyHmhf/NzQ8Tg/5YaHTHPWsOeHCnwjNle80pULSjqvmfcX6/dWm4T8G2WP8NAafHvmZndRKDPNhYdC2rpEuSZBT+es5qcYlngIyZsSKW1gcXe/eBbhHrU5vTi8EZIW/zj5YONWjDmUT7tfy7EC0rfnprSNPEOy2uFhxuwK/dS/YbjeCIm4WVdMMe//O7/QKvcqLqmbB4t44m2RwQPffJ/1SphJzs/+GFAUK565h3jdaph6EO0VNe3fzzbBnfqAYz6B4QNwznqLZmkOgp1CtSdQJcHPx8yhitWb6jEV6QJV9KNrZ8DDGX9Ryxq41DriviAazut2QQyeBe4hU7dD+NVbIhIRJupK6Siw5cIyugBIIjQPRiisprZkrpfSJ9yAxWjQNvEmu+nMo4tW2snGhLcwff0NG+jcUyaWVG8PSrTCpgt5SQ8drBA5xdNyB0Yp27TyTcQ8qVxt8gSNwO83rXFBc1SWQerDMXHUe/znZ5dHVsfFiKBF4LnwSzLGeZOM2hPCXH62yQAQD5YSDOLIu0NVP3hx6nZlW4pgN32gHOKCyOKIobuQaUw3fqYOPqVtaM1xABZpPpQ5kRA/V+v0mHQgDSYN7gml9l5URb6f6QPXrbbtvOQI3LbI4Z8A3aX21w2IW5kHtM1t6GLCZh2c/aZDCFTgUY5DlgZwWJybgzQCN0WgCAxoxy6VfMXNPe1g3E8Z846BCBRyazpFucSKTAsZDv0DxSisb0Ckaygqsi6goFqYL3ZFGOtzKXi/yHsugwO+myx4COC+x1uukvKzmHNAkx5uPpKhjC48DRL5mjtfRgKgrIy4RhrghLot8vdRgbJwmIPUd9rflB86OVHvxkFyy05k4Bw4yY7wYSwgS4/ynGE8it/dnB7lAfMfFMz235xbuHpVSnC/kkHfsQos6anC7eopb62yVJbo/de0Ra6paOMYHE7PLGnDnmDFWm3lXlj0KOwtvTqSOEpPYv88faswzKJgHZ2We2x49HShlaxRrZiFHku5AGnvF+26ZOjRr56vfgtyXXq6RuvRPz10W2UF3GJgM+3NwkO3bhvr+ydPbl0zhSEdzgq0Kf+f+b2odJZHziR8GeuOD+Rg6Xt4ldbGIp6iN+c7Ty/jNLJJ1flqWLFolkm9byxO28YInefggXblS7stVNDE2nfEATCp9jRAD3xYbbytf/uizPiEuszn2XYVc1Ce58gASTwYe/mj+Am6jaB0/X9DG0FoJpIEGgvUmmwucH9hkDM4bMKpU54wDTv0N4b55PnTVFa1paCbu6ityFUShmxozVg/r8m+GwEqlVQ2VUxSx74GZIC/tvr5q9m5c/Y2GYHoAMWx9lOpSXKbAfJUdw00gm/58Bqv1JHS+EZ2zJI/vEtvV6dBBcUlGkBCcFBrcVhtdZjLvOmNuHfpMbj4S4nbu4ToiVNOc5gMaNCpKXaJt0yqTZ/RpoRc/hrl8eYptalciqC1X0SNK8PFwZu0x/zPwl2BpaHycVzIRHaHeB0Dq9djZ2r2QsXBdj7HKXPdKkyPue2e8D4laq6Vk7DyG8u9CR9n+4km5zACJWeAsR61SksLrDwA2CyiW1xkc/N+rkNMBASPcZNKiPK5xrFTFjsCEkAftFIw9FO9ZPFGdnhk8iy3jMUijWTNEDsA8TR75KTUtkWp1//ecLwfwj7yVEvdkPf0Uj5om3r42GCaKZ3IxbHDFhFy9FEWSHE7tRXodvo8YnECc9Kbvy6PnWBr8XadBdmV0pCiMb9MG1NZhYm2GjH6DAZ35w1kDk9TgW0xXBEF0ACVIK8vc8cY009xBtY98E5V+HVKaec16fIgVAGgZn0WYvgTs6efOyQywd898fPB5o4OVqRYgZiBbEOrMdPKWO8c6oaWjexdc+661L1stt5CQ9z9a2bLHzNxrGCh2cp+nlZ5vDEUN5PqWFNY6sV3oD09UVKFbJeRXJQ/AeFitDXKbaY4F4zurgK4xf55F+obZlSRlBXkLqmn13WRNkdlnTaylxM9w4hBT217bqQq6PDk7KCze6BcLxsqBMOVhq5N1QkM5XSjSrwprgX7KXFqX519k1LkjPYJ+2GfSlpdPZyq1OntrzA6Rzy2iX54vUfYF5c9AiDODEr9J7+U69wngLb44Mt0FRswsu5f/0R84nAaq9aP8kbNPMiNBg5acf02vG4VislHgV/7QPfEq1T4j74TtuKTxpfgt271jRXNwE0QlqdqeboeiMvOaK/AXsRPU0bv+u+/bI7IPcCjiu5q9iyLjg1FCIfdM8VYU13mf+WgUm/CkV2xyPLE6349Wbal/w86CLaRIskmYOJrlmt4sn8idgSfhC5AzxMbl4Wx4IEEFV173ice7zJ5uawMnj52GvkQ8BoSR08L95VVjf1jJ7FxJHI1TYm606OHW2ZFFrbCNfWCKP9wMnCCe73ciVSimQ3Kskmx0FiaT5tfpwnt9T0sTQjDVcwbo7wvxGAjabiKlUnpUjB7uSQtFOQj1PDIPSUPlFpK8SiRmRwULW1rU+BmlMjiT3sCMn2gIPav5w46GAg2hQQwPsNhqHhcsqjytQBuhS2CMxZCvKWU2+tzWQnI40NuSB1fCHlRDUdSuv2ie/AvZ8RpgaJeopyOE7NZjHEn7q4XXJFn8/lGBNRGKtHd5w3WyVcwNsCx/q4nFJMKQdMU0zeBtLs4Yc7o9LDmLlti4j7v5nFJ5kJSRYjvrcrffqYWp7T/ajw4OrJvaarGqpbSwb0djpb4KnjSjZbMNvVhjPt8dLW8fwXvhQrCfN2bUGQZSC+G04qZgp0EJBiZqNvzTkkaqrRwcNa401vRPBxe0Yuxq0pP2BZZhhXHmxk4feQlvFRUKsmDprzaFrj4p/dbIqaLU8DFw4x91ZIzC4SkdXrO0SMk1QLwGZ9eDQWqycyi8vHIoTMOdAFjAnEkduzI16RS4qbXCk7HFqVxCAmLIUqGXF8B2+gaAo5YdZuJW4fKtNobecGZNGlHcCF4nL71twYZqxzAqrq1ktmiD8O4GQXrqoj1eRLQ2SsklxtVbBMc541SDpBYaJTWz8iubNUkJ+0e8/VjEk6aPyBcEA99PLyMlrmFvGLagplRxfkqhhbQYQERS64KkJ/LAMM7GiMBwvCVt4OUTFlZYpxLcjPSo8lmyGUW0tu+7HBd4cDRJryyXDtgb4QrYpuOnngsGRAkmK4sOV6SyA+PW+DMTUPbKkBiw6hkIE9XkFrAr7LhZzlp7kR6XFdKT7Zkj+luV+mw6AYWLhZ9o2sQH94+ccNHTsSsSjn+P3L9yPNEwvFAuABieOCVw0iqKcvYbyfHIut3UdEAeXxWsdL3Ql5LNUja4iVXPJz+R7ISs9WE53GsXB+fvGjdpBwpzOmuDgCEIzAinfF/jIBwD+0DUT9akQPZ2XBT8uuVfoV2wB432fVy6zf0pXIL80uUdFgStA5AXgchl7zx9BbW2GRRXYEY+HgvblUZ5f7u1eqMwpH2wQvys5wY632i5TOY5rCnERhpx34vg5HD1hP1wWG9+uOHy/TzlnYdm6Y37bMAsLR2yDURk6ip++LUm/L6obWVvxFOJb5MSNvgRZ3i45tihdlnIuuE919toWrZmFyVM4aJJdiyvSc6X5ws06FADh8w4PQP9C3x/J1pgrlmSmNtOtI9O9aHtw9eFJN9Gck5DhKNqeMIlyUb2wwoTDkgJKUZG/IbLpQ5lK4xXjBVZqhq/6sBdXTRUmTkw0l6wrPs3s5vztyS/lL1/eGF/78VdQpvu0G9H0spCRdqs0hFlMJzjuzsG3wEOP6wDitUhzPxlUScsJkU7YqqwaC5Qo5XmzR1nb8O2teedAlGxUeo+rNCakDjrvzI7lmogMsZXDT1NJwPewlvE+y+MW7t8sXTv0kzcCttAQobOXxKO9gmj9g/HndEvnsyLHuY9Ii8Wkxvkitg5kvltWxFD4B1GPNuxKjqvww/uWoPC7DoL/N6Bf3qf1xHrT4A/uNK89nesRf+VHhPFDf5LS2S67zzEQ+vITL/mPQ3zeq5AcJKew2RMDv0GycolIdkl/B9plOgDJwekEtV9jlkLgd/ax6995wImkJsfCrV8labGZkQmYpJuZCQ9rS/T5Nz/p13GjwEJANpntsJ5tZP3KyW/I3TX8GiOuDaWTH0mlmlFooqLkM7fZTb8nbttp/FRegkwNkskIAvQsEGOQOju2J85TDt0qAE+uR0uOc/PWrrxrpxtgC9RJTMhKyt4O+OBK37TzuuR89leONFvOW/QRBhE9OFVC4pT2zDShGnbyA8Xi1GTtYARwUMAtFCGathkWHmO7O8wkKOzLe5EYzhwIUVV7prdkneXj3culLqllQyCH8XueVYXYeSVZ0KRsLgLPTrpaKAueFGETx9nuCdSfRIbh1t8OeMJ/9g9skaxciAvMqzViSreWeYkkGQfqSUmX5Jqbm2DA6VNmcN9uiS3pLiE7CWKguXHXYF/+0tCxNvQ6b7iP2rJT5dKuZx/fUo2RzCOqpGQsI/MzJuS6ohADrZhqY/UTu2FDgSLWBny/12Tb9LpHsNTpVzsg6PQLOnrjbPE6q6DlEvpnI8xiktwV5cXqaw8vFrMQJV0Tqu1OubGhTZiT+y293mG93aZ9XKUc/6pDNF+gL9WHoeN0DjMTyRhaD+odABLM6Hw7WLJhsfRAJHwpNpTBUNKPgL9ELrVsbM4dadK/gDJ2v+VepDRjub6nwLWDj0SQjSS3NBkJAQBf7e2Jjo0kvXOlBvilAZJRM4k6oBt3KazmKswmjToBLaqN1EFlCJ3X7yPJ1g+KRwGA+B09EYFOp0xc1IJSGUBXjxy4ERb9XBICUXMvGzVIf/VaAqXkNXLSHT7W75ruLcae+QBsEosNKEyEK/NeeJo6MJjhRpu3kEfU2kmA3dYpj17J/9fG6mCO448lB6SAvhHi2LQFbfThWv3+UoTsKYy0HBjPAdUYSUL9S9P/WCrSU160onxERuKHcj6ocXJtIy++tWZfvX5MZ4TSarDV85Ylc94mfUnLvTSPn67xJ5AnUpFteOMKUhsWiZEmP17298f85NsaDSp4kmjv6ft7MXeOvAm8q7KPT4mvvhBZXuYUvCoyzUMi2E7fy3GrTXMEf61K+de9jNzsFFdMJzsDL5UWCmqbMZ6DAznIbQl+CvcKN3M4qzjzMbzqf2ljxLkaog89Myj1Dd5ZDaAw0gXwVwVF/9W0aNo0TnjW0YfEcHtljueOP1mZ9QxCQRQoJjqaNH811AVkzmdHkwLAd1OurF4X4752K7dC58t0J+ENdI3u0ZlxrHvAErTjo3amqLScGD3j/3l4JTs7qaxMauV+j2zM1en95Qnt7xIT+Yg3H345vVaw9aKBzfSVnKMdJr05SQwrYufqrYhmTYYmOxcS7oArnJfjS+bxvgxlHfLm82dK0KFrM6YLvo/RiqDCgVkQqUTN9bQkUypcW7YMaa8WJEiBuIuVt05zDv0ZQUTJ8paR4+iSg40Y7/xXqbWChwY7gfFf3BLCAXGy6crwdM9uvME2UzeH1TmyJWhivJk8gsDQ3cHSIUK9DRjdezKqkFs4PA2Q86NVEQA3CW/9UxqwTs2bJiRvekXKL1jXRz9M2hOYaabBCKRCnOfgCCFHmc87STKulnrIqCeS0MbjGThZ4mMshp2x20ZKg9VTIniLCirv/JjkIFkbazlGvSgXc3Riolz5TmWIRUfhi6RnuE4IITbVyYhAIEc0bRQXC41BTC4ZqeQOTL2nM7rQFZiFz7Nf8YY70fpLWsgRi44i3mURteEgmHKVNIm0piP2v1fC1RbzlESo7B1bycOWnomktPilN+8jZHyeKJbyHEjGHvetj7qrhKiQesgUx53aRStzIg3zQYI0u3y54w6wYtSB6u4LV9L6+m/dvuKT091mgg/Oi2bn/Wmmzg/Mjo23gaH7aNCiIvAu/JaYa945ZJhvIi+XIr1P0nIRZVA+3SByznwy5fxugfd+gKL3w38TBPwAmeyUnvUYHU3YUl9kXTydOO0zhIJRG190bFHgfQ5rANuOIIG4xgmLlymNmwICG8aC8tjuGZZ9VcXUL6CkPJ9PxApq3hII93fdFu8acMYXimDvnZanEgDVbEEszaxfi0K6tHCKqW+IDBog5xWNHY8A24gKbNkC7BrcSj0SNqSss40J6AH3Fb7cjjpZyUy+MJOtgqvviGdaBY7lAIKN+xQJChYGuPATacCE6eZ1m/jcAcJyGNI3+yhVDIQPNaIa0L1HNpe1e59gmAKQAjnoLFikbCgQOZJTwoHzmBfdYVSXoDNfr9yeAAzmgDnbP4OMvCqi4yTrykotlMQlYpwLTzFiZqUGmE16XjnCPwAKNGYEdmL+l8fpYhOJfoy/zfDgjg9N29LeUFVcXJ/AeOPKUqzx7QYDQlMhhuyvzfbmJ8AaEogFgYshSKIuYHfPy9EYPgYtvlyT5zUcLqk5Zv+SUK/K7AYrxoZn+Erj2dMyGKM5KaUbnjxLral6rtObYY3TDQy6HX2oAct/89x8mBQqKaM+AxvPbSJeEp4ZX8TDz4g1Es/mujl0B9yHq1WDDgLTpiFtc/WlFYYbeUo6HASCSwA/vNlAgnTwPMs4fA6icr0x9rCW8iFmrPmDL8LrhTAkWCeNI/VNI3/hGPbkDyo3uWgCssRjAOThPpYOZLE4KRd8bMeyacjTlCa0R4HJ0CuLRZasUOruOSPZx8o1Yuw59HQbhC4hOehkgVBLNRkj6Y79yb0d9beYGFOI/OdjMJQtoxz1HhZeTtlQzjhKweUVwigb50554kBIxKfiRzdvGjvoQSJOBvvCR8wFTH5MqO6v9jKcDpZAR8K5JYjRSJNoW2nQHAxGl+2IJkjBkuGBHN1MxFCAHapvCUEVE80XGVYCFPWbgYvZCOit0hApFTI83i1fWj1hjlU3azFwitnWAt/yLm0sMR5ScMVTZS1H6wIGFZwJbRm9ndRbtIQuIhjjLVouBBguX2t/zNE9oDaIkXrErIjKVAWJb3/Ib0tgpsX8Jszc+YXlSfWX0bsmyZIHUqHhKQEiYNWsPnlv8Ch/sgEBTALXgo8CZHttaP0hcFufGUm6SOt2lrYqYiDykeCrEmMa+gm+lcdHezdjgTAT8Cg5L8zAMhLRWBrgCfl2F1GX7xFi3BuEGCRzNNshv9JSmEaUya4ddcfscKSipZRtu/hAiO3krvcin4Bu1MhN/0/0IbVJYIdEmXBgEev/ID8rCJ+9vffROLU9mAwSNSajTHzcgup97M2ACycFeBE5cY+qnhBQvL32t096ZP1kMd/SPP4+Z/4VRb7XcezXF/kxWAM7i0sDtE0XFCXo8u2pnbJ1a/5EMpsAtYs/y8y0ml4vs4BwLj/FnB6AH0qrrZjRz+Tl82LYPlzoh4Au/swRq6eZro7wZXQvKA2johUVsOmrrKmVeeZkerbW1dkdmDVlvrQLDQaCBVIKuTS3N+czYX6bEG3j3pYhd9QWE9Qh68UcGmGV9qFpTA7GjdL5Fvm+PpAguMKtuZyn8kQS74emyQs9XGBRiwjTG/IG04s7yJgdfq3h8JsV3KEaxlDHv5xUUq2Z9VE/sdapeq3EdeG13k7DHbizBjpaZIqS+1FEy62x3E9yxadanue1pxH9p9h5pphY/8f2xpa9ieFsVN57plrb5JjeJPJcc4oYsnn3rwpqazOsmKB60AT2dYO32gYS+g2k0lrssEGQDWziAV/Fkc0euJkoRXhwwpKH3SGPytB4UU3UnvYwNZ8OqhFOOZQSn+dCK5BiKBWSeDVqH0jNf2w0rNCTMcRXTBFfoc/HD0LgvPO3qYPujmqN3d7hOaaQJY9dWj6RHdl0nZNzsSz9/RBFLOtnGfIo0BHxMkBP4melLuErC6Ei3QZe7ZxJKQa2K6rjGyuQiEmPw6cKEKO78X2Jm2YCNiGvCMoU8jAeR78cRhSuYSg3Ks1jsZEtiPTjtxDxas596iQB8+0+V8Bd5KGt1UTA2tMrSS6IPWyH7iauAHX0VahuODjmuC8bkphPhl233kB8n12u02EdMSc6HBY+s7mHqi7gO0MrqBWFxrvfdw4eRMhjkZ2MoFz/zKuagQJkfdYxeUO/EMlwlzp0iUBJ7q3duIj8F1cLuW7CTpNjW7JuEGEvvsuxWTraF5S1SjJm0pYx4WyzljdTsunkMK+5hghlb8bqyMADsIPh4Ip7CDSDzICHYr9zO4jwxp70lgAkjp+exPyDbYHe5lubSEQcXIS3ksmRPgfo8aCBNW3vd3pqDSNyDcpYDTo1gBPLuPwTtO+sBw/pjnRWKU4mGzx0qWaCbG/gpIfiDZpK5wOYKpvvI/ALV1nHtpkLsa/+OkgkTCP4w/tyrr3qy68EVG2kEMUdtSk4DoqFBJ9Ptw8LSxH7uH+GB9SaiOQlfc1gOCfu5kmE3DLt9jS0/Phg00O8MgU6DtqyqMZ/5AdL+bNqsu1mO6J1gDWR/jPqtqtD8dtI7bO3bhtzci+UG9YS5CX/oAlCGhGAxIUQyNfMGs0/SYBtMIlpnnFTQIlykhdPMnMffZ9SMs5Nv/6IYLac84OZbDjfMdFJV6w7MB29F78jvLZ5tOjIEW639OzKn2yEZenyeCv2qiXTeXA+SuKdno9lsWRVe+lFyCchoWgaMNIzb9YgyvwERw8nW0C7Ph4PZ+PKCJxd7DZCldGV5T7dXmaLyH/CIg1AwrO6xUYZEZeesGkxrxvPev2s7uMMxPE6S710gn3U8NvJN6KY/e2Z8y7AwEZd4BUPCip/sZwJ9W/WPDan72W1u4cMq36Kf020DwI5OGQkxjT35HV6Bok7UGUiD2MpXxyVnl1CFgKUgcSbd282tAsU01D6EwmmynWL+NtO8Kg7sxGFedEGxYc0GNxvop9zLvULtVlvIH5F0KmmtX/YcdqLaYoiMYXT+A1oXN9K2Eam5z/2Z/g8Jy6l6WeoYWN5IFHa3wNbO2eYGvMdAuqyt77HzM4UI8LgzbocxPUgvwiCorkQD/FVlGu6AA8o6it/T9R0yBLVCj0OKRlhccSc2kTJOjm2/pb3wHq/HdrNvKDYccadYnrvTgslQKmS1RVitd8wDnhqDcvGSHmDZwa0bCd2eEkjxBonpwikKDJ/S5ChnwFOYgN79qPwHGVK2xEt5/oJiCDJFNAl/xwBoL8Y58tHL9UQ/yTr7Eanh4jRl3iz8c3+V25D+jsHXdOjMXHQ5OzYjDfgd5sWW3gDz4x9eDkEdKwPQSuP3JxObjZsHmei3NWSQkKs/BHqU6tIWo/eqbLMI85qfYoiw/mp3mFpJ9N72CBz/BWsXj7uIdWHlmBHfUwjtKaE9Ni1AvtxYjjMlNtCllJ9mChXXSBzX9M2ZIyX2b2mcUTJC55xjU09C2Em0N8RWckQLsP6j1Hix09nM8DAGsI+3iOMEqkg1pzcAteU+++WL/Lz/mq1ilWl5oYjY5yw5NAZD9w++kfsD9bDKVMzqI3Yyr4JEHPXuxS4Xg5nNrg8crech8UKauyUeBJcYhI9BJI7mIfxX1hJDOglSUOUTj3UstohFTebmLl7jWaCwSFccErDP4qP7cZX4ulAtuqh9w0cPccZoUOu8xKR7wexjv3p3PsXU1TnqoU5GeCD17GzSbKTVzObXLo4MT2SF10v0OUWBm1O0krkA5wbHUnRgKmhJzlT1Rg4y0qwJhcamv2FOq1R/CcBJaCqKJiWNaxAL0Wum8oFipPEfeWGhFfFbLhQ80oMwKu6P2W4NP5jnsnIW+5or9wsR3cQr9+YWfFitkyKJaoq1bLD3xrPEwzlh4ItS/khCzewDhOimfIVesqbBon4Qz8lj3oauGdqwFRMzadCJqb8r3ryfwsau7CXtNB5VqEjB+9DYKW+XR1zU06MJR86EGhgrBsKflXivp/JNNMJ/zNskNF89jVWdRKQ22KX7W2q49cIvhUkXnYgEiykeUHmvrUGKOYvLybi23OgQyhj65C5TgzqrkFFb9FJNZ00hY1dMOYwBJuYgNGbjFzIQ6Y15dQlbNIRzV4g7164zr9rEV1FzyBZB3B983Cdk0rMSUIfhBZjiAFzwyLGU+OXYD5KcgrB9utEkH8bk500ySZhv8wAGAdnY3DMyDXNqAeKcSxeagQLH71MOFffPn4t/MPfoDE8qopYFt7V/+LwbUkRxJcHM9GbwDGLzUmy2Knu6vF4EgMEfJzA/t/p9iUHUweORitGlgRw1qHwcCsD92NLRfp4EuzqSSV1A+4T43geVh4cb55wdm9F7oi/ojEKy1hTSuQGY8UYOY39/Tw3B5Ie1eTUTx/F/SMlOd9MXMjGbcgc5LbXGHkN2k9ENjxl8bDI3jgRV0cSWiLyStluKFWQPNQCFIDEy0o4w8DHS+F5fKYVCXK15OZlsSo3ntOWzM4bXygzCcVbOCta+w658U+hJzwN4Qsu6DgDFumEBi9VWRA29CT1kwDm5Tf6SApXChwYHGFZUffX2OOpeDlCeTYvDNBafVfY+4qi1n428kNuoVinf4w9X9VicUQdodp9jc0IYYGFCzlwSLqUk7lJ7nsqne0OyiVGnxpffKOryNYZsmbFXNGGBweWNMH23AWeomeiDnRUPRAG+PyxZ1HhxXn0MDPVJvA/2MSoucK/TF9Pn4G53W1sqGqsLNHxKLvuQU2SHGTx+K2b57Ysv7e7eVUv9nZMJ8GIJTop0VhknHlncIW9U/y9OpQdgtOPCyH12zECryOOP5W11eyXjON1Bp3j0muuSPMkGmJ+2FOZRKvPgNSMziY/S54+PviKWiBHkf1d5srf3+7oAVT3TLCW7sXZE7yVXwGwtvHsBuhBwNqIOGPnKLfMn8mUcp2wH3+y6JV5c/nSrMdtN7JlJnexVDDBmjXMfKDMzZ7XcIkldZ2a8c4zVtuAoZqW4EJcNqFsrd4ZCOhcO/fIJE1wRPtpNQ/vVgrRyimke9uHDMmB72MQmBSjIi0ASL+bzVcCdHWgT+XkUWq1r5pamdBGoFlSiAsGLZc3W1jmzVqoCYKJCmYf1s0DKyjmkuZ/5XQ1Ecjn2m+uFJqM3+0TS8ako4ktjY0cmHaumwRH3WJv6HRAmjqwFggTmebt2GcrVxdMuxzEw+/cMxn2bFoh5G7q4yEdX4pbH0LBDHgdtMN4+eP6wsTusq4h+WHQpdJqh5NZSb0F045E36rm8PW0lyXd4Wp9mTFT/+b+1wI3PrXrPEbvBJlhj/wVuysu9M5B+koWl8WuoHYeXWjHsaRAQAak1Dnb3s1Le30x6hMtBQMlrxC00QA3QqH5Qdnx5K5El1yrKxN2X5rkjujcUxgVmwzON1V9UuyB4Yl+G8VECm/3fQQ8/o45FLiE4aC76g6rzD4g7IGL4CI7SfD2Nh0EXgHZUV3ssDs4yTqz1i75pgfd9Xk3pwO8TctqQA0Ypg8+uVfuA6ylsfon7WbGKtgMv83eEL0q6uI8Z1Tg+x/MI4vBHdUb/taJ3a7J9ijI5tCOcF7wE3y45rNVEN4hgujgDdF7+uSo8EvyV5JyPgdUaQWLewYIM1ELDIPrU7FJfofq3PbUQychXO07JCGwnIMT67C97wS0YBZ8jyfQNcx8Fm987faHANDaQYdpg2v/85+ipz8Pxbl8WkMT+26oNVUlGW1FmVVETZjbTInpiYACG4U6vMHGgvDj0CaBGDyApVr4Rzp9Cmn3Fj6ee2KeFkr+/hgHsc7zYzsuqCj/CT8TCLaF5Ol3EaDU0iQsJw2t/1HJt2yypj98goEmLgM9AIp0y5O4DqMVqJPUsqOgs52QCVodCkzhvK/EF3iVO2gK/qo+ROIOIuM6OzEonhp47Lm0EH2rsdNwgc1u2SyNfc4JYYmLxlGKsmba8f6x0Gab0EkcxQGxn3XlnyAF99WcK4xUeSNQRDtIV7se6CvOjPpmdIagIWzI3cmWYn8k+lBqSk4JpNBRiy55LRWqDZZo+265O0l0oTnWoqRIapuoUHW453FS0Tc04NAf4rfEM3P2RyuEX/+t/1V8uu5sqB3hu1mOCvS69nAVf807dhm2Nb4tISK2h97FyFI7bgvwIv2xTFriZ0lyeSC6zLNyk2CgI9fGKd7r7ZAlh/IUXUJD2y9yDkgcEmvXzCaQbwvwrsiwsz9M+5mqn/P5EYZS7Kdby1r4GJ82VapyNmD7pg0j1ZU4ujRSreah1oZYmiTVen5c1RZhZAuSoYlk+qF+0tHaZyLZ21WlE89b9J2Iyo4NKE9LCyhZmbsORquGo0cgX4HyV2Q3pR1kKLNKHWBt4ovdMt6dNvOg66L53EPB14MorSR3T0tsJ/bvMM+la/l4k23LztfdxzQeDb2p1e/OEug1d7NdJ6TOalXqfR04rdr/kdnu59bOqOLaznH/ya0EBO5LiIuTRoZTmaK8B5pv0RvhZ6mtlyhHs25VYMMfsUNlruTiLVgZndvvBHNuJUzYcjGORKvtad+gmxBq9WxuGzCZndPvvQa/xVv8af/MHWgYnr0LSsh6ODLuj7L8YegB+K+4VVuKgrs3uWx6Qy09GQ9yaQIvWCPqsNU/6XSOEN5VmQHtL+TqFr05B/lHyp1hSHZjkQIea9oTXXLRGpr9w1yYuUdjEFXNrdy3THS0+DwbHZ1y7RX7k76kaNvC06IAi2QM/m6rYAn5SqeM9HvvSQylV3fjl8syZN0CiINkSqGa5c/OvwDrGZ/jeZTtWxZ6qeALuW2P8aQtpyOkyU1jz2u5Et4SEr8aPWmJe8PCZugh/B2Ddoq1dvs+s29plS12S/HXt5YHj+RsBeK8uCXE0Wsq69RDnHrR0H/9FJYXW9eAEJADm1pATU/81wbjfQcH1a/qu88h9Cevv2f9OIXjH35l+OPFuA1Mn1M/vTvs0ZChjOwPSJOVnCUGmurMhasC2wtSrVeilpehR854HQBZJ8gm9XgG4PTNmqmcX/bkfUXffUVo0EbKpuVN0XoqOLe6o3w0bn7JoqkAd+LNdCE22Pb+V1aQGiI1/cezPvO2B6pOai9iw2XP2JZQ6XDbMX2Qt5PdgSNaOv0SZkY/yZVoCS9P3Ff4qpCupmG5izzAdSEUyqj0Pu8HRTiENAkLclHzzVRYoqHfg4VuvcKIfbzcf3WHfYVdqT/Yv1RfR41POJwauGy9jGm66c2FqzJ/vbdcWpaM8GRjBZMpjboj7gdhJ713U+/IQq8SjtrqL+7ue20WrMKfSUaBc0J4eri+XuWdTP5x6vFKAHd19hJHPMJEgBgnmxdRJB5sCkqJG7pq+gC+yYVPxQzsPpfzDlPkhY7iBzfriohk2S+jDODM0Sy7IhOjUMfU4rTCRmLi1myGP3XVX/D90M/VLIS8ocsTukvFFXAq3/HgwGWSaFBX8lTwdGiZi2EiIB48weLWWZOiR3S9SlahKxNr14+2GX/SWfegS+XvHFiQhE4xgPctSqQ/H2zVPRxfBLr8KO6rD0Myv8f3wmGe5FbhkKbPuTEGFVlwzYr2iPiLb9FQFXK1sh3uHcTtPG4Eq2YkYg2lc7KE9Dljuzu1VXWPpdKNV1fav/eEt+Bhq4bGgTeOYjKUUiZ8BuXqjtS6sWYe6WSaqb6LE3gjaHyGOijCroQbkmwdseFf4KT8NLbvAUkWGkouKQgp/Gee/vGpf3mQOEyuIiVHczThAWv2HgEfm2ugqhutRFrLPx9zVR6k05WTYuFMZm8PBiShB42rGUEQyiZHOMYFVg45dGDbPKn0t2T8tItFK1DK43ZSvtlPOpLoijTenEwb9Zfrl32LlPF2MKAm35Fnf90qDRkXmkwNZRYmaILN8IrP0utx2qanm72QRz7+OSPCG1sC6TC/RsxZy9c5NuSMN40CetlJhW4jTpN271C5PcyEGYyc2xQtPQktId5SKHWB1BSpAdmb/BMZjaniGYMVPQHYTdrjOZt3TrmRvnfJ3lkO0l5OgqlY7/JQ11XkR+X7R5dCNJ6jjGbF8bv4n2m1rOyIhVmhmr1sxvZXJvKOLp3MadjL6lRu4iaJGVQai6fTexmPxsiM+jRh5nXq+Vw8NJjtJteKuXjgGZGLfqn9DvVTRePeVZxSzaaBxTnfBg1OyEo2XDsYmWDjOiBzlexxPK9Jy4Upvqr7OysADgBnBuATOgpVcz06J85nDVUQzvohWhN6GSlZ4KNmbjaiyfxXudfK2AO4Snsd8q8rZ6pLOTMsz0PqpSQtEQA/tDh0e2oA+mmdrUXgtma8pwXw6xRx6bQBH4Z3tZ7gOZuceBQ+4qa7h29CFZWMRebGzMe1XTU9h882vzmBzimJwKjlfjpUIqOjBz8akHp5aUlAv6zbEDnAxxgsEomvPLVOFZNQLzulFqbTXbkURj2Rt9oz7oZ1Z7zPpfxrGJgu7ke0d7JItI/r7cInBwOFolocvblukoqxSOXYXh2IIgL2C7uuwHSTRNVK07gDLQvGVMUhdOOJJsl60dcvmNfRpSxjbisa1LqPzQbJKjYTlLo/PSUh6fjz7+sFCcwReoprKW7i+gssXlg78Tcc0kHsjSk0a3yjBWw1yOumk0fuEeqL6h8qolwsGVEBHOYHO3g9M4ACfSOsoyMjEagt3rdEKsecSECAuYm4liGAauf+qWOxXSFYKW4VlZXBUfgqFB4asAs3wvt0cejzA0oExAGISKJCquBWxe2R5B/NY/El8jMvnJzZuvM4Ci6mx1b0FB4HcWhafibQhSxVRy84oGzEDxc8nlYWQE28Sh9Vz3lV90V4nwXoLFYvekhg8MnSSp8DHl8Nta7Q1UUBxPfEuwkvCsPViD+2cnPqhJtFvIWdk/F/EPzTEGC/Otar1NQ9fmvMEjlE5W08wV0i2KBao5M7KORbdkaXqrf97JV6SzSZf4sgD474Mi10MjxrWl+XtjneqPXxeqwOYt5t9qRGWmWsyolNo0fI06lEW9IhLRvZMAQtruthvCk2f989rqRX5JY9jnp75r5ZvCfJLTr6tuiPfJjlWJmMXzg+juDkiIxisNTATZ4n33tPgSt010soUOnphIlJOjMTUvh5RWkhypIVTr6ITZCduqySQlIbq+AaTf6YgMHFAZLR/QgJf5ftPhcZuxYUfueOfGzcUkaqCXWCcaqNUm+JwUo19U01Fv6jGcXgasplzZ9IAJB009bSlYtDkBwCu5BGQrqK6nRKJSlNo9y5CR5dbPlmDuJ8ISfYeA8yhfrBJrwv4XmQSUXacCtvjdeeuw97auJcyXQaMjK5t7tnXLo6SGV03Gur","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"fe7b61d8d1f3a4d9d1ed750a4cd1f015e613dbba","last_commit_update":"2026-05-27T16:00:38.1409279+08:00","gmt_create":"2026-05-27T15:32:45.7755498+08:00","gmt_modified":"2026-05-27T16:00:38.1409279+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"main\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.2.3\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"333405ee9924108619cd8443f735d754","path":"internal/router/router.go","line_range":"16-52","gmt_create":"2026-05-27T18:35:29.892946+08:00","gmt_modified":"2026-05-27T18:35:29.892946+08:00"},{"id":"6eda76d6eb6015250ec186fdafd0b3c9","path":"cmd/server/main.go","line_range":"59-70","gmt_create":"2026-05-27T18:35:29.8934805+08:00","gmt_modified":"2026-05-27T18:35:29.8934805+08:00"},{"id":"553e943cfb2f6b7752122999084a80a5","path":"internal/cache/brand_cache.go","line_range":"18-44","gmt_create":"2026-05-27T18:35:29.8940514+08:00","gmt_modified":"2026-05-27T18:35:29.8940514+08:00"},{"id":"d7c4ecf9c38df06865431d0dcd796162","path":"internal/cache/model_cache.go","line_range":"19-69","gmt_create":"2026-05-27T18:35:29.8940514+08:00","gmt_modified":"2026-05-27T18:35:29.8940514+08:00"},{"id":"5ec84f3864f3fa2c3ab1d97fe69d5529","path":"internal/repository/brand.go","line_range":"14-52","gmt_create":"2026-05-27T18:35:29.8940514+08:00","gmt_modified":"2026-05-27T18:35:29.8940514+08:00"},{"id":"468dd8105671ed478ff86ca97c0609ba","path":"internal/repository/model.go","line_range":"14-79","gmt_create":"2026-05-27T18:35:29.8946006+08:00","gmt_modified":"2026-05-27T18:35:29.8946006+08:00"},{"id":"a0b3e000a5b789bf08d2d996fc17d8df","path":"cmd/server/main.go","line_range":"25-101","gmt_create":"2026-05-27T18:35:29.895175+08:00","gmt_modified":"2026-05-27T18:35:29.895175+08:00"},{"id":"111557d31227afead72d0f01becea3bc","path":"README.md","line_range":"19-123","gmt_create":"2026-05-27T18:35:29.895175+08:00","gmt_modified":"2026-05-27T18:35:29.895175+08:00"},{"id":"5db111a430cac488cabeb543494fb917","path":"internal/response/response.go","line_range":"15-36","gmt_create":"2026-05-27T18:35:29.895702+08:00","gmt_modified":"2026-05-27T18:35:29.895702+08:00"},{"id":"891c848d9153926513b9005f2d61382e","path":"internal/middleware/logger.go","line_range":"10-44","gmt_create":"2026-05-27T18:35:29.8962367+08:00","gmt_modified":"2026-05-27T18:35:29.8962367+08:00"},{"id":"8a6a9ea04bb9b0de8fd0195ca491b154","path":"internal/middleware/request_id.go","line_range":"20-29","gmt_create":"2026-05-27T18:35:29.8962367+08:00","gmt_modified":"2026-05-27T18:35:29.8962367+08:00"},{"id":"99d2500a6a0922c50675ed247c6777e5","path":"internal/middleware/cors.go","line_range":"7-19","gmt_create":"2026-05-27T18:35:29.8962367+08:00","gmt_modified":"2026-05-27T18:35:29.8962367+08:00"},{"id":"c86c8f1c951956c0397e6c938ccc641c","path":"internal/router/router.go","line_range":"23-36","gmt_create":"2026-05-27T18:35:29.897306+08:00","gmt_modified":"2026-05-27T18:35:29.897306+08:00"},{"id":"99701e03d9c9476a15f742b82e5adfa5","path":"internal/cache/brand_cache.go","line_range":"13-44","gmt_create":"2026-05-27T18:35:29.8978401+08:00","gmt_modified":"2026-05-27T18:35:29.8978401+08:00"},{"id":"a072f4ebff3b6cc9eaf8025737ca42d3","path":"internal/cache/model_cache.go","line_range":"13-69","gmt_create":"2026-05-27T18:35:29.8978401+08:00","gmt_modified":"2026-05-27T18:35:29.8978401+08:00"},{"id":"d4f94a6e4a0cd46ebc0c5f03e96c6232","path":"internal/router/router.go","line_range":"38-49","gmt_create":"2026-05-27T18:35:29.8983769+08:00","gmt_modified":"2026-05-27T18:35:29.8983769+08:00"},{"id":"0a2840d641ba5dccfff95a35d7317004","path":"README.md","line_range":"83-110","gmt_create":"2026-05-27T18:35:29.8983769+08:00","gmt_modified":"2026-05-27T18:35:29.8983769+08:00"},{"id":"491bd71f42db0fd5bf1d4851b9c4aaa9","path":"internal/handler/health.go","line_range":"14-18","gmt_create":"2026-05-27T18:35:29.8994388+08:00","gmt_modified":"2026-05-27T18:35:29.8994388+08:00"},{"id":"fce5662f14aa6386a5036b5241e00b1c","path":"internal/response/response.go","line_range":"15-21","gmt_create":"2026-05-27T18:35:29.8999721+08:00","gmt_modified":"2026-05-27T18:35:29.8999721+08:00"},{"id":"7e3954c3e70a9252de9cfdec52ed93c8","path":"internal/handler/brand.go","line_range":"25-48","gmt_create":"2026-05-27T18:35:29.8999721+08:00","gmt_modified":"2026-05-27T18:35:29.8999721+08:00"},{"id":"79304ed9558f17f9ecb0dc7d24add547","path":"pkg/encode/base64.go","line_range":"44-51","gmt_create":"2026-05-27T18:35:29.9005171+08:00","gmt_modified":"2026-05-27T18:35:29.9005171+08:00"},{"id":"a6d16b8965ed7f207f19f8f915ad53a4","path":"internal/handler/model.go","line_range":"25-49","gmt_create":"2026-05-27T18:35:29.9005171+08:00","gmt_modified":"2026-05-27T18:35:29.9005171+08:00"},{"id":"fce0c17d6c03e511c3afeaee662ad34f","path":"internal/handler/model_list.go","line_range":"26-56","gmt_create":"2026-05-27T18:35:29.9010627+08:00","gmt_modified":"2026-05-27T18:35:29.9010627+08:00"},{"id":"d4bd0610a0ad3d8fd8d33ac5f4aa83b5","path":"internal/handler/device.go","line_range":"26-84","gmt_create":"2026-05-27T18:35:29.901596+08:00","gmt_modified":"2026-05-27T18:35:29.901596+08:00"},{"id":"1be2a5a025cb64eeb20d5e54d293203f","path":"internal/middleware/logger.go","line_range":"33-43","gmt_create":"2026-05-27T18:35:29.9037303+08:00","gmt_modified":"2026-05-27T18:35:29.9037303+08:00"},{"id":"5f4eb9799d6c811ddcc430f51e299cf6","path":"internal/middleware/request_id.go","line_range":"22-27","gmt_create":"2026-05-27T18:35:29.9037303+08:00","gmt_modified":"2026-05-27T18:35:29.9037303+08:00"},{"id":"be85f7cf4e9dd0c2460475b95efb085d","path":"internal/middleware/cors.go","line_range":"9-12","gmt_create":"2026-05-27T18:35:29.9042675+08:00","gmt_modified":"2026-05-27T18:35:29.9042675+08:00"},{"id":"730d8469648c9599ccbc091a9496d2a1","path":"internal/response/response.go","line_range":"23-36","gmt_create":"2026-05-27T18:35:29.9042675+08:00","gmt_modified":"2026-05-27T18:35:29.9042675+08:00"},{"id":"d48bcd5374602483c104c7d50c7224fb","path":"internal/router/router.go","line_range":"18-21","gmt_create":"2026-05-27T18:35:29.9062656+08:00","gmt_modified":"2026-05-27T18:35:29.9062656+08:00"},{"id":"798bc9e7f1a3902993b3aa9acba73022","path":"internal/middleware/logger.go","line_range":"16","gmt_create":"2026-05-27T18:35:29.9067927+08:00","gmt_modified":"2026-05-27T18:35:29.9067927+08:00"},{"id":"ed43fe99536e371ce908f167a68124f8","path":"internal/middleware/request_id.go","line_range":"28","gmt_create":"2026-05-27T18:35:29.9073213+08:00","gmt_modified":"2026-05-27T18:35:29.9073213+08:00"},{"id":"08c02a0d77d871b6c9650cbfcdf84c94","path":"internal/middleware/cors.go","line_range":"18","gmt_create":"2026-05-27T18:35:29.9073213+08:00","gmt_modified":"2026-05-27T18:35:29.9073213+08:00"},{"id":"e88b0ee062bd02dd7acdf8e2e945b270","path":"cmd/server/main.go","line_range":"103-130","gmt_create":"2026-05-27T18:35:29.9078603+08:00","gmt_modified":"2026-05-27T18:35:29.9078603+08:00"},{"id":"64381887b12f6927d8b0481a55c2dcf1","path":"internal/router/router.go","line_range":"22-25","gmt_create":"2026-05-27T18:35:41.7314752+08:00","gmt_modified":"2026-05-27T18:35:41.7314752+08:00"},{"id":"1503a99bb2f2ab96e4a3a830d8834e45","path":"internal/handler/brand.go","line_range":"19-24","gmt_create":"2026-05-27T18:35:41.7314752+08:00","gmt_modified":"2026-05-27T18:35:41.7314752+08:00"},{"id":"f74cdc773e62a1a9f5a4bf940b5961e3","path":"internal/handler/model.go","line_range":"19-24","gmt_create":"2026-05-27T18:35:41.7320175+08:00","gmt_modified":"2026-05-27T18:35:41.7320175+08:00"},{"id":"8b0db394a538b6652de2e6634277ad0f","path":"internal/repository/brand.go","line_range":"14-21","gmt_create":"2026-05-27T18:35:41.7320175+08:00","gmt_modified":"2026-05-27T18:35:41.7320175+08:00"},{"id":"03f26c7c55e18e6266ea8e543a032229","path":"internal/repository/model.go","line_range":"14-21","gmt_create":"2026-05-27T18:35:41.7325394+08:00","gmt_modified":"2026-05-27T18:35:41.7325394+08:00"},{"id":"8fab617bba600779abac7805723180a0","path":"internal/cache/brand_cache.go","line_range":"18-24","gmt_create":"2026-05-27T18:35:41.7325394+08:00","gmt_modified":"2026-05-27T18:35:41.7325394+08:00"},{"id":"006d91f2f5f75fd7cd586165c200ba98","path":"internal/cache/model_cache.go","line_range":"19-25","gmt_create":"2026-05-27T18:35:41.7325394+08:00","gmt_modified":"2026-05-27T18:35:41.7325394+08:00"},{"id":"509525e0463c03c509709a6bd1765d4f","path":"internal/cache/redis.go","line_range":"10-16","gmt_create":"2026-05-27T18:35:41.7330685+08:00","gmt_modified":"2026-05-27T18:35:41.7330685+08:00"},{"id":"57b8aed283762226a00482b42a8acf5b","path":"internal/database/mysql.go","line_range":"14-46","gmt_create":"2026-05-27T18:35:41.7330685+08:00","gmt_modified":"2026-05-27T18:35:41.7330685+08:00"},{"id":"4ab082407b96e18f67a65d07eb4a331d","path":"internal/config/database.go","line_range":"17-40","gmt_create":"2026-05-27T18:35:41.7330685+08:00","gmt_modified":"2026-05-27T18:35:41.7330685+08:00"},{"id":"fd2a12d243b52512003ae067f53a7548","path":"internal/config/redis.go","line_range":"9-57","gmt_create":"2026-05-27T18:35:41.7335924+08:00","gmt_modified":"2026-05-27T18:35:41.7335924+08:00"},{"id":"61d69bf4d3c8c548eecfd677394486d6","path":"internal/config/config.go","line_range":"18-52","gmt_create":"2026-05-27T18:35:41.7335924+08:00","gmt_modified":"2026-05-27T18:35:41.7335924+08:00"},{"id":"e87c932ace50951cb91aa66877ad6f81","path":"sql/model.sql","line_range":"24-35","gmt_create":"2026-05-27T18:35:41.7341274+08:00","gmt_modified":"2026-05-27T18:35:41.7341274+08:00"},{"id":"90226e287e9b66f5a36ba2316d7a7cd7","path":"internal/router/router.go","line_range":"14-41","gmt_create":"2026-05-27T18:35:41.7341274+08:00","gmt_modified":"2026-05-27T18:35:41.7341274+08:00"},{"id":"9918f39149aaf1f5c3ec03275d6e3673","path":"internal/repository/brand.go","line_range":"23-52","gmt_create":"2026-05-27T18:35:41.7373036+08:00","gmt_modified":"2026-05-27T18:35:41.7373036+08:00"},{"id":"a19fb2ac137e43d92d2ef93e8d79f0a7","path":"internal/repository/model.go","line_range":"23-79","gmt_create":"2026-05-27T18:35:41.7378291+08:00","gmt_modified":"2026-05-27T18:35:41.7378291+08:00"},{"id":"72322f320f907b6eec72e885e30759eb","path":"internal/cache/brand_cache.go","line_range":"26-44","gmt_create":"2026-05-27T18:35:41.7385763+08:00","gmt_modified":"2026-05-27T18:35:41.7385763+08:00"},{"id":"d0f658c42abae9b6dc0baaa8fc7d0694","path":"internal/cache/model_cache.go","line_range":"31-69","gmt_create":"2026-05-27T18:35:41.7385763+08:00","gmt_modified":"2026-05-27T18:35:41.7385763+08:00"},{"id":"a952e5d5b625754a2e9249983bb8abaa","path":"internal/config/database.go","line_range":"17-72","gmt_create":"2026-05-27T18:35:41.7391229+08:00","gmt_modified":"2026-05-27T18:35:41.7391229+08:00"},{"id":"f7af3a1998c24f922aa650a69b252734","path":"internal/config/redis.go","line_range":"16-57","gmt_create":"2026-05-27T18:35:41.739651+08:00","gmt_modified":"2026-05-27T18:35:41.739651+08:00"},{"id":"c7bf654a5faf00b02953d2e56747a669","path":"internal/database/mysql.go","line_range":"28-43","gmt_create":"2026-05-27T18:35:41.7417727+08:00","gmt_modified":"2026-05-27T18:35:41.7417727+08:00"},{"id":"1d3714bd55d5d3f773f1ab7fdb8c9b53","path":"internal/model/brand.go","line_range":"3-6","gmt_create":"2026-05-27T18:35:41.7422949+08:00","gmt_modified":"2026-05-27T18:35:41.7422949+08:00"},{"id":"8d92ac14c6257462a15eb6990dd44596","path":"internal/model/model.go","line_range":"5-14","gmt_create":"2026-05-27T18:35:41.7439044+08:00","gmt_modified":"2026-05-27T18:35:41.7439044+08:00"},{"id":"8b134235408cf40b9d6351d54591b3c4","path":"sql/model.sql","line_range":"34","gmt_create":"2026-05-27T18:35:41.7449566+08:00","gmt_modified":"2026-05-27T18:35:41.7449566+08:00"},{"id":"62d02336da9111eec3c5696aabf71927","path":"internal/cache/brand_cache.go","line_range":"13-16","gmt_create":"2026-05-27T18:35:41.746537+08:00","gmt_modified":"2026-05-27T18:35:41.746537+08:00"},{"id":"a60ecb63d9ab3bda0c5042f26916def3","path":"internal/cache/model_cache.go","line_range":"13-16","gmt_create":"2026-05-27T18:35:41.7475474+08:00","gmt_modified":"2026-05-27T18:35:41.7475474+08:00"},{"id":"5859dc43ab95b589fc2cada49ab59a86","path":"go.mod","line_range":"5-11","gmt_create":"2026-05-27T18:35:41.7475474+08:00","gmt_modified":"2026-05-27T18:35:41.7475474+08:00"},{"id":"dcc3acd0529002f62657a37922318e37","path":"cmd/server/main.go","line_range":"25-69","gmt_create":"2026-05-27T18:35:41.7475474+08:00","gmt_modified":"2026-05-27T18:35:41.7475474+08:00"},{"id":"99ead368ce42f1081e05c800c65b176f","path":"internal/database/mysql.go","line_range":"33-43","gmt_create":"2026-05-27T18:35:41.7539267+08:00","gmt_modified":"2026-05-27T18:35:41.7539267+08:00"},{"id":"a5fb1691af5646ea8b4306ae97288e36","path":"internal/handler/health.go","line_range":"10","gmt_create":"2026-05-27T18:35:49.7681131+08:00","gmt_modified":"2026-05-27T18:35:49.7681131+08:00"},{"id":"de87fa33e6add38c027478dd3d0cebda","path":"internal/handler/brand.go","line_range":"18","gmt_create":"2026-05-27T18:35:49.7681131+08:00","gmt_modified":"2026-05-27T18:35:49.7681131+08:00"},{"id":"09427d743a4be750f874418ab3e8504d","path":"internal/handler/model.go","line_range":"18","gmt_create":"2026-05-27T18:35:49.76864+08:00","gmt_modified":"2026-05-27T18:35:49.76864+08:00"},{"id":"9ebb4688793526b520ec263ebf651be7","path":"internal/handler/model_list.go","line_range":"19","gmt_create":"2026-05-27T18:35:49.76864+08:00","gmt_modified":"2026-05-27T18:35:49.76864+08:00"},{"id":"5e813130e7885527f77be92dbbaee9b6","path":"internal/handler/device.go","line_range":"19","gmt_create":"2026-05-27T18:35:49.769172+08:00","gmt_modified":"2026-05-27T18:35:49.769172+08:00"},{"id":"1992aa29a2869c31fe69ac701541c6ff","path":"internal/handler/health.go","line_range":"8-19","gmt_create":"2026-05-27T18:35:49.7696957+08:00","gmt_modified":"2026-05-27T18:35:49.7696957+08:00"},{"id":"692a2c6d49d4eb62f58600908dff9f60","path":"internal/handler/brand.go","line_range":"13-23","gmt_create":"2026-05-27T18:35:49.7696957+08:00","gmt_modified":"2026-05-27T18:35:49.7696957+08:00"},{"id":"c9df5e7b8533af65ce97cf085b6589a9","path":"internal/handler/model.go","line_range":"13-23","gmt_create":"2026-05-27T18:35:49.7702757+08:00","gmt_modified":"2026-05-27T18:35:49.7702757+08:00"},{"id":"d2fd0586bf019047d2adbcdf90e09224","path":"internal/handler/model_list.go","line_range":"14-24","gmt_create":"2026-05-27T18:35:49.7702757+08:00","gmt_modified":"2026-05-27T18:35:49.7702757+08:00"},{"id":"bf1f0d1dece713e866e4a46be7784473","path":"internal/handler/device.go","line_range":"14-24","gmt_create":"2026-05-27T18:35:49.7708+08:00","gmt_modified":"2026-05-27T18:35:49.7708+08:00"},{"id":"c600af69dac497c7cf059a4bb2f033fc","path":"internal/router/router.go","line_range":"32-36","gmt_create":"2026-05-27T18:35:49.7708+08:00","gmt_modified":"2026-05-27T18:35:49.7708+08:00"},{"id":"bc6f53b403231c0f908654d3fea2102a","path":"internal/handler/brand.go","line_range":"29","gmt_create":"2026-05-27T18:35:49.7708+08:00","gmt_modified":"2026-05-27T18:35:49.7708+08:00"},{"id":"7b39881baafeaea08adce31120b7c1e1","path":"internal/handler/model.go","line_range":"30","gmt_create":"2026-05-27T18:35:49.7713218+08:00","gmt_modified":"2026-05-27T18:35:49.7713218+08:00"},{"id":"dbe385204072d26c84bf169842961690","path":"internal/handler/model_list.go","line_range":"37","gmt_create":"2026-05-27T18:35:49.7713218+08:00","gmt_modified":"2026-05-27T18:35:49.7713218+08:00"},{"id":"2a723ed48cd9855068a04da6a33cb5e4","path":"internal/handler/device.go","line_range":"71","gmt_create":"2026-05-27T18:35:49.7718468+08:00","gmt_modified":"2026-05-27T18:35:49.7718468+08:00"},{"id":"d72b0eafdb65d1d946060cf944359251","path":"internal/search/meilisearch.go","line_range":"22-45","gmt_create":"2026-05-27T18:35:49.7723711+08:00","gmt_modified":"2026-05-27T18:35:49.7723711+08:00"},{"id":"1eb8f107de13e2ad7eaed3bd6cf20a3a","path":"internal/router/router.go","line_range":"40","gmt_create":"2026-05-27T18:35:49.7728957+08:00","gmt_modified":"2026-05-27T18:35:49.7728957+08:00"},{"id":"72195f4e7a76b584cbdfbaba23db2a1a","path":"internal/model/brand.go","line_range":"3-7","gmt_create":"2026-05-27T18:35:49.7739534+08:00","gmt_modified":"2026-05-27T18:35:49.7739534+08:00"},{"id":"3e3a148f4095f6d36c64b1cfb3d1702a","path":"internal/handler/brand.go","line_range":"13-48","gmt_create":"2026-05-27T18:35:49.7739534+08:00","gmt_modified":"2026-05-27T18:35:49.7739534+08:00"},{"id":"3c27d9274287839faa5269c34b98b6a9","path":"internal/model/model.go","line_range":"5-15","gmt_create":"2026-05-27T18:35:49.7755123+08:00","gmt_modified":"2026-05-27T18:35:49.7755123+08:00"},{"id":"e0ca219542426b9141a89063f7052b0c","path":"internal/handler/model.go","line_range":"13-49","gmt_create":"2026-05-27T18:35:49.7755123+08:00","gmt_modified":"2026-05-27T18:35:49.7755123+08:00"},{"id":"270fee7aef8f38c42409050388865f6d","path":"pkg/encode/base64.go","line_range":"35-51","gmt_create":"2026-05-27T18:35:49.7765552+08:00","gmt_modified":"2026-05-27T18:35:49.7765552+08:00"},{"id":"8cf065ea198e4e0d88af1863fcd6ac11","path":"internal/handler/model_list.go","line_range":"14-57","gmt_create":"2026-05-27T18:35:49.7770826+08:00","gmt_modified":"2026-05-27T18:35:49.7770826+08:00"},{"id":"b62090b5a8fe0cd95b332a46bb8eac3c","path":"internal/handler/device.go","line_range":"14-85","gmt_create":"2026-05-27T18:35:49.7775979+08:00","gmt_modified":"2026-05-27T18:35:49.7775979+08:00"},{"id":"3f830fae511ccf076a0f04192c9b4cbe","path":"cmd/server/main.go","line_range":"53-69","gmt_create":"2026-05-27T18:35:49.7775979+08:00","gmt_modified":"2026-05-27T18:35:49.7775979+08:00"},{"id":"d0f6f695e8187267487ad6b6fb8559b0","path":"internal/router/router.go","line_range":"16-36","gmt_create":"2026-05-27T18:35:49.7781224+08:00","gmt_modified":"2026-05-27T18:35:49.7781224+08:00"},{"id":"1b6991f54b135de9969d4b357dcce8e4","path":"cmd/server/main.go","line_range":"67-70","gmt_create":"2026-05-27T18:35:49.7791807+08:00","gmt_modified":"2026-05-27T18:35:49.7791807+08:00"},{"id":"86ac1fc7361002fc5d2c9f7b9b1ea754","path":"internal/router/router.go","line_range":"27-36","gmt_create":"2026-05-27T18:35:49.7797069+08:00","gmt_modified":"2026-05-27T18:35:49.7797069+08:00"},{"id":"bdfbf7d6f851540dee549606f7aca9d4","path":"internal/repository/brand.go","line_range":"19","gmt_create":"2026-05-27T18:35:49.7808022+08:00","gmt_modified":"2026-05-27T18:35:49.7808022+08:00"},{"id":"ba4653c42534e9835fb3db39fbfd5c06","path":"internal/repository/model.go","line_range":"19","gmt_create":"2026-05-27T18:35:49.7808022+08:00","gmt_modified":"2026-05-27T18:35:49.7808022+08:00"},{"id":"e5c6898e570c67346c0858cfeaa98fae","path":"internal/search/meilisearch.go","line_range":"17","gmt_create":"2026-05-27T18:35:49.7808022+08:00","gmt_modified":"2026-05-27T18:35:49.7808022+08:00"},{"id":"90b60f9dc283b0c2610ad113bc211315","path":"pkg/encode/base64.go","line_range":"8","gmt_create":"2026-05-27T18:35:49.7813263+08:00","gmt_modified":"2026-05-27T18:35:49.7813263+08:00"},{"id":"85820118c846a111e112dc705c071116","path":"internal/response/response.go","line_range":"9","gmt_create":"2026-05-27T18:35:49.7813263+08:00","gmt_modified":"2026-05-27T18:35:49.7813263+08:00"},{"id":"1041284bd46edf16a19f024c113d10b4","path":"internal/handler/brand.go","line_range":"30-34","gmt_create":"2026-05-27T18:35:49.7826173+08:00","gmt_modified":"2026-05-27T18:35:49.7826173+08:00"},{"id":"84be9fdffe58ef8cd5e77e0d3c37313b","path":"internal/handler/model.go","line_range":"31-35","gmt_create":"2026-05-27T18:35:49.7826173+08:00","gmt_modified":"2026-05-27T18:35:49.7826173+08:00"},{"id":"f034e5c72872862a675dd11e32404854","path":"internal/handler/model_list.go","line_range":"38-42","gmt_create":"2026-05-27T18:35:49.7831513+08:00","gmt_modified":"2026-05-27T18:35:49.7831513+08:00"},{"id":"df50e47a5b6541093011bb59b1ec831d","path":"internal/handler/device.go","line_range":"61-78","gmt_create":"2026-05-27T18:35:49.7831513+08:00","gmt_modified":"2026-05-27T18:35:49.7831513+08:00"},{"id":"0a425d8fed248deb7202bc7e8d531ca1","path":"internal/middleware/logger.go","line_range":"10-45","gmt_create":"2026-05-27T18:35:49.7836872+08:00","gmt_modified":"2026-05-27T18:35:49.7836872+08:00"},{"id":"d6d27b00ae4ab42348e74a7e7bf688b2","path":"internal/middleware/request_id.go","line_range":"20-31","gmt_create":"2026-05-27T18:35:49.7836872+08:00","gmt_modified":"2026-05-27T18:35:49.7836872+08:00"},{"id":"e9390185152783a55f55e277d45e6948","path":"cmd/server/main.go","line_range":"25-131","gmt_create":"2026-05-27T18:36:40.5088629+08:00","gmt_modified":"2026-05-27T18:36:40.5088629+08:00"},{"id":"a3cbc373dacd9d032ed0c72bca1e51e9","path":"internal/cache/brand_cache.go","line_range":"1-45","gmt_create":"2026-05-27T18:36:40.5088629+08:00","gmt_modified":"2026-05-27T18:36:40.5088629+08:00"},{"id":"d65e653afb8b211f2e5a7845f72b45dd","path":"internal/cache/model_cache.go","line_range":"1-70","gmt_create":"2026-05-27T18:36:40.5093857+08:00","gmt_modified":"2026-05-27T18:36:40.5093857+08:00"},{"id":"a26d903ac77196fac97ddebf48638ab3","path":"internal/repository/brand.go","line_range":"1-100","gmt_create":"2026-05-27T18:36:40.5093857+08:00","gmt_modified":"2026-05-27T18:36:40.5093857+08:00"},{"id":"7ffaf7b06ea96ca93862aa0dae926ff5","path":"internal/repository/model.go","line_range":"1-181","gmt_create":"2026-05-27T18:36:40.5093857+08:00","gmt_modified":"2026-05-27T18:36:40.5093857+08:00"},{"id":"187b4628003859e3da78f3937c686803","path":"internal/cache/brand_cache.go","line_range":"18-45","gmt_create":"2026-05-27T18:36:40.5109436+08:00","gmt_modified":"2026-05-27T18:36:40.5109436+08:00"},{"id":"a6c526ea58aabee86ae3010b00441c69","path":"internal/cache/model_cache.go","line_range":"19-70","gmt_create":"2026-05-27T18:36:40.5114567+08:00","gmt_modified":"2026-05-27T18:36:40.5114567+08:00"},{"id":"a364a8daa183eaf86417b4c1bd2cc719","path":"internal/repository/brand.go","line_range":"14-100","gmt_create":"2026-05-27T18:36:40.5114567+08:00","gmt_modified":"2026-05-27T18:36:40.5114567+08:00"},{"id":"2e040aabeb8e907eaddc6bbf2ee493ac","path":"internal/repository/model.go","line_range":"14-181","gmt_create":"2026-05-27T18:36:40.5114567+08:00","gmt_modified":"2026-05-27T18:36:40.5114567+08:00"},{"id":"3d315320639ece8212fd138420d94be5","path":"internal/handler/brand.go","line_range":"13-49","gmt_create":"2026-05-27T18:36:40.5120123+08:00","gmt_modified":"2026-05-27T18:36:40.5120123+08:00"},{"id":"fbf36e29345cd3e53fd3a6e8234ad2de","path":"internal/handler/model.go","line_range":"13-50","gmt_create":"2026-05-27T18:36:40.5120123+08:00","gmt_modified":"2026-05-27T18:36:40.5120123+08:00"},{"id":"32b7267a28b0347d59500c38ffa96a7b","path":"internal/cache/brand_cache.go","line_range":"13-45","gmt_create":"2026-05-27T18:36:40.5135974+08:00","gmt_modified":"2026-05-27T18:36:40.5135974+08:00"},{"id":"b9c3c517ffd917351757137ca1338574","path":"internal/cache/model_cache.go","line_range":"27-69","gmt_create":"2026-05-27T18:36:40.5141244+08:00","gmt_modified":"2026-05-27T18:36:40.5141244+08:00"},{"id":"df7d264896976fc8c5475257994c707e","path":"internal/cache/model_cache.go","line_range":"13-70","gmt_create":"2026-05-27T18:36:40.5141244+08:00","gmt_modified":"2026-05-27T18:36:40.5141244+08:00"},{"id":"a3b89d2e56d589f8d902fb9389004bf0","path":"cmd/server/main.go","line_range":"103-131","gmt_create":"2026-05-27T18:36:40.5141244+08:00","gmt_modified":"2026-05-27T18:36:40.5141244+08:00"},{"id":"f76ee32725201731512db1e0e7951586","path":"cmd/server/main.go","line_range":"67-68","gmt_create":"2026-05-27T18:36:40.5146452+08:00","gmt_modified":"2026-05-27T18:36:40.5146452+08:00"},{"id":"251d1b1dc197a1dc242f5384adb1555c","path":"internal/repository/brand.go","line_range":"34-52","gmt_create":"2026-05-27T18:36:40.5146452+08:00","gmt_modified":"2026-05-27T18:36:40.5146452+08:00"},{"id":"a51abc6a6d80413bf60f143cd1f46ee4","path":"internal/repository/model.go","line_range":"27-79","gmt_create":"2026-05-27T18:36:40.5146452+08:00","gmt_modified":"2026-05-27T18:36:40.5146452+08:00"},{"id":"f0b044854c85d50b2d1ba4b9d3e6a6cb","path":"internal/cache/model_cache.go","line_range":"13-17","gmt_create":"2026-05-27T18:36:40.5151635+08:00","gmt_modified":"2026-05-27T18:36:40.5151635+08:00"},{"id":"3f0d637bef43d636594a4816c9da037e","path":"internal/cache/brand_cache.go","line_range":"38-44","gmt_create":"2026-05-27T18:36:40.5151635+08:00","gmt_modified":"2026-05-27T18:36:40.5151635+08:00"},{"id":"3f945faea776f513b5294aa60759fb15","path":"internal/cache/model_cache.go","line_range":"43-69","gmt_create":"2026-05-27T18:36:40.5156806+08:00","gmt_modified":"2026-05-27T18:36:40.5156806+08:00"},{"id":"a272829cfc9c48e8063d8bca53cdebc8","path":"cmd/server/main.go","line_range":"13-23","gmt_create":"2026-05-27T18:36:40.5156806+08:00","gmt_modified":"2026-05-27T18:36:40.5156806+08:00"},{"id":"6d2fece0c97147748fd0269a356e4802","path":"internal/repository/brand.go","line_range":"3-12","gmt_create":"2026-05-27T18:36:40.5156806+08:00","gmt_modified":"2026-05-27T18:36:40.5156806+08:00"},{"id":"282a046f62f9715bfef882f5a4a6a362","path":"internal/router/router.go","line_range":"3-14","gmt_create":"2026-05-27T18:36:40.516202+08:00","gmt_modified":"2026-05-27T18:36:40.516202+08:00"}],"knowledge_relations":[{"id":1,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"523107ca-244f-43c5-a4fe-4649e36a88ad","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e 523107ca-244f-43c5-a4fe-4649e36a88ad","gmt_create":"2026-05-27T16:00:38.0397713+08:00","gmt_modified":"2026-05-27T16:00:38.0397713+08:00"},{"id":3,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"5910d326-0408-450d-b403-06a19f3da81b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e 5910d326-0408-450d-b403-06a19f3da81b","gmt_create":"2026-05-27T16:00:38.0417677+08:00","gmt_modified":"2026-05-27T16:00:38.0417677+08:00"},{"id":4,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"e8e5fe7e-cc7c-4259-95d0-f6b46d888ed8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e e8e5fe7e-cc7c-4259-95d0-f6b46d888ed8","gmt_create":"2026-05-27T16:00:38.0417677+08:00","gmt_modified":"2026-05-27T16:00:38.0417677+08:00"},{"id":5,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"5a04f737-b877-4908-a4fc-67a88614aafc","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e 5a04f737-b877-4908-a4fc-67a88614aafc","gmt_create":"2026-05-27T16:00:38.0427691+08:00","gmt_modified":"2026-05-27T16:00:38.0427691+08:00"},{"id":8,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"97c42095-5b4f-4cec-bbbb-1ba8bb9981d4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e 97c42095-5b4f-4cec-bbbb-1ba8bb9981d4","gmt_create":"2026-05-27T16:00:38.0437677+08:00","gmt_modified":"2026-05-27T16:00:38.0437677+08:00"},{"id":9,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"699a84c5-5140-4267-861e-62bffbffccb4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e 699a84c5-5140-4267-861e-62bffbffccb4","gmt_create":"2026-05-27T16:00:38.0442739+08:00","gmt_modified":"2026-05-27T16:00:38.0442739+08:00"},{"id":10,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"6f1fe170-ae35-4660-91dc-ab89735274b7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e 6f1fe170-ae35-4660-91dc-ab89735274b7","gmt_create":"2026-05-27T16:00:38.0452805+08:00","gmt_modified":"2026-05-27T16:00:38.0452805+08:00"},{"id":11,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"6af33e3a-220d-4e68-87ed-bfb96bda4c3a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e 6af33e3a-220d-4e68-87ed-bfb96bda4c3a","gmt_create":"2026-05-27T16:00:38.0452805+08:00","gmt_modified":"2026-05-27T16:00:38.0452805+08:00"},{"id":12,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"e1ed4fc8-f1d6-4e8a-907b-9c39bbe13b92","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e e1ed4fc8-f1d6-4e8a-907b-9c39bbe13b92","gmt_create":"2026-05-27T16:00:38.0452805+08:00","gmt_modified":"2026-05-27T16:00:38.0452805+08:00"},{"id":13,"source_id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","target_id":"0fc3d59c-d219-4f97-af10-473ee62f4de5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6159e8a9-0f6e-43af-b097-bfcd16c8b223 -\u003e 0fc3d59c-d219-4f97-af10-473ee62f4de5","gmt_create":"2026-05-27T16:00:38.0462819+08:00","gmt_modified":"2026-05-27T16:00:38.0462819+08:00"},{"id":15,"source_id":"cfbcaa79-26f5-402f-8746-9fe524993684","target_id":"d0c2dea0-a71a-4f16-9889-b37e1e7996e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfbcaa79-26f5-402f-8746-9fe524993684 -\u003e d0c2dea0-a71a-4f16-9889-b37e1e7996e3","gmt_create":"2026-05-27T16:00:38.0462819+08:00","gmt_modified":"2026-05-27T16:00:38.0462819+08:00"},{"id":16,"source_id":"cfbcaa79-26f5-402f-8746-9fe524993684","target_id":"23a2ffc3-fa50-41ba-b7a6-55354d68a95a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfbcaa79-26f5-402f-8746-9fe524993684 -\u003e 23a2ffc3-fa50-41ba-b7a6-55354d68a95a","gmt_create":"2026-05-27T16:00:38.0472824+08:00","gmt_modified":"2026-05-27T16:00:38.0472824+08:00"},{"id":17,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"d2654fb48612d74ab0ccc06a3aede80b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/router/router.go","gmt_create":"2026-05-27T18:35:29.9094769+08:00","gmt_modified":"2026-05-27T18:35:29.9094769+08:00"},{"id":18,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"fd613068059c593ac4df9eaef2918055","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: cmd/server/main.go","gmt_create":"2026-05-27T18:35:29.9094769+08:00","gmt_modified":"2026-05-27T18:35:29.9094769+08:00"},{"id":19,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"336527cad207564e9ea86fcc4e0ec240","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/middleware/cors.go","gmt_create":"2026-05-27T18:35:29.9100157+08:00","gmt_modified":"2026-05-27T18:35:29.9100157+08:00"},{"id":20,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"f8a733666ceab6a73ba2bf3234e91222","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/middleware/logger.go","gmt_create":"2026-05-27T18:35:29.9100157+08:00","gmt_modified":"2026-05-27T18:35:29.9100157+08:00"},{"id":21,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"2ba2f740fa3334f7c6d51f74470ec4b7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/middleware/request_id.go","gmt_create":"2026-05-27T18:35:29.9105584+08:00","gmt_modified":"2026-05-27T18:35:29.9105584+08:00"},{"id":22,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"a7b9800e6fc68baa0cfda9c8f327b423","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/health.go","gmt_create":"2026-05-27T18:35:29.9111006+08:00","gmt_modified":"2026-05-27T18:35:29.9111006+08:00"},{"id":23,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/brand.go","gmt_create":"2026-05-27T18:35:29.9111006+08:00","gmt_modified":"2026-05-27T18:35:29.9111006+08:00"},{"id":24,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"b18d19ca2c60406b9cd28010df12296d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/model.go","gmt_create":"2026-05-27T18:35:29.9116443+08:00","gmt_modified":"2026-05-27T18:35:29.9116443+08:00"},{"id":25,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/model_list.go","gmt_create":"2026-05-27T18:35:29.9116443+08:00","gmt_modified":"2026-05-27T18:35:29.9116443+08:00"},{"id":26,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"3a1babcf090301072327433866c0d7d0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/device.go","gmt_create":"2026-05-27T18:35:29.9121832+08:00","gmt_modified":"2026-05-27T18:35:29.9121832+08:00"},{"id":27,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"703706c059a41213d3dbfbddc03fab12","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/response/response.go","gmt_create":"2026-05-27T18:35:29.9121832+08:00","gmt_modified":"2026-05-27T18:35:29.9121832+08:00"},{"id":28,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"0bba4121c12e2cf427dc805016fade40","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/config.go","gmt_create":"2026-05-27T18:35:29.9127279+08:00","gmt_modified":"2026-05-27T18:35:29.9127279+08:00"},{"id":29,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"80d716769cf67cd05b504a3bc0a06a92","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: pkg/encode/base64.go","gmt_create":"2026-05-27T18:35:29.9127279+08:00","gmt_modified":"2026-05-27T18:35:29.9127279+08:00"},{"id":30,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"67d9f7c1be7ff64bb9bca0a5f2492621","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: README.md","gmt_create":"2026-05-27T18:35:29.9127279+08:00","gmt_modified":"2026-05-27T18:35:29.9127279+08:00"},{"id":31,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"7bfaa93c0d23eed2727039a5bd3d9a07","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/redis.go","gmt_create":"2026-05-27T18:35:29.9127279+08:00","gmt_modified":"2026-05-27T18:35:29.9127279+08:00"},{"id":32,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"67d3253845127f03f1f9ebe3f6a6aaa3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/brand_cache.go","gmt_create":"2026-05-27T18:35:29.9137674+08:00","gmt_modified":"2026-05-27T18:35:29.9137674+08:00"},{"id":33,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"018b14cbce05561cfb50fe7e6e3835a3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/model_cache.go","gmt_create":"2026-05-27T18:35:29.9137674+08:00","gmt_modified":"2026-05-27T18:35:29.9137674+08:00"},{"id":34,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"276b4d58e492bc3f7c258914abb959e4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/brand.go","gmt_create":"2026-05-27T18:35:29.9137674+08:00","gmt_modified":"2026-05-27T18:35:29.9137674+08:00"},{"id":35,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"4ca752eb084c575a36939921aeeb9984","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/model.go","gmt_create":"2026-05-27T18:35:29.9137674+08:00","gmt_modified":"2026-05-27T18:35:29.9137674+08:00"},{"id":36,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"ac542a8b31381c132de78b921e3216d4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/redis.go","gmt_create":"2026-05-27T18:35:29.9137674+08:00","gmt_modified":"2026-05-27T18:35:29.9137674+08:00"},{"id":37,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"d2c7a50459a83c5ef23e809b0f194aba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/meilisearch.go","gmt_create":"2026-05-27T18:35:29.9137674+08:00","gmt_modified":"2026-05-27T18:35:29.9137674+08:00"},{"id":38,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"333405ee9924108619cd8443f735d754","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#16-52","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":39,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"333405ee9924108619cd8443f735d754","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-52","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":40,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"6eda76d6eb6015250ec186fdafd0b3c9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#59-70","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":41,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"6eda76d6eb6015250ec186fdafd0b3c9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 59-70","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":42,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"553e943cfb2f6b7752122999084a80a5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#18-44","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":43,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"553e943cfb2f6b7752122999084a80a5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-44","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":44,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"d7c4ecf9c38df06865431d0dcd796162","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#19-69","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":45,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"d7c4ecf9c38df06865431d0dcd796162","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-69","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":46,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"5ec84f3864f3fa2c3ab1d97fe69d5529","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#14-52","gmt_create":"2026-05-27T18:35:29.9152992+08:00","gmt_modified":"2026-05-27T18:35:29.9152992+08:00"},{"id":47,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"5ec84f3864f3fa2c3ab1d97fe69d5529","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-52","gmt_create":"2026-05-27T18:35:29.9181432+08:00","gmt_modified":"2026-05-27T18:35:29.9181432+08:00"},{"id":48,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"468dd8105671ed478ff86ca97c0609ba","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#14-79","gmt_create":"2026-05-27T18:35:29.9181432+08:00","gmt_modified":"2026-05-27T18:35:29.9181432+08:00"},{"id":49,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"468dd8105671ed478ff86ca97c0609ba","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-79","gmt_create":"2026-05-27T18:35:29.9186699+08:00","gmt_modified":"2026-05-27T18:35:29.9186699+08:00"},{"id":50,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"a0b3e000a5b789bf08d2d996fc17d8df","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#25-101","gmt_create":"2026-05-27T18:35:29.9191948+08:00","gmt_modified":"2026-05-27T18:35:29.9191948+08:00"},{"id":51,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"a0b3e000a5b789bf08d2d996fc17d8df","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-101","gmt_create":"2026-05-27T18:35:29.9191948+08:00","gmt_modified":"2026-05-27T18:35:29.9191948+08:00"},{"id":52,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"111557d31227afead72d0f01becea3bc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: README.md#19-123","gmt_create":"2026-05-27T18:35:29.9197286+08:00","gmt_modified":"2026-05-27T18:35:29.9197286+08:00"},{"id":53,"source_id":"67d9f7c1be7ff64bb9bca0a5f2492621","target_id":"111557d31227afead72d0f01becea3bc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-123","gmt_create":"2026-05-27T18:35:29.9197286+08:00","gmt_modified":"2026-05-27T18:35:29.9197286+08:00"},{"id":54,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"5db111a430cac488cabeb543494fb917","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/response/response.go#15-36","gmt_create":"2026-05-27T18:35:29.9202582+08:00","gmt_modified":"2026-05-27T18:35:29.9202582+08:00"},{"id":55,"source_id":"703706c059a41213d3dbfbddc03fab12","target_id":"5db111a430cac488cabeb543494fb917","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 15-36","gmt_create":"2026-05-27T18:35:29.9209575+08:00","gmt_modified":"2026-05-27T18:35:29.9209575+08:00"},{"id":56,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"891c848d9153926513b9005f2d61382e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/logger.go#10-44","gmt_create":"2026-05-27T18:35:29.9214708+08:00","gmt_modified":"2026-05-27T18:35:29.9214708+08:00"},{"id":57,"source_id":"f8a733666ceab6a73ba2bf3234e91222","target_id":"891c848d9153926513b9005f2d61382e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-44","gmt_create":"2026-05-27T18:35:29.9220086+08:00","gmt_modified":"2026-05-27T18:35:29.9220086+08:00"},{"id":58,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"8a6a9ea04bb9b0de8fd0195ca491b154","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/request_id.go#20-29","gmt_create":"2026-05-27T18:35:29.9220086+08:00","gmt_modified":"2026-05-27T18:35:29.9220086+08:00"},{"id":59,"source_id":"2ba2f740fa3334f7c6d51f74470ec4b7","target_id":"8a6a9ea04bb9b0de8fd0195ca491b154","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 20-29","gmt_create":"2026-05-27T18:35:29.9225391+08:00","gmt_modified":"2026-05-27T18:35:29.9225391+08:00"},{"id":60,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"99d2500a6a0922c50675ed247c6777e5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/cors.go#7-19","gmt_create":"2026-05-27T18:35:29.9225391+08:00","gmt_modified":"2026-05-27T18:35:29.9225391+08:00"},{"id":61,"source_id":"336527cad207564e9ea86fcc4e0ec240","target_id":"99d2500a6a0922c50675ed247c6777e5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 7-19","gmt_create":"2026-05-27T18:35:29.9230634+08:00","gmt_modified":"2026-05-27T18:35:29.9230634+08:00"},{"id":62,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"c86c8f1c951956c0397e6c938ccc641c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#23-36","gmt_create":"2026-05-27T18:35:29.9241149+08:00","gmt_modified":"2026-05-27T18:35:29.9241149+08:00"},{"id":63,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"c86c8f1c951956c0397e6c938ccc641c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-36","gmt_create":"2026-05-27T18:35:29.9241149+08:00","gmt_modified":"2026-05-27T18:35:29.9241149+08:00"},{"id":64,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"99701e03d9c9476a15f742b82e5adfa5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#13-44","gmt_create":"2026-05-27T18:35:29.9241149+08:00","gmt_modified":"2026-05-27T18:35:29.9241149+08:00"},{"id":65,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"99701e03d9c9476a15f742b82e5adfa5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-44","gmt_create":"2026-05-27T18:35:29.9246449+08:00","gmt_modified":"2026-05-27T18:35:29.9246449+08:00"},{"id":66,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"a072f4ebff3b6cc9eaf8025737ca42d3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#13-69","gmt_create":"2026-05-27T18:35:29.9251757+08:00","gmt_modified":"2026-05-27T18:35:29.9251757+08:00"},{"id":67,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"a072f4ebff3b6cc9eaf8025737ca42d3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-69","gmt_create":"2026-05-27T18:35:29.9251757+08:00","gmt_modified":"2026-05-27T18:35:29.9251757+08:00"},{"id":68,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"d4f94a6e4a0cd46ebc0c5f03e96c6232","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#38-49","gmt_create":"2026-05-27T18:35:29.9257015+08:00","gmt_modified":"2026-05-27T18:35:29.9257015+08:00"},{"id":69,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"d4f94a6e4a0cd46ebc0c5f03e96c6232","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 38-49","gmt_create":"2026-05-27T18:35:29.9257015+08:00","gmt_modified":"2026-05-27T18:35:29.9257015+08:00"},{"id":70,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"0a2840d641ba5dccfff95a35d7317004","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: README.md#83-110","gmt_create":"2026-05-27T18:35:29.9262333+08:00","gmt_modified":"2026-05-27T18:35:29.9262333+08:00"},{"id":71,"source_id":"67d9f7c1be7ff64bb9bca0a5f2492621","target_id":"0a2840d641ba5dccfff95a35d7317004","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 83-110","gmt_create":"2026-05-27T18:35:29.9262333+08:00","gmt_modified":"2026-05-27T18:35:29.9262333+08:00"},{"id":72,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"491bd71f42db0fd5bf1d4851b9c4aaa9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/health.go#14-18","gmt_create":"2026-05-27T18:35:29.9273021+08:00","gmt_modified":"2026-05-27T18:35:29.9273021+08:00"},{"id":73,"source_id":"a7b9800e6fc68baa0cfda9c8f327b423","target_id":"491bd71f42db0fd5bf1d4851b9c4aaa9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-18","gmt_create":"2026-05-27T18:35:29.9273021+08:00","gmt_modified":"2026-05-27T18:35:29.9273021+08:00"},{"id":74,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"fce5662f14aa6386a5036b5241e00b1c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/response/response.go#15-21","gmt_create":"2026-05-27T18:35:29.9278475+08:00","gmt_modified":"2026-05-27T18:35:29.9278475+08:00"},{"id":75,"source_id":"703706c059a41213d3dbfbddc03fab12","target_id":"fce5662f14aa6386a5036b5241e00b1c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 15-21","gmt_create":"2026-05-27T18:35:29.9278475+08:00","gmt_modified":"2026-05-27T18:35:29.9278475+08:00"},{"id":76,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"7e3954c3e70a9252de9cfdec52ed93c8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#25-48","gmt_create":"2026-05-27T18:35:29.9278475+08:00","gmt_modified":"2026-05-27T18:35:29.9278475+08:00"},{"id":77,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"7e3954c3e70a9252de9cfdec52ed93c8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-48","gmt_create":"2026-05-27T18:35:29.9283823+08:00","gmt_modified":"2026-05-27T18:35:29.9283823+08:00"},{"id":78,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"79304ed9558f17f9ecb0dc7d24add547","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: pkg/encode/base64.go#44-51","gmt_create":"2026-05-27T18:35:29.9283823+08:00","gmt_modified":"2026-05-27T18:35:29.9283823+08:00"},{"id":79,"source_id":"80d716769cf67cd05b504a3bc0a06a92","target_id":"79304ed9558f17f9ecb0dc7d24add547","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 44-51","gmt_create":"2026-05-27T18:35:29.9289151+08:00","gmt_modified":"2026-05-27T18:35:29.9289151+08:00"},{"id":80,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"a6d16b8965ed7f207f19f8f915ad53a4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#25-49","gmt_create":"2026-05-27T18:35:29.9289151+08:00","gmt_modified":"2026-05-27T18:35:29.9289151+08:00"},{"id":81,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"a6d16b8965ed7f207f19f8f915ad53a4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-49","gmt_create":"2026-05-27T18:35:29.9289151+08:00","gmt_modified":"2026-05-27T18:35:29.9289151+08:00"},{"id":82,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"fce0c17d6c03e511c3afeaee662ad34f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#26-56","gmt_create":"2026-05-27T18:35:29.930006+08:00","gmt_modified":"2026-05-27T18:35:29.930006+08:00"},{"id":83,"source_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","target_id":"fce0c17d6c03e511c3afeaee662ad34f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 26-56","gmt_create":"2026-05-27T18:35:29.930006+08:00","gmt_modified":"2026-05-27T18:35:29.930006+08:00"},{"id":84,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"d4bd0610a0ad3d8fd8d33ac5f4aa83b5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#26-84","gmt_create":"2026-05-27T18:35:29.930538+08:00","gmt_modified":"2026-05-27T18:35:29.930538+08:00"},{"id":85,"source_id":"3a1babcf090301072327433866c0d7d0","target_id":"d4bd0610a0ad3d8fd8d33ac5f4aa83b5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 26-84","gmt_create":"2026-05-27T18:35:29.930538+08:00","gmt_modified":"2026-05-27T18:35:29.930538+08:00"},{"id":86,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"1be2a5a025cb64eeb20d5e54d293203f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/logger.go#33-43","gmt_create":"2026-05-27T18:35:29.9321249+08:00","gmt_modified":"2026-05-27T18:35:29.9321249+08:00"},{"id":87,"source_id":"f8a733666ceab6a73ba2bf3234e91222","target_id":"1be2a5a025cb64eeb20d5e54d293203f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 33-43","gmt_create":"2026-05-27T18:35:29.9326589+08:00","gmt_modified":"2026-05-27T18:35:29.9326589+08:00"},{"id":88,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"5f4eb9799d6c811ddcc430f51e299cf6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/request_id.go#22-27","gmt_create":"2026-05-27T18:35:29.9326589+08:00","gmt_modified":"2026-05-27T18:35:29.9326589+08:00"},{"id":89,"source_id":"2ba2f740fa3334f7c6d51f74470ec4b7","target_id":"5f4eb9799d6c811ddcc430f51e299cf6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-27","gmt_create":"2026-05-27T18:35:29.9331872+08:00","gmt_modified":"2026-05-27T18:35:29.9331872+08:00"},{"id":90,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"be85f7cf4e9dd0c2460475b95efb085d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/cors.go#9-12","gmt_create":"2026-05-27T18:35:29.9331872+08:00","gmt_modified":"2026-05-27T18:35:29.9331872+08:00"},{"id":91,"source_id":"336527cad207564e9ea86fcc4e0ec240","target_id":"be85f7cf4e9dd0c2460475b95efb085d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-12","gmt_create":"2026-05-27T18:35:29.9337179+08:00","gmt_modified":"2026-05-27T18:35:29.9337179+08:00"},{"id":92,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"730d8469648c9599ccbc091a9496d2a1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/response/response.go#23-36","gmt_create":"2026-05-27T18:35:29.9337179+08:00","gmt_modified":"2026-05-27T18:35:29.9337179+08:00"},{"id":93,"source_id":"703706c059a41213d3dbfbddc03fab12","target_id":"730d8469648c9599ccbc091a9496d2a1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-36","gmt_create":"2026-05-27T18:35:29.9337179+08:00","gmt_modified":"2026-05-27T18:35:29.9337179+08:00"},{"id":94,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"d48bcd5374602483c104c7d50c7224fb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#18-21","gmt_create":"2026-05-27T18:35:29.9354707+08:00","gmt_modified":"2026-05-27T18:35:29.9354707+08:00"},{"id":95,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"d48bcd5374602483c104c7d50c7224fb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-21","gmt_create":"2026-05-27T18:35:29.936015+08:00","gmt_modified":"2026-05-27T18:35:29.936015+08:00"},{"id":96,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"798bc9e7f1a3902993b3aa9acba73022","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/logger.go#16","gmt_create":"2026-05-27T18:35:29.936015+08:00","gmt_modified":"2026-05-27T18:35:29.936015+08:00"},{"id":97,"source_id":"f8a733666ceab6a73ba2bf3234e91222","target_id":"798bc9e7f1a3902993b3aa9acba73022","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16","gmt_create":"2026-05-27T18:35:29.9365406+08:00","gmt_modified":"2026-05-27T18:35:29.9365406+08:00"},{"id":98,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"ed43fe99536e371ce908f167a68124f8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/request_id.go#28","gmt_create":"2026-05-27T18:35:29.9370715+08:00","gmt_modified":"2026-05-27T18:35:29.9370715+08:00"},{"id":99,"source_id":"2ba2f740fa3334f7c6d51f74470ec4b7","target_id":"ed43fe99536e371ce908f167a68124f8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 28","gmt_create":"2026-05-27T18:35:29.9375945+08:00","gmt_modified":"2026-05-27T18:35:29.9375945+08:00"},{"id":100,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"08c02a0d77d871b6c9650cbfcdf84c94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/cors.go#18","gmt_create":"2026-05-27T18:35:29.9375945+08:00","gmt_modified":"2026-05-27T18:35:29.9375945+08:00"},{"id":101,"source_id":"336527cad207564e9ea86fcc4e0ec240","target_id":"08c02a0d77d871b6c9650cbfcdf84c94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18","gmt_create":"2026-05-27T18:35:29.938135+08:00","gmt_modified":"2026-05-27T18:35:29.938135+08:00"},{"id":102,"source_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","target_id":"e88b0ee062bd02dd7acdf8e2e945b270","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#103-130","gmt_create":"2026-05-27T18:35:29.938135+08:00","gmt_modified":"2026-05-27T18:35:29.938135+08:00"},{"id":103,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"e88b0ee062bd02dd7acdf8e2e945b270","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 103-130","gmt_create":"2026-05-27T18:35:29.938674+08:00","gmt_modified":"2026-05-27T18:35:29.938674+08:00"},{"id":104,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"276b4d58e492bc3f7c258914abb959e4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/brand.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":105,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"4ca752eb084c575a36939921aeeb9984","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/model.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":106,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"67d3253845127f03f1f9ebe3f6a6aaa3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/brand_cache.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":107,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"018b14cbce05561cfb50fe7e6e3835a3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/model_cache.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":108,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"7bfaa93c0d23eed2727039a5bd3d9a07","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/redis.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":109,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"0b4d10e2e0a550819cadaa7dbef9ecd1","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/database/mysql.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":110,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"a0a3a762dc85a8d8c5bb359f5c523def","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/database.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":111,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"ac542a8b31381c132de78b921e3216d4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/redis.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":112,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"0bba4121c12e2cf427dc805016fade40","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/config.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":113,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"6e3fd9bdc8a1ccaaa905d91772ecca2c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/model/brand.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":114,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"e9902bfcef1f5908b5123648ae6b07c6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/model/model.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":115,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/brand.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":116,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"b18d19ca2c60406b9cd28010df12296d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/model.go","gmt_create":"2026-05-27T18:35:41.7574665+08:00","gmt_modified":"2026-05-27T18:35:41.7574665+08:00"},{"id":117,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"d2654fb48612d74ab0ccc06a3aede80b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/router/router.go","gmt_create":"2026-05-27T18:35:41.772274+08:00","gmt_modified":"2026-05-27T18:35:41.772274+08:00"},{"id":118,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"fd613068059c593ac4df9eaef2918055","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: cmd/server/main.go","gmt_create":"2026-05-27T18:35:41.7739049+08:00","gmt_modified":"2026-05-27T18:35:41.7739049+08:00"},{"id":119,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"c56e5254bd7f42350c5261822fa135bb","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: sql/model.sql","gmt_create":"2026-05-27T18:35:41.7739049+08:00","gmt_modified":"2026-05-27T18:35:41.7739049+08:00"},{"id":120,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"47165ac2566e8b2d3796014bdb75361f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: go.mod","gmt_create":"2026-05-27T18:35:41.774462+08:00","gmt_modified":"2026-05-27T18:35:41.774462+08:00"},{"id":121,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"e88b0ee062bd02dd7acdf8e2e945b270","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#103-130","gmt_create":"2026-05-27T18:35:41.774462+08:00","gmt_modified":"2026-05-27T18:35:41.774462+08:00"},{"id":122,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"64381887b12f6927d8b0481a55c2dcf1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#22-25","gmt_create":"2026-05-27T18:35:41.7750027+08:00","gmt_modified":"2026-05-27T18:35:41.7750027+08:00"},{"id":123,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"64381887b12f6927d8b0481a55c2dcf1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-25","gmt_create":"2026-05-27T18:35:41.7750027+08:00","gmt_modified":"2026-05-27T18:35:41.7750027+08:00"},{"id":124,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"1503a99bb2f2ab96e4a3a830d8834e45","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#19-24","gmt_create":"2026-05-27T18:35:41.7755529+08:00","gmt_modified":"2026-05-27T18:35:41.7755529+08:00"},{"id":125,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"1503a99bb2f2ab96e4a3a830d8834e45","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-24","gmt_create":"2026-05-27T18:35:41.7755529+08:00","gmt_modified":"2026-05-27T18:35:41.7755529+08:00"},{"id":126,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"f74cdc773e62a1a9f5a4bf940b5961e3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#19-24","gmt_create":"2026-05-27T18:35:41.7760825+08:00","gmt_modified":"2026-05-27T18:35:41.7760825+08:00"},{"id":127,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"f74cdc773e62a1a9f5a4bf940b5961e3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-24","gmt_create":"2026-05-27T18:35:41.7760825+08:00","gmt_modified":"2026-05-27T18:35:41.7760825+08:00"},{"id":128,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"8b0db394a538b6652de2e6634277ad0f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#14-21","gmt_create":"2026-05-27T18:35:41.7766018+08:00","gmt_modified":"2026-05-27T18:35:41.7766018+08:00"},{"id":129,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"8b0db394a538b6652de2e6634277ad0f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-21","gmt_create":"2026-05-27T18:35:41.7766018+08:00","gmt_modified":"2026-05-27T18:35:41.7766018+08:00"},{"id":130,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"03f26c7c55e18e6266ea8e543a032229","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#14-21","gmt_create":"2026-05-27T18:35:41.7771345+08:00","gmt_modified":"2026-05-27T18:35:41.7771345+08:00"},{"id":131,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"03f26c7c55e18e6266ea8e543a032229","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-21","gmt_create":"2026-05-27T18:35:41.7771345+08:00","gmt_modified":"2026-05-27T18:35:41.7771345+08:00"},{"id":132,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"8fab617bba600779abac7805723180a0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#18-24","gmt_create":"2026-05-27T18:35:41.7777054+08:00","gmt_modified":"2026-05-27T18:35:41.7777054+08:00"},{"id":133,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"8fab617bba600779abac7805723180a0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-24","gmt_create":"2026-05-27T18:35:41.7777054+08:00","gmt_modified":"2026-05-27T18:35:41.7777054+08:00"},{"id":134,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"006d91f2f5f75fd7cd586165c200ba98","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#19-25","gmt_create":"2026-05-27T18:35:41.7777054+08:00","gmt_modified":"2026-05-27T18:35:41.7777054+08:00"},{"id":135,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"006d91f2f5f75fd7cd586165c200ba98","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-25","gmt_create":"2026-05-27T18:35:41.7782257+08:00","gmt_modified":"2026-05-27T18:35:41.7782257+08:00"},{"id":136,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"509525e0463c03c509709a6bd1765d4f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/redis.go#10-16","gmt_create":"2026-05-27T18:35:41.7782257+08:00","gmt_modified":"2026-05-27T18:35:41.7782257+08:00"},{"id":137,"source_id":"7bfaa93c0d23eed2727039a5bd3d9a07","target_id":"509525e0463c03c509709a6bd1765d4f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-16","gmt_create":"2026-05-27T18:35:41.7787495+08:00","gmt_modified":"2026-05-27T18:35:41.7787495+08:00"},{"id":138,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"57b8aed283762226a00482b42a8acf5b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/database/mysql.go#14-46","gmt_create":"2026-05-27T18:35:41.7787495+08:00","gmt_modified":"2026-05-27T18:35:41.7787495+08:00"},{"id":139,"source_id":"0b4d10e2e0a550819cadaa7dbef9ecd1","target_id":"57b8aed283762226a00482b42a8acf5b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-46","gmt_create":"2026-05-27T18:35:41.7792726+08:00","gmt_modified":"2026-05-27T18:35:41.7792726+08:00"},{"id":140,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"4ab082407b96e18f67a65d07eb4a331d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/config/database.go#17-40","gmt_create":"2026-05-27T18:35:41.7792726+08:00","gmt_modified":"2026-05-27T18:35:41.7792726+08:00"},{"id":141,"source_id":"a0a3a762dc85a8d8c5bb359f5c523def","target_id":"4ab082407b96e18f67a65d07eb4a331d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-40","gmt_create":"2026-05-27T18:35:41.7792726+08:00","gmt_modified":"2026-05-27T18:35:41.7792726+08:00"},{"id":142,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"fd2a12d243b52512003ae067f53a7548","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/config/redis.go#9-57","gmt_create":"2026-05-27T18:35:41.7797862+08:00","gmt_modified":"2026-05-27T18:35:41.7797862+08:00"},{"id":143,"source_id":"ac542a8b31381c132de78b921e3216d4","target_id":"fd2a12d243b52512003ae067f53a7548","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-57","gmt_create":"2026-05-27T18:35:41.7797862+08:00","gmt_modified":"2026-05-27T18:35:41.7797862+08:00"},{"id":144,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"61d69bf4d3c8c548eecfd677394486d6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/config/config.go#18-52","gmt_create":"2026-05-27T18:35:41.7797862+08:00","gmt_modified":"2026-05-27T18:35:41.7797862+08:00"},{"id":145,"source_id":"0bba4121c12e2cf427dc805016fade40","target_id":"61d69bf4d3c8c548eecfd677394486d6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-52","gmt_create":"2026-05-27T18:35:41.7803146+08:00","gmt_modified":"2026-05-27T18:35:41.7803146+08:00"},{"id":146,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"e87c932ace50951cb91aa66877ad6f81","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: sql/model.sql#24-35","gmt_create":"2026-05-27T18:35:41.7803146+08:00","gmt_modified":"2026-05-27T18:35:41.7803146+08:00"},{"id":147,"source_id":"c56e5254bd7f42350c5261822fa135bb","target_id":"e87c932ace50951cb91aa66877ad6f81","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-35","gmt_create":"2026-05-27T18:35:41.78084+08:00","gmt_modified":"2026-05-27T18:35:41.78084+08:00"},{"id":148,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"90226e287e9b66f5a36ba2316d7a7cd7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#14-41","gmt_create":"2026-05-27T18:35:41.78084+08:00","gmt_modified":"2026-05-27T18:35:41.78084+08:00"},{"id":149,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"90226e287e9b66f5a36ba2316d7a7cd7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-41","gmt_create":"2026-05-27T18:35:41.7813615+08:00","gmt_modified":"2026-05-27T18:35:41.7813615+08:00"},{"id":150,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"9918f39149aaf1f5c3ec03275d6e3673","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#23-52","gmt_create":"2026-05-27T18:35:41.7837575+08:00","gmt_modified":"2026-05-27T18:35:41.7837575+08:00"},{"id":151,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"9918f39149aaf1f5c3ec03275d6e3673","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-52","gmt_create":"2026-05-27T18:35:41.7842961+08:00","gmt_modified":"2026-05-27T18:35:41.7842961+08:00"},{"id":152,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"a19fb2ac137e43d92d2ef93e8d79f0a7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#23-79","gmt_create":"2026-05-27T18:35:41.7842961+08:00","gmt_modified":"2026-05-27T18:35:41.7842961+08:00"},{"id":153,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"a19fb2ac137e43d92d2ef93e8d79f0a7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-79","gmt_create":"2026-05-27T18:35:41.7848355+08:00","gmt_modified":"2026-05-27T18:35:41.7848355+08:00"},{"id":154,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"72322f320f907b6eec72e885e30759eb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#26-44","gmt_create":"2026-05-27T18:35:41.7848355+08:00","gmt_modified":"2026-05-27T18:35:41.7848355+08:00"},{"id":155,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"72322f320f907b6eec72e885e30759eb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 26-44","gmt_create":"2026-05-27T18:35:41.7848355+08:00","gmt_modified":"2026-05-27T18:35:41.7848355+08:00"},{"id":156,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"d0f658c42abae9b6dc0baaa8fc7d0694","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#31-69","gmt_create":"2026-05-27T18:35:41.7853732+08:00","gmt_modified":"2026-05-27T18:35:41.7853732+08:00"},{"id":157,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"d0f658c42abae9b6dc0baaa8fc7d0694","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 31-69","gmt_create":"2026-05-27T18:35:41.7853732+08:00","gmt_modified":"2026-05-27T18:35:41.7853732+08:00"},{"id":158,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"a952e5d5b625754a2e9249983bb8abaa","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/config/database.go#17-72","gmt_create":"2026-05-27T18:35:41.7859103+08:00","gmt_modified":"2026-05-27T18:35:41.7859103+08:00"},{"id":159,"source_id":"a0a3a762dc85a8d8c5bb359f5c523def","target_id":"a952e5d5b625754a2e9249983bb8abaa","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-72","gmt_create":"2026-05-27T18:35:41.7864448+08:00","gmt_modified":"2026-05-27T18:35:41.7864448+08:00"},{"id":160,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"f7af3a1998c24f922aa650a69b252734","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/config/redis.go#16-57","gmt_create":"2026-05-27T18:35:41.7864448+08:00","gmt_modified":"2026-05-27T18:35:41.7864448+08:00"},{"id":161,"source_id":"ac542a8b31381c132de78b921e3216d4","target_id":"f7af3a1998c24f922aa650a69b252734","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-57","gmt_create":"2026-05-27T18:35:41.786982+08:00","gmt_modified":"2026-05-27T18:35:41.786982+08:00"},{"id":162,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"7e3954c3e70a9252de9cfdec52ed93c8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#25-48","gmt_create":"2026-05-27T18:35:41.7880705+08:00","gmt_modified":"2026-05-27T18:35:41.7880705+08:00"},{"id":163,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"a6d16b8965ed7f207f19f8f915ad53a4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#25-49","gmt_create":"2026-05-27T18:35:41.7885925+08:00","gmt_modified":"2026-05-27T18:35:41.7885925+08:00"},{"id":164,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"c7bf654a5faf00b02953d2e56747a669","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/database/mysql.go#28-43","gmt_create":"2026-05-27T18:35:41.7896921+08:00","gmt_modified":"2026-05-27T18:35:41.7896921+08:00"},{"id":165,"source_id":"0b4d10e2e0a550819cadaa7dbef9ecd1","target_id":"c7bf654a5faf00b02953d2e56747a669","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 28-43","gmt_create":"2026-05-27T18:35:41.7896921+08:00","gmt_modified":"2026-05-27T18:35:41.7896921+08:00"},{"id":166,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"1d3714bd55d5d3f773f1ab7fdb8c9b53","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/model/brand.go#3-6","gmt_create":"2026-05-27T18:35:41.7907502+08:00","gmt_modified":"2026-05-27T18:35:41.7907502+08:00"},{"id":167,"source_id":"6e3fd9bdc8a1ccaaa905d91772ecca2c","target_id":"1d3714bd55d5d3f773f1ab7fdb8c9b53","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-6","gmt_create":"2026-05-27T18:35:41.7907502+08:00","gmt_modified":"2026-05-27T18:35:41.7907502+08:00"},{"id":168,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"8d92ac14c6257462a15eb6990dd44596","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/model/model.go#5-14","gmt_create":"2026-05-27T18:35:41.7923122+08:00","gmt_modified":"2026-05-27T18:35:41.7923122+08:00"},{"id":169,"source_id":"e9902bfcef1f5908b5123648ae6b07c6","target_id":"8d92ac14c6257462a15eb6990dd44596","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-14","gmt_create":"2026-05-27T18:35:41.7923122+08:00","gmt_modified":"2026-05-27T18:35:41.7923122+08:00"},{"id":170,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"8b134235408cf40b9d6351d54591b3c4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: sql/model.sql#34","gmt_create":"2026-05-27T18:35:41.7933596+08:00","gmt_modified":"2026-05-27T18:35:41.7933596+08:00"},{"id":171,"source_id":"c56e5254bd7f42350c5261822fa135bb","target_id":"8b134235408cf40b9d6351d54591b3c4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 34","gmt_create":"2026-05-27T18:35:41.7933596+08:00","gmt_modified":"2026-05-27T18:35:41.7933596+08:00"},{"id":172,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"62d02336da9111eec3c5696aabf71927","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#13-16","gmt_create":"2026-05-27T18:35:41.7954607+08:00","gmt_modified":"2026-05-27T18:35:41.7954607+08:00"},{"id":173,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"62d02336da9111eec3c5696aabf71927","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-16","gmt_create":"2026-05-27T18:35:41.7959791+08:00","gmt_modified":"2026-05-27T18:35:41.7959791+08:00"},{"id":174,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"a60ecb63d9ab3bda0c5042f26916def3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#13-16","gmt_create":"2026-05-27T18:35:41.7959791+08:00","gmt_modified":"2026-05-27T18:35:41.7959791+08:00"},{"id":175,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"a60ecb63d9ab3bda0c5042f26916def3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-16","gmt_create":"2026-05-27T18:35:41.7959791+08:00","gmt_modified":"2026-05-27T18:35:41.7959791+08:00"},{"id":176,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"5859dc43ab95b589fc2cada49ab59a86","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: go.mod#5-11","gmt_create":"2026-05-27T18:35:41.7965008+08:00","gmt_modified":"2026-05-27T18:35:41.7965008+08:00"},{"id":177,"source_id":"47165ac2566e8b2d3796014bdb75361f","target_id":"5859dc43ab95b589fc2cada49ab59a86","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-11","gmt_create":"2026-05-27T18:35:41.7970218+08:00","gmt_modified":"2026-05-27T18:35:41.7970218+08:00"},{"id":178,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"dcc3acd0529002f62657a37922318e37","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#25-69","gmt_create":"2026-05-27T18:35:41.7976793+08:00","gmt_modified":"2026-05-27T18:35:41.7976793+08:00"},{"id":179,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"dcc3acd0529002f62657a37922318e37","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-69","gmt_create":"2026-05-27T18:35:41.7976793+08:00","gmt_modified":"2026-05-27T18:35:41.7976793+08:00"},{"id":180,"source_id":"599c0bda-3332-415c-a535-362503079473","target_id":"99ead368ce42f1081e05c800c65b176f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/database/mysql.go#33-43","gmt_create":"2026-05-27T18:35:41.8014731+08:00","gmt_modified":"2026-05-27T18:35:41.8014731+08:00"},{"id":181,"source_id":"0b4d10e2e0a550819cadaa7dbef9ecd1","target_id":"99ead368ce42f1081e05c800c65b176f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 33-43","gmt_create":"2026-05-27T18:35:41.802505+08:00","gmt_modified":"2026-05-27T18:35:41.802505+08:00"},{"id":182,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/brand.go","gmt_create":"2026-05-27T18:35:49.7836872+08:00","gmt_modified":"2026-05-27T18:35:49.7836872+08:00"},{"id":183,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"b18d19ca2c60406b9cd28010df12296d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/model.go","gmt_create":"2026-05-27T18:35:49.7836872+08:00","gmt_modified":"2026-05-27T18:35:49.7836872+08:00"},{"id":184,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/model_list.go","gmt_create":"2026-05-27T18:35:49.7836872+08:00","gmt_modified":"2026-05-27T18:35:49.7836872+08:00"},{"id":185,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"3a1babcf090301072327433866c0d7d0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/device.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":186,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"a7b9800e6fc68baa0cfda9c8f327b423","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/health.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":187,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"276b4d58e492bc3f7c258914abb959e4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/brand.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":188,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"4ca752eb084c575a36939921aeeb9984","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/model.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":189,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"703706c059a41213d3dbfbddc03fab12","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/response/response.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":190,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"80d716769cf67cd05b504a3bc0a06a92","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: pkg/encode/base64.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":191,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"a1ff50cc5809d0d712db343ab0befe3b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/search/meilisearch.go","gmt_create":"2026-05-27T18:35:49.784717+08:00","gmt_modified":"2026-05-27T18:35:49.784717+08:00"},{"id":192,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"d2654fb48612d74ab0ccc06a3aede80b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/router/router.go","gmt_create":"2026-05-27T18:35:49.7862502+08:00","gmt_modified":"2026-05-27T18:35:49.7862502+08:00"},{"id":193,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"fd613068059c593ac4df9eaef2918055","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: cmd/server/main.go","gmt_create":"2026-05-27T18:35:49.7862502+08:00","gmt_modified":"2026-05-27T18:35:49.7862502+08:00"},{"id":194,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"0bba4121c12e2cf427dc805016fade40","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/config.go","gmt_create":"2026-05-27T18:35:49.7862502+08:00","gmt_modified":"2026-05-27T18:35:49.7862502+08:00"},{"id":195,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"f8a733666ceab6a73ba2bf3234e91222","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/middleware/logger.go","gmt_create":"2026-05-27T18:35:49.7862502+08:00","gmt_modified":"2026-05-27T18:35:49.7862502+08:00"},{"id":196,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"336527cad207564e9ea86fcc4e0ec240","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/middleware/cors.go","gmt_create":"2026-05-27T18:35:49.7862502+08:00","gmt_modified":"2026-05-27T18:35:49.7862502+08:00"},{"id":197,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"2ba2f740fa3334f7c6d51f74470ec4b7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/middleware/request_id.go","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":198,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"6e3fd9bdc8a1ccaaa905d91772ecca2c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/model/brand.go","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":199,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"e9902bfcef1f5908b5123648ae6b07c6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/model/model.go","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":200,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"67d3253845127f03f1f9ebe3f6a6aaa3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/brand_cache.go","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":201,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"018b14cbce05561cfb50fe7e6e3835a3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/model_cache.go","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":202,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"a0b3e000a5b789bf08d2d996fc17d8df","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#25-101","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":203,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"333405ee9924108619cd8443f735d754","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#16-52","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":204,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"a5fb1691af5646ea8b4306ae97288e36","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/health.go#10","gmt_create":"2026-05-27T18:35:49.7872716+08:00","gmt_modified":"2026-05-27T18:35:49.7872716+08:00"},{"id":205,"source_id":"a7b9800e6fc68baa0cfda9c8f327b423","target_id":"a5fb1691af5646ea8b4306ae97288e36","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":206,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"de87fa33e6add38c027478dd3d0cebda","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#18","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":207,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"de87fa33e6add38c027478dd3d0cebda","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":208,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"09427d743a4be750f874418ab3e8504d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#18","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":209,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"09427d743a4be750f874418ab3e8504d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":210,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"9ebb4688793526b520ec263ebf651be7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#19","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":211,"source_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","target_id":"9ebb4688793526b520ec263ebf651be7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":212,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"5e813130e7885527f77be92dbbaee9b6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#19","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":213,"source_id":"3a1babcf090301072327433866c0d7d0","target_id":"5e813130e7885527f77be92dbbaee9b6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19","gmt_create":"2026-05-27T18:35:49.7892834+08:00","gmt_modified":"2026-05-27T18:35:49.7892834+08:00"},{"id":214,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"1992aa29a2869c31fe69ac701541c6ff","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/health.go#8-19","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":215,"source_id":"a7b9800e6fc68baa0cfda9c8f327b423","target_id":"1992aa29a2869c31fe69ac701541c6ff","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 8-19","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":216,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"692a2c6d49d4eb62f58600908dff9f60","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#13-23","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":217,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"692a2c6d49d4eb62f58600908dff9f60","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-23","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":218,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"c9df5e7b8533af65ce97cf085b6589a9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#13-23","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":219,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"c9df5e7b8533af65ce97cf085b6589a9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-23","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":220,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"d2fd0586bf019047d2adbcdf90e09224","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#14-24","gmt_create":"2026-05-27T18:35:49.7913083+08:00","gmt_modified":"2026-05-27T18:35:49.7913083+08:00"},{"id":221,"source_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","target_id":"d2fd0586bf019047d2adbcdf90e09224","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-24","gmt_create":"2026-05-27T18:35:49.7933132+08:00","gmt_modified":"2026-05-27T18:35:49.7933132+08:00"},{"id":222,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"bf1f0d1dece713e866e4a46be7784473","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#14-24","gmt_create":"2026-05-27T18:35:49.7933132+08:00","gmt_modified":"2026-05-27T18:35:49.7933132+08:00"},{"id":223,"source_id":"3a1babcf090301072327433866c0d7d0","target_id":"bf1f0d1dece713e866e4a46be7784473","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-24","gmt_create":"2026-05-27T18:35:49.7933132+08:00","gmt_modified":"2026-05-27T18:35:49.7933132+08:00"},{"id":224,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"c600af69dac497c7cf059a4bb2f033fc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#32-36","gmt_create":"2026-05-27T18:35:49.7933132+08:00","gmt_modified":"2026-05-27T18:35:49.7933132+08:00"},{"id":225,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"c600af69dac497c7cf059a4bb2f033fc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-36","gmt_create":"2026-05-27T18:35:49.7933132+08:00","gmt_modified":"2026-05-27T18:35:49.7933132+08:00"},{"id":226,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"bc6f53b403231c0f908654d3fea2102a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#29","gmt_create":"2026-05-27T18:35:49.7933132+08:00","gmt_modified":"2026-05-27T18:35:49.7933132+08:00"},{"id":227,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"bc6f53b403231c0f908654d3fea2102a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 29","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":228,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"7b39881baafeaea08adce31120b7c1e1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#30","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":229,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"7b39881baafeaea08adce31120b7c1e1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 30","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":230,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"dbe385204072d26c84bf169842961690","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#37","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":231,"source_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","target_id":"dbe385204072d26c84bf169842961690","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 37","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":232,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"2a723ed48cd9855068a04da6a33cb5e4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#71","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":233,"source_id":"3a1babcf090301072327433866c0d7d0","target_id":"2a723ed48cd9855068a04da6a33cb5e4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 71","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":234,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"9918f39149aaf1f5c3ec03275d6e3673","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#23-52","gmt_create":"2026-05-27T18:35:49.7948171+08:00","gmt_modified":"2026-05-27T18:35:49.7948171+08:00"},{"id":235,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"a19fb2ac137e43d92d2ef93e8d79f0a7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#23-79","gmt_create":"2026-05-27T18:35:49.7970098+08:00","gmt_modified":"2026-05-27T18:35:49.7970098+08:00"},{"id":236,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"d72b0eafdb65d1d946060cf944359251","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/search/meilisearch.go#22-45","gmt_create":"2026-05-27T18:35:49.7970098+08:00","gmt_modified":"2026-05-27T18:35:49.7970098+08:00"},{"id":237,"source_id":"a1ff50cc5809d0d712db343ab0befe3b","target_id":"d72b0eafdb65d1d946060cf944359251","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-45","gmt_create":"2026-05-27T18:35:49.7970098+08:00","gmt_modified":"2026-05-27T18:35:49.7970098+08:00"},{"id":238,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"fce5662f14aa6386a5036b5241e00b1c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/response/response.go#15-21","gmt_create":"2026-05-27T18:35:49.7970098+08:00","gmt_modified":"2026-05-27T18:35:49.7970098+08:00"},{"id":239,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"1eb8f107de13e2ad7eaed3bd6cf20a3a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#40","gmt_create":"2026-05-27T18:35:49.8048985+08:00","gmt_modified":"2026-05-27T18:35:49.8048985+08:00"},{"id":240,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"1eb8f107de13e2ad7eaed3bd6cf20a3a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 40","gmt_create":"2026-05-27T18:35:49.8048985+08:00","gmt_modified":"2026-05-27T18:35:49.8048985+08:00"},{"id":241,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"7e3954c3e70a9252de9cfdec52ed93c8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#25-48","gmt_create":"2026-05-27T18:35:49.8048985+08:00","gmt_modified":"2026-05-27T18:35:49.8048985+08:00"},{"id":242,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"8b0db394a538b6652de2e6634277ad0f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#14-21","gmt_create":"2026-05-27T18:35:49.8048985+08:00","gmt_modified":"2026-05-27T18:35:49.8048985+08:00"},{"id":243,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"72195f4e7a76b584cbdfbaba23db2a1a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/model/brand.go#3-7","gmt_create":"2026-05-27T18:35:49.8048985+08:00","gmt_modified":"2026-05-27T18:35:49.8048985+08:00"},{"id":244,"source_id":"6e3fd9bdc8a1ccaaa905d91772ecca2c","target_id":"72195f4e7a76b584cbdfbaba23db2a1a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-7","gmt_create":"2026-05-27T18:35:49.8048985+08:00","gmt_modified":"2026-05-27T18:35:49.8048985+08:00"},{"id":245,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"3e3a148f4095f6d36c64b1cfb3d1702a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#13-48","gmt_create":"2026-05-27T18:35:49.8120366+08:00","gmt_modified":"2026-05-27T18:35:49.8120366+08:00"},{"id":246,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"3e3a148f4095f6d36c64b1cfb3d1702a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-48","gmt_create":"2026-05-27T18:35:49.8120366+08:00","gmt_modified":"2026-05-27T18:35:49.8120366+08:00"},{"id":247,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"a6d16b8965ed7f207f19f8f915ad53a4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#25-49","gmt_create":"2026-05-27T18:35:49.8127781+08:00","gmt_modified":"2026-05-27T18:35:49.8127781+08:00"},{"id":248,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"03f26c7c55e18e6266ea8e543a032229","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#14-21","gmt_create":"2026-05-27T18:35:49.8127781+08:00","gmt_modified":"2026-05-27T18:35:49.8127781+08:00"},{"id":249,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"3c27d9274287839faa5269c34b98b6a9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/model/model.go#5-15","gmt_create":"2026-05-27T18:35:49.8127781+08:00","gmt_modified":"2026-05-27T18:35:49.8127781+08:00"},{"id":250,"source_id":"e9902bfcef1f5908b5123648ae6b07c6","target_id":"3c27d9274287839faa5269c34b98b6a9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-15","gmt_create":"2026-05-27T18:35:49.8127781+08:00","gmt_modified":"2026-05-27T18:35:49.8127781+08:00"},{"id":251,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"e0ca219542426b9141a89063f7052b0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#13-49","gmt_create":"2026-05-27T18:35:49.8127781+08:00","gmt_modified":"2026-05-27T18:35:49.8127781+08:00"},{"id":252,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"e0ca219542426b9141a89063f7052b0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-49","gmt_create":"2026-05-27T18:35:49.8127781+08:00","gmt_modified":"2026-05-27T18:35:49.8127781+08:00"},{"id":253,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"fce0c17d6c03e511c3afeaee662ad34f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#26-56","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":254,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"270fee7aef8f38c42409050388865f6d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: pkg/encode/base64.go#35-51","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":255,"source_id":"80d716769cf67cd05b504a3bc0a06a92","target_id":"270fee7aef8f38c42409050388865f6d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 35-51","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":256,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"5db111a430cac488cabeb543494fb917","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/response/response.go#15-36","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":257,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"8cf065ea198e4e0d88af1863fcd6ac11","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#14-57","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":258,"source_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","target_id":"8cf065ea198e4e0d88af1863fcd6ac11","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-57","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":259,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"d4bd0610a0ad3d8fd8d33ac5f4aa83b5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#26-84","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":260,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"b62090b5a8fe0cd95b332a46bb8eac3c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#14-85","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":261,"source_id":"3a1babcf090301072327433866c0d7d0","target_id":"b62090b5a8fe0cd95b332a46bb8eac3c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-85","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":262,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"3f830fae511ccf076a0f04192c9b4cbe","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#53-69","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":263,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"3f830fae511ccf076a0f04192c9b4cbe","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 53-69","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":264,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"d0f6f695e8187267487ad6b6fb8559b0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#16-36","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":265,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"d0f6f695e8187267487ad6b6fb8559b0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-36","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":266,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"8fab617bba600779abac7805723180a0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#18-24","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":267,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"006d91f2f5f75fd7cd586165c200ba98","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#19-25","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":268,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"1b6991f54b135de9969d4b357dcce8e4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#67-70","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":269,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"1b6991f54b135de9969d4b357dcce8e4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 67-70","gmt_create":"2026-05-27T18:35:49.8152938+08:00","gmt_modified":"2026-05-27T18:35:49.8152938+08:00"},{"id":270,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"86ac1fc7361002fc5d2c9f7b9b1ea754","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#27-36","gmt_create":"2026-05-27T18:35:49.821585+08:00","gmt_modified":"2026-05-27T18:35:49.821585+08:00"},{"id":271,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"86ac1fc7361002fc5d2c9f7b9b1ea754","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 27-36","gmt_create":"2026-05-27T18:35:49.821585+08:00","gmt_modified":"2026-05-27T18:35:49.821585+08:00"},{"id":272,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"bdfbf7d6f851540dee549606f7aca9d4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#19","gmt_create":"2026-05-27T18:35:49.821585+08:00","gmt_modified":"2026-05-27T18:35:49.821585+08:00"},{"id":273,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"bdfbf7d6f851540dee549606f7aca9d4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19","gmt_create":"2026-05-27T18:35:49.821585+08:00","gmt_modified":"2026-05-27T18:35:49.821585+08:00"},{"id":274,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"ba4653c42534e9835fb3db39fbfd5c06","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#19","gmt_create":"2026-05-27T18:35:49.821585+08:00","gmt_modified":"2026-05-27T18:35:49.821585+08:00"},{"id":275,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"ba4653c42534e9835fb3db39fbfd5c06","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":276,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"e5c6898e570c67346c0858cfeaa98fae","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/search/meilisearch.go#17","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":277,"source_id":"a1ff50cc5809d0d712db343ab0befe3b","target_id":"e5c6898e570c67346c0858cfeaa98fae","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":278,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"90b60f9dc283b0c2610ad113bc211315","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: pkg/encode/base64.go#8","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":279,"source_id":"80d716769cf67cd05b504a3bc0a06a92","target_id":"90b60f9dc283b0c2610ad113bc211315","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 8","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":280,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"85820118c846a111e112dc705c071116","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/response/response.go#9","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":281,"source_id":"703706c059a41213d3dbfbddc03fab12","target_id":"85820118c846a111e112dc705c071116","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9","gmt_create":"2026-05-27T18:35:49.8235965+08:00","gmt_modified":"2026-05-27T18:35:49.8235965+08:00"},{"id":282,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"491bd71f42db0fd5bf1d4851b9c4aaa9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/health.go#14-18","gmt_create":"2026-05-27T18:35:49.8256014+08:00","gmt_modified":"2026-05-27T18:35:49.8256014+08:00"},{"id":283,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"1041284bd46edf16a19f024c113d10b4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#30-34","gmt_create":"2026-05-27T18:35:49.8256014+08:00","gmt_modified":"2026-05-27T18:35:49.8256014+08:00"},{"id":284,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"1041284bd46edf16a19f024c113d10b4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 30-34","gmt_create":"2026-05-27T18:35:49.8256014+08:00","gmt_modified":"2026-05-27T18:35:49.8256014+08:00"},{"id":285,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"84be9fdffe58ef8cd5e77e0d3c37313b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#31-35","gmt_create":"2026-05-27T18:35:49.8256014+08:00","gmt_modified":"2026-05-27T18:35:49.8256014+08:00"},{"id":286,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"84be9fdffe58ef8cd5e77e0d3c37313b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 31-35","gmt_create":"2026-05-27T18:35:49.8256014+08:00","gmt_modified":"2026-05-27T18:35:49.8256014+08:00"},{"id":287,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"f034e5c72872862a675dd11e32404854","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model_list.go#38-42","gmt_create":"2026-05-27T18:35:49.8256014+08:00","gmt_modified":"2026-05-27T18:35:49.8256014+08:00"},{"id":288,"source_id":"75f8ef5ebd7eeb0cf2346b392f877e1a","target_id":"f034e5c72872862a675dd11e32404854","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 38-42","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":289,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"df50e47a5b6541093011bb59b1ec831d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/device.go#61-78","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":290,"source_id":"3a1babcf090301072327433866c0d7d0","target_id":"df50e47a5b6541093011bb59b1ec831d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 61-78","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":291,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"0a425d8fed248deb7202bc7e8d531ca1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/logger.go#10-45","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":292,"source_id":"f8a733666ceab6a73ba2bf3234e91222","target_id":"0a425d8fed248deb7202bc7e8d531ca1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-45","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":293,"source_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","target_id":"d6d27b00ae4ab42348e74a7e7bf688b2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/middleware/request_id.go#20-31","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":294,"source_id":"2ba2f740fa3334f7c6d51f74470ec4b7","target_id":"d6d27b00ae4ab42348e74a7e7bf688b2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 20-31","gmt_create":"2026-05-27T18:35:49.827349+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"id":295,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"fd613068059c593ac4df9eaef2918055","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: cmd/server/main.go","gmt_create":"2026-05-27T18:36:40.5191825+08:00","gmt_modified":"2026-05-27T18:36:40.5191825+08:00"},{"id":296,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"67d3253845127f03f1f9ebe3f6a6aaa3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/brand_cache.go","gmt_create":"2026-05-27T18:36:40.5191825+08:00","gmt_modified":"2026-05-27T18:36:40.5191825+08:00"},{"id":297,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"018b14cbce05561cfb50fe7e6e3835a3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/model_cache.go","gmt_create":"2026-05-27T18:36:40.5198012+08:00","gmt_modified":"2026-05-27T18:36:40.5198012+08:00"},{"id":298,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"7bfaa93c0d23eed2727039a5bd3d9a07","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/cache/redis.go","gmt_create":"2026-05-27T18:36:40.5203298+08:00","gmt_modified":"2026-05-27T18:36:40.5203298+08:00"},{"id":299,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"0bba4121c12e2cf427dc805016fade40","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/config.go","gmt_create":"2026-05-27T18:36:40.5203298+08:00","gmt_modified":"2026-05-27T18:36:40.5203298+08:00"},{"id":300,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"ac542a8b31381c132de78b921e3216d4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/config/redis.go","gmt_create":"2026-05-27T18:36:40.5208694+08:00","gmt_modified":"2026-05-27T18:36:40.5208694+08:00"},{"id":301,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"d2654fb48612d74ab0ccc06a3aede80b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/router/router.go","gmt_create":"2026-05-27T18:36:40.5214036+08:00","gmt_modified":"2026-05-27T18:36:40.5214036+08:00"},{"id":302,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"276b4d58e492bc3f7c258914abb959e4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/brand.go","gmt_create":"2026-05-27T18:36:40.5214036+08:00","gmt_modified":"2026-05-27T18:36:40.5214036+08:00"},{"id":303,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"4ca752eb084c575a36939921aeeb9984","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/repository/model.go","gmt_create":"2026-05-27T18:36:40.5219307+08:00","gmt_modified":"2026-05-27T18:36:40.5219307+08:00"},{"id":304,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/brand.go","gmt_create":"2026-05-27T18:36:40.5219307+08:00","gmt_modified":"2026-05-27T18:36:40.5219307+08:00"},{"id":305,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"b18d19ca2c60406b9cd28010df12296d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/handler/model.go","gmt_create":"2026-05-27T18:36:40.5224739+08:00","gmt_modified":"2026-05-27T18:36:40.5224739+08:00"},{"id":306,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"6e3fd9bdc8a1ccaaa905d91772ecca2c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/model/brand.go","gmt_create":"2026-05-27T18:36:40.5224739+08:00","gmt_modified":"2026-05-27T18:36:40.5224739+08:00"},{"id":307,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"e9902bfcef1f5908b5123648ae6b07c6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: internal/model/model.go","gmt_create":"2026-05-27T18:36:40.5230612+08:00","gmt_modified":"2026-05-27T18:36:40.5230612+08:00"},{"id":308,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"47165ac2566e8b2d3796014bdb75361f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: go.mod","gmt_create":"2026-05-27T18:36:40.5230612+08:00","gmt_modified":"2026-05-27T18:36:40.5230612+08:00"},{"id":309,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"e9390185152783a55f55e277d45e6948","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#25-131","gmt_create":"2026-05-27T18:36:40.5235889+08:00","gmt_modified":"2026-05-27T18:36:40.5235889+08:00"},{"id":310,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"e9390185152783a55f55e277d45e6948","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-131","gmt_create":"2026-05-27T18:36:40.5235889+08:00","gmt_modified":"2026-05-27T18:36:40.5235889+08:00"},{"id":311,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a3cbc373dacd9d032ed0c72bca1e51e9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#1-45","gmt_create":"2026-05-27T18:36:40.5241608+08:00","gmt_modified":"2026-05-27T18:36:40.5241608+08:00"},{"id":312,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"a3cbc373dacd9d032ed0c72bca1e51e9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-45","gmt_create":"2026-05-27T18:36:40.5246891+08:00","gmt_modified":"2026-05-27T18:36:40.5246891+08:00"},{"id":313,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"d65e653afb8b211f2e5a7845f72b45dd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#1-70","gmt_create":"2026-05-27T18:36:40.5246891+08:00","gmt_modified":"2026-05-27T18:36:40.5246891+08:00"},{"id":314,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"d65e653afb8b211f2e5a7845f72b45dd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-70","gmt_create":"2026-05-27T18:36:40.5252193+08:00","gmt_modified":"2026-05-27T18:36:40.5252193+08:00"},{"id":315,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a26d903ac77196fac97ddebf48638ab3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#1-100","gmt_create":"2026-05-27T18:36:40.5252193+08:00","gmt_modified":"2026-05-27T18:36:40.5252193+08:00"},{"id":316,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"a26d903ac77196fac97ddebf48638ab3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-100","gmt_create":"2026-05-27T18:36:40.5257547+08:00","gmt_modified":"2026-05-27T18:36:40.5257547+08:00"},{"id":317,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"7ffaf7b06ea96ca93862aa0dae926ff5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#1-181","gmt_create":"2026-05-27T18:36:40.5257547+08:00","gmt_modified":"2026-05-27T18:36:40.5257547+08:00"},{"id":318,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"7ffaf7b06ea96ca93862aa0dae926ff5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-181","gmt_create":"2026-05-27T18:36:40.5263036+08:00","gmt_modified":"2026-05-27T18:36:40.5263036+08:00"},{"id":319,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"187b4628003859e3da78f3937c686803","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#18-45","gmt_create":"2026-05-27T18:36:40.5278728+08:00","gmt_modified":"2026-05-27T18:36:40.5278728+08:00"},{"id":320,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"187b4628003859e3da78f3937c686803","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-45","gmt_create":"2026-05-27T18:36:40.5278728+08:00","gmt_modified":"2026-05-27T18:36:40.5278728+08:00"},{"id":321,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a6c526ea58aabee86ae3010b00441c69","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#19-70","gmt_create":"2026-05-27T18:36:40.5283937+08:00","gmt_modified":"2026-05-27T18:36:40.5283937+08:00"},{"id":322,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"a6c526ea58aabee86ae3010b00441c69","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-70","gmt_create":"2026-05-27T18:36:40.5283937+08:00","gmt_modified":"2026-05-27T18:36:40.5283937+08:00"},{"id":323,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a364a8daa183eaf86417b4c1bd2cc719","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#14-100","gmt_create":"2026-05-27T18:36:40.5289418+08:00","gmt_modified":"2026-05-27T18:36:40.5289418+08:00"},{"id":324,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"a364a8daa183eaf86417b4c1bd2cc719","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-100","gmt_create":"2026-05-27T18:36:40.5289418+08:00","gmt_modified":"2026-05-27T18:36:40.5289418+08:00"},{"id":325,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"2e040aabeb8e907eaddc6bbf2ee493ac","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#14-181","gmt_create":"2026-05-27T18:36:40.5294767+08:00","gmt_modified":"2026-05-27T18:36:40.5294767+08:00"},{"id":326,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"2e040aabeb8e907eaddc6bbf2ee493ac","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 14-181","gmt_create":"2026-05-27T18:36:40.5294767+08:00","gmt_modified":"2026-05-27T18:36:40.5294767+08:00"},{"id":327,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"3d315320639ece8212fd138420d94be5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#13-49","gmt_create":"2026-05-27T18:36:40.5294767+08:00","gmt_modified":"2026-05-27T18:36:40.5294767+08:00"},{"id":328,"source_id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","target_id":"3d315320639ece8212fd138420d94be5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-49","gmt_create":"2026-05-27T18:36:40.5294767+08:00","gmt_modified":"2026-05-27T18:36:40.5294767+08:00"},{"id":329,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"fbf36e29345cd3e53fd3a6e8234ad2de","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#13-50","gmt_create":"2026-05-27T18:36:40.5304957+08:00","gmt_modified":"2026-05-27T18:36:40.5304957+08:00"},{"id":330,"source_id":"b18d19ca2c60406b9cd28010df12296d","target_id":"fbf36e29345cd3e53fd3a6e8234ad2de","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-50","gmt_create":"2026-05-27T18:36:40.5304957+08:00","gmt_modified":"2026-05-27T18:36:40.5304957+08:00"},{"id":331,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"9918f39149aaf1f5c3ec03275d6e3673","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#23-52","gmt_create":"2026-05-27T18:36:40.5304957+08:00","gmt_modified":"2026-05-27T18:36:40.5304957+08:00"},{"id":332,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a19fb2ac137e43d92d2ef93e8d79f0a7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#23-79","gmt_create":"2026-05-27T18:36:40.5304957+08:00","gmt_modified":"2026-05-27T18:36:40.5304957+08:00"},{"id":333,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"32b7267a28b0347d59500c38ffa96a7b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#13-45","gmt_create":"2026-05-27T18:36:40.5320145+08:00","gmt_modified":"2026-05-27T18:36:40.5320145+08:00"},{"id":334,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"32b7267a28b0347d59500c38ffa96a7b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-45","gmt_create":"2026-05-27T18:36:40.5320145+08:00","gmt_modified":"2026-05-27T18:36:40.5320145+08:00"},{"id":335,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"b9c3c517ffd917351757137ca1338574","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#27-69","gmt_create":"2026-05-27T18:36:40.5320145+08:00","gmt_modified":"2026-05-27T18:36:40.5320145+08:00"},{"id":336,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"b9c3c517ffd917351757137ca1338574","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 27-69","gmt_create":"2026-05-27T18:36:40.5320145+08:00","gmt_modified":"2026-05-27T18:36:40.5320145+08:00"},{"id":337,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"df7d264896976fc8c5475257994c707e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#13-70","gmt_create":"2026-05-27T18:36:40.5320145+08:00","gmt_modified":"2026-05-27T18:36:40.5320145+08:00"},{"id":338,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"df7d264896976fc8c5475257994c707e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-70","gmt_create":"2026-05-27T18:36:40.5330386+08:00","gmt_modified":"2026-05-27T18:36:40.5330386+08:00"},{"id":339,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a3b89d2e56d589f8d902fb9389004bf0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#103-131","gmt_create":"2026-05-27T18:36:40.5330386+08:00","gmt_modified":"2026-05-27T18:36:40.5330386+08:00"},{"id":340,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"a3b89d2e56d589f8d902fb9389004bf0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 103-131","gmt_create":"2026-05-27T18:36:40.5330386+08:00","gmt_modified":"2026-05-27T18:36:40.5330386+08:00"},{"id":341,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"f76ee32725201731512db1e0e7951586","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#67-68","gmt_create":"2026-05-27T18:36:40.5330386+08:00","gmt_modified":"2026-05-27T18:36:40.5330386+08:00"},{"id":342,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"f76ee32725201731512db1e0e7951586","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 67-68","gmt_create":"2026-05-27T18:36:40.5330386+08:00","gmt_modified":"2026-05-27T18:36:40.5330386+08:00"},{"id":343,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"251d1b1dc197a1dc242f5384adb1555c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#34-52","gmt_create":"2026-05-27T18:36:40.5330386+08:00","gmt_modified":"2026-05-27T18:36:40.5330386+08:00"},{"id":344,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"251d1b1dc197a1dc242f5384adb1555c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 34-52","gmt_create":"2026-05-27T18:36:40.5350514+08:00","gmt_modified":"2026-05-27T18:36:40.5350514+08:00"},{"id":345,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a51abc6a6d80413bf60f143cd1f46ee4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/model.go#27-79","gmt_create":"2026-05-27T18:36:40.5350514+08:00","gmt_modified":"2026-05-27T18:36:40.5350514+08:00"},{"id":346,"source_id":"4ca752eb084c575a36939921aeeb9984","target_id":"a51abc6a6d80413bf60f143cd1f46ee4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 27-79","gmt_create":"2026-05-27T18:36:40.5350514+08:00","gmt_modified":"2026-05-27T18:36:40.5350514+08:00"},{"id":347,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"62d02336da9111eec3c5696aabf71927","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#13-16","gmt_create":"2026-05-27T18:36:40.5350514+08:00","gmt_modified":"2026-05-27T18:36:40.5350514+08:00"},{"id":348,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"f0b044854c85d50b2d1ba4b9d3e6a6cb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#13-17","gmt_create":"2026-05-27T18:36:40.5350514+08:00","gmt_modified":"2026-05-27T18:36:40.5350514+08:00"},{"id":349,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"f0b044854c85d50b2d1ba4b9d3e6a6cb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-17","gmt_create":"2026-05-27T18:36:40.5350514+08:00","gmt_modified":"2026-05-27T18:36:40.5350514+08:00"},{"id":350,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"3f0d637bef43d636594a4816c9da037e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/brand_cache.go#38-44","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":351,"source_id":"67d3253845127f03f1f9ebe3f6a6aaa3","target_id":"3f0d637bef43d636594a4816c9da037e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 38-44","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":352,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"3f945faea776f513b5294aa60759fb15","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/cache/model_cache.go#43-69","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":353,"source_id":"018b14cbce05561cfb50fe7e6e3835a3","target_id":"3f945faea776f513b5294aa60759fb15","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 43-69","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":354,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a272829cfc9c48e8063d8bca53cdebc8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: cmd/server/main.go#13-23","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":355,"source_id":"fd613068059c593ac4df9eaef2918055","target_id":"a272829cfc9c48e8063d8bca53cdebc8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-23","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":356,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"6d2fece0c97147748fd0269a356e4802","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/repository/brand.go#3-12","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":357,"source_id":"276b4d58e492bc3f7c258914abb959e4","target_id":"6d2fece0c97147748fd0269a356e4802","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-12","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":358,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"282a046f62f9715bfef882f5a4a6a362","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/router/router.go#3-14","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":359,"source_id":"d2654fb48612d74ab0ccc06a3aede80b","target_id":"282a046f62f9715bfef882f5a4a6a362","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-14","gmt_create":"2026-05-27T18:36:40.5371702+08:00","gmt_modified":"2026-05-27T18:36:40.5371702+08:00"},{"id":360,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"7e3954c3e70a9252de9cfdec52ed93c8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/brand.go#25-48","gmt_create":"2026-05-27T18:36:40.5405367+08:00","gmt_modified":"2026-05-27T18:36:40.5405367+08:00"},{"id":361,"source_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","target_id":"a6d16b8965ed7f207f19f8f915ad53a4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: internal/handler/model.go#25-49","gmt_create":"2026-05-27T18:36:40.5405367+08:00","gmt_modified":"2026-05-27T18:36:40.5405367+08:00"},{"id":362,"source_id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","target_id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab98c251-c5f7-40df-bba1-21b2edf5d220 -\u003e f4014d47-467e-4cfe-8549-1dfb69cbc325","gmt_create":"2026-05-27T18:36:41.1100061+08:00","gmt_modified":"2026-05-27T18:36:41.1100061+08:00"},{"id":363,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e d1a696b8-5a9e-4ad2-8777-04eecc0bb424","gmt_create":"2026-05-27T18:36:41.1111288+08:00","gmt_modified":"2026-05-27T18:36:41.1111288+08:00"},{"id":364,"source_id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","target_id":"599c0bda-3332-415c-a535-362503079473","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7563e383-3ea0-4630-baeb-e86efcaeefb8 -\u003e 599c0bda-3332-415c-a535-362503079473","gmt_create":"2026-05-27T18:36:41.1116631+08:00","gmt_modified":"2026-05-27T18:36:41.1116631+08:00"},{"id":365,"source_id":"cfbcaa79-26f5-402f-8746-9fe524993684","target_id":"795a5202-49be-4c11-a2b4-44312eca8ae7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfbcaa79-26f5-402f-8746-9fe524993684 -\u003e 795a5202-49be-4c11-a2b4-44312eca8ae7","gmt_create":"2026-05-27T18:36:41.1121847+08:00","gmt_modified":"2026-05-27T18:36:41.1121847+08:00"}],"source_files":[{"id":"d2654fb48612d74ab0ccc06a3aede80b","path":"internal/router/router.go","filename":"router.go","gmt_create":"2026-05-27T18:35:29.8906012+08:00","gmt_modified":"2026-05-27T18:35:29.8906012+08:00"},{"id":"fd613068059c593ac4df9eaef2918055","path":"cmd/server/main.go","filename":"main.go","gmt_create":"2026-05-27T18:35:29.8906012+08:00","gmt_modified":"2026-05-27T18:35:29.8906012+08:00"},{"id":"336527cad207564e9ea86fcc4e0ec240","path":"internal/middleware/cors.go","filename":"cors.go","gmt_create":"2026-05-27T18:35:29.8912536+08:00","gmt_modified":"2026-05-27T18:35:29.8912536+08:00"},{"id":"f8a733666ceab6a73ba2bf3234e91222","path":"internal/middleware/logger.go","filename":"logger.go","gmt_create":"2026-05-27T18:35:29.8912536+08:00","gmt_modified":"2026-05-27T18:35:29.8912536+08:00"},{"id":"2ba2f740fa3334f7c6d51f74470ec4b7","path":"internal/middleware/request_id.go","filename":"request_id.go","gmt_create":"2026-05-27T18:35:29.8912536+08:00","gmt_modified":"2026-05-27T18:35:29.8912536+08:00"},{"id":"a7b9800e6fc68baa0cfda9c8f327b423","path":"internal/handler/health.go","filename":"health.go","gmt_create":"2026-05-27T18:35:29.8912536+08:00","gmt_modified":"2026-05-27T18:35:29.8912536+08:00"},{"id":"4d2b98c1d0a7fa8cf9725fb65019ae0e","path":"internal/handler/brand.go","filename":"brand.go","gmt_create":"2026-05-27T18:35:29.8912536+08:00","gmt_modified":"2026-05-27T18:35:29.8912536+08:00"},{"id":"b18d19ca2c60406b9cd28010df12296d","path":"internal/handler/model.go","filename":"model.go","gmt_create":"2026-05-27T18:35:29.8917986+08:00","gmt_modified":"2026-05-27T18:35:29.8917986+08:00"},{"id":"75f8ef5ebd7eeb0cf2346b392f877e1a","path":"internal/handler/model_list.go","filename":"model_list.go","gmt_create":"2026-05-27T18:35:29.8917986+08:00","gmt_modified":"2026-05-27T18:35:29.8917986+08:00"},{"id":"3a1babcf090301072327433866c0d7d0","path":"internal/handler/device.go","filename":"device.go","gmt_create":"2026-05-27T18:35:29.8917986+08:00","gmt_modified":"2026-05-27T18:35:29.8917986+08:00"},{"id":"703706c059a41213d3dbfbddc03fab12","path":"internal/response/response.go","filename":"response.go","gmt_create":"2026-05-27T18:35:29.8917986+08:00","gmt_modified":"2026-05-27T18:35:29.8917986+08:00"},{"id":"0bba4121c12e2cf427dc805016fade40","path":"internal/config/config.go","filename":"config.go","gmt_create":"2026-05-27T18:35:29.8917986+08:00","gmt_modified":"2026-05-27T18:35:29.8917986+08:00"},{"id":"80d716769cf67cd05b504a3bc0a06a92","path":"pkg/encode/base64.go","filename":"base64.go","gmt_create":"2026-05-27T18:35:29.8923362+08:00","gmt_modified":"2026-05-27T18:35:29.8923362+08:00"},{"id":"67d9f7c1be7ff64bb9bca0a5f2492621","path":"README.md","filename":"README.md","gmt_create":"2026-05-27T18:35:29.8923362+08:00","gmt_modified":"2026-05-27T18:35:29.8923362+08:00"},{"id":"7bfaa93c0d23eed2727039a5bd3d9a07","path":"internal/cache/redis.go","filename":"redis.go","gmt_create":"2026-05-27T18:35:29.8923362+08:00","gmt_modified":"2026-05-27T18:35:29.8923362+08:00"},{"id":"67d3253845127f03f1f9ebe3f6a6aaa3","path":"internal/cache/brand_cache.go","filename":"brand_cache.go","gmt_create":"2026-05-27T18:35:29.8923362+08:00","gmt_modified":"2026-05-27T18:35:29.8923362+08:00"},{"id":"018b14cbce05561cfb50fe7e6e3835a3","path":"internal/cache/model_cache.go","filename":"model_cache.go","gmt_create":"2026-05-27T18:35:29.8923362+08:00","gmt_modified":"2026-05-27T18:35:29.8923362+08:00"},{"id":"276b4d58e492bc3f7c258914abb959e4","path":"internal/repository/brand.go","filename":"brand.go","gmt_create":"2026-05-27T18:35:29.8923362+08:00","gmt_modified":"2026-05-27T18:35:29.8923362+08:00"},{"id":"4ca752eb084c575a36939921aeeb9984","path":"internal/repository/model.go","filename":"model.go","gmt_create":"2026-05-27T18:35:29.892946+08:00","gmt_modified":"2026-05-27T18:35:29.892946+08:00"},{"id":"ac542a8b31381c132de78b921e3216d4","path":"internal/config/redis.go","filename":"redis.go","gmt_create":"2026-05-27T18:35:29.892946+08:00","gmt_modified":"2026-05-27T18:35:29.892946+08:00"},{"id":"d2c7a50459a83c5ef23e809b0f194aba","path":"internal/config/meilisearch.go","filename":"meilisearch.go","gmt_create":"2026-05-27T18:35:29.892946+08:00","gmt_modified":"2026-05-27T18:35:29.892946+08:00"},{"id":"0b4d10e2e0a550819cadaa7dbef9ecd1","path":"internal/database/mysql.go","filename":"mysql.go","gmt_create":"2026-05-27T18:35:41.7298499+08:00","gmt_modified":"2026-05-27T18:35:41.7298499+08:00"},{"id":"a0a3a762dc85a8d8c5bb359f5c523def","path":"internal/config/database.go","filename":"database.go","gmt_create":"2026-05-27T18:35:41.7298499+08:00","gmt_modified":"2026-05-27T18:35:41.7298499+08:00"},{"id":"6e3fd9bdc8a1ccaaa905d91772ecca2c","path":"internal/model/brand.go","filename":"brand.go","gmt_create":"2026-05-27T18:35:41.7304145+08:00","gmt_modified":"2026-05-27T18:35:41.7304145+08:00"},{"id":"e9902bfcef1f5908b5123648ae6b07c6","path":"internal/model/model.go","filename":"model.go","gmt_create":"2026-05-27T18:35:41.7304145+08:00","gmt_modified":"2026-05-27T18:35:41.7304145+08:00"},{"id":"c56e5254bd7f42350c5261822fa135bb","path":"sql/model.sql","filename":"model.sql","gmt_create":"2026-05-27T18:35:41.7309531+08:00","gmt_modified":"2026-05-27T18:35:41.7309531+08:00"},{"id":"47165ac2566e8b2d3796014bdb75361f","path":"go.mod","filename":"go.mod","gmt_create":"2026-05-27T18:35:41.7309531+08:00","gmt_modified":"2026-05-27T18:35:41.7309531+08:00"},{"id":"a1ff50cc5809d0d712db343ab0befe3b","path":"internal/search/meilisearch.go","filename":"meilisearch.go","gmt_create":"2026-05-27T18:35:49.7652632+08:00","gmt_modified":"2026-05-27T18:35:49.7652632+08:00"}],"wiki_catalogs":[{"id":"78b906f9-f81c-4bb2-b076-5c5609c7eb41","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"项目概述","description":"project-overview","prompt":"为 Luxsin 应用 API 项目创建全面的项目概述内容。详细介绍项目的目标、核心功能和技术架构。解释这是一个基于 Gin 框架的 Go 语言 Web API 服务,专注于音频设备(耳机)数据管理。阐述项目的整体设计理念、分层架构模式和设计原则。包含技术栈概览(Go 1.22+、Gin、MySQL、Redis、Meilisearch),项目结构说明,以及与其他组件的关系。提供适合初学者的概念性介绍和面向经验丰富开发者的技术细节。使用与代码库一致的术语,展示常见使用场景的实际示例。","progress_status":"completed","dependent_files":"README.md,cmd/server/main.go,go.mod","gmt_create":"2026-05-27T15:42:25.0250549+08:00","gmt_modified":"2026-05-27T15:44:16.3667749+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wV7ojrH0+b4JMz5OewwhBN1HmP/0rRww9hUnTCEZmNJO3yBTSwzDP2RxlM1vNSo2miB47OWpHJe/fbeK8YpuBtRbc1xpai4QWWh4AweGy0HEvW9apev3dOSAiTr8UoRTgRToJyEaxWrqZcs+MtHKRAsIrcUTt6ZOh39uAbnNwRxK9M2/DiD+kawezpj/AwiANKfd4KpHSMbzYKq9YTP0ksJkGEAjH/XwM331T75uP1oZ/psvBENTK57EgxUJQIxxl/qi9stybX0Smmey1LJ+iJDAfMqZYbs5BbkxPPLpvmXX8GX/lHaSvSv8bbbhTLnYiN+DawAvAhSIRex/qStKvjVXbzHUwrLiXLR5XSvCX75e6L5cIB4b+Mx86121DipgZvZjF7zEMzArfk0N5yZkwD5XI7a3kzfmH2BaXJoEdULrvDFX7ssODrPjklVgc2gbh9DYJXJ/eua5QA3Xx1lsmOuAQB7a98gCmD6wgY1fk9B5rsKGk7vjeRpn+VjuxS6i0t9dcHlhvXCrR7IAI7ElFcmatn18jtjyzt08iJ/2HJB3lwVKEHvC/D131ZrYoMax215Ho63ABv5IhWhlOacH3EHlX6kLvYaCiaCq7fkoW8IUfIUEJGPYMNiPdNXw8BHHJaE8Emy4eKyw7+C0K//+SPmGgkpVUXe5QBHZUCVde9qeHWFvjX7tIKhxv6DuRjUgaCTjlup8gJ49u24zpnUWcnA8qT/jl0wsGHfJi8eD0LLh0kE8XKQQ/x7QONSqCBwUYpVE0TaFITaD9jPqrfRmH7pcAVggsg7CrxVJKwukwntI7yyj4r0gvzmECsd41Q9FYOoPHu3IjRxN+OlXsp7yXlO8Bk3HtmqmpIVzy3rg5kNXkrwf98MEdjBWvI1SfpRXoliuppIkKLvshYbDq9zj7Gt5l1fDkWJrFTA59HAAa3qxQ1UvtlTV3x563VZo0DZofv2rHQaWxyL8gslH21B3jt1SClPzpPPC2ERp1waFgf/K6NltgqZg+qvCivqr8SOjn4ASj8olJuvcUYIqGIh4Glws6tboVkX7ItQuueGikKKhSflv4RIB28KosR6Y5EvB8oDFTNknPtjjj8fDMAdLye5AhzMlBtH3Ozvd7tR8DbP77ZPX3WIncMv8HHSXGmn8IwwggXYIKJ5fpuepkStOcJLSafRsijI2Jji/9y8ULNSvIJgGHlfsd+ytl0t8xFik3QfYqBtbBaYKauIWmP3opbaM="},{"id":"67d62b58-6970-45ca-a17f-f48cb2ea679a","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"业务处理器","description":"business-handlers","prompt":"为 Luxsin 应用 API 项目的业务处理器模块创建详细文档。深入解释各个处理器的职责分工、接口设计和实现细节。详细说明 BrandHandler、ModelHandler、ModelListHandler、DeviceHandler 和 HealthHandler 的具体功能和使用方法。包含依赖注入模式的实现、错误处理机制和响应格式化。提供具体的代码示例展示如何调用各个处理器,以及它们与 Gin 框架的集成方式。解释处理器之间的协作关系和数据流转过程。涵盖性能优化建议、并发安全考虑和最佳实践。确保内容对初学者易懂,同时为高级开发者提供深入的技术细节。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","progress_status":"completed","dependent_files":"internal/handler/brand.go,internal/handler/model.go,internal/handler/model_list.go,internal/handler/device.go,internal/handler/health.go","gmt_create":"2026-05-27T15:42:38.0124453+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00","raw_data":"WikiEncrypted:nTJcmZGR4n7nsIYUWzxCEHR9BTHxs+LY0EgcqY6ozHnPPg0CLCttcCJZTpOx5+g2+gyrhHkzQ3Oi3lFEBAWcJwtBf3fcUwrFRJbk5e8EGX6x+EuAIzfWxxMr70rCoOXyzGDz3OufTtvXqJeM6nCBBbrSJFJctzjIO8YwH2hod0rSa9BvOFL67fRLHnu5niCbygn6bT9T5Ad6YdUpIn1+mocnIZl+JxBlJ7CmgIePFEwhBbZ3HH9nKWBBaq8X7TfEL5bB556Dryv38amvl6Tlr9+oDWLzQ7durLm8mEoKTLumTtOGkLB6WdZ8ZnmAme8xYQEh58Gq/FaXq1Ch+bbX7c0sY3N207YdS+s9ADC7EYlu62+KRwIH+fejouD9Xai0SmElgzHAm8sdC//M7KELtxj0+UkF/DCTjTGZZa2sZbIvBheHRGA4uopAAdJW1z0WVUX1+aaW5BCD4sCbivzFSePeGIwaJc4S+FibJPlTKfStwCIoo5A6v8DO2AOPdiUYgzaMvqF1C4mQcHb7J2SBtLsaQepkGu+YZvBksk0Lz+NpJEH2FKFI+U+y8kw97WoPrimvQ2t44IJNHJc0WmycS/PNb2FSzM2E2hj7mtxsycLtn2LO5KOlRK85jdTSJFqGcYZzeZ6T7VK2yBxf5rRAwRATKfq58519HtZUycv0AeFGvOfYEpRMv5E+/9eF+o2hi9WqBURire5cWunx1RrVQTJ+QOs/ejc4AfuInYvURMp9uXUy62pRU8d9Pvq1zCbvM/QCKFu+YzdDyb+IucGj/GUmvrZTwLHZF2//WMylMOpEzsbGaL+cgwvPS0ZpiHx2Dr3KyQ3uIJaUsiQKXOOl46GI8mNiPEN4JP4rOorOH1+LOAd7a/LbC0xqg6Z0rlNQSQIc0ujM0D9L7WtfUrTKRHIwi89fdj2lY9xinRj8OsH2MnVNtkTirZPtudetURaBAmlqvomU4AzyIeshiJKP+D2WDwDSDXFuKCHzQ77xNb9Eo4ijpRO55+Xj0sqm0QGg4VPdachzP0AXWNlEvSbT3daOrRwAwKfxcK5nI9MjOx1lwFr0GcPqXAqx3khltksU8hfLyWdyQKr3kLrxNXwU7WQRVbWWtkTcfV4eK9lAXsF5YC50ZzKcz6RRHQERSKRNZWIgfr//nusobqJtFBZk8kBUZwgnw89udjyk7U6XLghzduw/uhHaMkS8e9a9eIcoHn57wG7KVE8q34/ItI6kF/9VYvcjQCGrboe1hmIrwG46Qpq8rKhq19zjM1N35JOLqbxS12v9mmyX0JhAkWIj6uO5FDPFOr7elw1yLGp+9r58B4mMPOFb/utyMhIn9nyKQ1SZJhWrvC46j8UUgKYX1zzNmDT57M8HBWkM027nRZTPuqHWLwy3BKvLdsip3/fM8IWCtK52p3SrvFjjDa3us6v6/+ldlLF+bAJPbDqMQ5Xd5KAFIRmtfI7Vt+3/elwQnV/hfncEobSgozbpi/+wxFDTehDxNn925sH6W0ft6ayeiO6l/Z26jrBSXhw0v7uN53zVoQheZdTZUOHGsvWz5HiGx6ZRWZhxdSZLlzVsU9hRdYgF/fhtW8nOSODxNk4oAkvprvgwx9TgdWnjME8piPjdlKsqcJKNXiNkMFThtdotd5/oVJWSUh6wEvdMmyJZ","layer_level":1},{"id":"591ea147-ba05-4d86-a671-941af668ca2f","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"品牌管理接口","description":"brand-management-api","prompt":"为品牌管理接口创建详细的 API 文档。记录获取品牌列表的接口规范,包括 HTTP 方法、URL 模式、请求参数(brandName 查询参数)、响应格式和错误处理。提供具体的请求示例和响应示例,说明如何查询特定品牌或所有品牌信息。详细说明 Base64 编码响应选项的使用方法和适用场景。包含常见的使用场景、客户端实现指南和性能优化建议。提供错误处理策略和调试方法。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","progress_status":"completed","dependent_files":"internal/handler/brand.go","gmt_create":"2026-05-27T15:42:40.190927+08:00","gmt_modified":"2026-05-27T15:52:20.2742155+08:00","raw_data":"WikiEncrypted:MpYke5d2PXdqtxI+drCrLtTQMJR2qutlXYM1eplHCPm9/Q2P6fWxhBRJ5bi1YZPWaHS/NqlGVpUFmW1DTLhf/76xGG0D1/eLqVfyND560PlQohHkNSJ7tG8q8rNN0PSoYa8X/dNeOTyE1A+uNuvpiB8VEfTp3tDUy+z3wJjo7Mac9XZxl3yz7HAEroJflv+CMaOLDNpuuFAizP+9X1/8yMamdkg455SQiJ4MA3tO8lvrplKeDtAsHnZMOuRb1k8H2J1Okf9ERLFkl/hajhx/ErZkMXJcVDAafq7dea3WDtuhkapO0hPBNT0jBx23jA9D7bdwpP8HUMhRQofKSrXSGWsNkOXGoTUbtKPcvqSXhQc/9ZnwEEWeVTez5dnt0TzIm14zjRSuX8WW7fn2EC5NSDXky9F0+kI+r1SW0lJAbI3S7/PzXMppdYjT5CIvUr4oUNfXpKuj0hpO8TqMLZU7tVSVTfLxNXN9GhtdNUotltCy+fTfIRE9oX+iVuqgGtGw1XfkviF0TKtN2+lC3tYHFIpPZl0lv2u1hS9qg5UQt86ZqNo0oyYG4iMTW1/PcJjvEh+ZouSCdeb1/NZXAghNVhgC+8CAFMY8ARl4571OoYbQgSJas0Ved/ljSKxbViyBTgk/eadCH+WuFgEUJPidhbhNV95LyTxjvd4d98Fz4GQj2038lVoj9NivalyW4v3H3DG7fUSW/wraV29VqX1jG8ICAA3c60Q5kE1oNPSUR1elSjYrLy3on9k9r8INUoZBOoRUyflFm5B6kmZvm44JlzVpRLRlNpa3erHjDw9LI3thWQq/NO7w72+KvFuF8zaQB3H1VyMGzou5eP9dokkthFbhCLnEofzO48Sc+x4zNRb2ub0rcxs3APyeA95SJ/c3J9UaFr94I+ITvJ+DlDyvoZNjoHZ4/PsNi22elB2RuhO7SsbQKIU3Nh9ngyjEqTmG6c+HSPzeLezD9npjOYrsjxTcnZkMSsIAqZRSPeW1VwP+1y42+EAhmnF9vQgYw4YM","layer_level":1},{"id":"fb8ae541-8bbc-4544-9133-e797be1433e0","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"分层架构设计","description":"layered-architecture","prompt":"为 Luxsin 应用 API 项目创建详细的分层架构设计文档。深入解释 MVC 模式的变体实现,包括表现层(Router/Handler)、业务层(Repository)、数据访问层(Database)和基础设施层(Middleware/Cache/Search)的设计理念和职责划分。详细说明各层之间的依赖关系和数据流向。文档化依赖注入模式的实现方式,展示如何通过构造函数注入依赖。解释分层架构的优势、约束和最佳实践。包含具体的代码示例展示层间通信机制。提供架构图表说明组件间的交互关系。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","progress_status":"completed","dependent_files":"internal/router/router.go,internal/handler/brand.go,internal/repository/brand.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:44.0573625+08:00","gmt_modified":"2026-05-27T15:53:50.4735252+08:00","raw_data":"WikiEncrypted:Cbw4rSSRJFTkFIVuyRiw4IoOVu9h4U/miV8kuFep2zRCWdjPBNlat3QQ8xqzDjxqnwEXQuPFqO2rdKF2PS2SXAKzDQAtOrwT0N0Bb1cVz1ybTiUFKF4yLIfZkQvmd4aTaafAMRNgGZZmW7p4Ef5Gb7g6VLCa1ky2b8mBvNur7HulgiwcdOzHhqi+XnXEdfba/+4TOqQvhA8OEJsD8r89uJDnH3WUxmiulVTnh8wTsjZ/sG6IRexTh8wnXF2Z3Pp3eoQrztwivE/v2tdi/tM+xK1ZLq6CQH87mEfFjtJjTQg257NwlL8OIUf7otektOR1U4nLWYMIIFT9ZnLxCRer9o+2+pnhIDCkzxWjQGwexhyS9T7Sq09AQ78taySEDIKsmPoPyWrRxYn284OLFkbbnE1kES3YlzGpQ1BX1HzOz4I69saOR3KsmELHh7P7qZT9s8U17TqLBKRo4LWPb9lfHPc2n9CNtaojQSYBresLm4Ta7KRF27FZXJKCUr2Y7A4p1QODq8Xxz7oxjv9ItKra6FFGv7FB+vqalxx2iPAp824obAuXeSRgvdRFeIQJ6R5siQRJFuZpQJW/aigbXEWcoP3A9m/wfRe0jaxEI100Oj9QQGRz3OGUeAoz62DjwUXCX4AUuMqRKjmjvBQP/xSKnA3j/lKtduUs9QoLJ/g3nrBj+jDR9Q6FoGxuKVUCy9+0QH35x8onGEu4z2bXyyujjA6eCclxoq7ck1+KWQfmShbEqnk+bd9dTRVQMaDBv2VgymZnIMvJEvLJFyAlmW6Bqc3qZkv9C8OH+uS90l66JlXniuUHlPinlQ+3/eJiqqMldDvT3oLvYeXLWjHUquxR0LFTQ9XFrzdxuOzsjbxhKaN+FjNZWN1d/J2TdK3LtYlEMaaxGQGsUxdTQuCIQqyQTc6n+yoXpTJ7xGtIitcxvZ6lOtQnLu2VN9ID29ySBKUeNTEDo6F486yfARaPMVjKVssURgEKlt5pEWVPnPPxd5YgYqn0dNm3g+hU3Esrx9pH0r2T8ity7CL28QWZWdthEpldnZLRdQHK7yf5ZTWBjij9h7ozRglKkjrqYtDyBCwmGNGnlUN/zURSFldO1RvnFPaGPmkGSGZaMA5jBaIqKElGCIIeGQcHEvM5reoBNq6Y71tWRTS7ei1SPsvnw2EYGGgUPzY8HealmML7QlT7utxN8WnldmX+B9tvQ0HNKwQBmMzgxPI0ycy7vcx4Pb95uK2tkKZfyxCAqZBZo2/oFspYlsMKwqPF7RMfFxnD5cQi90gF48iJKU/WEb6aXUbCDZrVdhXzg6IMu6iuziM3fdFSU20A8HaJB5hfLpDSE9S7","layer_level":1},{"id":"6e42204e-3d78-4997-a95a-3311c8fcaa43","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"缓存系统","description":"cache-system","prompt":"为 Luxsin 应用 API 项目的缓存系统创建详细文档。深入介绍 Redis 缓存客户端的初始化过程、连接配置和使用方法。详细说明 NewClient 函数的实现原理,包括地址配置、密码认证、数据库选择等参数设置。解释缓存策略的设计思路和应用场景,包括数据过期时间设置、键值命名规范、缓存穿透防护等。提供具体的使用示例,展示如何在业务逻辑中集成缓存操作。包含性能优化建议、连接池配置和故障恢复机制。涵盖缓存失效策略、数据一致性保证和监控告警配置。确保内容既适合初学者快速上手,又为高级用户提供深入的技术细节和最佳实践指导。","parent_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","progress_status":"completed","dependent_files":"internal/cache/brand_cache.go,internal/cache/model_cache.go,cmd/server/main.go,internal/cache/redis.go,internal/config/redis.go","gmt_create":"2026-05-27T15:42:51.5485979+08:00","gmt_modified":"2026-05-27T18:36:40.5405367+08:00","raw_data":"WikiEncrypted:qF2VoNuQmlFJjqRbYbbhOvcXQhVMYEksE+NeC2wRMGvQM2IjYFDS9siO1iO2s+wXGt5c4G/rGBotfHAKl+KluyLXHEbz0a+A38FZJBcg/xsLVn81ZMr/D2bWrBbJn2fpjSOko3snwikV7KEicvuTRLfGF1uyRD9yizrkBo2nom3vkAeT2lpfuVOpR2K8ziw+iZjkPanA9ft0p6lRydJ1JwCvJgauyfLtGQALZRi9tplifkJF67PdJVggGG+PdKlwoicJZ7CUXJDkAbaGVZr5ymUdKpVvpKG1qcLwU2j2lZ8AOZTvN64+XL+tFd5jH9zbEn1Dw90AfM6PdvqFTNsoEjE0Jk4atkXxxmQ+5YAchazygCjDmM6EsQgcChzHcQ1hVFusjC3Klt/750WNEMXdWPN6ZKDN+mdZcFuEX+TWLWrGqrC7bJ1vvArSMTCDOtmsx9XK2O1OkKu4Yt68Cw3G10JtB8aTo9uoK3dWl/SYtd5+Uz3pz4DOOXVx5BnQ3B8rTX+eKpDGDNoIQ4g7lUpLn75JpojKpK0Uf86/26FNBifL0DlkOBNPRBOykUd6SlwQVNrTRVTLeulhFzBh80b3azCsjj9FpbZ0QvpZ50Sc9fzE2yUALx8W3sIgrOKiJWb678CwiQ78abW22G1QZm0vdr6m2mTtkvQ6lFOvQ8cv9iKuM3uQusE5QVLmrBWkKT3YjsoyXWJyO4LmhkoCCum8ootzLJRbAM8RzcHBRWMi3vLkTF/qt7TcTi32nJEyxJKgWrbr9HJRnYwCGAHj9eGBCLbzTQLW1jkitLBsC8DrjKiCrD8GAlxYOwqdZMJisYcnxxFYqIoVg6/kJCFAgC8kyXn4eqYpYg2AE3eGNJlJmLXkkYJyowYdd2iqWts34bcoIKZ3bSe22uavQ1+HzINa5gRRgl0c2kimg2JxvxS39ZWcwsRwx842zMaTpYnL3biUxHNksXTQYvSmst1iuVUgUZUsVcEZOrTLtoxA3/Sos7KduaUxAyx3gaJt7vIh69kBNStH7n0S9n9bPr2EvlmZ1rXbfQ5004Sp3gbTBD3iTlF5CbRi6TcUJbFpp2V5Z/D5ghV6Bdd/gqOf7BGnHu7zAA/RGylp4QkLWfNtREhSn/h/WsQv7uvgvlCkmCoeAb8pnFa1aqu2nEFV7ugmL9iU92hvqgfwCcpRKnjJrAbzBc/VvBY2+mRpjbZrhnvZz8MVdZouSbaJbR+3wTeZPs2/s7co/apOf8cXOBEf5w3keVlHws6FkTrRVuSXBTby3kjsFVd97eFEYI6F3SyS7qg/Lz3GObMQJIqITwH9MN+kQVDVf8STYkmM4GAGfv3QMeNZcs5BdeDIPWibN2XOs0eqHsNHlCVV821vMW7I4JAu47667AlZ90XTG4y9javLSyJ0Y1iZ7GHTzywqrNwhML3fai5u81qYEck4NQPx44U+TpIRnbWoRJTVR7apgWuf+fP8h73g6wSgp6NnlneITQmVk+phyp0M4aE+ykNmZr6cTEQCQrPb1Q5B+FjG3gIT+A/bT3J287pdji9TRQR6+iTeJpHTnh3k6R13l+o+TEDI1g5JxmOrMAdxH/rb69JO3OWU","layer_level":1},{"id":"6de9a03e-f360-4daa-97ac-dc1cd1937916","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"快速开始","description":"getting-started","prompt":"创建 Luxsin 应用 API 项目的快速开始指南。详细说明环境要求(Go 1.22+)、依赖安装步骤(go mod tidy)、配置设置(.env 文件配置)和运行方法。包含开发环境和生产环境的不同配置方式,数据库连接配置,以及如何使用 Makefile 进行构建和运行。提供具体的命令行示例和配置文件模板。解释 APP_ENV、APP_HOST、APP_PORT 等关键环境变量的作用。包含健康检查、品牌查询等基本 API 接口的使用示例。确保新手开发者能够快速搭建开发环境并运行项目。","order":1,"progress_status":"completed","dependent_files":"README.md,Makefile,cmd/server/main.go","gmt_create":"2026-05-27T15:42:25.0297402+08:00","gmt_modified":"2026-05-27T15:45:02.5503172+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRS0qKOV1Xow/Q40Lf5w81YuuThtu0J6OFTGB2L0Nm95mISVZMGD73nREHXw2e/m/hzrb+N8ZuuUYDQ1FQZZcmT6YP+CSB9cZx9b8UZDJ08MCgp50aJvLLku23MEdwFc0gj3Vn9X1djLPuceJ7dwpUG3aeQmdLHCtxnEu4d1LuWHOx9SORMidWdUkvBpxZh1Mhj875BKw8zi1Bb10CuOVR0o/umWOKMxS7pa+P+krzS6ZwgQk/HiWvQgzcfGvyyQkIUoEtVfRQGP8gB4azIvJ540SopfP4dNI7lFdjUOwyTR0oyYuzDc8Y4dPgrwjMNGFkwRmsbMB5f9fKw1JT8+BoOVDOPoK1gHP/uXWcZx9Yg92aHtloj/wlf0IvlSbGhTfmFJrO/wjuSVP5sooJD9GCuVzNgSDitGoZkvsycpn320vlVFUPXtnf/VH0JOo5PM7BMj/zshAL+vsXkYjllDwZWM6DYEyETEwa0kfHBm7pTZ2bMQ4goUU1UQAPAjjbYf9VJAWxLZYVJf25SxXbn1u/PDKifLJNxgXRJg5OyBhyIL6jTJf2fuXyNcczL0GyfRvunp1WzofE6bAl15iIFcNABHPqdtKOV347seHgIIbxupRt/eFgrh5u1k/i5XAKbSXEquVhICmh4waR9rf3HeYisd/Nvj/4cpJISkhNXsY6Y4AsIpbPl0jiMSVt6jMRFgTGG51WgeuZoVPzdIDJMhk5Rc9mot1q4rK434Mrv6TJamzkwU5v7z7zy3gNx1C7wf2f4tHTVCj/Gc4KfVU+uuMRKcAAPB9bBC4uoO6zcPRroMIr+NLZN+g2CdsZ3FbJvsw/j0KEtYP8EeQ3bYak8dmhOc3c/A8LN+8UIlfyxmY1xVgbu/fvkIh9NW+GktKxQZcPfzS9ZE4KL1oKMxW9uavN/xE3hjtivmOAdhyqBhchbo6uwaAtv18ZMNOPoWLrgOW58/NlHdF4abXrwuX3YUwJHiMsjsgV6C7ZnTsYDrwXYRETPr7XXOmztvG+nYXkaHujEQtdAh/mf1KjWTbyY9qBthEG3zBTZ4AVcKt15anR6l8x7Of1pepg67m1lo31a+QlxkvmZdH6vV16tMnYHUR/UHYdSIb1yknP96PdGpWChgEZL4bynWLBFveZQSEhM057qMj39UgMZjHQd6YGbwA3ma+BnBwAMHKZSvFAMWN5arlTN9ZP2iLxhhiNniYPMQXdTviDJPYW2mRXPAgEhheln74="},{"id":"948e0792-2de7-47b1-b73b-e7b246e749ff","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"数据访问层","description":"data-access-layer","prompt":"为 Luxsin 应用 API 项目的数据访问层创建综合文档。详细介绍 BrandRepository 和 ModelRepository 的设计模式和实现原理。解释数据访问层在整体架构中的作用和职责边界。深入分析数据库连接管理、SQL 查询优化和事务处理机制。包含具体的代码示例展示如何使用 Repository 进行数据操作,以及错误处理和异常管理策略。说明 Repository 与数据库层的交互模式和性能优化技巧。涵盖并发安全、连接池管理和资源清理的最佳实践。提供扩展新 Repository 的指导原则和注意事项。确保内容既适合初学者理解架构概念,又为经验丰富的开发者提供实现细节。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","order":1,"progress_status":"completed","dependent_files":"internal/repository/brand.go,internal/repository/model.go","gmt_create":"2026-05-27T15:42:38.0130833+08:00","gmt_modified":"2026-05-27T18:35:41.8040874+08:00","raw_data":"WikiEncrypted:Zb5TNaG1u/mRrgPr+sDyChJtzwIYFTCqYOjGU3g0QRCfpxhFN6jbespPa8XDdb1bDp3AuvsVCECkcjmD8WGzuQA6ZBzaDsg2BTmcYyLiBU/fXFxRrjQBCKhw7EdY9q9mOD7xeV09cQ23lyqcZ1JxiKDMyZTkeaZinSw+CyeLncwBBkLF7SA+EUpvQg5T2V6UUZzmBynfSB91UbIwQkn4YJPkneRGbn4aSt/0AHOspw5uR45u8Vxo4vtsybyyQTwHZ0yDHq4kShUwCZUHQQCG6HtsA+/96zmlyVwiXTAZ0kDAkHvZ++i86OYR9tu1n0aKlFZ+TH2+00rQkh+c9XHW7S0/hHRX/JUjpuMRVxxoXAZ75GMYLIysvB/824kykkYyRbo+CFGYaiZ9NtwDTnSOs8Ijn38NFtETIPLu7TMiyF66f0M5i+C33aR5R3t6rd09ndi9opSCgekwPe/HFN32wUXiOhRQDFmo/oA2sVU+pF2Bc2xuDkJxuI9xhbYbVhtSVCyfKhBhxhZonBkonYsNsJZo/6O3G6BEFTGfNaxPgZdLMyWfA98xtzf2SgxAV1vUQro05XDbKk6dOFXpgHY+4z4xNNhAF4hGCwZrBeSz4yBHijT8GhIkcWP/JfkjlvtlBh39P8TiXdLb51y5Lk0ZIF+bkVeqSlJhfubmnv89A+Q1tKx2YK2fZkp4POQnQHG2/vmE3ZhJLui60ZSChiJf3ZmEwjjlmlbD3BQrq2hVj3k13oOV+GRdK5tMxS2ahYOc4uejEKaHZMm+yH533dTR3rpOYPYj2Y/E1GnYm0fQF+Jk6n2SAZEfAWAOMR+T3XfCERWYX6vJ12sO9r3V3Ya1J/ozczYC4vfqXIgFoIHUQO9hEyb9Uluj/u0uzjjJsa6j07LqjPJf2/GKThTbHE6+U9Ux/fS7oMiVA7jTlsLENTy4G/jkoOShYIeF8LLiDgaHHCXRP5a4SyK9Hg7ddgMvIoVO+sdfEX230MNSdy7R2rIPG2qi2RwhXgqOTychDohgjd/APhZf++/24Ci/vxfM/h7vXAmjJmArYIsoqCQdZrxdZh8mzN/mKKAYOvDHlsjmnb+a5AEZKRQlHRDoDvxdcv9K3nDrnrOE3E+xevf5ZdE2Gv61WsNpGrmoIDocBgfWKBHs8b6aTawPHWegc+IpPNb9p/SfNyGPP98TJFwmY88AhznK0Q1Rb+4x0WQUXfmRixT2/jwTeEIWDSRPOVCEXMX43u4TML/3bXa/4w+NfF8WcfiVyOM7JLJXGWPz6xT5DtM7wqoofnzzSy9j77ctcyaQZk2bZi4RTsbXhmR57IwgPWo5vswk5fpmkL8doGwBCDTcnK4x2Ri0HSZ1x0QvuVccU1jYZYgpgu3Cej5F5dTy4BsNPYksGiKRXIQoUhYYo5iA542Tai70Q64rOPyl4gHoDQXclqKtqJ5jWy9Yb6P8pHNkkCZsVr2XH7S9at20Wna+f/hC/F1sKLkH7XCuWQ==","layer_level":1},{"id":"8b3ba473-1cf0-4471-a203-9a87732dc227","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"型号管理接口","description":"model-management-api","prompt":"为型号管理接口创建完整的 API 文档。详细记录获取型号信息和搜索型号列表的接口规范。对于获取型号信息接口,说明 HTTP 方法、URL 模式、请求参数和响应格式。对于搜索型号列表接口,详细说明搜索参数、搜索条件和结果排序规则。提供具体的请求示例和响应示例,展示不同查询场景下的使用方法。包含搜索优化建议、分页处理和性能考虑。说明与其他组件的集成方式和最佳实践。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","order":1,"progress_status":"completed","dependent_files":"internal/handler/model.go,internal/handler/model_list.go","gmt_create":"2026-05-27T15:42:40.190927+08:00","gmt_modified":"2026-05-27T15:54:37.2236089+08:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT5dIP53cxEH82N4y2QAmkutwkd0KP3KAvEyUQN0CgerucfElkuIsDGzyGuldlZZBSDX//XqOqGZKP+QnmlgMLhVVCpCNWw9EHW/qmIVTQJxBtumOVtR8RGgSMrfzxaMVsu0eL8ZY2bOrDST6r17lVTgdrEdY1nQ8/+B+bkzQ65abRsvYiYrspSgJteye8d8XhEaqyOpAsROLv0P50tvHHJp3pH0uNG7lrGmAIe93f1OqwLCINSCxfZ8qPHLxTT/1qsC8mBTfx6bux1+J+Dfuz0Fr25e9dCzBo06yz2oIHMpYHNOV9TTNo0Cb2bY4Etp7T7BAVAWYdmCPqkIp4muaajavVH/dsG3SIH9RE15781XFeLnZpjK3/6SyXbQzhkntGT6UDzd1f7YIF/wsYN+uji3Ytz2tKz+YuJAr2Eu+YAeR5ONhXxZJufNXZqE6lFG0h7UGc4EYAADRkXK2AefSD9qXzxvGet5VJqYDwvW+BBTRWQB3HtSC4RgwTj0pGPjrHyjdXRtYabw+1Z/3qmXraEjCkcBZqY83T3pyfSdpygE/Tp7yYYmPu94xft9AqhG0xbLEJMTwW0ad3sFR22W7PkIMegzWRGtSSosiRq883B7ZAuea6PE+DdpILgCSAnEaNFgOXp9T09825iKyPsJ7V/ePwhLdj5Lg1Sf2Ar4u2WoKKzKmVNMqngve7AIqYVhGA6hn2tryumcq512jTxKeeMrtTR1kI+kuiFb4598z0y5j8dx7XsYW4ySYNYOvKIRMNvH2r3hnqBb5pvFv9gmk5vsVg/gSNlN4VOQsszd/o2lXQfYUaon0zYsdmR73UvkjhZMnufNa5tiCXZIFdcP1BTWDeBT/f2uOsftIky+JZFoyv9ZKzVesewLPArJaSxOT++MD/ggK/zn1vWZEgWgNcONx3sbyJnPoWEw1TiNMe6pxO3VXzMjnyIL0cie5BeVP1kiQ4S3XzkediOL2bQt4hjEMPkSuuLR7ryE23zbkEZpvwV/2TORoBY12Ii6KK5Ezg9F+aFO5SG2MvF2IZyMgpmnH7KIBfag8sIb3o2RSK6zo9lgRYbXsw7lfxPpBtPyHNpHfqIYgOLYptNzC/GBTVdTQYRLULRlp1XeXxGw8mlViYBltq/GwBlmKbMKrLjsczQPuxFX9mgcnTntc2Op+0ITGX/cW8pMa+UlI2Jgvay8k","layer_level":1},{"id":"ccdbaf47-6cde-4ad7-95f8-5b92d33e2440","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"路由系统","description":"routing-system","prompt":"为 Luxsin 应用 API 项目创建详细的路由系统文档。深入解释 Gin 框架的路由配置和中间件机制。详细说明路由组的组织方式(/api/v1 和 /audio),以及各路由端点的功能和参数。文档化中间件的执行顺序和作用,包括 CORS 处理、日志记录、请求 ID 生成等。解释路由工厂模式的实现,展示如何通过 New 函数创建路由实例。提供路由配置的最佳实践和性能优化建议。包含具体的路由注册示例和中间件链路分析。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":1,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/middleware/cors.go,internal/middleware/logger.go,internal/middleware/request_id.go","gmt_create":"2026-05-27T15:42:44.0579461+08:00","gmt_modified":"2026-05-27T18:35:29.939743+08:00","raw_data":"WikiEncrypted:awWreJ4vbyDoG0xJzdo9962/EguU7aHgylmLV0bXWudK991xRrNmlNXm6cdg1D0SLArIcaiebnTiIk5ALRoah1F7N/jEqTOdtqzUGvhnHHdkrdGKp1f0p//OiusAVNsUuzORJk8F6itQjg8sAzi99yjPWuxCoN6aFxuU5DDarymBvIgYK0CQgdSWKWpO3FtV08sV53wIddgHlB473zJxslXmlHxrqhCFKsvglAmKSSt22PPeGPXyKfKPXHvsBSLYicPvioimld86vMFqWGCXDSQDW3kmMOB94ARii5vldIVpP03ADv2SZjoL+Ud9+r8ROzHMdV/WpYKBvnC9QosSPRoQEE47mfXwV+eB65JlmVFTrURS9AImcV6aGhHmevyQMUt/dhK8C0eDxkoAXK/A9/yyWUEmd1NjNWqBjaZWVl/pFeEhR2eOKOIeB+UXVP2Lvakdksugbqcl/GylW4s4KtyO8mNHgsSofjrbh9MLgeZ2qIUWCEMflmtGYyeArjX3XihEb7LM+HraWDvkCDlrT82wSLVUnZAuooAhf/6ZhYBx1CnqvUoBquDId870T7PL/zly1HabWTLrWdBirLIjb7LZnJQCxmjhNNZdEXRTin13TqdurI+qSjJE6h6Cr2QEeblZheFaGTOZWdnZfcEoUKSGnr+4lAiU4WKuT5lUjF1337ohm40FiwQ51Vs0wM40mL5oIqfsgBx0dxpM+qoRn04cUb1lQQmdfUgj6AAC0F3JDVGF9/gxPVl/QMZH8QnUrNiDQj+xf67ilGPLibQkxKL9j5a6im9seqxZ+mKLuyJUNV9DRXXY6OXoYdjs5vzWDRXD7eApmYRml9IXGVOV+wXV157vDK8qXansO0wf657i/HImAUGe6NLP4r8a5LN+gBSbhdwweM8Pql/MIHT418oeIoS4h/7XP+wQuNJI3P4P9nk5ABtNRa4FDm5jhYOMC8nseUHuIvsVbaxiuqEdUsphInfeZ3JUjjRr2D73xXesdkqqfWfRQg/Zs95Tgbj5imbFKEbDXsSfz4rXyeMYGU4b8w7/PDmoEtH5YXvjNx7qZ+1CY0EeShg1ct9fD4PRzPgqg3m/DOQtCDJThysXe40MnfEBWVuADAxnUppmXUjv8/7cRgPRwshyXbbH3YknK8n4ghKebDlNyAI3wdT8DmwYzybxkOCLbYuGb+SyIy+7RfDySsj+RxZAhNtDfokTpBWh2B4i7YgNRc2mhzF4cEarUp/xtE+1BGqvxqF2PCg=","layer_level":1},{"id":"5b9847ff-f7b8-488b-821b-6fdfe2dbde40","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"搜索引擎","description":"search-system","prompt":"为 Luxsin 应用 API 项目的搜索引擎创建综合文档。详细介绍 Meilisearch 搜索引擎的集成方式、初始化配置和核心功能。说明搜索客户端的创建过程、连接参数设置和索引管理策略。解释全文搜索的实现原理,包括文本分词、索引构建、查询优化等关键技术。提供搜索 API 的使用示例,展示如何进行设备型号搜索、品牌过滤和结果排序。包含搜索性能优化技巧,如索引预处理、查询缓存、分页策略等。涵盖搜索结果的高亮显示、自动补全和相关性排序等功能。提供故障排除指南,包括连接问题诊断、索引重建和性能调优。确保内容从基础概念到高级应用的完整覆盖,满足不同层次开发者的需求。","parent_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","order":1,"progress_status":"completed","dependent_files":"internal/search/meilisearch.go,internal/config/meilisearch.go","gmt_create":"2026-05-27T15:42:51.549218+08:00","gmt_modified":"2026-05-27T15:55:50.6500526+08:00","raw_data":"WikiEncrypted:uPtIvUbMezH0ofnqqRSEthHE63LUAQzlPWMsHoJP+/Xvzp1zu9yMhdQo5+5IhHnrHX4ZOoo974Mq5SbaZHfjDGkMYXk9L6JwG6+nNMpoyLz7Yvtg+8V5E/tIsJ5Kc6+iYBU1An8SAJrGuA0Rg8PKKB2Lomw8RjlQO6aFo5tapv4T8ZcTSCEzPetfEDt4Ire/BS8D0NCO9C5peTRlECqqOr+U+OC5BfaXaEvAAPhu0+2LKV5pUWuqhJB8wS0sZ1C5WaKdq3GSgEsQPwvpw2BQ1jRzPp5Gw92/L6CiOkLBRkvHdCH9dpObT+Fc2bTPTxchCzPA1QxWkqYjFOEzIs4+c9QWuFqGuEbrHq+Ferc28nVGyeEv7Tu6l6m0Xe3CTg9tqdBgkd6r9Y4uV4bh0didngLNjO9xEjQiYo/ssQ7aeCgh5CY89JkKjbhy8iWFLtMr0REWD9B4Tb/USBDRMoljXzRJ+rOWL0o28fL4U5wl0ZRerKn1Z4oHbe2uKMx1+wXerr7aDOXN5JCqdJfUuX0X6xn/ZHUrsqiQHGXkRCXBeXGZYjdzLtsrL01/BtT1EzCiD0xUVjPPE9dWXXwHexSANSMPsC/RJmvwwlMon5lzHXlWN+FkX1N1OEax+N8FY1eBxIWLiwUWps0/IwghwilZeXcNGiuUf7skRlvM6iTjpc9QQeyE1h7qrU5x4xCrlcYc2S4pQv+WEFB6Va33skBqhNrCO1vIUjki6nAesFzcnPJkaWwnmEBipsjs1BuIUK3wxXWrnpgcFUZbb6WvFF2WRI15NCO+jImJ4SSo2vAvVRKF5JFtZlABOifDyJCkfMwUyU227ch0TmMp55pYqp3NoLQ7ixrqRxaPvxFda40SlBqKe2Yzuiqm/73r4Oc0T1zXequgzmTkaZtRaq5yqAJ115HA1HLcYITiZngQbSWTnPeVbWsb+DCPd33lIKZ8fXEGiNBs7vdikdYx+6vF+1EsrQeSjHfD0Ihmk87cLn4d9La5SoLzDfOVJEy5iZpWO3AaUZMZ4EcPE1r6ZMeZ8EUGqXQ9Nlpb4InQHP4W7ghwsYHtL5FFeja4OeMJNBxHgnOAypiJ8tPVobpLX600FfUsZDv09Mcr1xhbylBxsRrlqA7Gn3sOfbt0DZUG0uo0Rk1ME1x2rP5Xfa5lQH0t+tS5FpyP34T6dwqMGEtcccz6Je3BiN5IyE+vUyFHw+FdZ7gNtZ0hDEfzwP2qOWZT+c3Qsu+6MyhWHPs437C1isiJNawoEnOiqCV9kWhig5+ztneMD35zhcCTEgPu/Bm/bEThy3Rdd7iZFBdoU4vYaqKC7n7/DByj71DHngfpIkzvddxnNY3z+MxRPwwc3khnmY7jvA+4rooEThszp2Uu51YkzKA3R8OCZX8akGsfWwzUIQK2BB/CZUj5Y837fb7vEzAC6+ILo7N1OoawujgMXPweHQI6XDnpbNfOnLfNxXqPfgUApYzsPZoGGtPp5WSaiLcCw6qMXPNJVzEQq2wysa7phID6rq9Pl1LQxzlIH6h9p8v0IkxQMMloAiN3ufObHM9ygq7zggt971iApCCae3R6XOA=","layer_level":1},{"id":"0506348d-993b-48f2-936c-908972f149bc","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"系统架构","description":"architecture-design","prompt":"为 Luxsin 应用 API 项目创建详细的系统架构文档。描述高层设计、架构模式和系统边界。详细说明分层架构(表现层、业务层、数据访问层、基础设施层)的设计理念和实现方式。解释依赖注入模式、中间件模式和工厂模式的应用。文档化组件交互、数据流和集成模式。说明技术决策、权衡和约束条件。包含基础设施要求、可扩展性考虑和部署拓扑。提供系统上下文图和组件分解图。涉及横切关注点如安全性、监控和灾难恢复。记录技术栈、第三方依赖和版本兼容性。","order":2,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/config/config.go,internal/middleware/logger.go","gmt_create":"2026-05-27T15:42:25.0297402+08:00","gmt_modified":"2026-05-27T15:45:15.0922502+08:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5QXmatSKh1iukhkKRz99kcWlEvnOwuqXvA4ZgQ6tN+ytovQp8yiqJicl84VZMQ0QFU2VsQju8IpcRws9R+O5UqWqyS/p2d/juMO7CcvH5Z71CG7eM55PPWPy+SJ+QNdupFqroK3bd/LSj0CxhfnVajICVNkUN5WBZxRD776A1wRS/9o+f2rU9gRAuwITsrHMLAbGKP2R4CWvSRvdssG+ipznfcduSvnmuao6OKPuV4jqBbRKw4zcI6RvA8OzqjvEzd71LQGHM4pSLSZHCpXNsVLsyx66RKMz2ehGMgRX9mmwX6tatCTNGRawqOaeHsAdZQVRO5F/B6eOmBUnLjBLXMFaj9NiCqZXNSC4hsNcV2NHNsgCUG4d5ZrRt08xhKOHc0qnU6uPcmCoIrcH7BzrDe0ZgsfQ5XPv2VLskL9VH7jP/iok3665UNTbFEMp+0VrHrtj3MGwZoOPjci63/k3b7LG2CemZFYRL/bBs4bMFcslJ5zofo0Udc21Z14UtDMqmtYl8JWFBrQXBiQmeSQ1WnHwlcbw4u7v98svD3w+hug0ZVtbBIzPxwFMvWxUfRg4bYDfaYuu9TTbJDDZVS6Ob7p0LyJNbyCA5QPrEI1J8F8PhZ4Q4jLG7aMJugVeyzmc86juCVMOMHEp/N4hziN6xK/qRiJHM3tNljxXReJi4IufNYJTXLNXYKvDPvBIyDFn2dE2mCCXqEozsEjZ+v1q0e/qlU1dunYg8xPxrsTLDcF9K1BoyCvSx+UQiB4ONUP+JxX64QXTtp+IU0v0seB2KMrqPn0/L+A8OWuXVZTvRwPavFOv5itZOdJAwA/V5N2eufZbLHqMglD8xPwtGKDElVmGnIo3BZVNSoRZySK0fotmIw3xMqHf/TIgp731ZvXaZCaKCnXvHmW1NCCQkqFwBHBcq3S04NwWv8UMSj+HNCHd++vSABXVmaVxgqblXcKffFrA/gNTjqBgt3JGZZI97/WtLhJ5rCuiZXimpuKRBCG9Mt4/TZBFvL8EtkrKKRM7s3qaiXo4+rxMwzBW5q7TSyuCkv7qZLVNg0tvqAaU87jlHeLK1szXHS95TJbbbwjv67i8S5YYoSfZZg4iWUWizvHjGv9xeSfB5oZEfizx8EkEkD6rutxWWUarg7NVOH0fJqslwz3lkocZU2+RLK2kbH+JbCdYfCoZ6SYU+W5JDYAfSxLyvGhW5sDb3XXYFtD9X30uW8TOYGcvIRawRJbAjmJmdlrT+9rFcYHVaBJHtLDAkEnSUMNTxZgsSUCulSQNjxAV66NfhnKRsTJ2+M3dqXj4LldBrlK0CwEZUrmzutKSXsYqB/x3yFnXshPVlWG0HqDXi77z/VH2PwAlmUZi30yCiL3c+D3rtHVruIK0y7+TJeQIcHCK8c8WmqIMeA6Zauq0wgWtGrI4ShyR+BKhcQEtCGA0ZPrOitzD+oByp9nJy/p/jyDoJ2KbQk+UK+DxYjyyeOGMh023Ioq+pZwhbHjNF8MPtVdr/ZTBpHSWIfgC"},{"id":"e81027fa-c24e-4492-8100-f051facb89c9","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"数据模型","description":"data-models","prompt":"为 Luxsin 应用 API 项目的数据模型创建详细文档。全面介绍 Brand 和 Model 数据模型的设计理念和字段定义。详细解释每个字段的数据类型、约束条件和业务含义。包含模型与数据库表结构的映射关系和 ORM 映射配置。提供具体的代码示例展示如何创建、更新和查询模型实例。说明模型验证规则、数据转换和序列化机制。涵盖模型扩展、版本管理和向后兼容性的最佳实践。解释模型在不同层之间的传递方式和性能考虑。确保内容对初学者友好,帮助理解数据建模的基本概念,同时为高级开发者提供深入的设计考量。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","order":2,"progress_status":"completed","dependent_files":"internal/model/brand.go,internal/model/model.go","gmt_create":"2026-05-27T15:42:38.0130833+08:00","gmt_modified":"2026-05-27T15:56:31.7808704+08:00","raw_data":"WikiEncrypted:klcgW2PbPxJambbKMzvFtzxL0nPpsuPMPxr5hj83lS7zLbVY013R4TC8XNEUYbb5qxIyzNIzP0UIL5gcgWgb2JN3lLqRFiolKSir3QefPwOA9n9PyEgt3UyqdWtF063zcOhUCuBNMrBuPrwe5CLRNYPjpeT80bmhf1WCbW0Wc4soOdqZfNatqkw2uzcHw6lRPr2OtTCqznVFik3UW5X7OSPl2Ttad8DOmCF+RIgP5/y9rHCmETZIEnQAjeyLbBXbw6UgR8f5iLkYVBNC7MFGFybSCmqrbPvzuYIucnF8DA/OBQbccvz8He0YhGp5Ug4qlUVtOLmA0SeYTnT3k5tD1obbgsTO4qQabKiW63BMDIgOoTKlnAxC1I4m+7qzShvq8Br3qYdH05fujRftdqvZ3vwdt/v22MmEtMVDy773q7E6UAWYYM5ZFpzQm0FMEmNSl01+1H3g/6NLTH9eP8bwh87Xu2V+U7zgrLU0hd3RZ0OahjypNpLHcMl2lXk/R7L7r4rqIN25hBQ6UmXVTgJaiLUx3de0ar0mjZESOIFPklc2p7+a+gJKnsuZ302S24Iqoj7AavR3Pi+VN/ZiDIP5Jeq/kr9vnhFkMn6zcXxG9uhrYtLkssRve9T9PQea2j7e01+V/IRE1erymaIw4LR2+ujdhB0V60mQlH0Z/YHMAaj2SBzGB+QTLKTIYabYR2UvD5j+cjFoa+Gbv0JVt7WMtqYL+CA4hSSdAuR8tMIXc2t2CcnnQa5O6Tn0MfMrcJ7Vdd5GeLy3KLSJMiyAdGf8tQ+JZ89A+1fQXxuEAa7TZZ3BB2Y832o5/9JIpgOQz/5oUXiHMQMoJPg6JwkfMJgMgWRzYBfhqRR15ceTQaxuMvii3FPvdiqa6G37kowws9zAmlHMZWT58FopOSivkLJCWodvWMrHAkMS8z8bai5nPSMfxSVyZw1PIyfCY16u8WPVBvxU4hqjJyB5Bp8wM0yN5480l3wa1Q3fuEzaJKj7nPjtU4N9gPI8QOahBMHpDjUDymEe2pFTNRoGiNEP45Jp4RyxlYSX4cFgV4meLKhbXpXHiY0dnAaKfBc9jAtgWdWnmviK0GLQ/jILxdrqE0PICXi9+4yqSRI2Ry0zpRi3qp0Y//pb6taUy+j56Vo8zoIsZTAucPdhoOaagkLsFMjiBClhwGTCL4ddbbDqwou29yxIdZ74gd0bOsbOrVf2Cle+fOknD4NoXKDGYaQ+KHd3gixYUsoET/IXmUN0vFu/IGEzI0R0XrwFDPtjlVbg16+Sht26Ty4kWon1FNcLN3BCZRX167pLM/oB/mh/MdCRdaEZ0DoXfwegSeXYwGho7HJZDjiwFdafr+1MXjd4UgRw874LAKL9N5H4GLBDCG6lvCQ=","layer_level":1},{"id":"8b7558c2-be32-47b8-99e2-1964009b4337","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"设备管理接口","description":"device-management-api","prompt":"为设备管理接口创建详细的 API 文档。记录设备信息上报接口的完整规范,包括 HTTP 方法、URL 模式、请求参数结构、响应格式和错误处理。详细说明设备信息的数据格式要求、必填字段和可选字段。提供具体的上报示例和验证示例,展示不同类型设备的上报流程。包含数据验证规则、重复上报处理和数据一致性保证。说明与 Redis 缓存系统的交互方式和性能优化策略。提供故障排除指南和监控建议。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","order":2,"progress_status":"completed","dependent_files":"internal/handler/device.go","gmt_create":"2026-05-27T15:42:40.190927+08:00","gmt_modified":"2026-05-27T15:57:09.2032126+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvOUiHqohKn6BWshWHivzY4jjRdHovfIvtJ2sB9MDcSrupgUsB93CF5gLCd86HZ+9K0WcrorZ9lipKx/OS3vd+kUisB7ExUabBXlss9QTm91m5fLHe0jeTIgrcbTRB/E6TiCq7LQKIbDT/vX8e7gGsXm7c6bJS+oGkiX4dvfSGGxPsTJAzByQh9zKq0+EB1Cdehda7LhobHHhD/zrFU8gTYLmATkOqk43kMtWFXfUxZx4vfa6jkkrn2Yy9ZXvHFDce0ofKtOVLfq3hKZi9k4owDfhOWo1Diy53e4Nq65RlOEImu+zThrRgYRk0za0MnIJRjTpwcuh6BKDwprXShIUp4xbiPG3TFnnTMAA93o2zAcKGb2Ca0Qt/QT8wY2uCxaVwD0GXGQGpI93ttiS+EfxOpjoxc+xkTy77AI8niJq+SBImduJC+de4cefpYZZm2E9MmZSUbEbDEvXBi0kIgnFiSH/BigSv1UA9JM4cWf7m3AvwqqCGKN7CNtERiJxTyhs8xDKqxeoR4CRHtZ0Po30nTlEXMrgkyjlnvdlkRokDUi1ZrRl7UvaUc7IAQFie+6dHuwt4/iZkuQJMydlgb3ysz010zMUXCSWtnqb6yQi0Y16jkKXmPgBl1ifYkUYzIrMzr+UZZHq7EwLVVjj0SWvnNnHeWgSst509csZcp36C60qyP/+8XjGBbVMUoTVonu89qUrotxb4Dr07k7YzT100WjET+IOcrQfLKiHM2SO/HyTfGKSpS9/T3JoW4mI+tVwFQ0QFEey51AmMN72D9I83sYo/INqWjC4cAhHr/IiAxVTtcj0s5xI5pGgOAv7XNXGFPmc4X+rf4C8k6zxIWMCOirykNyiIF2cm8i/LUJFrD+sqdGCVdilSQlsEgs0Gf0faUDYAUNQdylOw+rNDrJMNPGktUsoxfdb2WBc63/L7nV6pPm7NnpU0xCDhtdG0/jq9hEyEESN6V7L7bOvG/csrwRuKnJZ65RFZNlodDK+JNRUhn6yPOkrG9uC0NU12cyBY+r8Su9MV/6ozEnnNWpxhuM=","layer_level":1},{"id":"bc6825c8-9aa3-4f0e-96ca-ef4925af0570","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"依赖注入模式","description":"dependency-injection","prompt":"为 Luxsin 应用 API 项目创建详细的依赖注入模式文档。深入解释构造函数注入的实现方式,展示如何在路由初始化时注入数据库连接、日志记录器、Redis 客户端和搜索客户端。详细说明依赖注入容器的替代方案,即手动依赖注入的工厂模式实现。解释依赖注入带来的好处,包括测试性增强、松耦合设计和配置灵活性。提供具体的代码示例展示不同组件的依赖注入过程。文档化依赖生命周期管理和循环依赖的避免策略。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":2,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/handler/brand.go,internal/config/config.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:44.058506+08:00","gmt_modified":"2026-05-27T15:57:20.0074643+08:00","raw_data":"WikiEncrypted:Mh1qeXd3vDrFfJakTA2LVPk895/C8yZ/nxc225NJgc/vaOsdHkI/4otOCFkjHjzGbvDeu3NfvNrTVuHfsGzx3dTon6sTOx2eqYzt8f1TpTMBkynZ464lQq/2wtKdG64LJ046YBidJFw0ZIeaCnDrSGq0XciHKDBtepVmFvc3BWHO81I8gofhmEgiJhls+KdsMfDjsRa7M0G749YeIbqdVds5ERm7uOgH8tBY2YpTkxOsuOlArfwWtnc/XtjHNW1JrezQd9Mid0eOpxaMqgE8yaFeTmGavv8vNNdwkPtoQaRIZjrbbiqxTvEUceUQYbCYQRtN8pZ3IPUSyl/t5LmjfI8kcvGH9WDuz9YzeYHPRMxg8qhmGItUtY5Mpls5ivH/EIhLrZokNcrV5iUHEjmqb+XCRa4yG0StkWI/9ZNKERgMX67LixsijqQn0vqlkUufnCRPCP87EnYdQqECcP+43/+HHmvfgNL2YqVlrJqTwAbRfkIOiR3RzC77UVxXk9TDkvoSu55Qg5T1DUnOUSH3YHIkfOdMt11bVZaQveJDn8eKF6fBu1S2w0nsgVRJUYN4xWDBb67St1qj/284vBE3o80iLbKGZuKALFUmDfFJrRWZxKz0EkrEzGEHLZlY8gqCMlDvpIDasl1U8U3c4akb4qk+YO/zjLohUFROnbeKRIrU66oQ5vJmycIgrt6M4+rjAVUkaEguxq+ntt2xZNdA99vs2cNQGXIFbb3h6nnwxQfKvVVV//1SMfISmnCs34BYxkwVXBcadfbrEOM6CtcYBMqCXvzWJ33/FXvJZmH/A2KAbLgQ/kpz2RPmPzOUT7cKpJqB9MhC3DXdQfZ4kFUFzF+13sJwXPOJvel1igPgOiAs1rrZV85YJXrrc9ZY46pVGQKQ3yekIrqt0EK0vaAgj5oZyrRLz94KdhvIpCIUMd+M05SmsY00TRk827U95uJFIInVhtoOKMS1CqgSM1yQIa/IIKz/s4LEl2UelFpJEOmaXLT9gan8Bsdu2mXOWE2iDgTUhjhHSx1rYeN5EPajgxJq2tyvfti61Ohcm+s2CPxSV7LBjGbAZq0X/r6myA7lLsQQo8uf5F/GMloMEPtiXUyyLW0EJI19rEx68+ZtpIUPNoESaao/sS5ANWs2d2VH+YVdF+I/ZvuMKKkfIgFbf+JvjYdCHS0qZ94BTAzNJdhWzOqdw0ImHLop6nEwvJI2oJ5GWhZGw9jP0WFmwV65RfKVPOZRZTPvo9W2tCb0ZQo=","layer_level":1},{"id":"f5a7db4b-765d-46e4-9395-af7bbe8d8fd3","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"日志系统","description":"logging-system","prompt":"为 Luxsin 应用 API 项目的日志系统创建全面文档。详细介绍基于 Zap 的结构化日志系统的设计和实现。说明日志客户端的初始化过程、配置选项和输出格式设置。解释不同日志级别的使用场景,包括 Debug、Info、Warn、Error 等级别在系统中的应用。提供日志记录的最佳实践,包括字段命名规范、上下文传递和性能考虑。展示如何在中间件、处理器和业务逻辑中正确使用日志功能。包含日志轮转配置、文件管理和存储策略。涵盖日志聚合、监控告警和故障排查的实际应用。提供调试技巧和常见问题解决方案。确保内容既包含理论概念又提供实用的操作指南,帮助开发者建立完善的日志体系。","parent_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","order":2,"progress_status":"completed","dependent_files":"pkg/logger/logger.go","gmt_create":"2026-05-27T15:42:51.5497484+08:00","gmt_modified":"2026-05-27T15:58:35.6424946+08:00","raw_data":"WikiEncrypted:U7R4DE1TfAUvjZuFqogRLnOghdG8YONf1+EXGFfCCKN64XPQEDdUeRHtBVRbgq1RTfu+PHdhhtH3Ub4edjV7OQOmQQeOhgljoi3HGtSqPVCQvF+mHbx8hRLjpVdCwHdXLvW1Ns4CDnqx/UVLCA1IVbunG2no8Z4rHywszGt/xnqU1gTE2kg8t6xAVG7XfQvH3irlIr1G7/Y2/+RWxJWLz/5H7tsKGpmrGhw8RSd3hVQPhG3iSp62UpI4Jxk/d+OrEUWPuwqJKtZElc7QKOmFaL2Ou0Xm32XwADHOmjYzJyNTlscSdcecUG5KctRPumjoy0gNP7qCfrs8gUDdHMzL6ttn23qdEEZPNbh+TYWVIWnXigmIb8ZizIpBBvi8lgdSE6OX/M698aF13vXXWYsV/gWx1aMFvyo0U2/RQWwm33tMeBdIwK+36gcgiSFDbE0S4b5hb02VMCuasWvPPhMQloVwTmpRX9jLlSWIxElvqhN6JW9Sj3tn9asGgB2y7sZ5hd9DmoUifCyNwMYaKDr87XcM5YtUgyXFquhGaFcY2+CEND5OlVHePB/BTWoyBiDCLgXpicJborNdI7/Nscjq6w3smcCa0ShFdrQ2c1oxL/nowS+0Np2YD/mGUBQfJGct62LTGIm3ejRTFJcHn9bsk38oD3Cjniur0JFTE+jhM3c2BIpd1A8qaNgOfFPuLR038U+ZzBwSYPk0ujoLLSuHOTfKvppASu1MMZuPFcqe8LG+ceVp0xjkx0BKLaD6HrjbpSDMXXMVbNnJU9shT522RABkZEeCFibRDEdFCO6l4jLtyCPaHZCPmGOvHOj5lizmbQtmuBYHEEG+eGYYgOBv/wev3hPI59DkbhTIXpIUwxQ1+0vjVdabnEPEBVxCuGVGDC1Aea1CzWgqA3FLHFtIDExYaEo5YGKlWQn85tDudAmcoD/Ru2NWdGGcW1Ypp7/NWX/VOzYfaGmEEYVbZm41M/SfkgFawUphZc5M5cRj4OG4/tI8ZvDx7IcwIwu4FwPm+21LyFqD1gm86CbkOJ7lK1BH1kl9o+SMXw9VA3snaZ4GGhpaHvgBFvZLH1oT5ZI8GXrTUvuCfq+i3DrDdnuhElM+h3ewW+lMfyvo6DUCbSK3PvLQbsO8EEhz7rAUVsLkZVc1MS4u5dgtYaZte4H71gQszMPb5kdmZW8ys3JTlZlpjsCOMDj+LregbU7ysvd1xZC+GFB1f9RtMNfyIvB0/60vzV8BkymNhb+K5giaTcSKv94wsV+wIVqxR3DGo/CyCs7AbdIof2wAC5ApaWIxrX7XM87JVZkSCS1I8KGN2fVloq5p/lFHvEn+z0UdPd7f4wsFgOlczB3xEz0FolPe/utaK7QT5lmhGjbdBcGumMq8QwGZYYsZk8z3RCjTxi+NXI9NIx1lGzzdjHtr/l0gIU/8oiKa8KYSVjsH58LX3gtmmM2UImLU6+FrVEaFDK8wBB23SJgK41j/mcvuuwJNAg==","layer_level":1},{"id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"核心模块","description":"core-modules","prompt":"为 Luxsin 应用 API 项目的核心模块创建综合文档。详细介绍业务处理器(Handler)、数据访问层(Repository)、数据模型(Model)和统一响应(Response)的设计和实现。解释各模块之间的依赖关系和协作模式。包含具体的代码示例、接口定义和使用模式。说明模块的职责分离、依赖注入实现和错误处理机制。提供扩展新模块的最佳实践和注意事项。涉及性能优化、缓存策略和并发安全考虑。确保内容对初学者友好,同时为经验丰富的开发者提供足够的技术深度。","order":3,"progress_status":"completed","dependent_files":"internal/handler,internal/repository,internal/model,internal/response","gmt_create":"2026-05-27T15:42:25.030488+08:00","gmt_modified":"2026-05-27T15:48:30.8195851+08:00","raw_data":"WikiEncrypted:bpQ1QlMq61uqjeQzqQaeFJ8lEiuSQp7TFZGpUgKRJgaf7PT+zt7MmzNkqVEU0hd1ivmcFoQ5NrDuJye6YrJgMhvUC8x94MX9xPrGNOjZI+5X4c+vLlR4Y9di8UWaiF3ePMWFHZ+l5JpFZY14y0Gmj+mg2jg6ynoSHd4F8iD94Ksscd/cHjiFkz5KV1ZDKSVo0Zk43RijuZRD+ZvrVDu0XmtFrZ3alp/u48vDDtq64kS9QZdDuR6Wlu7qiT9NwgX7AiaDJqJ4R7dPgxgm6Mui+BQ08Oeq08iURJiXTO07UxLp+uzs2JqJsTrShJlYr/1DePotYHyji38fNP/IbITC4bmDtRqP/5BMbZ7k9hlh8bGx0EWkS6uNkxCgFDuaNHgykTVXSiKrKRDSWgLmKInyhnzBbCcH73bVc+oVtcoSBXixSUbTl5gP1Ig+Y7wyWeOoPHPDdUn77U/OcrSdTkZNXYm4+/I1eIujWEUg4gc3eye74LI568bySPdOk6ZoKG7u8TBv2E0BC3tLW6pJFD6RRArV26sWYSdHsaCumsfOVUgYjGHkhQhsYwKt6buEJZTy7sv9olRDHoi1qy0k9PbRIDacX2cJll7l0u0jXnnztZGx+9+HQ3H08P26RSQB9mNCVtihrb3zqn+nn/fHaVP6TLlA/fFESM0VIGwPT/3NXgKCrGhgeLaw610W73Kv7Ad4zTf/FWsHJ6uv/LC2qfCo9Zt20Voo8N5CmmqTJah6KgVEvW8v7BoekBUzC7ZPGH4oCJeTk4kIoVfGbX7ACMu5mplivQVLaQWQfMElRG+s7oBrbN95CCShpR7S7J59DpnFX/IbgIScrW6X9QGEyoBrPe4S0LA4tnTBU7d2g8RsZDWloZJZbIBi+isLt1JA6fWqwfZ//t8ItkkzPmQJIFJNOR30i9z3wqQAHliGK0F+EqacD6YYn1Ryvt/d8nhRJJDZ526J2xz8X2pZKja+oeGAwU+edSxkfqjTZ87fqFunqnQMbZ5zjs/JzrFvTHlR43EYFU2vuK9YgZ9UJIHtxvPBAubNcuFc5aP4J6GqrxUrF6h/ZAfD1Zpj43GWztuTnhRy2w8l4xy/B722d+K8VBXpE6k7/b8KNnkM/5fSrqgzE1pAlbi0AWtXWfP8pgWRLo+r+wE+BALUxNC80jMVfYGnnIvWU2rzgcJ1YmWOyznQOZu/mNvoUI5AqEDSCzI/ow+21CW0sEvfypb9HKynhsg0JfiAAPvdBZlGmCYs1rcrjp5RoagygMzTGEu3jQYQqwRC8ctiOr0SIvoGaRfcZ2XBEPnjYwAQv2ZdUT7MB3cDleI6Eevvvz1GwXLldlBytA6hHLrkC3mCCZW0+qJiwahbJ5Ayi4uuem08ScBJFqUVxqndMyTN7+7v98xiEKLumUia0Wn4eDjobEwAEosPbMS2pI94b5xVXHj/QHiBfCTdbnlX+vTiLOFU1YW+322ZmO8m/7EPabziKO20Mgff19WPSw=="},{"id":"e2d8da89-04c9-4fee-8dfe-adfaff79c9c1","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"统一响应","description":"unified-response","prompt":"为 Luxsin 应用 API 项目的统一响应模块创建详细文档。深入解释统一响应格式的设计原则和实现机制。详细介绍响应结构、状态码定义和错误处理策略。包含具体的代码示例展示如何使用统一响应格式,以及如何处理不同类型的业务场景。说明响应格式在 API 设计中的重要性和一致性保证。涵盖错误码定义、国际化支持和调试信息的处理方式。解释响应格式的扩展机制和自定义选项。提供性能优化建议和最佳实践指导。确保内容既适合初学者理解响应设计的重要性,又为高级开发者提供实现细节和扩展方法。","parent_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","order":3,"progress_status":"completed","dependent_files":"internal/response/response.go","gmt_create":"2026-05-27T15:42:38.0136404+08:00","gmt_modified":"2026-05-27T15:58:41.4408299+08:00","raw_data":"WikiEncrypted:iaIcfwdLscso9uJYzNYkBwQmMSDrN359f9FMHjOmg7ClR23tbv3dTo6S+mZPVOhFdDzmxIISHKSsp2mIHtSHucIsRTVIuVJBLVgxbLtBw+vYpBthrkKp7ZsmnvjWGy5He35k2/5gy4bT+0fHVhDxJakT8MktDZ/BR/eSlGlnIY5RrC7zFB41KSVM+DwzGHJ6wFsSBTONLyyruobUVduEU7vzMZj9sgtAiHvFL9P2SHh3KcDKpQJaSF6kzMxfuHz+RjE2JrSS7jCHMh0pHTgddYdXs0A21pKoq1Cz9ewRb59irUcIZIJum0fCoYabjhhlkabgVWpIZZl9yI9tYbNT404kkRaJxst4Jxb567lxVXj7z99S7Tl5HxaCXddNPmiUawv0vJsTzd40DhW2ZDAviR3GRAUDUyfw3/+7dQvIEQR/e/MrQlblG6A55TurcS4CgAI1GLwDIWQneG1pO+BCAgXtQPSmpqB7BgjGxlBSb0Mc7Ozk3IATXCWF2Gz/3rMiwdu/lCfL7wtHHu7F/8j5tAKZVzSyjHmJfXLPZ5kHt6Y7AdIc5TZNDyi/LrJoXnYx7u7cHY15CrJc/tEbrztzQ1iElkaTNZ08r7RV7F32Es2t0ynCOMCVirx+HAUHpAOaAdrSai+26wUse4xRm/FkwNZtv+w2OCnTZs5KwT9H5tUVsmqVWyBhSeXHtGkuvUyqx0IINIHQnBhkIpxCdOwzkXTumXWy8tolLEPQSJECMUeYwxFHpvtC6vAQckxS2amrDMWK/GTvxacGzKQom2peJWZZJ0bUQ3pgm7a7YDJZHCC3jH0cq0BoCXXUU9d95pauWlQP2/IZMyuUcH0X72/xZ5xKYPNJuyeVPVzFTjkaZDzPAbyCCKrXJFs8tjyuNkSuRpPaAh4kSgxL6/G5WXR2Fwe/QG2rpK9IUOEv17HBevzn6Dbty0HUFB3zxObA10u7Kx+3rfpfr6yzO3k7y7wWuKpzPhYJhrIS+TCgBZjcTIteFPYWuoj87paGFovSmvqEB9DkBU7xawc9cRduspe3fMlYvFSHJJnaIDWeejeQuwwFd0JoBgOkeMPtCVTkj/SaZimKyefQLYyw5AAu0rj+5IqJ+HGhiB456prnmou8yIC9ws2NUc/LeK3qMNaM1Tkf4lPPKffZ282PoNA1rMelkw4Vu6gXVHkuVRLdCqcUZteXbuH+Qyr/pATu1oc3mOV34LzJDJs8AC1k47iZmX/sSGNZ957wolJ0WWZow24CiUWZtP4/Pg51r9qwhsqMAp7p602Sup+i5M11Gg09u0cyRanD+hMX7HCnsebpyCyxZVvB9jhaZJ4sNdDLWZKhRcBfm4gGm5v3l1Ep8tABF5fwEQ==","layer_level":1},{"id":"4b0e33d8-28d6-44dd-b90a-57af5c6cfaa9","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"系统监控接口","description":"system-monitoring-api","prompt":"为系统监控接口创建 API 文档。详细记录健康检查接口的规范,包括 HTTP 方法、URL 模式、响应格式和状态码含义。说明健康检查的各个维度,如数据库连接状态、缓存服务状态、搜索引擎状态等。提供具体的请求示例和响应示例,展示正常状态和异常状态的返回格式。包含监控集成指南、告警配置和故障诊断方法。说明与其他监控系统的对接方式和自定义扩展点。","parent_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","order":3,"progress_status":"completed","dependent_files":"internal/handler/health.go","gmt_create":"2026-05-27T15:42:40.1914576+08:00","gmt_modified":"2026-05-27T15:58:27.2611572+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjCM7vFjnlRAhPoaEN0ftdCdBUTnleag+HHtjerxF8Yo/aNSQCvWghRAmFaNP5Ate+OnNgrZtWxUTlolKrwVliK7qFYneTgLhtk2O0DExsEj8rE3wciXyMoLthA27VSFS1hEh1vYjSsYzEvIq9/P7ebtCx3WZIPnPyfLgw1cXSj9siM5kzk0nmt4Ccf6gZaDZuw0Bp7WplXSset9XbcxKPL+MMIzax7BxVHZuxA+Xr0km0IickRzt8NBUEER7TSRBv327JwCiAS8fQqpTdjIoYZaoZD0fB/NTnHP+9Ak0Q0/FKYlXGSAVzh3CgkU+Bn+Cg5ZTP9yyUsZCouns8PsujUZ2npUR1PLdj9hkBS03HbNE8lSbaX8OU3ViNNk1DL+T4pp2AQ8kjAuM3wbk0fgx0dNKLVy5WY3PlBQ20Fx/tZebK5ym8FUGSHChyldzRq6ZYkNg/glvq7d32Xl8fO5iVdMwkqg1pt1O211CYPFuEOhq+EKjmlkG0WCs/2ee5aQCsJwhqN/Ya6IeDgL+9Db+zeM6x5OiHG8FmYl+N582mzAbn2+xbvZqxlMTJOHjWoHb2LewryAHz2W6QEWwOHKtx09+ET8stLXhUowUkW1gy8qjK+E8U+dj3UNXDeo8cAiAnEvjdmuNwCC15pArY6OHVC9X2U5Vpj5U5NUQu2JMoFgwLq4N3PTIxjJ0A+VzuBk/QcYMjmo7LrfP3y+wJaUZn2vsFEIBQ2eTRD5a1Pe13jvgLYJNHUEI8RJfy1p2pZIQyFO8NTC8GoKJhnSQ+gTu14mmS4S08TCy0fu79yKHrmq1Mxpx9FQeGvkkDg0fwa8pu4D5GP0ERsG/CD6v72/U0UcOO7d7Ncz6OJ+WItEmGuCm3eGoUCNtiJjI5slrLxxlLM3hEF/nte/d/5N2XBVG/xn6/YDvrzqEyAFgYUT/UCUiuGiHkv23qhBSjI24q6ODYIHl3EPfycQLGVtjFwMMFxs=","layer_level":1},{"id":"f351f338-eeb0-4243-921a-eed11d063072","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"中间件模式","description":"middleware-pattern","prompt":"为 Luxsin 应用 API 项目创建详细的中间件模式文档。深入解释 Gin 中间件的工作原理和执行顺序。详细说明 CORS 中间件的安全策略配置,包括跨域请求处理和安全头设置。解释日志中间件的结构化日志记录机制,展示如何统一记录请求信息和响应状态。文档化请求 ID 中间件的分布式追踪支持,说明如何在整个请求链路中保持唯一标识符。提供中间件开发的最佳实践和性能考虑。包含自定义中间件的开发指南和调试技巧。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":3,"progress_status":"completed","dependent_files":"internal/middleware/cors.go,internal/middleware/logger.go,internal/middleware/request_id.go","gmt_create":"2026-05-27T15:42:44.058506+08:00","gmt_modified":"2026-05-27T16:00:02.1508768+08:00","raw_data":"WikiEncrypted:KoBWq/Q7Adld3nvKT6YAXjbeYGdbE/D4CStunsqJjgl0jPyMgacfbAcsG69IjV6W+YAUulkiH6yJh6guJ8xsLC0r674enptjON7n1TyvEmDvQ0ts2hwoFwrID/aMzsWc6ykTfCUAJOOlgk4w+ArbzUldUGx6slnJqOHO15q0hPQH7GaO0RDoayr+zF5Md89ka3FMbDJBSe7XpA6zdP+wNXSd04XmKPO4VRjZqmJkxAGC8VFm4yVB97+PFqSyh68UCvChI56FzzpLF/5BFK7vdhB4RKqA66aNRDf4DW25UaKG5whiuqjk/HYzMhxcvIfnxNNQENyjxYlMX1sZy4HsMgkgx/uFM4++tYIvF03t17sV6inMrzPeJGGPuhlz/8276En11T0U+vrBLHt5cuHwwfT9/TbnmX6ii+DQAK6bIQ4TouGACknzbAKKYD527I1FVSQgI9EoSN0pbR8fm6ONx31WoIHCHWp/YV+KoNG4BqHkATQ6ytaki/qaUL/ng+odBZvDmXBjiEPo39VVePVK04bIdD705zKajkzvowecnVXm2AKaMJ69AGERz8Yh8e6TmJNgzoBcYyY4mEun80jcRmapIRl8c8YHgH0NMwaVSwcLqiudxnv3oQr59HZzPqbA2lsjZbIb2PrDETb2QeWum0Fm6rN2Un2jJWVpT0EznojYQrzEaNxrIPMOL2v27AiWIqzQv0GQ3sqciy6SmZiuq2wPG7HlS2A2zZkroeKz2FOR+HQnQPJAYla49YW7f6gn/xufwFLQ2P09Vv1PN1pyxXpNDEuiTqHaVp2kzhv9oqymB7xkMgUWjzJxA3LCPmaLv++QPEBFdy6p8cW4yb4I4EhhEKGmNSkUraKRcmosg4NWFDcipy8qHZXRbF6teMWiB3RRRisWUnfoZUcGgAFFGscCtU6FRbrdh8FZz1dO6dwy+o2iUkSDe5kR8tnRRbjY/fvtiPqMjoBsHuvLo8VgUj/8p4Z2FzifMlFm47HXFcnhNcTyNHadq/BKt32asbZMkyf5mwAazzbaJZ9zE72kKw3V+IXEq2k8PQFilZeDtHzxWba+6jseqSydPEZeopZAtR8inj9373angdQRcahgfTWP2Tu1JM7pp/nx4e/XGXgcV/eAY6K6bheHMiVhe8uqpViCaPM56DFwiJSu8jM4uJ7c2z87Ru/IU7jBjcCel2qrMTwxGrIxl3LJQWNXYmFvWXKFkw1YzGjfH/CiNBiu4ygHy7YalDmDnEePypwhiyZ25shL/pX1OxbV8m/tNZmv4AAk3Q9YjR6tRGu+hpIeQQ==","layer_level":1},{"id":"8085e1b7-3658-4490-8b52-9a61f3e79976","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"API 接口文档","description":"api-documentation","prompt":"为 Luxsin 应用 API 项目创建完整的 API 接口文档。详细记录所有 RESTful API 端点,包括 HTTP 方法、URL 模式、请求参数、响应格式和错误处理。针对每个接口提供具体的请求示例、响应示例和使用场景。包含品牌管理接口(获取品牌列表)、型号管理接口(获取型号信息、搜索型号列表)、设备管理接口(上报设备信息)和系统接口(健康检查)。详细说明认证方法、速率限制和版本信息。提供客户端实现指南和性能优化建议。包含协议特定的调试工具和监控方法。如果适用,提供已弃用功能的迁移指南和向后兼容性说明。","order":4,"progress_status":"completed","dependent_files":"internal/handler/brand.go,internal/handler/model.go,internal/handler/model_list.go,internal/handler/device.go,internal/handler/health.go","gmt_create":"2026-05-27T15:42:25.0310242+08:00","gmt_modified":"2026-05-27T15:49:27.8891715+08:00","raw_data":"WikiEncrypted:aJsVvsatVVT+Oax9nwx6A6Ka1Sy3/Ax3fbdr8CSPsFwpSinOHdKPUiaO43Q3eH/wzCti2uFNYtfdvQWqQWpEsnbUBpqKCbRzHWFAT9Lm270y0Q6B1UE3nx+gx/6onwH05kgU4aSL6Vyf/ZaJTFKBZpR/hASnZEkssdX1yTnZq4HGLCbeLR5p3acQeZtqIab449ZqM5BfhYg1nC4veZGNU0ZbTVY2/+9U92yhi84zrKmyuO7gZe6RpeJW+3R+pbFduijY8FtGcUobIv+f3QcPEH7ZWqwynHO+v7PrlM8OHoMZ4jNowBv+/rK9cg9v/ZMBmZfMQEKxsZsOp3fl4F4qYtSm10mD/w81n+As4xiJhZiEZyEFs5J1d8Z9Vy8wXGEIR7fqm+a9zy8Fsu5byzXecYMhxZS2ERHZx240veYTNST0o1BZbq+K36QEct8vD7FCALNKAcaZ6AOkQ3ZeFQRkF77ySrit0wubK5Y8hJZIiie/lo/zKRe7AcNPttvBv8m/fwMlN9KEVR4OUGV/gJU1svwYIsZZEnrCMvG+y67NRx0KVjqb6L6X54uvguKz7kxDUMczgIfViz8ratyBmUtc4FfEAPRsjCROGGkVoDEN/5w+ZyQXhLxP3xXUKd1/P4J1avMlerh1CuO5ejlxXeucDZUHgRDjHUwBXfwGOMvhjOjwHiCV+WGml1tKFYFwCTMROq63PKS+JNp0RfgSHK+FtVbauDr08rz2vyPg98+5DPKjnqfdczGey2EZtF3aUyS0f+eIwXUXUtiq/w14fn2wmUy4I611KQjjMiUaXGeOEzE6IIDLjUY2tTTxx/aPpqJvhEJsora8N2/6a3xsw6yT6z46cc9FiIhyEApe9UKpdjI1fdeQuYjErjck7jRAWTUhfVXtQU4SeD3ehMV7Y6r1A8qOMU0h/oidZfO1nAE/JYP3YBXGYHS5oK7bg1MAtFEpo1o6sSWrginCktGk52hMNSGoV8nehuwtZxdhXoyY4IXjvpfAFsXH1Hb/mkNuAue8aL73FijK+a6EhDh03TFe0zLWJHxx6x6Auvo7AXWOBCnZmEjakamzlcsky5YeF79LZz5GwUfWnRavEY3T6FwU1CLhWG4vTlOctHSDbxPcek4EYQrGDGh3pm9EKWAbxxjSxaOj+mjfVS/BResVW35tX7QJikLDMO3bAgq1R7pKwJkOq6LKlFGQid7IX3oBWU3vnf68+OZYTo3XbhF1ibJBtGKJo9LJnus5LWKyXL8OlPBZ6O9My/LGSv/u8SgYidk1IqHF9E0GEd1n1XivRudgVPhOyyChOZRTjrfkGYZyCG9JFtb07mHqu1GTttkO+yrSl02PBotGLbcN6fVq9tA+nKBe9hyXj1jRm77qabudCbBq1WfADA3BI1naBKwjd/hkC2WRFu+OobhwEa5BWjLR0S5hhbkX9l8NggWqYhlkNoAGqfQHPfV6TRRUMT+YxiAtQS4xyBRe3hdSlLTfFn2DqhwtS2Lz3mdjaYxot+rBGShwUkEN2YW8NTWAPTsPtxYLGPhsJEGRMeC0e/0pGacNmr/a7f0BDYZipNYXZEpoLO6TRDR2814xSzHlyQHssJNrGjQ7GSSOz1iSfL3l8GvofUZpMwsaNKmd0njucNMBp0oxVTp+o5hLPEwLl45Rkmvpz8NLlhicrw4UvoIUrMW1vLOUsZsH+zfQu//Xuf5MvVE="},{"id":"c79882f1-420e-4d6c-a40c-dff8c7e8988f","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"组件交互机制","description":"component-interaction","prompt":"为 Luxsin 应用 API 项目创建详细的组件交互机制文档。深入解释从请求接收到响应返回的完整数据流路径。详细说明 Router → Handler → Repository → Database 的调用链路和参数传递。解释各组件间的解耦机制和接口设计原则。文档化错误传播机制和异常处理策略。提供组件交互的时序图和数据流图。解释异步处理和并发控制的实现方式。包含组件间通信的性能优化和监控策略。","parent_id":"0506348d-993b-48f2-936c-908972f149bc","order":4,"progress_status":"completed","dependent_files":"internal/router/router.go,internal/handler/brand.go,internal/repository/brand.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:44.058506+08:00","gmt_modified":"2026-05-27T16:00:37.8856299+08:00","raw_data":"WikiEncrypted:4Zqjl5aZEo1Vv5NKBpebTvIjOs8PtjUiIDyDFsBcQ7xcxPCSMrQFGywF92hdzdj0/Ns2K9dSEDwOkKxz9EMCD21sNknfTIWpC88CWR1X7WuNlX6UdseDM8NhczwhCNaZN3vgjI2RCnPQ3swJEmcffGwsCSYh9whfm7CRrmT1BsJAsL0IISPTl0j7Dypz7NiXQSwlVYOWLyyU9AbzCZDbJ3PpxFYDDzPxaDuVWPVPXLf/wiv9mA5vqzDDmAe1dkhs/NMef3G3n7dFGNy8bE2Kb89TGY1mWlLXsD5yz8TOX2FASKkcwVpddx7H1G4BCCeVxnXrAcc8YtLwtNLqhtYwO9sMQvaZN2pzzBQEBT+bF1KsPSISX/kKBTBc8lKQzbtXgZmpqxMtrqwNvB4AFvHvruBwy5i5usgPxShB0x2ZSOxEQKepTRqJ0sEJxpCG19CRKrqMYxxZMufZecyJcMUUEey9yDRO/hzyy2/pZqn2ZFzkp5KdT+gamSrlq3mJSAJwW1wr584b5P2Bept3By31QHtVKY46YC4WYYzzF1oCjY4mxHTxeyK3KpEfyLa/UEH4JnKUxpA+XrgAxuGhWNQ1XSDiZSY0bXbpklSWH5wVZx9XrhNt1Uv4/Y71JhvdR+D6xb0dEQGbyblvvsAJ/FVnU0+D7VEY0HA3iF8VkSWyCEqfQ/JIf8Ek9Q5LAgQNfEMhoPlzjGIQgoKYiJiPUQYjn0iYa7VDL7waXMyHlwcRIghsmI3fkNu8lRCggKYPTT7Q5qbf+1dABN8HQfKSQ4G3Fyki8uSSBxsxPNBAv1YZhpejX8VnKJ4bcTlb7j+urjrCDfKdzBS3GxW7JA4R3YybG4pIpCHM1znO6FBc0Vw6nOB3lfGW47z0MjpFN3fcV2sOG8ckI47G7KXLi5mabdHP+LyR6s3mSWlLLu59L/RXid0QNasUkkPc7dDbDL9DeRvMlBo5s/BB0qZ3OplmHq79N7OvD8hC8Exo5pNRlCuQXyk/ki56Z2SI5K/AGP1lMNV0tGKe91nJRDGKcxar2YY7tk+dtyGPslSVCeJXmY6OBED+ODDNJ8Ro8sqnENFk2pjIC2z7i8EinBYXDVCn8Fne/tZy4ylO64uHF66MPf3pwmepe2hwAyEDF06K+eddiX3JlmF9xi7EaZS+y+R6h3ktk3ku4KD0Qd86UyfJ5b+r1X4JFTmE2KfIaTeUpCRtOdXJ","layer_level":1},{"id":"cc6acec0-b687-417f-9c93-00f59162cfed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"数据库设计","description":"database-design","prompt":"为 Luxsin 应用 API 项目创建全面的数据模型文档。详细说明实体关系、字段定义和数据类型。记录主键/外键、索引和约束条件。解释数据验证规则和业务规则。包含数据库模式图和示例数据。说明数据访问模式、缓存策略和性能考虑。指定数据生命周期、保留策略和归档规则。包含数据迁移路径和版本管理。涉及数据安全、隐私要求和访问控制。详细说明 Brand 和 Model 实体的设计理念、字段含义和业务逻辑。提供数据库连接配置和查询优化建议。","order":5,"progress_status":"completed","dependent_files":"sql/model.sql,internal/model/brand.go,internal/model/model.go,internal/database/mysql.go","gmt_create":"2026-05-27T15:42:25.031564+08:00","gmt_modified":"2026-05-27T15:47:52.3231001+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkBwdhOAmcMQTz+AJLOFORhNFeFTAN7xitXLxeRr3T1sKrh0z/6NFLuxfhi+XJSCnWiA4bOgOqwoJp44HwLqumks3fTrub2qfkx3kGo8Vv0zwaj7mBYt8gy+IsUDExaTSt3z0xSYoiMJRoiBXhAlNc3py65rPX7myyVo7X5aWc6AOTgywn0pmK3XweYJTp/OGuhexu3owdi0ojlyjLM5fhrVaPCMSjZlCmYDKjdRDiJgH8SUT81h6jSMp8DVFvov1TzHKQO6fEt1yGV1rxGiKDrIs4QHO32th+o7k9tQYH6CSnDoMYk4ZYZUaCxNKZcIp1I2u8cv/mKHnKyIHV6o157UJotCffdSghARHRgXNbZRFJKw2LlW0eFfRB4rXMpkNhwxyCyfJuS9HOpH2lBPYNg37sMa1V/Eu3/Q6COF5ALxno0JO2w0V8DANenW4lwqay9TduAWeV/Wd4/dgnc0kGDAAqO5EpRQJ05PlZiAK5WPSeJcE1FMCShp43SRUeu0Is+TvJKih/ixtdr5ZN0vVE+0okdcGzxP1GZGfVlqDy80vdMZ4WJdIHu89JzvzkS2ptiMw834+utWhBxxpJRRDvJl4Zrs1QcGgN5sZCKlUYb1Fb2NOabQvc5fyx8yVZnMaEZpko17DLilQmJCCgrVdi3p2OeIBmnS81Vz5vmsF+754mz9081paU05Zvu1Rlqpklsnxlsn1KOJaq7CxyN1Vcn7SR3cBEu7L2hL7vLqTSlTilbnVUdfG+udOd7z4QHQfU7qOkWy5HkYrcuXrTycl2ufPlCeAr479dPNQ0Xk947AQs7w9xu97C9uZA8SNXmqVZxe/h+O5HjlMfIT6tt8mxvEaeqK8VOrAJKUIyPjs/joJZGQbF1Elfpx5bcIUUpIPc/JZZJaeEsgIox2ZEwOooQJ8nd8HwCEY747ONvgtaJ5q1ezLwIyrBIAmhB7hha3NW5XM3pTSnhhVF5uzeW/SrLPa7/kLcN+z6qciY2+1f1Di3u1j5vjLI3vVhWYxtJeb1HFtQ00iXdel0aXgFh1WDymjQp+3kFFEFC7ujRqludkNuXwc4VxtV1bCbiMRuM9Me/1hxMYQsxfUqeYWXsbBN+TUkt5+5dKDAfjIrRn1uSgSIvVIhez+1s+xqnAoLrGJnH10tSz3gtZIy6HHkEXNgV+uGynd+yFYQPyVzqFl6ycwI4QJr3nkZe2cmn6FJQbfcuksp/k6A7IRaJ1aeEl9xJZ2aGXJYapB8ZgUNClFNIABpvB/G/YA2vmhfZp0uQPvIRc1ND/6GmGWg8sdS3QLzprJuywzZHaPbYAlocEixTYrXFTgWuXbhn803vpaRzzwcwy39VcvjxmM8EPgA8UchNi9kMeRVrOORtsa4ws4iQcDlrdOvw9lPOco6pAgMVqHWw=="},{"id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"基础设施","description":"infrastructure","prompt":"为 Luxsin 应用 API 项目创建基础设施组件文档。详细介绍缓存系统(Redis)、搜索引擎(Meilisearch)和日志系统(Zap)的配置和使用。说明各组件的初始化过程、连接管理和配置选项。包含缓存策略、搜索优化和日志记录的具体实现。解释组件间的协作关系和数据流向。提供性能优化建议和故障排除指南。涉及监控告警、扩展性和可靠性设计。包含具体的配置示例、最佳实践和安全考虑。确保内容既适合初学者理解,又为专家提供足够的技术细节。","order":6,"progress_status":"completed","dependent_files":"internal/cache/redis.go,internal/search/meilisearch.go,internal/config/redis.go,internal/config/meilisearch.go,pkg/logger/logger.go","gmt_create":"2026-05-27T15:42:25.031564+08:00","gmt_modified":"2026-05-27T15:49:51.0048099+08:00","raw_data":"WikiEncrypted:sbHxgqwNaIQfuetky2uLRyIOX0QcV4F0AILzzQc9GWKM9RbXWkeyZypYurT6q6/jdshRRky9i8euWVz+RwzDEjLSf/5TBE5hqVfwtdoniolHNIvg/V4U6o0Uy5LnDr8i+8lIxu2oIBTUlsaoAv7w5iNfekHSt0q6goXepa4aMrqdtCXd78BSUFzGGoqTjFCImp9K2wkx2G0tXqpmpVp7tEiupbmaekaydnQiLfWCTsuAhiIixmNf7zhMvQddDdz/vFMxg8EgQjBYCRrLJfa59w1dwNOsh7LD7B0xejH7YnQkazsXQPDc/l1CAXfLcIcNw18T1VJ8pdgRZVu74q4BhQ1oz+mkyNXOXO7uFYyROvZ9+SHCV/p2M5/xkEo3CqCAP+CEI+59/1ozZqaYwitDifyO7wkSXdFb88+pXlAGZCDRQ9iQ/cMLmgrf0UWW3ZQdLAgo9PRlh3nTWGEe+/rkwMoVKFhvAJBooUPS4OIGSMvMAHQrbwvx/poFrNYVDC84lwkm0R3PHjhB1K9cOk9+6tZ/6F7kp3XdCVAhc2U62dBlI8hDoyGxT1Jl75o1y6mLlxFRleUEYQIFasnt0X1GgKG3oeRJfDQBnoW5H7CZ2Q2VQG/Mam6+pMMK/r9diCnIYM5ogiqUj7tr7iypIS+cfkJESScxOnrfQlCN0Qkd8sEGP4K1s0MOXaL2n/I8jL0akBuCdC6r/XwkXXVuwyvONhBo8AKhjlw4Z80l8g9IfCLE516hSHdAvPrqJdQ+uv2kxoDUCbdnki86NLEmUIu9E8Cg/ctAE8bB/3EZ8W0jCiwjkJMG/7zWgjmRnEZEB3qTVgtRa2KlCUd2QJmlRplYoHxZpXr+SKdJwnlA3vad9yfoc20k1McD/WIU1xyYcMO0RlCh7D9YFySaMEU0ajxvhY0IaEzEkSksTTGrckLMEjYGic+cCNwIIo2yh4+RiMTixfUw95/Beb5C6YA4wOzhKhEYwBsyKI1mRNwEf9R87hDhmK7a83qw/cRy9X8q37PVUu4kfKUP00SAvuQVxgyEp5jO+UOmYubsAjFLqt+BLYCvX1BLVs34bTjTZ7UdPkyCewtgeK88zHgLljGSzyR1bspq4eozKjqoiqavFLVqYzTtwTuTtg5HzkqhFBkHceFCQzoxpbcgdyvxHj7rIeuao76nbRqwWFxM0CL/w2bwd3YhIHOUtNX1PHq5deeuo3macM8moQOj2mgBCoh3lJdc8w+9qpT/nooQSlJfOQ8o9+an8h4sgvMbAbGt6Xt34gkJnbQ57qn+h6fXefwWrxaekNiXWaEYYRQlaazmSk/IH+Shr0OZVtpWlkFn7FjYCqe68ScAMyhmZUJ5Pkw+Y1rENFipss0BlI+diw2G12+r1GuERworaWCvas6w5A3FkFKC66BELhQjLk0vsY9c19ea9GihiHshbDr4OSKya8FZ5nM1jK+4vN63WFEnIS/vVAg4NxpzpBa91cZOB3hHRNKWuG9Zv2L5ASdR8D+2EwNxXV+A0vv1YgBt6lCQ/uDGyRePhYr0xyoQ7QfWpRQ+EkUPCA=="},{"id":"f4f8585d-1446-4f49-85b2-efc715bda6cf","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"部署运维","description":"deployment-operations","prompt":"为 Luxsin 应用 API 项目创建部署运维文档。详细说明构建过程、部署配置和环境管理。包含开发环境和生产环境的配置差异、环境变量设置和数据库连接配置。提供 Docker 容器化部署方案和 Kubernetes 部署示例。说明监控告警、日志收集和性能优化策略。包含故障排除指南、备份恢复和版本升级流程。涉及安全配置、权限管理和合规要求。提供自动化部署脚本和 CI/CD 集成方案。确保运维人员能够高效地部署、监控和维护系统。","order":7,"progress_status":"completed","dependent_files":"Makefile,internal/config/config.go,.gitignore","gmt_create":"2026-05-27T15:42:25.0321059+08:00","gmt_modified":"2026-05-27T15:49:39.6683467+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w2XbjO+yyEmY3ONOjrL5GjA3YcCk7HFAQ1etKc5i1P7UH3oVY8Um0qaAPkZpvBj4kR5+MfLB2lNNE8Rq4eigRbWcSc/FwkPYo+Lgq1jG1nwAdVBamYbeC5rJp9miML32uAYGdDFNBUjcZautOKk/RnMVJbDBhxk06H3YR9uha+agF827jtBxrCN+YUD41ewpmu39XkuD0mIkISY0mw2kTQ3+d3o8egfEhqEtpYEFWDr4W3bjpZzdlqibicqkrLymwjSHLQ25Yk3RDRLQh41MEe9NzR7Dq9pho9nnzV6lVFI/+D3aLuQmEW30BSE9ANU6hjMLS2wzjZI20qiE3EYf9+/cetjKX3PuzziuE6FOa9zkRQET5Avno4lvS+dZE+/NCsoLeLBSpEpHChwy1FLMangpeABL3DMfOcjKBI10Zckgxc6knhlzmH7BYem/MGjE3gGbpXcSOYO91tlzjpTzkA6o8IN0BBKnVEm5ZsnA1/bpvtl8iPNcBLSvEh8r9nsvT61wFloxMMEwoqk4pfGxfYLYpLzHK4/B7kcP2F2ZxPsLNKguH2P+W5Onf/VEoeoeUie2shjfuxNczO0o+tk08s7YDF0suC+hauvXM8A5MtTJFjGAcXk0PepsGbBA15NaUxXQL+T9g4ZmHiM+HpXAVuFUtKMwAoMX7ejSmhK0Uu3abxpuatBFVQMyMn2CtFqbZ7qowCiFy8R+N8iJK+CNvcQX2UDetV403Hy9t8wz9Mb7zjigKo8EExeqBR+6tdzkd2jCxuo8oGTUNED9jyF3yEdLlhvryX6R8fmWeX6XaIUdEfwqd3lefqvppQLJ082CWs43k5Sa3wBYSrhvhINvH+qH2TvKZHwT6jdxjjHkPO23f0RWwLtVr0KwjqIYa2C5ujlLLUzPccXXZozTajzaXs4y1GIXIkjQyN9gkvew0CQdmqcwIakk6B1cd6GSvR2R7jI9aORlvoBPkZZZZaWccD23SJpY8S49pk6J1f4pp8SY58Cs5Tyhzyr9Jx/g0sdQhX5jT4NOD4vFTMDi/QwlxJVK5aAMEoni1Xixkn86Mvy6YO+C0syQmDIeaWwTw3oaJtKkp0rbEph8ikP8GV+vYas27rEHT5ikXy+qKaSpRTrS6pIvqMDTr46wYVA48CocbQCKuCxz+8aN1rxEOyVvF4BZIOGK94UT/86do17dVZDlKWyrMHyapzdcsG77AQVqx3wFdVBRhW+LLPtZ7DjrJ9MbZlWCzqTN+MPtV2pqJpf2QM5tK7xYlv8Yb6jOUmKXAJ+GSoB6Lnv55zJALFR7zYrYJqdnAOfLrd0Tx7cB5v+9"},{"id":"29142a7a-fa93-4a61-8ad8-c35c1b047599","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"开发指南","description":"development-guide","prompt":"为 Luxsin 应用 API 项目创建开发指南文档。详细说明代码规范、测试策略和调试技巧。包含添加新接口的标准流程、代码审查要求和最佳实践。提供单元测试、集成测试和性能测试的编写指南。说明调试工具的使用方法和常见问题的排查步骤。包含扩展开发的指导原则、插件机制和自定义中间件的开发。涉及代码重构、性能优化和安全加固的建议。提供开发环境的配置和团队协作的工作流程。确保新加入的开发者能够快速上手并遵循项目的开发标准。","order":8,"progress_status":"completed","dependent_files":"internal/response/response.go,pkg/encode/base64.go,internal/middleware,Makefile","gmt_create":"2026-05-27T15:42:25.0321059+08:00","gmt_modified":"2026-05-27T15:50:56.1828091+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9C/ucQxiwh0okVA48AmODs5RKNS8ZgNngqmnHSFcG/1UaJxx+3dUn+EkMTpYUsOg40sht54cXVXsXhnq+u5RoF+QCaIHA1bGkkQVYVJAIxj7oosqEK59VnFAy3/dJV3KPSb/Ak2NMFBLBF1vGpBDxfvX3bT23bfnsRo4s15uorwKaV7X3HasHsjQoW0eNqTYHiGBulek8S0+90Xknrv9THoJiqpJqkBeofpQiXqX5V618tXTFFsKRJ6phlpbQWf2cbMabajttNJ3B44KtoJSJow48koViUqq1GW3BavJLaIXKMSMHmg9oSjXlTiTYcEEZKa/kYEu4HzH+CTxYhmAZitafJJSGarLyIbemD6c9dKLK9Frtj68/dJRxA2JDgVe81LYeb/3xRsBom0r4YzT8A6hHZcszh4H3wvsJMywPaPsmmBX1tXvgqCTmKeNH7dyLyLi3kWUTw9ok4pV8mMbQVe+tyq+dAjkFZ19Gg1pa48jOuq3XNtyOUDkFwzf8ENVW6mMjhd6eh1Wngr55aY62gP2kA69TRUUa7xCg4pPwMd7kukU9I+311WRjxwqdx+K9z918Nh+Ehzce//3AN16rOPpfJiqCBsWoIGofgkkvOrhJXb7ZBSV8svzmyNFJAEwluR6iW6JSQF8aYcFWeQvuFotN33nkyOjukcXDEGZsNzH5UtAJyLrlT7/Or9ByIMARY/bLEe2ttw4LkzwPX0zVri6275Z+Tr+vS1tQvbizhQX+2d6jRwB57dWTT5wiNTTauC0iaRxAQAQpIiilb6edtE9uJDim04tl8b0GkMJvSCCVUwIKIl495jl1QK4bnCVwbXf+Nm9M8b2DoPU91RhXbRUH0oa9hiK/MMmM1pNPt8sIQPodxmby96ls9G7B9FZz54hyvdDRZXOoxueOW+qswnlAT8Pjzr7WYDEFWLqhVHl3YjAnYEyvqPyjLV10UlsnTu74OIH6TGCiFnRNdEUNrebnly9HRW/qPROmHDa6/S39zhxd/Wve8OTESmdoItuQITLhTn+hUnhZoQBVVqWJwAYFrayIms6xJZY8R31ZKxaxYGd9xNCp3P+7To8IS9yboFTqky2xkebLSLfn+HS7xe0MqZXcpzdCKfivdIbm1ebxh/61TCdDH2Wx1T0uqMlwy70jnT6dzzS860fOuXLUw+3uEIg/ohj+iqYOEEPHAIG/ADJxSwbTR4/RjVzy+yaWUiKWxLukEG89+389O2WLfiqMNBTDEZ4+iXaBOjZ2i8yTTW0xGChxJcCUGPmug6KyNPvoEDLiPot5cTWScQG04DSfIGUnVEqHKDxX3mS/pZDnfV2OkxwUfNtqXdYzFlWBWnI9TxnL3wxXTu3eI8SYHxflga+4BF6OXBwi8eu8DXYDarKNvnEn0JHi0Fh8VVcAoZmJeQkJUhcvnhyAKmJ0tD21XmK4/7ZcFZ8RuBkIEpDy"},{"id":"4d1d9a48-feab-42a0-815a-edf76dcaaf69","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"故障排除","description":"troubleshooting","prompt":"为 Luxsin 应用 API 项目创建故障排除文档。详细说明常见问题的诊断方法和解决方案。包含数据库连接问题、缓存失效、搜索异常和日志分析的排查步骤。提供错误代码对照表、日志分析技巧和性能诊断工具的使用方法。说明网络连接问题、配置错误和权限问题的解决策略。包含系统监控指标的解读和告警处理流程。提供生产环境问题的应急响应方案和回滚策略。涉及安全事件的处理和数据恢复的操作指南。确保运维和开发人员能够快速定位和解决系统问题。","order":9,"progress_status":"completed","dependent_files":"pkg/logger/logger.go,internal/response/response.go,internal/config/config.go","gmt_create":"2026-05-27T15:42:25.0326686+08:00","gmt_modified":"2026-05-27T15:51:51.4638338+08:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87Wqy/1Xzi+22LbOfczFZkieMj5WEpLZAHMOxW2WrQJBBBBLWDFSQSfMzyLUONYz2Nl7KEGwStUbBydq7XRqsFITwnt/V34PJe33lfOUHLZdte9ZHqIcBUofSz417l0pyB/LxfxiLi3iV7uxs4nc6n2EFO0hgr4tRmmgaEM1CEq4EgiztB5945G3QMRbLtVRjxhkZe9eWYo9vc2zRYWsyCp6nsjGToiqmfJff57lDOhyn0MhEnJamhFrscVK3DVyGf1SpxoYkDkFQ8OxuxWIHhAN31k2cpGQv9LmsRHcL8ratSFNuE0JPDtSTdY/ZWlXZReIKt/Phb2FMvUA2BI6cCF2Evsk8rpZnwjGsdOlJ+sGevLXEX+KO/9vz0AE6s+rE5u71DR5usC6vuuFgFV4FP7o+3Lcj81SBIu9V+wYU4GkJfPm9eZdFSFgsvHSuqFzrpdlcAeV0XMnU6wZcRaZy/8ZdaUJaIWp/K5jIqfGuxtPSOD1zDJ9Vw0jCLMjDlUTY0Wkzwykxog7i2SnG61vtu/eLORV6aTh8tjNhzdBwbROp3XlsxD0Jxg41JcDSyt4dpyQ35FAPBMPr7Mb3YeD4W1JWqrn8tR5Q1goBmPFlekKRd1XmyYQSZsK4FvBVOUBeCzX1UO7I505eXz/lN/ZG62xC3zhdCt+qCOxJogd4T1f1Nux404SmdsvewY4mg5PnyoinMtMIMX67YY+iFfZEedlNURipIOxssz0zcp+qeJXI9lwR58sgAvpu9JbTbVQJv4I7n1XM9CayA7Nhd0WXIh+yChGMyFdfq6BDje0NtSgi44k/h+mFUk3BqzfQWasqg7rPzAKjx23DY3Wf/8AvNN7IpP2CH4yRynuCGZim6B1AEqKfL6RCsXi3dpi6y6HmEO4DRk7XL8l9c+vWr+u/yI6A9OGZtzl8B7MoVhhEuuTvPbLCrwnHsU3VReA05fImoZPThjC0vYsQuP5jijDtjnjnShV/o1rLBat0xPAhTT0+Ba23IeZGODiU8yg7NtgprzmcJSS/wFzeapmPZYCB70qjxvW/HgkOhwl1TsfHNP/T6k6i1j6gSPIxgCbZzvcJrH9sumu84lcS6Yfg9Qvr7PpOAuDKDj7riCajk2RbdUVxrptqpZkD0kYIKictTHLnL48Uvp97xnspGQYkJA4BAv0grWVZFzqj7o0BlwD7oL/FLdBMSbXkNRCvjQjGnIZ2nq8MEZP3aofJTmW7e63/JTbcplJzE6wdft6ZBF4hroZE8TbT/pMlEMDkQDxYbgPETx9z/quiPJ+0p6dAD2TjJdiV2GfAFz6WEnJ3NljmFPBV2/5DJ4ugFlz6oBXJZArZyUzJlbmfIXasvwycIUFMx470AIl4o7bGCbGGL+tWgljzbkg7dly6G5lMTM+gWVGvWdUtXCOvYLq+oqCr5Uddgt0"}],"wiki_items":[{"catalog_id":"78b906f9-f81c-4bb2-b076-5c5609c7eb41","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"f30115a0-52c0-4f22-8486-ec2e6c334e6d","gmt_create":"2026-05-27T15:44:16.3635684+08:00","gmt_modified":"2026-05-27T15:44:16.367324+08:00"},{"catalog_id":"6de9a03e-f360-4daa-97ac-dc1cd1937916","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"61e1b102-9ad1-44f6-accb-0e27be48ceb7","gmt_create":"2026-05-27T15:45:02.5387528+08:00","gmt_modified":"2026-05-27T15:45:02.550849+08:00"},{"catalog_id":"0506348d-993b-48f2-936c-908972f149bc","title":"系统架构","description":"architecture-design","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"ab98c251-c5f7-40df-bba1-21b2edf5d220","gmt_create":"2026-05-27T15:45:15.0879497+08:00","gmt_modified":"2026-05-27T15:45:15.0922502+08:00"},{"catalog_id":"cc6acec0-b687-417f-9c93-00f59162cfed","title":"数据库设计","description":"database-design","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"120f3824-43f7-4a38-9680-43b5b2f59e05","gmt_create":"2026-05-27T15:47:52.3181698+08:00","gmt_modified":"2026-05-27T15:47:52.3231001+08:00"},{"catalog_id":"8d7c257e-b299-4adb-adfe-bc0ddbf112b7","title":"核心模块","description":"core-modules","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"7563e383-3ea0-4630-baeb-e86efcaeefb8","gmt_create":"2026-05-27T15:48:30.8129369+08:00","gmt_modified":"2026-05-27T15:48:30.8195851+08:00"},{"catalog_id":"8085e1b7-3658-4490-8b52-9a61f3e79976","title":"API 接口文档","description":"api-documentation","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"6159e8a9-0f6e-43af-b097-bfcd16c8b223","gmt_create":"2026-05-27T15:49:27.8849802+08:00","gmt_modified":"2026-05-27T15:49:27.8891715+08:00"},{"catalog_id":"f4f8585d-1446-4f49-85b2-efc715bda6cf","title":"部署运维","description":"deployment-operations","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"1da760f2-e12f-4b50-bd2e-539ff08c2047","gmt_create":"2026-05-27T15:49:39.6657096+08:00","gmt_modified":"2026-05-27T15:49:39.6688705+08:00"},{"catalog_id":"0ba3accc-326a-4433-930c-5b951d4e5dcf","title":"基础设施","description":"infrastructure","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"cfbcaa79-26f5-402f-8746-9fe524993684","gmt_create":"2026-05-27T15:49:51.0000417+08:00","gmt_modified":"2026-05-27T15:49:51.0048099+08:00"},{"catalog_id":"29142a7a-fa93-4a61-8ad8-c35c1b047599","title":"开发指南","description":"development-guide","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"081f97c7-d774-43b7-aff8-4973d577a059","gmt_create":"2026-05-27T15:50:56.179658+08:00","gmt_modified":"2026-05-27T15:50:56.1833555+08:00"},{"catalog_id":"67d62b58-6970-45ca-a17f-f48cb2ea679a","title":"业务处理器","description":"business-handlers","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"d1a696b8-5a9e-4ad2-8777-04eecc0bb424","gmt_create":"2026-05-27T15:51:42.2402901+08:00","gmt_modified":"2026-05-27T18:35:49.827349+08:00"},{"catalog_id":"4d1d9a48-feab-42a0-815a-edf76dcaaf69","title":"故障排除","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"3ce5cfd0-f4f6-439a-b60d-6fb4c36a26bd","gmt_create":"2026-05-27T15:51:51.4591126+08:00","gmt_modified":"2026-05-27T15:51:51.4638338+08:00"},{"catalog_id":"591ea147-ba05-4d86-a671-941af668ca2f","title":"品牌管理接口","description":"brand-management-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"6f1fe170-ae35-4660-91dc-ab89735274b7","gmt_create":"2026-05-27T15:52:20.2715607+08:00","gmt_modified":"2026-05-27T15:52:20.2747568+08:00"},{"catalog_id":"6e42204e-3d78-4997-a95a-3311c8fcaa43","title":"缓存系统","description":"cache-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"795a5202-49be-4c11-a2b4-44312eca8ae7","gmt_create":"2026-05-27T15:53:16.9891352+08:00","gmt_modified":"2026-05-27T18:36:40.5405367+08:00"},{"catalog_id":"fb8ae541-8bbc-4544-9133-e797be1433e0","title":"分层架构设计","description":"layered-architecture","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"523107ca-244f-43c5-a4fe-4649e36a88ad","gmt_create":"2026-05-27T15:53:50.4703345+08:00","gmt_modified":"2026-05-27T15:53:50.4735252+08:00"},{"catalog_id":"948e0792-2de7-47b1-b73b-e7b246e749ff","title":"数据访问层","description":"data-access-layer","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"599c0bda-3332-415c-a535-362503079473","gmt_create":"2026-05-27T15:54:10.7247654+08:00","gmt_modified":"2026-05-27T18:35:41.8040874+08:00"},{"catalog_id":"8b3ba473-1cf0-4471-a203-9a87732dc227","title":"型号管理接口","description":"model-management-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"6af33e3a-220d-4e68-87ed-bfb96bda4c3a","gmt_create":"2026-05-27T15:54:37.220316+08:00","gmt_modified":"2026-05-27T15:54:37.2236089+08:00"},{"catalog_id":"5b9847ff-f7b8-488b-821b-6fdfe2dbde40","title":"搜索引擎","description":"search-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"d0c2dea0-a71a-4f16-9889-b37e1e7996e3","gmt_create":"2026-05-27T15:55:50.6464041+08:00","gmt_modified":"2026-05-27T15:55:50.6500526+08:00"},{"catalog_id":"ccdbaf47-6cde-4ad7-95f8-5b92d33e2440","title":"路由系统","description":"routing-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"f4014d47-467e-4cfe-8549-1dfb69cbc325","gmt_create":"2026-05-27T15:56:02.5802842+08:00","gmt_modified":"2026-05-27T18:35:29.939743+08:00"},{"catalog_id":"e81027fa-c24e-4492-8100-f051facb89c9","title":"数据模型","description":"data-models","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"97c42095-5b4f-4cec-bbbb-1ba8bb9981d4","gmt_create":"2026-05-27T15:56:31.7739386+08:00","gmt_modified":"2026-05-27T15:56:31.7808704+08:00"},{"catalog_id":"8b7558c2-be32-47b8-99e2-1964009b4337","title":"设备管理接口","description":"device-management-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"e1ed4fc8-f1d6-4e8a-907b-9c39bbe13b92","gmt_create":"2026-05-27T15:57:09.1993166+08:00","gmt_modified":"2026-05-27T15:57:09.2037555+08:00"},{"catalog_id":"bc6825c8-9aa3-4f0e-96ca-ef4925af0570","title":"依赖注入模式","description":"dependency-injection","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"5910d326-0408-450d-b403-06a19f3da81b","gmt_create":"2026-05-27T15:57:20.0015238+08:00","gmt_modified":"2026-05-27T15:57:20.0074643+08:00"},{"catalog_id":"4b0e33d8-28d6-44dd-b90a-57af5c6cfaa9","title":"系统监控接口","description":"system-monitoring-api","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"0fc3d59c-d219-4f97-af10-473ee62f4de5","gmt_create":"2026-05-27T15:58:27.2590583+08:00","gmt_modified":"2026-05-27T15:58:27.261717+08:00"},{"catalog_id":"f5a7db4b-765d-46e4-9395-af7bbe8d8fd3","title":"日志系统","description":"logging-system","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"23a2ffc3-fa50-41ba-b7a6-55354d68a95a","gmt_create":"2026-05-27T15:58:35.6388373+08:00","gmt_modified":"2026-05-27T15:58:35.6424946+08:00"},{"catalog_id":"e2d8da89-04c9-4fee-8dfe-adfaff79c9c1","title":"统一响应","description":"unified-response","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"699a84c5-5140-4267-861e-62bffbffccb4","gmt_create":"2026-05-27T15:58:41.4359+08:00","gmt_modified":"2026-05-27T15:58:41.4408299+08:00"},{"catalog_id":"f351f338-eeb0-4243-921a-eed11d063072","title":"中间件模式","description":"middleware-pattern","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"e8e5fe7e-cc7c-4259-95d0-f6b46d888ed8","gmt_create":"2026-05-27T16:00:02.1459491+08:00","gmt_modified":"2026-05-27T16:00:02.1508768+08:00"},{"catalog_id":"c79882f1-420e-4d6c-a40c-dff8c7e8988f","title":"组件交互机制","description":"component-interaction","extend":"{}","progress_status":"completed","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","reference_count":0,"id":"5a04f737-b877-4908-a4fc-67a88614aafc","gmt_create":"2026-05-27T16:00:37.8802374+08:00","gmt_modified":"2026-05-27T16:00:37.8856299+08:00"}],"wiki_overview":{"content":"基于我对项目的深入分析,现在我可以生成一个全面的项目概述:\n\n\u003cblog\u003e\n\n# Luxsin 应用 API 项目架构分析\n\n## 1. 项目介绍\n\n### 目标与定位\nLuxsin 应用 API 是一个基于 Go 语言构建的音频设备(耳机)数据管理服务,主要为移动应用提供品牌、型号、设备信息等数据查询接口。该项目采用现代化的微服务架构设计,专注于音频设备数据的高效检索和管理。\n\n### 核心目标\n- 提供 RESTful API 接口,支持音频设备数据的查询和管理\n- 实现高性能的数据检索,结合 MySQL 和 Meilisearch 搜索引擎\n- 构建可扩展的缓存层,使用 Redis 提升系统性能\n- 确保生产环境的稳定性和可靠性\n\n### 目标用户\n- 移动应用开发者\n- 音频设备数据管理系统\n- 第三方集成商\n\n## 2. 技术架构\n\n### 整体架构设计\n\n```mermaid\ngraph TD\n A[客户端应用] --\u003e B[Gin Web框架]\n B --\u003e C[中间件层]\n C --\u003e D[路由层]\n D --\u003e E[处理器层]\n E --\u003e F[仓库层]\n F --\u003e G[数据库层]\n \n H[Meilisearch搜索] --\u003e E\n I[Redis缓存] --\u003e E\n \n C --\u003e J[CORS中间件]\n C --\u003e K[日志中间件]\n C --\u003e L[请求ID中间件]\n \n M[配置管理] --\u003e N[数据库连接]\n M --\u003e O[Redis连接]\n M --\u003e P[搜索客户端]\n```\n\n### 设计模式\n- **分层架构模式**:清晰的业务逻辑分层,便于维护和测试\n- **依赖注入模式**:通过构造函数注入依赖,提升代码可测试性\n- **工厂模式**:用于创建各种客户端和服务实例\n- **中间件模式**:统一处理跨域、日志、请求ID等功能\n\n### 系统关系图\n\n```mermaid\nflowchart TD\n Client[客户端请求] --\u003e Gin[Gin Engine]\n Gin --\u003e Middleware[中间件链]\n Middleware --\u003e Handler[业务处理器]\n Handler --\u003e Repository[数据仓库]\n Repository --\u003e DB[(MySQL数据库)]\n Handler --\u003e Search[Meilisearch]\n Handler --\u003e Cache[Redis缓存]\n \n subgraph \"核心组件\"\n Gin\n Middleware\n Handler\n Repository\n end\n \n subgraph \"外部服务\"\n DB\n Search\n Cache\n end\n```\n\n## 3. 关键实现\n\n### 主要入口点\n- **服务器启动**:`cmd/server/main.go` - 应用程序的主入口,负责初始化所有服务组件\n- **路由配置**:`internal/router/router.go` - 定义 API 路由和中间件配置\n- **配置管理**:`internal/config/config.go` - 统一的配置加载和验证机制\n\n### 核心模块\n\n#### 数据访问层\n- **数据库连接**:`internal/database/mysql.go` - MySQL 数据库连接管理\n- **品牌仓库**:`internal/repository/brand.go` - 品牌数据的 CRUD 操作\n- **型号仓库**:`internal/repository/model.go` - 型号数据的查询和管理\n\n#### 业务处理层\n- **品牌处理器**:`internal/handler/brand.go` - 品牌数据的业务逻辑处理\n- **型号处理器**:`internal/handler/model.go` - 型号数据的业务逻辑处理\n- **模型列表处理器**:`internal/handler/model_list.go` - 结合搜索功能的型号查询\n- **设备信息处理器**:`internal/handler/device.go` - 设备上报信息处理\n\n#### 缓存和搜索\n- **Redis客户端**:`internal/cache/redis.go` - Redis 连接和操作封装\n- **Meilisearch客户端**:`internal/search/meilisearch.go` - 搜索功能实现\n\n### 配置管理\n- **环境配置**:`internal/config/config.go` - 支持开发和生产环境的配置切换\n- **数据库配置**:`internal/config/database.go` - MySQL 连接参数配置\n- **Redis配置**:`internal/config/redis.go` - Redis 连接配置\n- **搜索配置**:`internal/config/meilisearch.go` - Meilisearch 搜索配置\n\n### 中间件系统\n- **CORS中间件**:`internal/middleware/cors.go` - 跨域资源共享处理\n- **日志中间件**:`internal/middleware/logger.go` - 请求日志记录\n- **请求ID中间件**:`internal/middleware/request_id.go` - 请求追踪标识\n\n### 日志系统\n- **日志配置**:`pkg/logger/logger.go` - 基于 Zap 的日志系统,支持开发和生产环境不同配置\n\n### 数据模型\n- **品牌模型**:`internal/model/brand.go` - 品牌数据结构定义\n- **型号模型**:`internal/model/model.go` - 型号数据结构定义\n\n### 响应处理\n- **统一响应格式**:`internal/response/response.go` - API 响应的标准格式化\n\n## 4. 核心特性\n\n### 功能架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 接收请求\n 接收请求 --\u003e 验证参数\n 验证参数 --\u003e 处理业务逻辑\n 处理业务逻辑 --\u003e 查询数据库\n 查询数据库 --\u003e 返回结果\n 处理业务逻辑 --\u003e 使用缓存\n 使用缓存 --\u003e 返回结果\n 处理业务逻辑 --\u003e 执行搜索\n 执行搜索 --\u003e 返回结果\n \n 返回结果 --\u003e 记录日志\n 记录日志 --\u003e [*]\n \n 验证参数 --\u003e 错误处理\n 错误处理 --\u003e 返回错误\n 返回错误 --\u003e 记录日志\n```\n\n### 实现亮点\n\n#### 多数据源架构\n- **混合存储策略**:结合传统关系型数据库和现代搜索引擎\n- **缓存优化**:使用 Redis 缓存热点数据,提升响应速度\n- **异步处理**:支持设备信息上报的异步处理机制\n\n#### 高可用设计\n- **优雅关闭**:支持服务器优雅启动和关闭\n- **信号处理**:正确处理系统信号,确保资源正确释放\n- **连接池管理**:数据库和缓存连接的生命周期管理\n\n#### 开发体验优化\n- **环境隔离**:开发和生产环境的配置分离\n- **统一日志**:结构化的日志输出,便于问题排查\n- **错误处理**:完善的错误处理和返回机制\n\n### 性能考虑\n\n```mermaid\ngraph LR\n A[请求到达] --\u003e B[中间件处理]\n B --\u003e C[缓存检查]\n C --\u003e D{缓存命中?}\n D --\u003e|是| E[直接返回缓存]\n D --\u003e|否| F[查询数据库]\n F --\u003e G[更新缓存]\n G --\u003e H[返回响应]\n E --\u003e H\n H --\u003e I[记录日志]\n```\n\n## 5. 项目特色\n\n### 架构优势\n- **模块化设计**:清晰的职责分离,便于团队协作和维护\n- **可扩展性**:支持添加新的数据源和业务功能\n- **可观测性**:完整的日志记录和监控支持\n- **安全性**:中间件层提供统一的安全控制\n\n### 技术选型\n- **Go 1.24**:现代化的编程语言,提供优秀的性能和并发能力\n- **Gin 框架**:高性能 HTTP Web 框架,适合构建 RESTful API\n- **MySQL**:成熟的关系型数据库,适合结构化数据存储\n- **Meilisearch**:快速的全文搜索引擎,提供优秀的搜索体验\n- **Redis**:高性能的内存数据结构存储,用于缓存和会话管理\n\n### 开发最佳实践\n- **依赖注入**:通过构造函数注入依赖,提升代码可测试性\n- **错误处理**:统一的错误处理机制,避免错误传播\n- **配置管理**:环境变量驱动的配置管理,支持容器化部署\n- **日志标准化**:结构化日志输出,便于日志分析和监控\n\n## 6. 总结与建议\n\n### 项目特点总结\nLuxsin 应用 API 项目展现了现代 Go 语言 Web 服务的最佳实践,采用了清晰的分层架构、依赖注入和中间件模式。项目在性能、可维护性和可扩展性方面都表现出色,为音频设备数据管理提供了可靠的基础设施。\n\n### 架构优势\n- **清晰的层次结构**:从路由到数据访问的完整分层设计\n- **现代化技术栈**:选择合适的技术解决特定问题\n- **完善的基础设施**:包含缓存、搜索、日志等完整的系统组件\n- **良好的工程实践**:遵循 Go 语言的最佳实践和编码规范\n\n### 改进建议\n1. **增加单元测试**:为关键业务逻辑添加更多的单元测试覆盖\n2. **API 文档**:集成 Swagger 或类似工具生成 API 文档\n3. **监控指标**:添加 Prometheus 指标收集,完善运维监控\n4. **健康检查**:扩展健康检查端点,提供更详细的系统状态信息\n5. **配置热更新**:支持部分配置的动态更新,减少重启需求\n\n### 下一步发展方向\n- **微服务拆分**:根据业务领域进一步拆分服务\n- **消息队列**:引入消息队列处理异步任务\n- **容器化部署**:完善 Docker 和 Kubernetes 部署配置\n- **性能优化**:持续优化查询性能和缓存策略\n\n---\n\n**Sources:**\n- [main.go](cmd/server/main.go)\n- [go.mod](go.mod)\n- [config.go](internal/config/config.go)\n- [router.go](internal/router/router.go)\n- [brand.go](internal/handler/brand.go)\n- [brand_repository.go](internal/repository/brand.go)\n- [brand_model.go](internal/model/brand.go)\n- [meilisearch.go](internal/search/meilisearch.go)\n- [redis.go](internal/cache/redis.go)\n- [cors.go](internal/middleware/cors.go)\n- [logger.go](pkg/logger/logger.go)\n- [database_config.go](internal/config/database.go)\n- [model.sql](sql/model.sql)\n\n\u003c/blog\u003e","gmt_create":"2026-05-27T15:40:06.9577463+08:00","gmt_modified":"2026-05-27T15:40:06.9577463+08:00","id":"5a60eb9b-0b2d-4d2f-99c6-dd1e4cd34dd3","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-05-27T15:38:58.8115445+08:00","gmt_modified":"2026-05-27T15:38:58.8115445+08:00","id":"cf8cd5f4-1600-41c4-9afb-1db3a1464c48","repo_id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc"},"wiki_repo":{"id":"a6c92e0a-0eb8-4b81-8beb-0169c32d76bc","name":"app-api","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── _tmp_desc\\\\\\n├── cmd\\\\server\\\\\\n│ └── main.go\\n├── internal\\\\\\n│ ├── cache\\\\\\n│ │ └── redis.go\\n│ ├── config\\\\\\n│ │ ├── config.go\\n│ │ ├── database.go\\n│ │ ├── meilisearch.go\\n│ │ └── redis.go\\n│ ├── database\\\\\\n│ │ └── mysql.go\\n│ ├── handler\\\\\\n│ │ ├── brand.go\\n│ │ ├── device.go\\n│ │ ├── health.go\\n│ │ ├── model.go\\n│ │ └── model_list.go\\n│ ├── middleware\\\\\\n│ │ ├── cors.go\\n│ │ ├── logger.go\\n│ │ └── request_id.go\\n│ ├── model\\\\\\n│ │ ├── brand.go\\n│ │ └── model.go\\n│ ├── repository\\\\\\n│ │ ├── brand.go\\n│ │ └── model.go\\n│ ├── response\\\\\\n│ │ └── response.go\\n│ ├── router\\\\\\n│ │ └── router.go\\n│ └── search\\\\\\n│ └── meilisearch.go\\n├── pkg\\\\\\n│ ├── encode\\\\\\n│ │ └── base64.go\\n│ └── logger\\\\\\n│ └── logger.go\\n├── sql\\\\\\n│ └── model.sql\\n├── .gitignore\\n├── Makefile\\n├── README.md\\n├── go.mod\\n└── go.sum\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"36c6ca276628c62822c5b35e3772f1e2f1340f71","last_commit_update":"2026-05-27T18:36:41.119769+08:00","gmt_create":"2026-05-27T15:32:45.7755498+08:00","gmt_modified":"2026-05-27T18:36:41.119769+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"main\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.2.3\"}"}} \ No newline at end of file