b4780e256e
- 重写 15 张已有表文档:每张补「用在 App 哪/增删改查时机/字段取值/join key 指向」 - 新建 4 张缺失表文档:wechat_transfer_authorization / ad_watch_log / price_report / app_config - 新增 OVERVIEW.md:功能↔表映射 + 写入路径 + 表间关系(含语义 join key)+ ER + 资金模型 - README 索引补齐到 19 表 + 置顶 OVERVIEW + 通用约定补全 - 纠正过时:withdraw_order(reviewing/rejected/user_name)、savings_record(/order/report 真实写入)、coin_transaction(biz_type) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
admin_audit_log — 运营后台操作审计日志
模型
app/models/admin.py· 仓库app/admin/repositories/audit_log.py(写app/admin/audit.py) · 接口 admin-audit-logs · ← 索引 · 总览
每个 admin 写操作(改钱/改状态/处理反馈/改配置等)落一条,记"谁在何时、对谁、做了什么、前后值"。只追加、不可改不可删,用于追溯。admin_username / target_id 冗余存字符串,即使关联对象被删/改名也能追溯。
用在哪 / 增删改查
- C(插入):任何 admin 写操作经
audit.write_audit(add_audit_log)落一条,与业务写操作同事务(commit=False让 router 一起 commit:改了就有审计、有审计就真改了)。覆盖:手动增减金币、改用户状态、提现审核通过/拒绝/刷新、处理反馈、改配置等。 - U / D:无,永久不可变(无更新/删除接口)。
- R:
GET /admin/audit-logs(审计列表,可按action/target_type/admin_id筛,id倒序游标)。
字段
| 列 | 类型 | 约束 / 默认 | 说明(取值 / join) |
|---|---|---|---|
id |
Integer | PK, autoincrement | |
admin_id |
Integer | FK→admin_user.id, index, NOT NULL | 操作者 |
admin_username |
String(64) | NOT NULL | 冗余操作者用户名(改名/禁用后仍可追溯) |
action |
String(64) | index, NOT NULL | 操作类型,取值如 user.coins.grant / user.status.set / withdraw.refresh / withdraw.approve / withdraw.reject / feedback.handle / config.set |
target_type |
String(32) | NOT NULL | 被操作对象类型,取值如 user / withdraw / feedback / config |
target_id |
String(64) | nullable | 被操作对象 id(字符串以兼容 out_bill_no 等非整型主键)。指向随 target_type 变:user→user.id / withdraw→withdraw_order.out_bill_no / feedback→feedback.id / config→app_config.key |
detail |
JSON(PG: JSONB) | nullable | 上下文 + 前后值,如 {"amount":1000,"reason":"...","before":{...},"after":{...}} |
ip |
String(64) | nullable | 操作者 IP(取自 X-Forwarded-For 首段,仅记录不鉴权) |
created_at |
DateTime(tz) | server_default now(), index, NOT NULL | 操作时间 |
关系 / Join Key
admin_id→admin_user.id(多对一)。target_id是软关联(无 FK,字符串),目标表随target_type(见上表target_id行)。
索引与约束
- PK
id;indexadmin_id、action、created_at。
注意
detail用JSON().with_variant(JSONB(),"postgresql")(SQLite 退化 JSON)。- IP 可伪造:
X-Forwarded-For可被客户端伪造,nginx 必须proxy_set_header X-Forwarded-For $remote_addr覆盖;审计 IP 仅记录、不参与鉴权。