--- 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 且回落常量。