51 KiB
51 KiB
Fonrey 全量 Review — 登录管理 + 平台管理后台
- Review 范围:登录管理模块 + 平台管理后台模块
- Review 日期:2026-05-02
- Review 维度:8 维度(PRD质量 / PRD↔TECH一致性 / DATA_MODEL / API / UI_SYSTEM / 安全多租户 / 性能扩展 / 遗漏场景)
- 审查文档:
- PRD:
PRD_MVP.md、登录管理/用户登录管理模块PRD.md(v3.0)、平台管理后台/平台管理后台PRD.md - TECH:
TECH_STACK.md(v2.5)、登录管理技术方案.md(v4.1)、平台管理后台技术方案.md、API_CONTRACT.md、测试规范.md - DATA_MODEL:
DATA_MODEL.md、DATA_MODEL_LOGIN.md、DATA_MODEL_PUBLIC.md、ENUMS.md(v2.2) - UI:
UI_SYSTEM.md、组件清单.md、组件规范设计.md、UI_DESIGN/登录管理/登录_UI.md、UI_DESIGN/平台管理后台/平台管理后台_UI.md及 4 份 HTML 原型
- PRD:
- 严重程度图例:🔴 Blocker(影响交付,需立即处理)/ 🟠 Major(影响质量,需在迭代内处理)/ 🟡 Minor(建议优化)
维度一:PRD 质量
🔴 P-B-1 平台管理后台 PRD 缺失 OpenAPI 与功能编号体系
- 位置:平台管理后台PRD.md 全文 835 行
- 问题:用户故事未编号(无 PA-001/PA-002 等可追溯标识),与 用户登录管理模块PRD.md v3.0 已剥离实现细节后的"功能 ID + 验收标准"风格不一致。导致需求→测试用例→Bug 单的可追溯链条断裂。
- 改进方向:按登录 PRD v3.0 风格补齐编号 (PA-001 ~ PA-NN),每条用户故事附"验收标准 (AC)"小节。
- 责任角色:PM / Product Owner
🟠 P-B-2 平台管理后台 PRD 仍混入实现/字段细节
- 位置:平台管理后台PRD.md L210-L350 段落
- 问题:租户创建/升级/暂停章节出现
tenant_code、schema_name、statusCHECK 值等数据层概念;与 ADR-20260502-003 "PRD 剥离实现细节"原则违背。 - 改进方向:按登录 PRD v3.0 模式将字段/状态描述迁出至 DATA_MODEL_PUBLIC.md,PRD 仅保留业务语义("租户进入暂停态后所有用户登录被拒绝")。
- 责任角色:PM + Backend Architect
🟠 P-B-3 平台管理员(PlatformAdmin)"权限矩阵"未量化
- 位置:平台管理后台PRD.md L40-L60, L520-L560 与 DATA_MODEL_PUBLIC.md L189-L250
platform_admins表 - 问题:PRD 提到
super_admin/ops/support三种角色,但未列"角色 × 操作 × 资源"矩阵。技术方案与 DATA_MODEL 也未补齐。 - 改进方向:在 PRD 增 §权限矩阵小节,列出每条平台操作(创建租户/暂停租户/查看审计日志/发布客户端版本/等)所需角色,并与
platform_admins.role枚举对应。 - 责任角色:PM + 安全负责人
🟡 P-L-1 登录 PRD 验收标准粒度偏粗
- 位置:用户登录管理模块PRD.md UC-LOGIN-* 段
- 问题:部分验收标准只描述"成功"路径,未列出所有失败路径覆盖的提示文案(与 组件规范设计.md Toast/Form Error 规范脱节)。
- 改进方向:每条 UC 补充"异常路径 ×N → 文案 / 状态码"。
- 责任角色:PM
维度二:PRD ↔ TECH 一致性
🔴 PT-B-1 创建租户事务边界与回滚补偿未在技术方案落地
- 位置:平台管理后台PRD.md L122-L170 vs 平台管理后台技术方案.md
- 问题:PRD 描述"创建租户 → 建 schema → 跑 migration → 创建 Tenant Admin → 发欢迎邮件"为一体化流程,但技术方案未说明:django-tenants
create_tenant与 Django 默认事务无法包裹CREATE SCHEMA;migration 中途失败、欢迎邮件发送失败的补偿/回滚策略缺失。状态机仅定义creating/failed,但谁置位failed、是否清理半成品 schema 未规定。 - 改进方向:技术方案补"租户创建 Saga"章节:步骤 1-N、每步失败的补偿动作、
failed后的人工/定时清理任务。同步在 PRD 注明"创建过程为异步,最终一致"。 - 责任角色:Backend Architect + Platform Ops
🟠 PT-B-2 客户端发版灰度策略 PRD/TECH 描述不一致
- 位置:平台管理后台PRD.md L476-L520 vs 平台管理后台技术方案.md
- 问题:PRD 描述"按租户/百分比灰度",但 DATA_MODEL_PUBLIC.md client_releases L488-L505 仅有
channel、rollout_percent,无"租户白名单"字段,技术方案对此未澄清。 - 改进方向:技术方案明确灰度策略对象(租户级 OR 百分比级或两者并存),DATA_MODEL 同步增
rollout_tenant_codes JSONB或client_release_tenants关联表。 - 责任角色:Backend Architect + DBA
🟠 PT-B-3 平台管理员 MFA 在 PRD 强约束但 TECH 未规定算法/实现
- 位置:平台管理后台PRD.md L60("super_admin 必须 MFA") vs 平台管理后台技术方案.md、DATA_MODEL_PUBLIC.md platform_admins L189-L250
- 问题:未定义 MFA 类型(TOTP / SMS / WebAuthn)、密钥存储位置、登录流程接入点、备份码机制。
platform_admins表无mfa_secret/mfa_enabled字段。 - 改进方向:技术方案选定 TOTP(pyotp)方案;DATA_MODEL 增
mfa_enabled BOOL、mfa_secret_enc TEXT、mfa_recovery_codes_enc TEXT;PRD 注明备份码生成/重置规则。 - 责任角色:安全负责人 + Backend Architect
🟠 PT-L-1 登录 PRD "首次登录强制改密" 与 TECH 实现路径未对齐
- 位置:用户登录管理模块PRD.md "is_initial_password" + DATA_MODEL_LOGIN.md
user_accounts.is_initial_password+ 登录管理技术方案.md v4.1 - 问题:PRD 要求"首次登录必须改密才能进入业务",但技术方案未明确:登录 API 返回时如何标记需要改密(专用 HTTP code/Header/JSON flag),中间件/装饰器在哪一层拦截,HTMX 前端如何重定向。
- 改进方向:技术方案补 §"初始密码拦截器":登录响应增
must_change_password: true字段;新增RequirePasswordChangeMiddleware;HTMX 通过HX-Redirect跳转/account/change-password。 - 责任角色:Backend Architect + Frontend Lead
🟡 PT-L-2 账户锁定阈值 PRD 与 TECH 描述存在微差
- 位置:用户登录管理模块PRD.md §账户锁定 vs DATA_MODEL_LOGIN.md L411-L423(Redis 计数器说明)
- 问题:PRD 写"连续 5 次失败锁定 30 分钟",DATA_MODEL 注释也说 5 次,但 登录管理技术方案.md 未将阈值/窗口/键名作为可配置项明示,存在硬编码风险。
- 改进方向:技术方案显式列出 settings:
LOGIN_FAIL_THRESHOLD=5、LOGIN_LOCK_DURATION_MIN=30、Redis keylogin_fail:{tenant}:{username}。 - 责任角色:Backend Architect
维度三:DATA_MODEL(数据模型)
🔴 D-1 public.platform_audit_logs.result 大小写违反 ENUMS.md 规范
- 位置:ENUMS.md L70-L72 vs DATA_MODEL_PUBLIC.md L274-L275
- 问题:ENUMS.md 规定
success/failed(lower_snake_case,文件首部 L10 强制要求),DDL 实际为CHECK (result IN ('SUCCESS','FAILED'))DEFAULT'SUCCESS'。前端 enum_labels、查询过滤、报表全部错位。 - 改进方向:DDL 改为小写并执行迁移
UPDATE platform_audit_logs SET result = lower(result);同步 enum_labels fixture。 - 责任角色:DBA + Backend Architect
🔴 D-2 public.export_tasks.status done vs ENUMS success 不一致
- 位置:ENUMS.md L102-L106 vs DATA_MODEL_PUBLIC.md L351-L353
- 问题:ENUMS 已迁移为
success(注明"原done,已迁移"),DDL 仍为CHECK (status IN ('pending','in_progress','done','failed'))。backup_records.status已用success,与之分裂。 - 改进方向:DDL CHECK + DEFAULT 改为
success,迁移脚本UPDATE export_tasks SET status='success' WHERE status='done'。 - 责任角色:DBA
🟠 D-3 ENUMS.md 缺失 tenants.suspended_reason 的 license_expired
- 位置:ENUMS.md L55-L59 vs DATA_MODEL_PUBLIC.md L115
- 问题:DDL CHECK 已包含
license_expired,ENUMS.md 仅列overdue/violation/requested/other。前端文案/报表无法对该值取值。 - 改进方向:ENUMS.md 补
license_expired,记录变更 ADR;同步 enum_labels。 - 责任角色:ENUMS.md 维护者(架构 Atlas)
🟠 D-4 ENUMS.md 缺失 login_attempts.failure_reason 的 OTP 相关值
- 位置:ENUMS.md L168-L174 vs DATA_MODEL_LOGIN.md L220-L224, L266-L274
- 问题:DDL/Model choices 含
wrong_otp/otp_expired,ENUMS.md 漏写。 - 改进方向:ENUMS.md 补两个值。
- 责任角色:ENUMS.md 维护者
🟠 D-5 user_accounts.phone_enc / phone_hash 业务必填但 DB 可空
- 位置:用户登录管理模块PRD.md L31-L33 vs DATA_MODEL_LOGIN.md L80-L81
- 问题:PRD 规定
username等于手机号且必填,但phone_enc TEXT NULL、phone_hash VARCHAR(64) NULL。导入/数据修复时可能写入不一致数据,且phone_hash唯一性索引(若有)可能失效。 - 改进方向:业务确认后将
phone_hash改 NOT NULL(普通员工),或改用username作phone_hash计算源在应用层强约束 + 触发器保证一致性。 - 责任角色:accounts 模块负责人 + DBA
🟠 D-6 client_heartbeats 无分区策略
- 位置:DATA_MODEL_PUBLIC.md L568-L609
- 问题:心跳表为高频写表(按 PRD 推算每客户端每 5 分钟一条),无 RANGE 分区,长期会变成 TB 级单表。
- 改进方向:按
received_at月度 RANGE 分区;保留 90 天,老分区归档至冷库或删除。 - 责任角色:DBA
🟠 D-7 platform_audit_logs.payload_summary 缺全文索引
- 位置:DATA_MODEL_PUBLIC.md L260-L290
- 问题:PRD 要求平台审计日志支持关键字搜索,但
payload_summary仅 B-Tree 索引,无 GIN/tsvector 索引。 - 改进方向:增
CREATE INDEX ON platform_audit_logs USING GIN (to_tsvector('simple', payload_summary))。 - 责任角色:DBA
🟡 D-8 跨 schema 操作规范未沉淀到 DATA_MODEL.md 头部
- 位置:DATA_MODEL.md 总纲
- 问题:django-tenants 下不可建跨 schema FK,但 README 未明示该约定,新人可能误建外键。
- 改进方向:DATA_MODEL.md 增 §跨 schema 规范小节。
- 责任角色:Data Model Owner
维度四:API 契约
🔴 A-B-1 平台管理后台核心端点未在 API_CONTRACT.md 出现
- 位置:API_CONTRACT.md vs 平台管理后台PRD.md
- 问题:平台后台所述创建租户/暂停租户/发布客户端版本/查看审计等 API 均未在契约文档定义;前后端无对接基线。
- 改进方向:API_CONTRACT.md 增 §平台管理后台 端点章节,列出 path/method/请求/响应/错误码。
- 责任角色:Backend Architect + API 文档负责人
🟠 A-L-1 登录端点错误码未对齐 ENUMS failure_reason
- 位置:API_CONTRACT.md login 端点 vs ENUMS.md L168-L174
- 问题:API 返回错误码与
login_attempts.failure_reason枚举无映射表,客户端无法根据错误码呈现差异化文案。 - 改进方向:增"错误码 ↔ failure_reason ↔ 用户文案"三列对照表。
- 责任角色:Backend Architect + 安全负责人
🟠 A-B-2 客户端心跳/版本检查 API 无幂等与限流约定
- 位置:API_CONTRACT.md vs 平台管理后台PRD.md §客户端版本管理
- 问题:心跳/版本检查为高频公网入口,未规定
Idempotency-Key、限流阈值(每客户端 N 次/分钟)、签名校验。 - 改进方向:API_CONTRACT 补限流 + HMAC 签名(基于 client_id + secret)。
- 责任角色:Backend Architect + 安全
🟡 A-G-1 全局 API 错误响应结构未统一
- 位置:API_CONTRACT.md
- 问题:示例中部分接口错误体为
{detail: "..."}、部分为{code, message, errors[]},前端难以统一错误处理。 - 改进方向:统一为 RFC 7807 Problem Details 或自定义
{code, message, details}结构。 - 责任角色:Backend Architect
维度五:UI / UI_SYSTEM
🟠 U-B-1 平台后台 UI 设计未引用 组件清单.md 中已定义组件
- 位置:UI_DESIGN/平台管理后台/平台管理后台_UI.md + 平台管理后台_UI.html vs 组件清单.md
- 问题:HTML 原型直接写裸 Tailwind 类,未与组件清单中的
<button>/<table>/<modal>规范关联。前端实现易产生样式漂移。 - 改进方向:UI 设计文档每个区块标注引用组件 ID(如 "DataTable v1");HTML 原型用占位 class 体现组件契约。
- 责任角色:Frontend Lead + UI Designer
🟠 U-L-1 登录 UI 缺失"账户锁定"与"密码过期"专用状态页
- 位置:UI_DESIGN/登录管理/登录_UI.md + 3 份 HTML 原型
- 问题:PRD 描述了账户锁定、密码过期、首次登录强制改密 3 类状态,但 UI 设计仅覆盖登录、账密、重置密码 3 种页面。
- 改进方向:补"已锁定""密码过期"状态页或在登录页定义 inline 提示规范。
- 责任角色:UI Designer + Frontend Lead
🟡 U-G-1 UI_SYSTEM 缺无障碍(A11y)规范
- 位置:UI_SYSTEM.md
- 问题:未规定 ARIA、键盘导航、对比度门槛。
- 改进方向:增 §A11y 章节(WCAG 2.1 AA 基线)。
- 责任角色:UI Designer
🟡 U-G-2 HTML 原型与 组件规范设计.md 间距/色板未对齐
- 位置:平台管理后台_UI.html vs 组件规范设计.md
- 问题:原型出现规范外的
gray-750、不规则间距p-7。 - 改进方向:原型严格使用 design token(间距 4/8/12/16/24/32)。
- 责任角色:UI Designer
维度六:安全 & 多租户隔离
🔴 S-1 Tenant Admin 初始密码可能明文邮件下发
- 位置:平台管理后台PRD.md L122-L136 + DATA_MODEL_LOGIN.md L468-L469(示例
Fonrey@2025) - 问题:欢迎邮件包含初始密码明文;DATA_MODEL 给出系统统一默认密码示例。一旦邮箱被截获或日志记录到邮件正文,全部新租户首批管理员凭据泄露。
- 改进方向:禁止邮件明文密码;改用一次性安全 reset token(10-30 分钟有效,单次使用),强制首次登录改密;离线场景由平台运维通过加密 PDF 单独交付。
- 责任角色:安全负责人 + PM + accounts 模块
🔴 S-2 平台管理员(PlatformAdmin)会话与租户用户共用 Cookie/Session 边界未明示
- 位置:平台管理后台PRD.md + 登录管理技术方案.md
- 问题:未规定平台后台域名/Cookie 域、Session 隔离机制;存在租户 schema 用户登录态与平台后台越权同会话风险。
- 改进方向:平台后台独立子域
admin.fonrey.com,Cookie 域分离;中间件根据request.tenant.schema_name == 'public'强校验只允许platform_admins表用户进入。 - 责任角色:安全负责人 + Backend Architect
🟠 S-3 短信 OTP 速率/防刷未定量
- 位置:用户登录管理模块PRD.md §短信验证码 + DATA_MODEL_LOGIN.md sms_otp_records
- 问题:未定义"同号码 X 分钟内最多 N 次"、"同 IP 每日上限"、"图形/滑块校验前置"等防刷规则。
- 改进方向:技术方案补防刷策略;DATA_MODEL 增 IP 维度计数器或在 Redis 中维护。
- 责任角色:安全负责人
🟠 S-4 phone_enc 加密密钥轮换与 phone_hash salt 策略缺失
- 位置:DATA_MODEL_LOGIN.md L80-L81 + TECH_STACK.md
- 问题:未规定加密算法(AES-GCM?)、密钥来源(KMS?env?)、轮换流程、
phone_hash是否加 pepper。 - 改进方向:技术方案补 §字段级加密:算法/Key 来源/轮换 SOP;
phone_hash使用 HMAC-SHA256 + 全局 pepper(不入库)。 - 责任角色:安全负责人 + Backend Architect
🟠 S-5 平台后台审计日志覆盖范围未量化
- 位置:平台管理后台PRD.md + DATA_MODEL_PUBLIC.md platform_audit_logs
- 问题:哪些操作必须审计、保留期限、防篡改(append-only / 哈希链)未规定。
- 改进方向:列出"必审操作清单"(创建/暂停/删除租户、平台账号增删改、发版、备份恢复);表加
prev_hash/row_hash形成哈希链或转写至追加型存储。 - 责任角色:安全负责人
🟡 S-6 跨 schema 查询风险未在技术方案标注
- 位置:DATA_MODEL.md + TECH_STACK.md
- 问题:django-tenants 下错误的 schema 切换会导致跨租户数据泄露。
- 改进方向:技术方案增 §"禁止在 view 中直接
connection.set_schema_to_public()",必须经 service 层封装。 - 责任角色:Backend Architect
维度七:性能 & 扩展性
🟠 PF-1 client_heartbeats 写入风暴未做缓冲
- 位置:DATA_MODEL_PUBLIC.md client_heartbeats + 平台管理后台技术方案.md
- 问题:每条心跳直写 PG,N×M 客户端规模下会成为 IO 瓶颈。
- 改进方向:心跳先写 Redis Stream / Kafka,再批量落表(每分钟一次);同时配合 D-6 分区。
- 责任角色:Backend Architect
🟠 PF-2 平台后台租户列表 / 审计日志列表 缺分页/索引设计
- 位置:平台管理后台技术方案.md + DATA_MODEL_PUBLIC.md tenants/platform_audit_logs
- 问题:未明示 keyset pagination 或 LIMIT/OFFSET;审计日志按时间倒序查询无
(created_at DESC, id DESC)复合索引。 - 改进方向:明确分页方案;增复合索引;列表 API 默认 page_size 上限。
- 责任角色:Backend Architect + DBA
🟡 PF-3 登录端点未规定 P95 延迟 SLO
- 位置:用户登录管理模块PRD.md + 测试规范.md
- 问题:无性能 SLO(如登录 P95 < 300ms)。
- 改进方向:PRD 增非功能需求小节,列出关键端点 SLO;测试规范补压测脚本。
- 责任角色:PM + QA
维度八:遗漏场景 & 边界
🔴 X-1 租户删除 / 数据导出 / GDPR 类合规流程缺失
- 位置:平台管理后台PRD.md
- 问题:仅描述
pending_delete→deleted状态,未覆盖:删除前数据导出/客户签字回执;平台管理员双人复核;保留期内可撤销。 - 改进方向:新增"租户注销 SOP"用户故事;技术方案补软删除 + 冷却期 + 双人审批流程。
- 责任角色:PM + 安全 + 合规
🟠 X-2 客户端版本回滚 / 灰度中止流程缺失
- 位置:平台管理后台PRD.md L476-L520
- 问题:发版有,但回滚/灰度中止缺定义。
- 改进方向:补 UC "回滚到上一稳定版本"、"立即停灰度"两条用户故事。
- 责任角色:PM
🟠 X-3 备份恢复演练流程缺失
- 位置:平台管理后台PRD.md §备份 + DATA_MODEL_PUBLIC.md backup_records
- 问题:仅描述备份生成,缺"恢复到独立 schema 验证"演练流程;恢复操作风险(覆盖现网)未提示。
- 改进方向:增"恢复到隔离 schema 演练"用户故事;技术方案补恢复执行规范(必须先恢复至
restore_*临时 schema 校验)。 - 责任角色:PM + DBA
🟠 X-4 Tenant Admin 失联 / 转移流程未定义
- 位置:用户登录管理模块PRD.md + 平台管理后台PRD.md
- 问题:Tenant Admin 离职/换号场景下,由谁/如何重置或迁移管理员未定义。
- 改进方向:PRD 增"平台运维代运营重置 Tenant Admin"流程,需双人复核 + 审计。
- 责任角色:PM + 安全
🟡 X-5 同租户多设备登录策略未明示
- 位置:用户登录管理模块PRD.md
- 问题:是否允许同账号多端在线、互踢策略未定义。
- 改进方向:PRD 明示"允许并发"或"后登挤掉前登"。
- 责任角色:PM
🟡 X-6 跨场景同义概念差异(租户开通 → Tenant Admin 创建)
- 位置:平台管理后台PRD.md L122-L136 vs DATA_MODEL_LOGIN.md L468-L469 vs 用户登录管理模块PRD.md L31-L33
- 问题:三处对"初始 Tenant Admin"的用户名/初始密码/手机号来源描述用词不统一(PRD 平台后台说"系统生成",DATA_MODEL 给出
Fonrey@2025默认值,登录 PRD 说 username =tenants.contact_phone)。 - 改进方向:以登录 PRD v3.0 描述为准(username = contact_phone;初始密码由系统生成 + 一次性 reset token),其他文档同步修正。
- 责任角色:PM + Data Model Owner
汇总行动列表(按优先级)
| # | 严重 | 维度 | 问题 | 责任角色 | 建议截止 |
|---|---|---|---|---|---|
| 1 | 🔴 | 安全 | S-1 禁止欢迎邮件明文初始密码,改一次性 reset token | 安全 + PM + accounts | 立即 |
| 2 | 🔴 | 安全 | S-2 平台后台独立子域/Cookie 域 + 平台账号会话隔离中间件 | 安全 + Backend Architect | 立即 |
| 3 | 🔴 | DATA_MODEL | D-1 platform_audit_logs.result 大写改小写 + 数据迁移 |
DBA | 当周 |
| 4 | 🔴 | DATA_MODEL | D-2 export_tasks.status done→success + 迁移 |
DBA | 当周 |
| 5 | 🔴 | API | A-B-1 API_CONTRACT 补齐平台后台所有端点 | Backend Architect | 当周 |
| 6 | 🔴 | PRD↔TECH | PT-B-1 创建租户 Saga + 补偿事务 | Backend Architect + Ops | 当周 |
| 7 | 🔴 | PRD质量 | P-B-1 平台后台 PRD 引入 PA-NNN 编号体系 + AC | PM | 当周 |
| 8 | 🔴 | 遗漏场景 | X-1 租户注销 SOP + 双人复核 + 冷却期 | PM + 安全 + 合规 | 下迭代 |
| 9 | 🟠 | DATA_MODEL | D-3/D-4 ENUMS.md 补 license_expired/wrong_otp/otp_expired |
ENUMS 维护者 | 当周 |
| 10 | 🟠 | DATA_MODEL | D-5 phone_enc/phone_hash NOT NULL + 数据清洗 |
accounts + DBA | 下迭代 |
| 11 | 🟠 | DATA_MODEL | D-6 client_heartbeats 月度分区 + 90 天保留 |
DBA | 下迭代 |
| 12 | 🟠 | DATA_MODEL | D-7 payload_summary 增 GIN 全文索引 |
DBA | 当周 |
| 13 | 🟠 | PRD↔TECH | PT-B-2 客户端发版灰度策略澄清 | Backend Architect | 下迭代 |
| 14 | 🟠 | PRD↔TECH | PT-B-3 平台 MFA 选型 + DATA_MODEL 字段补充 | 安全 + Architect | 下迭代 |
| 15 | 🟠 | PRD↔TECH | PT-L-1 首次登录强制改密拦截器实现路径 | Backend + Frontend | 当周 |
| 16 | 🟠 | API | A-L-1 错误码 ↔ failure_reason 对照表 | Backend + 安全 | 当周 |
| 17 | 🟠 | API | A-B-2 心跳/版本检查接口限流 + HMAC | Backend + 安全 | 下迭代 |
| 18 | 🟠 | UI | U-B-1 平台后台 UI 引用组件清单组件 ID | UI + Frontend | 下迭代 |
| 19 | 🟠 | UI | U-L-1 补"账户锁定/密码过期"状态页 | UI + Frontend | 当周 |
| 20 | 🟠 | 安全 | S-3 短信 OTP 防刷规则量化 | 安全 | 下迭代 |
| 21 | 🟠 | 安全 | S-4 字段级加密 SOP + phone_hash pepper |
安全 + Architect | 下迭代 |
| 22 | 🟠 | 安全 | S-5 平台审计日志哈希链 + 必审操作清单 | 安全 | 下迭代 |
| 23 | 🟠 | 性能 | PF-1 心跳 Redis Stream 缓冲 + 批量落表 | Architect | 下迭代 |
| 24 | 🟠 | 性能 | PF-2 列表分页/复合索引 | Architect + DBA | 当周 |
| 25 | 🟠 | PRD质量 | P-B-2 平台 PRD 剥离实现细节 | PM + Architect | 下迭代 |
| 26 | 🟠 | PRD质量 | P-B-3 PlatformAdmin 权限矩阵 | PM + 安全 | 当周 |
| 27 | 🟠 | 遗漏 | X-2 版本回滚 / 中止灰度 UC | PM | 下迭代 |
| 28 | 🟠 | 遗漏 | X-3 备份恢复演练流程 | PM + DBA | 下迭代 |
| 29 | 🟠 | 遗漏 | X-4 Tenant Admin 重置/迁移流程 | PM + 安全 | 下迭代 |
| 30 | 🟡 | DATA_MODEL | D-8 跨 schema 规范沉淀至 README | Data Model Owner | 下迭代 |
| 31 | 🟡 | API | A-G-1 错误响应结构统一 | Architect | 下迭代 |
| 32 | 🟡 | UI | U-G-1 / U-G-2 A11y 规范 + 设计 token 严控 | UI Designer | 下迭代 |
| 33 | 🟡 | 性能 | PF-3 关键端点 SLO + 压测脚本 | PM + QA | 下迭代 |
| 34 | 🟡 | PRD↔TECH | PT-L-2 锁定阈值 settings 可配置 | Architect | 当周 |
| 35 | 🟡 | PRD质量 | P-L-1 登录 PRD 异常路径细化 | PM | 下迭代 |
| 36 | 🟡 | 遗漏 | X-5 多设备登录策略明示 | PM | 下迭代 |
| 37 | 🟡 | 遗漏 | X-6 跨文档对"初始 Tenant Admin 创建"用词统一 | PM + Data Model Owner | 当周 |
统计:🔴 Blocker 8 项 / 🟠 Major 21 项 / 🟡 Minor 8 项,合计 37 项。
结论
整体评估:
- 登录管理模块:PRD v3.0 已按 ADR-20260502-003 完成实现细节剥离,整体结构与 DATA_MODEL_LOGIN 大致对齐;主要风险集中在 (a) 手机号字段约束与 PRD 必填语义不一致 (S-1/D-5)、(b) 首次登录改密拦截缺技术方案落地 (PT-L-1)、(c) OTP 防刷规则未量化 (S-3)。
- 平台管理后台模块:处于"PRD 形成中"阶段,存在较多 Blocker:缺端点契约 (A-B-1)、缺创建租户 Saga (PT-B-1)、缺平台账号会话隔离 (S-2)、缺欢迎邮件密码安全策略 (S-1)、PRD 缺编号体系 (P-B-1)、PRD 仍混入实现细节 (P-B-2)。这些项必须在进入开发前解决,否则将引发跨团队反复对齐成本。
- 跨文档一致性:枚举命名规范(lower_snake_case)已被 ENUMS.md 强约束,但 DATA_MODEL_PUBLIC 的 DDL 多处未对齐(D-1/D-2/D-3/D-4),属于"规范已立但落地未跟",建议立即统一。
建议下一步动作:
- 召开 1 次跨角色 Review 会议(PM + Architect + 安全 + DBA + UI + Frontend),就上表 8 项 Blocker 形成处理排期。
- 由 ENUMS.md 维护者在 1 周内发布 v2.3,吸纳 D-3/D-4,并附数据迁移 SQL 草案(D-1/D-2)。
- 由 PM 在 1 周内完成平台管理后台 PRD 编号化与剥离实现细节的改版,进入下一轮 Review。
附录
A. 审查范围内文档清单
- PRD:
PRD_MVP.md、登录管理/用户登录管理模块PRD.md(v3.0, 2026-05-02)、平台管理后台/平台管理后台PRD.md(835 行) - TECH:
TECH_STACK.md(v2.5, 2026-04-30)、登录管理技术方案.md(v4.1)、平台管理后台技术方案.md(986 行)、API_CONTRACT.md、测试规范.md - DATA_MODEL:
DATA_MODEL.md、DATA_MODEL_LOGIN.md(526 行)、DATA_MODEL_PUBLIC.md(1049 行)、ENUMS.md(v2.2, 786 行) - UI:
UI_SYSTEM/UI_SYSTEM.md、组件清单.md、组件规范设计.md、UI_DESIGN/登录管理/登录_UI.md、UI_DESIGN/平台管理后台/平台管理后台_UI.md、登录_UI.html、登录_账号密码_UI.html、登录_重置密码_UI.html、平台管理后台_UI.html
B. 用户原文路径校正
- ❌
Project/fonrey/PRD/系统管理/系统管理模块PRD.md→ ✅ 实际为Project/fonrey/PRD/系统配置/系统配置模块PRD.md(不在本次 Review 范围) - ❌
Project/fonrey/PRD/平台管理后台/平台管理后台PRD→ ✅ 实际带.md后缀 - ❌
Project/fonrey/UI_DESIGN/登录_UI.md→ ✅ 实际位于Project/fonrey/UI_DESIGN/登录管理/登录_UI.md
C. 审查执行说明
- 本次 Review 由 4 个并行 explore agent 完成证据收集(登录 8 维度、平台 PRD+TECH、DATA_MODEL_PUBLIC+UI、跨文档枚举/字段/状态机漂移),汇总后按 8 维度去重合并。
- 报告坚持"指出问题 + 给出方向"原则,不重写设计文档内容;如某文档段落实际不完整(如 PT-B-3 MFA 字段缺失),按 Major 报告而非自行补全。
进度跟踪表(PM / 架构师填写)
使用说明:
- 状态取值:
待启动/进行中/已完成/已验证/阻塞/搁置(如搁置请在"备注"列填写理由及决策 ADR ID)- 处理人:填写实际负责人姓名/工号
- 修订位置:填写本次修订涉及的文档路径 + 章节/行号 + Commit/PR 链接
- 关联 ADR:跨模块规则变更必须创建 ADR(参考
ADR.md治理规则),格式ADR-YYYYMMDD-XXX- 验证证据:链接到对应的 PR / Commit / 测试用例 ID(
TC-FON-XXXXXX)/ Migration 文件- 每周更新:建议每周五由 PM 主持 Review 例会更新本表,并在
REVIEW/目录追加增量 Review
Blocker 项(🔴 必须立即处理,8 项)
| # | ID | 问题摘要 | 责任角色 | 处理人 | 状态 | 计划完成日 | 实际完成日 | 修订位置 | 关联 ADR | 验证证据 | 备注 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | S-1 | 禁止欢迎邮件明文初始密码,改一次性 reset token | 安全 + PM + accounts | Nova | 不修复(设计决策) | 2026-05-02 | 2026-05-02 | — | — | — | PM 决策:保持现有欢迎邮件含初始密码的设计,不改为 reset token 流程。接受此安全取舍。 |
| 2 | S-2 | 平台后台独立子域 + 平台账号会话隔离中间件 | 安全 + Backend Architect | Atlas | 已完成 | 2026-05-02 | 2026-05-02 | TECH_STACK/平台管理后台技术方案.md v1.1 §7.0(新增"平台后台独立子域与会话隔离"专节,含域名分离表、Cookie 隔离规则、PlatformAdminSessionMiddleware 代码规范、测试矩阵) |
— | 技术方案 v1.1 变更历史 | — |
| 3 | D-1 | platform_audit_logs.result 大写改小写 + 数据迁移 |
DBA | Atlas | 已完成 | 2026-05-02 | 2026-05-02 | DATA_MODEL/DATA_MODEL_PUBLIC.md v1.7 §2.4 CHECK 约束;附录 M.1 迁移脚本 migration_D1_audit_logs_result_lowercase.sql |
— | DATA_MODEL v1.7 变更历史 | 迁移脚本须在 Django migration 前执行(见附录 M.1 执行顺序说明) |
| 4 | D-2 | export_tasks.status done→success + 迁移 |
DBA | Atlas | 已完成 | 2026-05-02 | 2026-05-02 | DATA_MODEL/DATA_MODEL_PUBLIC.md v1.7 §2.5 CHECK 约束;附录 M.2 迁移脚本 migration_D2_export_tasks_done_to_success.sql |
— | DATA_MODEL v1.7 变更历史 | 迁移脚本须在 Django migration 前执行(见附录 M.2 执行顺序说明) |
| 5 | A-B-1 | API_CONTRACT 补齐平台后台所有端点 | Backend Architect | Atlas | 已完成 | 2026-05-02 | 2026-05-02 | TECH_STACK/API_CONTRACT.md v1.2 §12(新增"平台管理后台端点附录",涵盖认证 2 项、租户管理 6 项、授权/MFA 3 项、系统配置 3 项、客户端发布 4 项、导出任务 3 项,含请求/响应示例与错误码) |
— | API_CONTRACT v1.2 变更历史 | — |
| 6 | PT-B-1 | 创建租户 Saga + 补偿事务 | Backend Architect + Ops | Atlas | 已完成 | 2026-05-02 | 2026-05-02 | TECH_STACK/平台管理后台技术方案.md v1.1 §6.1.1(新增"创建租户 Saga 与补偿事务"专节,含 7 步流程状态机、各步骤补偿操作、Celery chord 实现规范、幂等性与重试策略、监控告警要求) |
— | 技术方案 v1.1 变更历史 | — |
| 7 | P-B-1 | 平台后台 PRD 引入 PA-NNN 编号体系 + AC | PM | Nova | 已完成 | 2026-05-02 | 2026-05-02 | PRD/平台管理后台/平台管理后台PRD.md v1.1 — 全部 11 条用户故事补齐 PA-001 ~ PA-011 编号,每条附验收标准(AC)小节 |
— | PRD v1.1 变更历史 | — |
| 8 | X-1 | 租户注销 SOP + 双人复核 + 冷却期 | PM + 安全 + 合规 | Nova | 已完成 | 2026-05-02 | 2026-05-02 | PRD/平台管理后台/平台管理后台PRD.md v1.1 — 新增 PA-011 Story E1,含 AC-1 发起申请 / AC-2 数据导出前置确认 / AC-3 双人 MFA 复核 / AC-4 30 天冷静期软删除 / AC-5 硬删除;同步更新 §5.1.4、§5.4、§5.5.1 API 清单、§6 权限矩阵、§7 状态机(新增 Pending Cancellation 节点) |
— | PRD v1.1 变更历史 | 技术方案 & DATA_MODEL 联动更新待 Atlas 处理(Pending Cancellation 状态字段) |
Major 项(🟠 迭代内处理,21 项)
| # | ID | 问题摘要 | 责任角色 | 处理人 | 状态 | 计划完成日 | 实际完成日 | 修订位置 | 关联 ADR | 验证证据 | 备注 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 9 | D-3 | ENUMS.md 补 license_expired |
ENUMS 维护者 | Atlas | 待启动 | ||||||
| 10 | D-4 | ENUMS.md 补 wrong_otp / otp_expired |
ENUMS 维护者 | Atlas | 待启动 | ||||||
| 11 | D-5 | phone_enc/phone_hash NOT NULL + 数据清洗 |
accounts + DBA | Atlas | 待启动 | ||||||
| 12 | D-6 | client_heartbeats 月度分区 + 90 天保留 |
DBA | Atlas | 待启动 | ||||||
| 13 | D-7 | payload_summary 增 GIN 全文索引 |
DBA | Atlas | 待启动 | ||||||
| 14 | PT-B-2 | 客户端发版灰度策略澄清(租户/百分比) | Backend Architect | Atlas | 待启动 | ||||||
| 15 | PT-B-3 | 平台 MFA 选型 + DATA_MODEL 字段补充 | 安全 + Architect | Atlas | 待启动 | ||||||
| 16 | PT-L-1 | 首次登录强制改密拦截器实现路径 | Backend + Frontend | Atlas | 待启动 | ||||||
| 17 | A-L-1 | 错误码 ↔ failure_reason 对照表 | Backend + 安全 | Atlas | 待启动 | ||||||
| 18 | A-B-2 | 心跳/版本检查接口限流 + HMAC 签名 | Backend + 安全 | Atlas | 待启动 | ||||||
| 19 | U-B-1 | 平台后台 UI 引用组件清单组件 ID | UI + Frontend | Iris | 待启动 | ||||||
| 20 | U-L-1 | 补"账户锁定/密码过期"状态页 | UI + Frontend | Iris | 待启动 | ||||||
| 21 | S-3 | 短信 OTP 防刷规则量化 | 安全 | Atlas | 待启动 | ||||||
| 22 | S-4 | 字段级加密 SOP + phone_hash pepper |
安全 + Architect | Atlas | 待启动 | ||||||
| 23 | S-5 | 平台审计日志哈希链 + 必审操作清单 | 安全 | Atlas | 待启动 | ||||||
| 24 | PF-1 | 心跳 Redis Stream 缓冲 + 批量落表 | Architect | Atlas | 待启动 | ||||||
| 25 | PF-2 | 列表分页(keyset)+ 复合索引 | Architect + DBA | Atlas | 待启动 | ||||||
| 26 | P-B-2 | 平台 PRD 剥离实现细节 | PM + Architect | Nova | 待启动 | ||||||
| 27 | P-B-3 | PlatformAdmin 权限矩阵 | PM + 安全 | Nova | 待启动 | ||||||
| 28 | X-2 | 客户端版本回滚 / 中止灰度 UC | PM | Nova | 待启动 | ||||||
| 29 | X-3 | 备份恢复演练流程(恢复至隔离 schema) | PM + DBA | Nova | 待启动 | ||||||
| 30 | X-4 | Tenant Admin 重置/迁移流程 | PM + 安全 | Nova | 待启动 |
Minor 项(🟡 优化建议,8 项)
| # | ID | 问题摘要 | 责任角色 | 处理人 | 状态 | 计划完成日 | 实际完成日 | 修订位置 | 关联 ADR | 验证证据 | 备注 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 31 | D-8 | 跨 schema 操作规范沉淀至 DATA_MODEL.md README | Data Model Owner | Atlas | 待启动 | ||||||
| 32 | A-G-1 | 全局 API 错误响应结构统一 | Architect | Atlas | 待启动 | ||||||
| 33 | U-G-1 | UI_SYSTEM 增 A11y 规范(WCAG 2.1 AA) | UI Designer | Iris | 待启动 | ||||||
| 34 | U-G-2 | HTML 原型严控 design token | UI Designer | Iris | 待启动 | ||||||
| 35 | PF-3 | 关键端点 SLO + 压测脚本 | PM + QA | Nova | 待启动 | ||||||
| 36 | PT-L-2 | 锁定阈值 settings 可配置(去硬编码) | Architect | Atlas | 待启动 | ||||||
| 37 | P-L-1 | 登录 PRD 异常路径细化 | PM | Nova | 待启动 | ||||||
| 38 | X-5 | 多设备登录策略明示 | PM | Nova | 待启动 | ||||||
| 39 | X-6 | 跨文档对"初始 Tenant Admin 创建"用词统一 | PM + Data Model Owner | Nova | 待启动 |
进度统计(每周更新)
| 统计日期 | Blocker 已完成 / 总数 | Major 已完成 / 总数 | Minor 已完成 / 总数 | 阻塞项数 | 风险说明 |
|---|---|---|---|---|---|
| 2026-05-02 | 0 / 8 | 0 / 21 | 0 / 9 | 0 | 初始基线 |
| 2026-05-02(更新) | 2 / 8 | 0 / 21 | 0 / 9 | 0 | P-B-1 & X-1 已完成(Nova);技术方案/DATA_MODEL 联动更新待 Atlas 跟进 |
| 2026-05-02(Atlas 修复) | 7 / 8 | 0 / 21 | 0 / 9 | 0 | S-2 / D-1 / D-2 / A-B-1 / PT-B-1 已完成(Atlas);剩余 Blocker S-1 为 PM 设计决策不修复;全部 Blocker 实质性完结 |
注:Minor 项实际为 9 项(编号 31-39),原汇总行动列表 Minor 计为 8 项的差异在于 D-8 与 X-6 是否合并归类,本跟踪表按独立处理项展开计 9 项。
Review 闭环规则
- 每条 Finding 修订完成后,处理人填写"修订位置 + 验证证据",状态置
已完成。 - PM/架构师在每周例会复核:跨模块/跨文档变更必须先创建 ADR(
ADR.md)再改文档,并在"关联 ADR"列填写 ID。 - QA 在所有依赖 Finding 全部
已完成后,对涉及业务路径执行回归测试,状态置已验证。 - 任何 Finding 在迭代结束仍未启动需在"备注"列说明原因并在下一次 Review 例会重新评估优先级。
- 本表与
REVIEW/目录后续增量 Review 报告同步:新增 Finding 追加编号(40+)继续延续。