Files
cmhub/docs/mvp-acceptance.md
T

45 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MVP 完整验收报告(T-402)
> 日期:2026-07-03
> 范围:按 [`02-requirements.md`](02-requirements.md) 的第一版 MVP / P0 验收标准验收。
> 结论:**P0 验收通过**。同一 119 条测试按验收域拆分运行全部通过;一次单条全量 `manage.py test` 曾因远程 MySQL 连接重置中断,已登记为测试环境稳定性问题。
## 验收矩阵
| P0 验收项 | 结论 | 主要证据 |
| --- | --- | --- |
| 用户注册 / 登录 | PASS | T-402 历史验收口径为 `apps.portal` 注册创建 0 点钱包且不写赠点流水;T-605 后注册为免邮箱验证、注册后可直接登录,邮箱仍必填且唯一。T-608 已按新需求改为注册赠点并写 `signup_bonus` 流水,且通过 `SignupBonusGrant(user UNIQUE)` 防重复发放;当前额度为 10 点。 |
| API Key 自助管理 | PASS | `apps.portal`:Key 明文只显示一次、列表仅显示 prefix、删除为吊销、不可删除他人 Key;`apps.api`:缺失/无效 Key 为 401,吊销 Key 为 403 |
| 扫码充值 | PASS | `apps.portal` / `apps.api`:创建 pending 订单不直接加点、不写流水;二维码票据展示;状态轮询只允许本人订单;主动查单可补入账 |
| 个人中心 / 记录 | PASS | `apps.portal`:余额、充值总额、获得点数、注册赠点/消费/退款记录与实际订单/流水一致;充值记录和点数记录分页且仅见本人 |
| 生成标题 API | PASS | `apps.api`:有效 API Key + 合法 prompt 返回标题、扣点并写调用记录;缺失/无效 Key 返回 401 |
| 生成图片 API | PASS | `apps.api`:有效 API Key 返回图片 URL,图片结果不把 provider raw/base64 写入调用记录;上游错误和能力错误会退点 |
| 点数计费与扣减 | PASS | `apps.billing` / `apps.api`:按别名+分辨率计费,余额不足返回 402 且不调上游;并发扣点不超扣、不为负 |
| 余额查询 API | PASS | `apps.api`:余额响应与 `PointsLedger.points_delta` 累加一致;Web session 不能调用外部余额接口 |
| 充值转点数 | PASS | `apps.api` / `apps.billing`:微信/支付宝 mock 回调验签后幂等入账;重复回调只入账一次;签名失败或金额不一致不入账 |
| 调用记录 / 点数流水 | PASS | `apps.api` / `apps.billing`:成功、失败退点、充值、运营调整均写记录/流水;流水约束拒绝 0 变动、负余额和重复 refund/recharge |
| 运营后台 | PASS | `apps.users` / `apps.billing` / `apps.ai`:admin 可登录;用户、钱包、API Key、规则、汇率、订单、流水、调用记录、模型配置和审计均可管理/检索;API Key / AI key 脱敏;手工调点经计费层写 `adjust` 流水 |
| 可插拔模型 | PASS | `apps.ai` / `apps.billing`:`ModelAlias` 解析别名到当前 active `AiModel`;后台变更有审计;改别名指向后调用方别名不变,计费规则仍按别名生效 |
## 验证命令
- `./init.ps1`:通过。
- `py -3.12 manage.py check`:通过,0 issues。
- `py -3.12 manage.py makemigrations --check --dry-run`:通过,No changes detected。
- `py -3.12 manage.py test apps.portal --noinput --keepdb --verbosity 2`:通过,21 tests OK。
- `py -3.12 manage.py test apps.ai --noinput --keepdb --verbosity 2`:通过,26 tests OK。
- `py -3.12 manage.py test apps.api --noinput --keepdb --verbosity 2`:通过,39 tests OK。
- `py -3.12 manage.py test apps.billing apps.users --noinput --keepdb --verbosity 2`:通过,33 tests OK。
- `py -3.12 manage.py smoke_ai_generation title --recorded`:通过,录制标题 smoke OK。
- `py -3.12 manage.py smoke_ai_generation image --recorded`:通过,录制图片 smoke OK。
- `py -3.12 manage.py findstatic portal/vendor/bootstrap/bootstrap.min.css portal/vendor/qrcode/qrcode.js --verbosity 1`:通过,两个本地 static 文件均可找到。
- `py -3.12 -m compileall apps config`:通过。
- `git diff --check`:通过,仅 Windows CRLF 提示。
## 已知限制
- 一次单条 `py -3.12 manage.py test --noinput --keepdb --verbosity 2` 发现 119 tests,已运行 98 tests 后远程 MySQL 在 `apps.portal.tests.PortalAccountFlow-ests.setUpClass` 阶段连接重置;已通过用例无断言失败。随后按 `portal` / `ai` / `api` / `billing+users` 四组拆分,合计同一 119 条测试全部通过。
- 测试阶段仍有 allauth `account.EmailAddress` 条件唯一约束在 MySQL 上不可创建的 `models.W036` 警告;本项目账号邮箱唯一性由 `user.email` 唯一约束承担。
- 真实微信/支付宝商户密钥、证书、生产 SDK 依赖和公网回调地址仍待提供;MVP 验收使用 mock 支付路径。
- 真实 AI 上游调用和图片同步真实耗时仍需配置 `AI_KEY_ENCRYPTION_KEY`、导入真实 AiModel/ModelAlias 后执行;部署超时口径已登记到 T-403。