4.6 KiB
4.6 KiB
name, overview, todos
| name | overview | todos | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 完善UserDefaultQuota配置化 | 补齐 UserDefaultQuota 配置链路:定义 setting.UserDefaultQuotaSettingS 结构体、main 读取配置、config 增加 UserDefaultQuota 段,并让 ensureDefaultQuota 改用配置值(配置缺省时回落现有常量兜底),修复当前因未定义结构体导致的编译错误。 |
|
需求概述
完善「新用户默认额度(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 消费配置。
实现要点
- 定义配置结构体 —
pkg/setting/section.go新增(放在WechatPaySettingS之后、ReadSection方法之前,与现有结构体风格一致):
type UserDefaultQuotaSettingS struct {
Cos int64 // 免费上传额度
AI int64 // 免费 AI 推荐额度
OutfitShare int64 // 免费社区分享额度
ClosetShare int64 // 免费衣柜分享额度
}
修复 global/setting.go:19 的 undefined 编译错误。
-
main 读取配置 —
main.gosetupSetting()增setting.ReadSection("UserDefaultQuota", &global.UserDefaultQuotaSetting),与其他段处理方式一致(错误则 return err)。 -
config 增加配置段 —
configs/config.yaml与configs/config.example.yaml均新增:
UserDefaultQuota:
Cos: 20
AI: 3
OutfitShare: 10
ClosetShare: 5
- 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 且回落常量。