docs: align phase 4 review follow-up
This commit is contained in:
@@ -25,7 +25,7 @@ Python 3.12 / Django 5.2 LTS + DRF / django-admin / 用户端 Django 模板 SSR
|
||||
|
||||
## 当前状态
|
||||
|
||||
Phase 2 计费核心已完成,Phase 3 对外 API 与充值已完成到 T-306,Phase 4 用户端已完成 T-501~T-504:用户可通过 allauth 自助注册、邮箱验证、登录、登出,扫码充值并轮询到账,生成 / 删除(吊销)API Key,并查看余额、充值总额、充值记录与消费记录。下一步进入 T-401 运营后台完善。详见 [`docs/current-state.md`](docs/current-state.md)。
|
||||
Phase 2 计费核心已完成,Phase 3 对外 API 与充值已完成到 T-306,Phase 4 用户端已完成 T-501~T-504:用户可通过 allauth 自助注册、邮箱验证、登录、登出,扫码充值并轮询到账,生成 / 删除(吊销)API Key,并查看余额、充值总额、充值记录与消费记录。Phase 4 审核新增 T-505,下一步先处理用户端审核优化,再进入 T-401 运营后台完善。详见 [`docs/current-state.md`](docs/current-state.md)。
|
||||
|
||||
> ⚠️ 涉及资金/点数。改动充值、扣费、退款、对账相关代码前,先读 [`docs/05-coding-rules.md`](docs/05-coding-rules.md) 第 8 节与 [`docs/04-architecture.md`](docs/04-architecture.md) 第四节计费时序。
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
## 当前阶段
|
||||
|
||||
当前项目处于:**Phase 5 后台与发布**。Phase 2 计费核心已完成到 T-204;Phase 3 已完成 T-301 API Key 鉴权、T-302 生成标题 / 图片接口、T-303 余额查询接口、T-304 充值回调、T-305 扫码充值下单 + 轮询与 T-306 对外 API 安全加固;Phase 4 已完成 T-501 注册 / 登录(allauth)、T-502 API Key 自助管理页、T-503 个人中心 / 记录页与 T-504 充值页。下一步进入 T-401 运营后台完善。
|
||||
当前项目处于:**Phase 4 审核优化收尾**。Phase 2 计费核心已完成到 T-204;Phase 3 已完成 T-301 API Key 鉴权、T-302 生成标题 / 图片接口、T-303 余额查询接口、T-304 充值回调、T-305 扫码充值下单 + 轮询与 T-306 对外 API 安全加固;Phase 4 已完成 T-501 注册 / 登录(allauth)、T-502 API Key 自助管理页、T-503 个人中心 / 记录页与 T-504 充值页。Phase 4 审核新增 T-505,下一步先处理用户端审核优化,再进入 T-401 运营后台完善。
|
||||
|
||||
优先路径:
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
2. Phase 1:最高风险功能原型 —— T-101/T-102/T-103/T-104/T-105 已完成 provider 层、模型配置表、别名解析、配置审计、录制标题/图片 smoke 与审核修补;真实图片同步耗时待配置 Fernet 主密钥、AiModel/ModelAlias 与真实上游后在 T-302/T-403 前补测。
|
||||
3. Phase 2:计费核心 —— T-201/T-202/T-203 已完成 UserWallet/ApiKey/PointsLedger/CallRecord、计费规则、汇率、计费计算、并发安全扣点与失败退点。
|
||||
4. Phase 3:对外 API 与充值 —— T-301 Key 鉴权、T-302 生成接口、T-303 余额查询、T-304 充值回调、T-305 扫码下单与轮询、T-306 安全加固已完成。
|
||||
5. Phase 4:用户端(Django 模板 SSR)—— T-501 注册登录、T-502 API Key 管理、T-503 个人中心 / 记录页与 T-504 充值页已完成。
|
||||
6. Phase 5:后台与发布 —— 下一步 T-401 运营后台完善,随后做完整验收与部署 / 运行文档。
|
||||
5. Phase 4:用户端(Django 模板 SSR)—— T-501 注册登录、T-502 API Key 管理、T-503 个人中心 / 记录页与 T-504 充值页已完成;T-505 用户端审核优化为当前下一步。
|
||||
6. Phase 5:后台与发布 —— T-505 完成后进入 T-401 运营后台完善,随后做完整验收与部署 / 运行文档。
|
||||
|
||||
## 领取任务规则
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
| T-502 | API Key 自助管理页 | T-501, T-301 | 登录用户生成/删除 Key;明文只显示一次、库内只存哈希;列表只显示 prefix;删除即吊销,吊销后该 Key 调用 403(无效/不存在 Key 仍为 401) | DONE |
|
||||
| T-503 | 个人中心 / 记录页 | T-501, T-203 | 剩余点数、充值总额、充值记录、消费(调用)记录;数据与流水一致;仅见本人 | DONE |
|
||||
| T-504 | 充值页(扫码 + 轮询到账) | T-501, T-305 | 发起充值→展示二维码→轮询订单状态→到账后余额刷新;到账以回调为权威 | DONE |
|
||||
| T-505 | Phase 4 用户端审核优化 | T-504 | 按 [`phase-4-review.md`](phase-4-review.md) 处理 **P2**(P2-1 Bootstrap/qrcode 自托管或加 SRI+crossorigin,断网 jsdelivr 后充值页仍可用;P2-2 记录页真正分页或明确截断提示,含 >50 条测试);P3 登记到 T-401/T-403 或 Backlog。**无 P1,但按任务看板领取规则应先完成 T-505,再进入 T-401**;`check`/`test`/`init` 全绿并在 `../progress.md` 留证据 | TODO |
|
||||
|
||||
## Phase 5 · 后台与发布
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
- [Phase 1 AI 层审核](phase-1-review.md):T-101~104 代码审核结论与修补清单(P1/P2/P3),对应任务 T-105;重点提示图片同步风险未退与 `parameters` 越权计费隐患。
|
||||
- [Phase 2 计费核心审核](phase-2-review.md):T-201~203 代码审核结论(资金安全逐条核对)与加固清单(**零 P1**,P2/P3),对应任务 T-204。
|
||||
- [Phase 3 对外 API 与充值审核](phase-3-review.md):T-301~305 代码审核结论(鉴权/回调/幂等/入账逐条核对)与优化建议,对应任务 T-306;**P1 提示 `image_url` SSRF 上线前必修**。
|
||||
- [Phase 4 用户端审核](phase-4-review.md):T-501~504 代码审核结论(注册不送点/越权/CSRF/明文只显一次/到账以回调为权威逐条核对)与优化建议(**零 P1**,P2/P3),对应任务 T-505。
|
||||
- [API 合约](api.md):对外接口、支付回调、AI 调用模块合约、错误码。
|
||||
- [路由与页面结构](routes.md):API 路由与 django-admin 后台职责。
|
||||
- [环境变量与配置](env.md):Django、数据库、AI 密钥加密、支付、对象存储等配置项。
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
## 当前快照
|
||||
|
||||
- 日期:2026-07-03
|
||||
- 阶段:Phase 5 后台与发布;Phase 3 对外 API 与充值已完成到 T-306,Phase 4 用户端 T-501 注册 / 登录(allauth)、T-502 API Key 自助管理页、T-503 个人中心 / 记录页与 T-504 充值页已完成,下一步 T-401 运营后台完善
|
||||
- 阶段:Phase 4 审核优化收尾;Phase 3 对外 API 与充值已完成到 T-306,Phase 4 用户端 T-501 注册 / 登录(allauth)、T-502 API Key 自助管理页、T-503 个人中心 / 记录页与 T-504 充值页已完成,Phase 4 审核新增 T-505,下一步 T-505 用户端审核优化,完成后进入 T-401 运营后台完善
|
||||
- 技术栈:系统 Python 3.12.3 + Django 5.2.15 + DRF 3.16.1 + django-allauth 65.18.0 + PyMySQL 1.1.3 + cryptography 46.0.7 + requests 2.34.2 + django-admin;MySQL 8.4 已接入 settings,并支持 `MYSQL_CONNECT_TIMEOUT` / `MYSQL_READ_TIMEOUT` / `MYSQL_WRITE_TIMEOUT`;用户端已用 Django 模板 SSR + Bootstrap + allauth 落地注册登录;详见 `03-tech-stack.md`
|
||||
- 生产代码:已有最小 Django 工程骨架:`manage.py`、`config/`;T-002 已创建 `apps/users|portal|billing|ai|api`;T-003 已把自定义 `User` 注册进 django-admin;T-004 已完成 email 唯一性、init 版本断言、app 顺序、`.env.example` 与 `pyproject.toml`;T-101 已新增 `apps/ai/providers/`(Provider 接口、注册表、chat/gemini/images/images_edits 适配器);T-102 已新增 `AiModel` / `ModelAlias`、Fernet 加密密钥存储、别名解析、admin 配置页、`import_ai_models` 导入命令;T-103 已新增 `AiConfigAuditLog` 审计表、admin 只读页面和后台保存/删除审计 hook;T-104/T-105 已完成录制 title/image smoke 与审核修补;T-201 已新增 `UserWallet` / `ApiKey`、`PointsLedger` / `CallRecord`、对应 admin 与迁移;T-202 已新增 `PricingRule` / `ExchangeRate`、`apps.billing.pricing` 计费计算函数、admin 配置页与迁移;T-203 已新增 `apps.billing.services`,实现并发安全预扣、成功确认与幂等失败退点;T-204 已新增 `billing.0003_pointsledger_unique_ledger_change_type_per_call`,用 MySQL 可落地的 `ref_call + change_type` 复合唯一约束兜底防重复 refund;T-301 已新增 `apps.api.authentication.ApiKeyAuthentication` 与 `ExternalApiView`;T-302 已新增生成接口编排、序列化器、图片本地存储和 `/api/v1/generate/title|image` 路由;T-303 已新增 `apps.billing.services.get_balance_snapshot()` 与 `/api/v1/balance` 余额查询接口;T-304 已新增 `RechargeOrder`、充值回调验签适配器、幂等入账服务、微信/支付宝回调路由与迁移 `billing.0004_rechargeorder_and_more`;T-305 已新增 `create_recharge_order()`、微信/支付宝扫码下单 mock/SDK 入口、`/api/v1/recharge/create` 与 `/api/v1/recharge/status`;T-306 已新增 `apps.api.throttles`、`apps.api.exceptions`、`REST_FRAMEWORK` 安全默认认证、生成/认证失败限流、`image_url` SSRF 防护与响应大小上限、充值单笔金额上限;T-501 已接入 allauth,新增 portal 路由、注册适配器、登录/注册/登出模板和最小 dashboard,注册成功创建 0 点钱包且不写赠点流水;T-502 已新增 `/apikeys`、API Key 创建表单、列表页和删除(吊销)动作,生成后明文只显示一次,列表只显示 prefix;T-503 已扩展 `/dashboard` 为个人中心汇总,并新增 `/records/recharge` 充值记录与 `/records/usage` 消费记录,只读展示当前用户数据;T-504 已新增 `/recharge` 页面、`RechargeCreateForm`、充值导航入口和轮询脚本,页面创建 pending 订单、展示二维码票据、轮询 `/api/v1/recharge/status`,订单 paid 后刷新余额
|
||||
- 测试:T-504 已验证:`./init.ps1` 开工前通过;`py -3.12 -m py_compile apps\portal\forms.py apps\portal\views.py apps\portal\urls.py apps\portal\tests.py` 通过;`py -3.12 manage.py check` 通过;`py -3.12 manage.py makemigrations --check --dry-run` 无变化;`py -3.12 -m compileall apps config` 通过;`py -3.12 manage.py test apps.portal --noinput --keepdb --verbosity 2` 通过(19 tests OK);`py -3.12 manage.py test apps.users apps.portal apps.api --noinput --keepdb --verbosity 2` 通过(60 tests OK);`./init.ps1` 收尾通过;`git diff --check` 通过(仅 Windows CRLF 提示)。测试/迁移阶段仍有 allauth `account.EmailAddress` 条件唯一约束在 MySQL 上不可创建的 `models.W036` 警告;本项目用户账本唯一性由 `user.email` 唯一约束承担。
|
||||
@@ -44,7 +44,7 @@
|
||||
- 已完成:T-001 初始化 Django + DRF 项目骨架;T-002 建立 apps 目录、自定义 User 与配置;T-003 接通 django-admin 与最小测试;T-004 Phase 0 骨架审核修补;T-101 Provider 适配器层 + 移植 cmbot 调用;T-102 AiModel + ModelAlias 模型 + 别名解析;T-103 配置变更审计;T-104 跑通一次录制标题生成;T-105 Phase 1 AI 层审核修补;T-201 User / UserWallet / ApiKey / PointsLedger / CallRecord 模型;T-202 PricingRule / ExchangeRate 模型 + 计费计算;T-203 并发安全扣点 / 退点;T-204 Phase 2 计费核心审核加固;T-301 API Key 鉴权;T-302 生成标题 / 图片接口;T-303 余额查询接口;T-304 充值回调;T-305 扫码充值下单 + 轮询;T-306 Phase 3 对外 API 安全加固;T-501 注册 / 登录(allauth);T-502 API Key 自助管理页;T-503 个人中心 / 记录页;T-504 充值页(扫码 + 轮询到账)。
|
||||
- 正在进行:无。
|
||||
- 当前 blocker:远程 MySQL 连接当前不稳定或很慢;支付商户真实密钥/证书与生产 SDK 依赖仍待提供;真实 AI 上游 smoke 仍需配置密钥和模型数据后执行。
|
||||
- 下一个可领取任务:**T-401 运营后台完善**。
|
||||
- 下一个可领取任务:**T-505 Phase 4 用户端审核优化**;完成后进入 **T-401 运营后台完善**。
|
||||
|
||||
## 当前可运行内容
|
||||
|
||||
@@ -97,7 +97,7 @@ python3.12 manage.py smoke_ai_generation image --recorded
|
||||
1. 读仓库级 `AGENTS.md` / `CLAUDE.md`。
|
||||
2. 读 `docs/00-ai-start-here.md`。
|
||||
3. 读 `docs/05-coding-rules.md`(尤其第 8 节资金安全)。
|
||||
4. 在 `docs/06-tasks.md` 领取第一个 `TODO` 且依赖均 `DONE` 的任务(当前为 T-401)。
|
||||
4. 在 `docs/06-tasks.md` 领取第一个 `TODO` 且依赖均 `DONE` 的任务(当前为 T-505)。
|
||||
5. 将该任务状态改为 `DOING`。
|
||||
|
||||
## 维护规则
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# Phase 4 用户端审核报告(T-501 ~ T-504)
|
||||
|
||||
> 审核人:Claude Code(全栈视角)|日期:2026-07-03|结论:**功能验收全部达标,测试覆盖极全,零 P1(无安全/资金/越权缺陷)**。
|
||||
> Phase 4 是自助用户端(Django 模板 SSR + allauth)。逐条比对验收:注册不送点数、session+CSRF、越权(IDOR)防护、API Key 明文只显一次、吊销后调用 403、记录仅见本人、充值到账以回调为权威——**全部正确落地且有专测**。剩余为前端资源与 UX 优化项(P2/P3)。
|
||||
> 本文面向 codex 执行:每条给出「症状 / 位置 / 怎么改 / 怎么验证」。修补任务见 [`06-tasks.md`](06-tasks.md) 的 **T-505**;按任务看板领取规则,当前应先完成 T-505,再进入 T-401。
|
||||
|
||||
## 一、验收核对(功能全部达标)
|
||||
|
||||
| 任务 | 验收要点 | 结果 |
|
||||
| --- | --- | --- |
|
||||
| T-501 | 自助注册(邮箱验证)、登录、登出;注册后钱包 0 点(不送点数);session+CSRF | ✅ 注册建 0 点钱包且**不写 `PointsLedger`**(专测);未验证邮箱不能登录;登录 POST CSRF 保护 |
|
||||
| T-502 | 生成/删除 Key;明文只显一次、库内只存哈希;列表只显 prefix;删除即吊销、吊销后调用 403 | ✅ 全部专测覆盖,含「删除→外部 API 返回 403」与「不能删他人 Key」(IDOR) |
|
||||
| T-503 | 剩余点数、充值总额、充值/消费记录;数据与流水一致;仅见本人 | ✅ 余额/汇总同源于流水;三处记录页均按 `user=request.user` 过滤(专测越权) |
|
||||
| T-504 | 发起充值→二维码→轮询→到账刷新;到账以回调为权威 | ✅ 下单**不加点不写流水**(专测);轮询 T-305 status 端点;paid 后 reload;入账仍走幂等回调/查单 |
|
||||
|
||||
## 二、做对的(勿在修补中回退)
|
||||
|
||||
1. **注册不送点数、且不留误导流水**:`CmhubAccountAdapter.save_user` 在事务内 `get_or_create` 建 `points_balance=0` 钱包,**刻意不写任何 `PointsLedger`**(避免被误解为赠点);专测断言注册后 0 点、无流水。顺带解决了 Phase 2 P3「钱包应在注册时创建」——precharge 不再依赖热路径建钱包。
|
||||
2. **越权(IDOR)防护到位**:删除 Key 用 `get_object_or_404(ApiKey, pk=pk, user=request.user)`(他人 Key 返回 404 不泄露存在性);所有记录/订单查询一律 `filter(user=request.user)`;充值页 `current_order` 也按 user 过滤。每条都有「只见本人」专测。
|
||||
3. **API Key 明文只显一次**:生成后 `raw_key` 存入 session,下次渲染 `session.pop` 取出展示后即清除(PRG 模式);刷新不再出现;库内只存 `key_hash`+`key_prefix`。专测断言明文只显一次、库内只存哈希。
|
||||
4. **删除=吊销(软删)**:`status→revoked` 而非物理删除,保留审计与 `CallRecord` 关联;吊销后外部 API 返回 403(与 T-301 口径一致:revoked→403、缺失/无效→401)。codex 主动修正了任务原文的「401」为正确的「403」。
|
||||
5. **session+CSRF 全覆盖**:所有页面 `LoginRequiredMixin`;所有 POST 表单带 `{% csrf_token %}`;登录、建/删 Key、充值下单的 CSRF 都有专测。
|
||||
6. **充值到账以回调为权威**:下单只建 `pending` 订单、**不碰余额**;前端轮询 `api-recharge-status`(`same-origin` 会话),status 端点内部对 pending 单走 `query_and_apply_recharge_payment`(复用幂等、金额校验的 `apply_recharge_payment`);paid 后 reload 刷新余额。资金入账始终经计费层,页面只读。
|
||||
7. **记录与流水同源**:余额用 `get_balance_snapshot()`;充值总额按 paid `RechargeOrder.amount_money`;入账/消费按 `PointsLedger` 汇总;`net_used_points = 消费 − 退款`(退款 delta 为正、消费取绝对值,口径正确)。
|
||||
8. **用当前 allauth API**:`ACCOUNT_LOGIN_METHODS` / `ACCOUNT_SIGNUP_FIELDS`(65.x 新式设置)、`ACCOUNT_EMAIL_VERIFICATION="mandatory"`、`ACCOUNT_UNIQUE_EMAIL`,与 T-201 的 `User.email` 唯一约束对齐。未引入 crispy-forms(MVP 保持轻)。
|
||||
|
||||
## 三、优化建议 / 修补清单
|
||||
|
||||
### P1 · 现在改
|
||||
|
||||
**无。** 用户端零 P1——越权、CSRF、注册不送点、明文只显一次、吊销 403、到账以回调为权威全部正确且有测试。以下为前端资源与 UX 优化。
|
||||
|
||||
### P2 · 建议处理
|
||||
|
||||
#### P2-1 外部 CDN 无 SRI + 国内可用性(含支付页)
|
||||
|
||||
- **症状**:`base.html` 从 jsdelivr 加载 Bootstrap CSS、`recharge.html` 从 jsdelivr 加载 `qrcode.min.js`,**均无 `integrity`(SRI)/`crossorigin`**。两个问题:
|
||||
1. **供应链/XSS**:无 SRI 的 `<script src=cdn>` 一旦 CDN 被投毒或遭 MITM,任意 JS 会在**已登录、带 session 的用户端(尤其充值页)**执行。
|
||||
2. **国内可用性**:本项目面向微信/支付宝用户,而 jsdelivr 在中国大陆**间歇性被墙/不稳**。CDN 失败时 Bootstrap 丢失→页面错版;`qrcode.js` 丢失→二维码画不出(有 code_url 文本兜底但体验退化)。
|
||||
- **位置**:`apps/portal/templates/portal/base.html`、`apps/portal/templates/portal/recharge.html`。
|
||||
- **怎么改(推荐自托管)**:把 Bootstrap、qrcode.js 纳入 `static/`,用 Django staticfiles(+ `collectstatic` + WhiteNoise/nginx)本地提供;若坚持用 CDN,则**必须**加 `integrity="sha384-..."` + `crossorigin="anonymous"`。自托管同时解决国内可用性,且与 T-403 部署(静态资源收集)天然衔接。
|
||||
- **验证**:断网/屏蔽 jsdelivr 后充值页仍能出二维码、样式正常;页面源码无无 SRI 的外链脚本。
|
||||
|
||||
#### P2-2 记录页无真正分页(静默截断历史)
|
||||
|
||||
- **症状**:`RECORDS_PAGE_SIZE=50` 只是 `queryset[:50]` 切片——充值记录 / 消费记录**超过 50 条后,更早的记录用户永远看不到**,且无「仅显示最近 50 条」提示、无总数、无翻页。与 T-503「查看自己的充值记录/消费记录」的完整性预期不符。
|
||||
- **位置**:`apps/portal/views.py`(`RechargeRecordListView` / `UsageRecordListView`)。
|
||||
- **怎么改**:用 Django `Paginator`(或 `ListView` + `paginate_by`)做真正翻页;至少先显示总条数并标注「仅显示最近 N 条」。
|
||||
- **验证**:造 >50 条记录,能翻到第 2 页 / 或页面明确提示被截断。
|
||||
|
||||
### P3 · 登记 / 后续
|
||||
|
||||
- **API Key 数量无上限**:用户可无限建 Key(每个都是一行 + 列表项)。建议加每用户活跃 Key 上限(如 10)。→ Backlog / T-401 后台侧。
|
||||
- **充值下单无频率限制**:用户可反复点「创建订单」刷出大量 pending 订单(每次调支付网关)。建议限制每用户未支付订单数或加节流。→ Backlog。
|
||||
- **生产邮件后端**:`ACCOUNT_EMAIL_VERIFICATION="mandatory"` + 默认 `console` 邮件后端——**生产必须配真实 SMTP**,否则验证邮件发不出、用户无法验证→无法登录。→ 明确写入 T-403 部署文档。
|
||||
- **`ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True`**:点验证邮件链接即自动登录,便利但邮件链接=登录入口(转发风险)。MVP 可接受,登记备忘。
|
||||
- **新 Key 明文经服务端 session 存储**:`raw_key` 在下次渲染前短暂存于 session(DB 后端)表中,`pop` 后清除。窗口极短可接受,登记。
|
||||
- **allauth `account.EmailAddress` 的 `models.W036`**(MySQL 条件唯一约束警告):邮箱唯一性已由 `User.email` 唯一约束承担,属 cosmetic 警告,登记。
|
||||
|
||||
## 四、说明:未本地复跑
|
||||
|
||||
审核机(WSL)无 `python3.12`,**未本地复跑**。本报告基于静态审查(`portal/views`、`adapters`、`forms`、`urls`、全部模板、`tests`;`config/settings` allauth 段)+ codex 执行记录(T-501~504 分 app 通过;T-501 有一次完整 **95 tests 单次全绿**;T-504 完整套件 60 tests 通过,失败点均为远程 MySQL 连接超时非断言失败)。
|
||||
|
||||
T-505 处理后,请重跑 `check`/`test`/`init` 并把证据记入 `progress.md`(`06-tasks.md` 使用规则第 5 条)。
|
||||
|
||||
## 五、T-505 完成定义
|
||||
|
||||
- **P2-1** 已处理:Bootstrap/qrcode 自托管(或加 SRI+crossorigin);断网 jsdelivr 后充值页仍可用。
|
||||
- **P2-2** 已处理:记录页真正分页或明确截断提示;含 >50 条测试。
|
||||
- **P3** 各项已在 `06-tasks.md` 对应任务(T-401 / T-403)或 Backlog 登记,不遗失。
|
||||
- `check` 0 issues、`test` 全绿、`init` 通过,证据入 `progress.md`。
|
||||
@@ -1,7 +1,7 @@
|
||||
# cmhub 项目介绍(给管理层)
|
||||
|
||||
> 面向决策与汇报的项目概览。技术细节见同目录架构与需求文档。
|
||||
> 日期:2026-07-03 | 阶段:Phase 5 后台与发布(Phase 4 用户端已完成到 T-504)
|
||||
> 日期:2026-07-03 | 阶段:Phase 4 审核优化收尾(T-505 待处理)
|
||||
|
||||
## 一句话概括
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
- Phase 2 计费核心已完成:PricingRule / ExchangeRate、计费计算、并发安全扣点与失败退点已落地,并覆盖并发测试。
|
||||
- Phase 3 对外 API 与充值已完成到 T-306:API Key 鉴权、生成/余额接口、扫码充值下单与轮询、支付回调幂等入账、`image_url` SSRF 防护、生成/认证限流和充值金额上限已落地。
|
||||
- Phase 4 已完成 T-501~T-504:用户端注册 / 登录(allauth)、邮箱验证、登出、API Key 自助管理、个人中心汇总、充值记录、消费记录和充值页已落地;用户可创建充值订单、查看二维码票据并轮询到账;Key 明文只显示一次,库内只保留 hash 和 prefix,删除即吊销;记录页仅见本人数据。
|
||||
- 下一步是 T-401:完善运营后台,补齐用户/钱包/API Key/计费规则/充值订单/流水/调用记录的运营检索与手工调点能力。
|
||||
- 下一步先做 T-505:处理 Phase 4 用户端审核优化(静态资源自托管或 SRI、记录页分页或明确截断提示),完成后再进入 T-401 运营后台完善,补齐用户/钱包/API Key/计费规则/充值订单/流水/调用记录的运营检索与手工调点能力。
|
||||
|
||||
---
|
||||
*更多细节:愿景 `01-vision.md` | 需求与验收 `02-requirements.md` | 架构 `04-architecture.md` | 任务计划 `06-tasks.md`。*
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# cmhub · 一页汇报版
|
||||
|
||||
> 自助用户端 + 计费型 AI 能力网关 + 运营后台 | 2026-07-03 | Phase 5 后台与发布
|
||||
> 自助用户端 + 计费型 AI 能力网关 + 运营后台 | 2026-07-03 | Phase 4 审核优化收尾
|
||||
|
||||
## 电梯陈述(30 秒)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
## 进度
|
||||
|
||||
M1 骨架已完成;M2 已通过录制生成 smoke 验证 AI 调用链路;M3 计费、对外 API、充值闭环与上线前安全加固已完成到 T-306;M4 用户端已完成注册 / 登录(T-501)、API Key 管理页(T-502)、个人中心 / 记录页(T-503)和充值页(T-504)。下一步做运营后台完善。里程碑:M1 骨架可跑 · M2 跑通生成 · M3 计费充值闭环 · M4 用户端可用 · M5 验收上线。
|
||||
M1 骨架已完成;M2 已通过录制生成 smoke 验证 AI 调用链路;M3 计费、对外 API、充值闭环与上线前安全加固已完成到 T-306;M4 用户端已完成注册 / 登录(T-501)、API Key 管理页(T-502)、个人中心 / 记录页(T-503)和充值页(T-504)。下一步先做 Phase 4 审核优化 T-505,随后进入运营后台完善。里程碑:M1 骨架可跑 · M2 跑通生成 · M3 计费充值闭环 · M4 用户端可用 · M5 验收上线。
|
||||
|
||||
---
|
||||
*详见 `project-brief.md`(完整介绍)。*
|
||||
|
||||
+20
@@ -825,3 +825,23 @@
|
||||
- 阻塞:T-504 功能无阻塞。测试阶段仍有 allauth `account.EmailAddress` 条件唯一约束在 MySQL 上不可创建的 `models.W036` 警告;本项目账本邮箱唯一性由 `user.email` 唯一约束承担。真实支付仍需微信 / 支付宝商户密钥、证书、生产 SDK 依赖与公网回调地址。
|
||||
- 决策:`/recharge` 页面 POST 直接复用 billing 层 `create_recharge_order()` 创建订单,JSON `POST /api/v1/recharge/create` 继续保留给用户端脚本或后续前端调用;页面本身不写钱包和流水,到账只认回调或主动查单入账后的本地订单状态。
|
||||
- 下一步:领取 T-401 运营后台完善。
|
||||
|
||||
## 2026-07-03 Phase 4 用户端审核(Claude Code review,非任务)
|
||||
|
||||
- 状态:DONE(审核完成)
|
||||
- 变更:新增 `docs/phase-4-review.md`;`06-tasks.md` 新增 T-505 优化任务;`docs/README.md` 导航登记。
|
||||
- 审核结论:**T-501~504 功能验收全部达标,测试覆盖极全,零 P1(无安全/资金/越权缺陷)**。逐条核对:注册建 0 点钱包且不写 PointsLedger(不送点数)、未验证邮箱不能登录、所有页面 LoginRequiredMixin + POST 带 CSRF、API Key 明文只显一次(session pop)且库内只存哈希、删除=软吊销且吊销后外部 API 返回 403、删他人 Key 返回 404(IDOR)、所有记录/订单按 user 过滤(仅见本人)、充值下单不加点不写流水、轮询 T-305 status 端点、到账经幂等回调/查单入账(页面只读、以回调为权威)——每条都有专测。T-501 有一次完整 95 tests 单次全绿。
|
||||
- 发现(详见 `phase-4-review.md`):
|
||||
- P1:无。
|
||||
- P2-1:base.html/recharge.html 从 jsdelivr 加载 Bootstrap/qrcode 且无 SRI/crossorigin——已登录/支付页的供应链风险 + jsdelivr 国内不稳(微信支付宝产品)。建议自托管静态资源(衔接 T-403 collectstatic)或加 integrity+crossorigin。
|
||||
- P2-2:记录页 RECORDS_PAGE_SIZE=50 仅切片无真正分页,>50 条历史静默截断。建议 Paginator 或明确截断提示。
|
||||
- P3(登记):API Key 数量无上限、充值下单无频率限制(→Backlog);生产必须配真实 SMTP 邮件后端否则邮箱验证发不出(→T-403);ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION=True 邮件链接即登录(备忘);新 Key 明文短暂经 session 存储;allauth EmailAddress W036 cosmetic 警告(邮箱唯一性已由 User.email 承担)。
|
||||
- 未本地复跑:审核机无 python3.12,结论基于静态审查(portal views/adapters/forms/urls/全部模板/tests;settings allauth 段)+ codex 执行记录(T-501~504 分 app 通过、T-501 一次 95 tests 单次全绿、T-504 完整 60 tests 通过,失败点均为远程 MySQL 连接超时非断言失败)。
|
||||
- 下一步:领取 T-505 做 Phase 4 用户端审核优化;完成后再进入 T-401 运营后台完善。
|
||||
|
||||
## 2026-07-03 Phase 4 审核任务口径修正(文档)
|
||||
|
||||
- 状态:DONE
|
||||
- 变更:统一新增 T-505 后的下一步口径:因任务看板规则要求领取第一个 `TODO` 且依赖均 `DONE` 的任务,T-505 作为 Phase 4 用户端审核优化先于 T-401 执行;同步更新 `README.md`、`docs/00-ai-start-here.md`、`docs/current-state.md`、`docs/project-brief.md`、`docs/project-onepager.md`、`docs/06-tasks.md`、`docs/phase-4-review.md` 与本执行流水。
|
||||
- 验证:文档口径修正,无代码变更;执行 `git diff --check`。
|
||||
- 下一步:领取 T-505 Phase 4 用户端审核优化。
|
||||
|
||||
Reference in New Issue
Block a user