Files
zt-closet-backend/.codebuddy/plans/完善UserDefaultQuota配置化_ca78d85f.md
T
2026-09-11 01:41:52 +08:00

89 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: 完善UserDefaultQuota配置化
overview: 补齐 UserDefaultQuota 配置链路:定义 setting.UserDefaultQuotaSettingS 结构体、main 读取配置、config 增加 UserDefaultQuota 段,并让 ensureDefaultQuota 改用配置值(配置缺省时回落现有常量兜底),修复当前因未定义结构体导致的编译错误。
todos:
- id: define-setting
content: 在 pkg/setting/section.go 新增 UserDefaultQuotaSettingS 结构体(Cos/AI/OutfitShare/ClosetShare int64),修复 global/setting.go 的 undefined 编译错误
status: completed
- id: wire-config
content: 在 main.go setupSetting 增加 ReadSection("UserDefaultQuota"),并在 config.yaml 与 config.example.yaml 新增 UserDefaultQuota 段(20/3/10/5)
status: completed
dependencies:
- define-setting
- id: service-use-config
content: 在 internal/service/quota.go 新增 defaultQuotaValue 辅助(判 nil、字段
status: completed
dependencies:
- define-setting
---
## 需求概述
完善「新用户默认额度(UserDefaultQuota)」的配置化链路。当前 `global/setting.go` 已声明 `UserDefaultQuotaSetting *setting.UserDefaultQuotaSettingS`,但结构体未定义、main 未读取、config 无配置段、service 仍用硬编码常量,导致项目编译报错(`undefined: setting.UserDefaultQuotaSettingS`)。
## 核心功能
- 定义 `UserDefaultQuotaSettingS` 配置结构体,修复编译错误。
- main 启动时读取 `UserDefaultQuota` 配置段。
- 两个 config 文件新增 `UserDefaultQuota` 段(Cos/AI/OutfitShare/ClosetShare)。
- `ensureDefaultQuota` 改为读取配置值,配置缺省(<=0 或 global 为 nil)时回落现有常量兜底。
- 保持现有行为不变:未配置时默认仍为 20/3/10/5;初始化仍为 best-effort 且幂等。
## 技术方案
### 技术栈
沿用现有:Go + viper(`setting.ReadSection` → `UnmarshalKey`)配置读取,`global` 单例持有配置,`internal/service` 消费配置。
### 实现要点
1. **定义配置结构体** — `pkg/setting/section.go` 新增(放在 `WechatPaySettingS` 之后、`ReadSection` 方法之前,与现有结构体风格一致):
```
type UserDefaultQuotaSettingS struct {
Cos int64 // 免费上传额度
AI int64 // 免费 AI 推荐额度
OutfitShare int64 // 免费社区分享额度
ClosetShare int64 // 免费衣柜分享额度
}
```
修复 `global/setting.go:19` 的 `undefined` 编译错误。
2. **main 读取配置** — `main.go` `setupSetting()` 增 `setting.ReadSection("UserDefaultQuota", &global.UserDefaultQuotaSetting)`,与其他段处理方式一致(错误则 return err)。
3. **config 增加配置段** — `configs/config.yaml` 与 `configs/config.example.yaml` 均新增:
```
UserDefaultQuota:
Cos: 20
AI: 3
OutfitShare: 10
ClosetShare: 5
```
4. **service 使用配置 + 兜底** — `internal/service/quota.go`:
- 新增取值辅助 `defaultQuotaValue(quotaType int8) int64`:判 `global.UserDefaultQuotaSetting` 是否为 nil;取对应字段;字段 `<= 0` 时回落 `constants.go` 的 `DefaultQuota*` 常量。
- `ensureDefaultQuota` 的 defaults 列表 `total` 改为调用 `defaultQuotaValue(quotaType)`。
- 语义约定:值 `<= 0` 视为「未设置」回落常量默认(本次不支持「显式 0 额度」,如需后续加开关,注释说明)。
- `constants.go` 的四个 `DefaultQuota*` 常量**保留**作为兜底默认,补注释说明用途。
### 关键决策与约束
- **兜底优先,不破坏现有默认**:配置缺省或 global 为 nil(如未走 main 的单测场景)时结果仍为 20/3/10/5,避免空指针 panic。
- **幂等/best-effort 不变**:`ensureDefaultQuota` 仍在 `WxLogin` 新用户分支中以 best-effort 调用,已存在则跳过,写流水(`QuotaChangeTypeActivity`)与同步 Redis 逻辑保持不变。
- **安全**:纯数值配置,无秘钥、无外部输入风险。
### 涉及文件
- `pkg/setting/section.go`:[MODIFY] 新增 `UserDefaultQuotaSettingS`。
- `main.go`:[MODIFY] `setupSetting` 增 `ReadSection("UserDefaultQuota", ...)`。
- `configs/config.yaml`、`configs/config.example.yaml`:[MODIFY] 新增 `UserDefaultQuota` 段。
- `internal/service/quota.go`:[MODIFY] 新增 `defaultQuotaValue` 辅助,`ensureDefaultQuota` 改用配置。
- `internal/service/constants.go`:[MODIFY] 保留 `DefaultQuota*` 常量并补注释。
### 验证
- `go build ./...`、`go vet ./...` 通过(修复当前 undefined 错误)。
- 逻辑核对:未配置该段时结果为 20/3/10/5;配置后按配置生效;`global.UserDefaultQuotaSetting` 为 nil 或字段 <=0 时不 panic 且回落常量。