first commit

This commit is contained in:
2026-09-11 01:41:52 +08:00
commit 9f22e6ccae
263 changed files with 28935 additions and 0 deletions
@@ -0,0 +1,129 @@
---
name: redismodel key 设计对齐 mysqlmodel
overview: 以 internal/mysqlmodel 的实体与字段术语为基准,修复 internal/redismodel 的 Redis key 常量命名、文件组织与 key 字符串,使其语义对齐,并做最小引用同步以保持编译通过。
todos:
- id: refactor-key-basics
content: 新建 keys.go 抽取 RedisPrefix,删除 org.go 并拆分为 like.go 与 collect.go
status: pending
- id: align-quota-keys
content: 修改 quota.go 对齐 mysqlmodel 术语,并补充 lock.go 注释
status: pending
dependencies:
- refactor-key-basics
- id: align-auth-user-keys
content: 修改 auth.go 的 token key 为复数 Set 语义,新增 user.go 定义 KeyUserInfo
status: pending
dependencies:
- refactor-key-basics
- id: sync-redisdao-refs
content: 同步 redisdao 中 quota.go 与 user.go 的常量引用
status: pending
dependencies:
- align-quota-keys
- align-auth-user-keys
- id: build-lint-verify
content: 运行 go build 与 read_lints 校验编译与引用完整性
status: pending
dependencies:
- sync-redisdao-refs
---
## 产品概述
以 `internal/mysqlmodel` 的实体与字段术语为唯一基准,重构 `internal/redismodel` 下的 Redis key 常量设计,使 Redis 命名空间与数据库模型语义保持一致。本次仅修改 key 常量定义,并做 `internal/redisdao` 中常量引用的最小同步,不改动任何业务逻辑实现。
## 核心功能
- 将全局前缀 `RedisPrefix` 从 `auth.go` 抽取到独立文件 `keys.go`
- 删除命名不符的 `org.go`,按 mysqlmodel 的 `like.go`/`collect.go` 拆分为两个文件
- 对齐 quota key 术语:`community` 改为 `outfit_share`(社区分享/搭配分享)、`wardrobe_share` 改为 `closet_share`(衣柜分享)、`upload` 改为 `cos`(cos 上传额度)
- 将 `KeyAuthUserToken` 改为复数 Set 语义 `KeyAuthUserTokens`,支持多端登录一对多 token
- 新增 `KeyUserInfo` 常量,把 `redisdao/user.go` 中绕开统一管理的 `user:info:` 前缀纳入 redismodel 并补上 `ztcloset:` 命名空间
- 同步 `redisdao` 中对被重命名常量的引用,保证编译通过
## 技术栈
- 语言:Go
- 改动核心:`internal/redismodel` 下的 Redis key 常量定义
- 语义基准:`internal/mysqlmodel`(`user.go`、`quota.go`、`like.go`、`collect.go`、`order.go`、`goods.go`、`quotaflowlog.go`)
- 最小同步:`internal/redisdao`(仅更新常量引用,不改函数逻辑与函数名)
## 实现方案
### 总体策略
以 mysqlmodel 的实体命名和字段注释为准,重命名 Redis key 常量和 key 字符串,使两层模型术语一致。重命名导致 key 字符串变化,用户已确认适用于未上线/可清库场景。由于 `redisdao` 直接引用了这些常量,必须同步更新引用,否则无法编译。
### 关键决策
1. **`RedisPrefix` 独立成文件**:从 `auth.go` 移至新建的 `keys.go`,作为全包共享的命名空间前缀,消除其他文件对 `auth.go` 的隐式依赖。
2. **`org.go` 拆分为 `like.go` 与 `collect.go`**:对齐 mysqlmodel 的文件划分,每个文件只包含对应业务的 key 常量,并补充 `like_type:target_id`、`collect_type:target_id` 的参数注释。
3. **quota 术语统一**:以 `UserDailyUsage` 字段和 `Quota.QuotaType` 注释为准,AI 保持不变,`community` 统一为 `outfit_share`,`wardrobe_share` 统一为 `closet_share`,`upload` 统一为 `cos`。
4. **token 一对多语义修正**:`KeyAuthUserToken` 改为 `KeyAuthUserTokens`,key 使用复数 `auth:user:tokens:%d`,注释明确为 `user_id -> token 集合(Set)`,支持多端登录。该常量当前无引用,改名不产生编译影响。
5. **`user:info` 纳入统一管理**:新增 `redismodel/user.go` 定义 `KeyUserInfo`(带 `ztcloset:` 前缀),`redisdao/user.go` 移除本地 `userInfoKeyPrefix` 常量并改用该常量。
6. **锁定 key 保留并补注释**:`lock.go` 的三个常量与 mysqlmodel 的 `Order`、AIRecommend 业务对应,保留不动,仅补充参数与用途注释。
7. **不改 redisdao 函数名**:`QuotaDailyIncrCommunity`、`QuotaDailyIncrShare` 等函数名本次不调整,仅同步函数体内引用的常量名,避免扩大影响面。
## 目录结构
```
internal/redismodel/
├── keys.go # [NEW] 定义全局 RedisPrefix = "ztcloset:"
├── auth.go # [MODIFY] 移除 RedisPrefix;KeyAuthUserToken 改为 KeyAuthUserTokens(Set 语义)
├── quota.go # [MODIFY] community→outfit_share、wardrobe_share→closet_share、upload→cos
├── like.go # [NEW] KeyLikeSet(由 org.go 拆分)
├── collect.go # [NEW] KeyCollectSet(由 org.go 拆分)
├── org.go # [DELETE] 内容已拆分至 like.go/collect.go
├── lock.go # [MODIFY] 补充参数与用途注释(常量不变)
└── user.go # [NEW] KeyUserInfo 缓存 key 常量
internal/redisdao/
├── quota.go # [MODIFY] 同步引用 KeyQuotaDailyOutfitShare / KeyQuotaDailyClosetShare
└── user.go # [MODIFY] 移除本地 userInfoKeyPrefix,改用 redismodel.KeyUserInfo
```
## 关键代码结构
修复后的 `internal/redismodel` key 常量全集:
```
// keys.go
const RedisPrefix = "ztcloset:"
// auth.go
const (
KeyAuthAccess = RedisPrefix + "auth:access:%s" // access_token -> user_id
KeyAuthRefresh = RedisPrefix + "auth:refresh:%s" // refresh_token -> user_id
KeyAuthUserTokens = RedisPrefix + "auth:user:tokens:%d" // user_id -> token 集合(Set,支持多端登录)
)
// quota.go
const (
KeyQuotaDailyAI = RedisPrefix + "quota:daily:ai:%d:%s" // user_id:date,当日AI推荐次数
KeyQuotaDailyOutfitShare = RedisPrefix + "quota:daily:outfit_share:%d:%s" // user_id:date,当日社区分享次数(搭配分享)
KeyQuotaDailyClosetShare = RedisPrefix + "quota:daily:closet_share:%d:%s" // user_id:date,当日衣柜分享次数
KeyQuotaCosTotal = RedisPrefix + "quota:cos:total:%d" // user_id,cos 上传总配额
)
// like.go
const KeyLikeSet = RedisPrefix + "like:set:%d:%d" // like_type:target_id
// collect.go
const KeyCollectSet = RedisPrefix + "collect:set:%d:%d" // collect_type:target_id
// lock.go
const (
KeyLockOrderCreate = RedisPrefix + "lock:order:create:%d" // order_id,下单防重
KeyLockPayCallback = RedisPrefix + "lock:pay:callback:%s" // order_no,支付回调幂等
KeyLockAIRecommend = RedisPrefix + "lock:ai:recommend:%d" // user_id,AI推荐防并发
)
// user.go
const KeyUserInfo = RedisPrefix + "user:info:%d" // user_id,缓存用户鉴权核心信息
```
## 实现注意事项
- 修改后需运行 `go build ./...` 与 `read_lints` 校验,重点确认 `redisdao` 内无遗漏的旧常量引用。
- 严格限定在 key 常量层:不改 `redisdao` 的函数名与业务逻辑,不改 `middleware/lzcwyjwt.go` 的 status 判断,不改 quota 过期/时区实现。
- key 字符串变更属于破坏性变更,依赖可清库/未上线前提(用户已确认)。