766666601e
Co-authored-by: OuYingJun1024 <1034284404@qq.com> Reviewed-on: #22 Reviewed-by: marco <marco@wonderable.ai> Co-authored-by: ouzhou <ouzhou@wonderable.ai> Co-committed-by: ouzhou <ouzhou@wonderable.ai>
2.9 KiB
2.9 KiB
app_config — 运营可配置项(覆盖 rewards 常量)
模型
app/models/app_config.py· 仓库app/repositories/app_config.py· 注册表app/core/config_schema.py· 接口 admin admin-stats-overview 同组的配置页(app/admin/routers/config.py) · ← 索引 · 总览
把原本硬编码在 core/rewards.py 的产品规则常量(签到档位、任务奖励、提现额度、看广告金币/上限/冷却等)挪到 DB,运营后台可改、跨进程即时生效。key 主键,value 用 JSON 存任意值(int / list / dict)。
核心约定:表里没有的 key,业务读配置时 fallback 到
config_schema.CONFIG_DEFS的默认值(= 原 rewards 常量)。所以空表 = 现有行为完全不变;admin 改某项 = 写一行 → 业务下次get_value读到新值。
用在哪 / 增删改查
- C / U(upsert):admin 配置页改某项
set_value(key, value, admin_id):无该 key 行→插,有→更新value+updated_by_admin_id(同事务写admin_audit_log,action='config.set')。未知 key(不在 CONFIG_DEFS)抛 KeyError。 - D:无(要恢复默认 = 删行即可回退到 CONFIG_DEFS,但当前无删除接口;改回默认值亦可)。
- R:业务侧——
rewards.get_*(db)一族(get_signin_rewards/get_withdraw_min_cents/get_ad_reward_coin…)经get_value读,签到/任务/提现/看广告发奖处用;admin 侧——list_all列出所有可配项(default + 当前值 + 元信息)给配置页渲染。
字段
| 列 | 类型 | 约束 / 默认 | 说明(取值 / join) |
|---|---|---|---|
key |
String(64) | PK | 配置标识,取值见 config_schema.CONFIG_DEFS:signin_rewards / min_exchange_coin / withdraw_min_cents / withdraw_max_cents / task_rewards / record_milestones / ad_reward_coin / ad_daily_limit / ad_max_coin / ad_round_count / ad_cooldown_sec |
value |
JSON(PG: JSONB) | NOT NULL | 配置值,类型随 key(int / int_list 如签到 14 档 / dict_str_int 如 task_rewards) |
updated_by_admin_id |
Integer | nullable | 最后修改的管理员 id(= admin_user.id,软引用,无 FK) |
updated_at |
DateTime(tz) | server_default now(), onupdate now() | 最后修改时间 |
关系 / Join Key
- 无外键。
updated_by_admin_id软指向admin_user.id(仅记录谁改的)。 - 逻辑上"覆盖"
core/rewards.py的常量:每个 key 的默认值/类型/分组/说明在config_schema.CONFIG_DEFS定义(配置项的 single source of truth)。
索引与约束
- PK
key(无自增 id)。
注意
- 不缓存:配置读频率低(每次福利操作读一次,主键查极快),admin 改了立即生效、跨进程一致(多 worker 也对)。
- 新增可配项 = 在
CONFIG_DEFS加一条 + 业务处改用app_config.get_value(db, key)读;不需要建迁移(行是动态插的,表结构不变)。