449 lines
51 KiB
Markdown
449 lines
51 KiB
Markdown
# 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 原型
|
||
- **严重程度图例**:🔴 Blocker(影响交付,需立即处理)/ 🟠 Major(影响质量,需在迭代内处理)/ 🟡 Minor(建议优化)
|
||
|
||
---
|
||
|
||
## 维度一:PRD 质量
|
||
|
||
### 🔴 P-B-1 平台管理后台 PRD 缺失 OpenAPI 与功能编号体系
|
||
- **位置**:[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) 全文 835 行
|
||
- **问题**:用户故事未编号(无 PA-001/PA-002 等可追溯标识),与 [用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) v3.0 已剥离实现细节后的"功能 ID + 验收标准"风格不一致。导致需求→测试用例→Bug 单的可追溯链条断裂。
|
||
- **改进方向**:按登录 PRD v3.0 风格补齐编号 (PA-001 ~ PA-NN),每条用户故事附"验收标准 (AC)"小节。
|
||
- **责任角色**:PM / Product Owner
|
||
|
||
### 🟠 P-B-2 平台管理后台 PRD 仍混入实现/字段细节
|
||
- **位置**:[平台管理后台PRD.md L210-L350](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L210-L350) 段落
|
||
- **问题**:租户创建/升级/暂停章节出现 `tenant_code`、`schema_name`、`status` CHECK 值等数据层概念;与 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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L40-L60) 与 [DATA_MODEL_PUBLIC.md L189-L250](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) UC-LOGIN-* 段
|
||
- **问题**:部分验收标准只描述"成功"路径,未列出所有失败路径覆盖的提示文案(与 [组件规范设计.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/%E7%BB%84%E4%BB%B6%E8%A7%84%E8%8C%83%E8%AE%BE%E8%AE%A1.md) Toast/Form Error 规范脱节)。
|
||
- **改进方向**:每条 UC 补充"异常路径 ×N → 文案 / 状态码"。
|
||
- **责任角色**:PM
|
||
|
||
---
|
||
|
||
## 维度二:PRD ↔ TECH 一致性
|
||
|
||
### 🔴 PT-B-1 创建租户事务边界与回滚补偿未在技术方案落地
|
||
- **位置**:[平台管理后台PRD.md L122-L170](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L122-L170) vs [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L476-L520) vs [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
|
||
- **问题**:PRD 描述"按租户/百分比灰度",但 [DATA_MODEL_PUBLIC.md client_releases L488-L505](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L60)("super_admin 必须 MFA") vs [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)、[DATA_MODEL_PUBLIC.md platform_admins L189-L250](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) "is_initial_password" + [DATA_MODEL_LOGIN.md](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md) `user_accounts.is_initial_password` + [登录管理技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) §账户锁定 vs [DATA_MODEL_LOGIN.md L411-L423](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L411-L423)(Redis 计数器说明)
|
||
- **问题**:PRD 写"连续 5 次失败锁定 30 分钟",DATA_MODEL 注释也说 5 次,但 [登录管理技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md) 未将阈值/窗口/键名作为可配置项明示,存在硬编码风险。
|
||
- **改进方向**:技术方案显式列出 settings:`LOGIN_FAIL_THRESHOLD=5`、`LOGIN_LOCK_DURATION_MIN=30`、Redis key `login_fail:{tenant}:{username}`。
|
||
- **责任角色**:Backend Architect
|
||
|
||
---
|
||
|
||
## 维度三:DATA_MODEL(数据模型)
|
||
|
||
### 🔴 D-1 `public.platform_audit_logs.result` 大小写违反 ENUMS.md 规范
|
||
- **位置**:[ENUMS.md L70-L72](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L70-L72) vs [DATA_MODEL_PUBLIC.md L274-L275](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L102-L106) vs [DATA_MODEL_PUBLIC.md L351-L353](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L55-L59) vs [DATA_MODEL_PUBLIC.md L115](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L168-L174) vs [DATA_MODEL_LOGIN.md L220-L224, L266-L274](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L220-L224)
|
||
- **问题**: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](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md#L31-L33) vs [DATA_MODEL_LOGIN.md L80-L81](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/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](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md) vs [平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md)
|
||
- **问题**:平台后台所述创建租户/暂停租户/发布客户端版本/查看审计等 API 均未在契约文档定义;前后端无对接基线。
|
||
- **改进方向**:API_CONTRACT.md 增 §平台管理后台 端点章节,列出 path/method/请求/响应/错误码。
|
||
- **责任角色**:Backend Architect + API 文档负责人
|
||
|
||
### 🟠 A-L-1 登录端点错误码未对齐 ENUMS `failure_reason`
|
||
- **位置**:[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md) login 端点 vs [ENUMS.md L168-L174](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/ENUMS.md#L168-L174)
|
||
- **问题**:API 返回错误码与 `login_attempts.failure_reason` 枚举无映射表,客户端无法根据错误码呈现差异化文案。
|
||
- **改进方向**:增"错误码 ↔ failure_reason ↔ 用户文案"三列对照表。
|
||
- **责任角色**:Backend Architect + 安全负责人
|
||
|
||
### 🟠 A-B-2 客户端心跳/版本检查 API 无幂等与限流约定
|
||
- **位置**:[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/API_CONTRACT.md) vs [平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) §客户端版本管理
|
||
- **问题**:心跳/版本检查为高频公网入口,未规定 `Idempotency-Key`、限流阈值(每客户端 N 次/分钟)、签名校验。
|
||
- **改进方向**:API_CONTRACT 补限流 + HMAC 签名(基于 client_id + secret)。
|
||
- **责任角色**:Backend Architect + 安全
|
||
|
||
### 🟡 A-G-1 全局 API 错误响应结构未统一
|
||
- **位置**:[API_CONTRACT.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/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](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0_UI.md) + [平台管理后台_UI.html](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0_UI.html) vs [组件清单.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/%E7%BB%84%E4%BB%B6%E6%B8%85%E5%8D%95.md)
|
||
- **问题**:HTML 原型直接写裸 Tailwind 类,未与组件清单中的 `<button>` / `<table>` / `<modal>` 规范关联。前端实现易产生样式漂移。
|
||
- **改进方向**:UI 设计文档每个区块标注引用组件 ID(如 "DataTable v1");HTML 原型用占位 class 体现组件契约。
|
||
- **责任角色**:Frontend Lead + UI Designer
|
||
|
||
### 🟠 U-L-1 登录 UI 缺失"账户锁定"与"密码过期"专用状态页
|
||
- **位置**:[UI_DESIGN/登录管理/登录_UI.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%99%BB%E5%BD%95_UI.md) + 3 份 HTML 原型
|
||
- **问题**:PRD 描述了账户锁定、密码过期、首次登录强制改密 3 类状态,但 UI 设计仅覆盖登录、账密、重置密码 3 种页面。
|
||
- **改进方向**:补"已锁定""密码过期"状态页或在登录页定义 inline 提示规范。
|
||
- **责任角色**:UI Designer + Frontend Lead
|
||
|
||
### 🟡 U-G-1 UI_SYSTEM 缺无障碍(A11y)规范
|
||
- **位置**:[UI_SYSTEM.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/UI_SYSTEM.md)
|
||
- **问题**:未规定 ARIA、键盘导航、对比度门槛。
|
||
- **改进方向**:增 §A11y 章节(WCAG 2.1 AA 基线)。
|
||
- **责任角色**:UI Designer
|
||
|
||
### 🟡 U-G-2 HTML 原型与 `组件规范设计.md` 间距/色板未对齐
|
||
- **位置**:[平台管理后台_UI.html](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_DESIGN/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0_UI.html) vs [组件规范设计.md](file:///mnt/d/Workspace/nexus/Project/fonrey/UI_SYSTEM/%E7%BB%84%E4%BB%B6%E8%A7%84%E8%8C%83%E8%AE%BE%E8%AE%A1.md)
|
||
- **问题**:原型出现规范外的 `gray-750`、不规则间距 `p-7`。
|
||
- **改进方向**:原型严格使用 design token(间距 4/8/12/16/24/32)。
|
||
- **责任角色**:UI Designer
|
||
|
||
---
|
||
|
||
## 维度六:安全 & 多租户隔离
|
||
|
||
### 🔴 S-1 Tenant Admin 初始密码可能明文邮件下发
|
||
- **位置**:[平台管理后台PRD.md L122-L136](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L122-L136) + [DATA_MODEL_LOGIN.md L468-L469](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L468-L469)(示例 `Fonrey@2025`)
|
||
- **问题**:欢迎邮件包含初始密码明文;DATA_MODEL 给出系统统一默认密码示例。一旦邮箱被截获或日志记录到邮件正文,全部新租户首批管理员凭据泄露。
|
||
- **改进方向**:禁止邮件明文密码;改用一次性安全 reset token(10-30 分钟有效,单次使用),强制首次登录改密;离线场景由平台运维通过加密 PDF 单独交付。
|
||
- **责任角色**:安全负责人 + PM + accounts 模块
|
||
|
||
### 🔴 S-2 平台管理员(PlatformAdmin)会话与租户用户共用 Cookie/Session 边界未明示
|
||
- **位置**:[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) + [登录管理技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
|
||
- **问题**:未规定平台后台域名/Cookie 域、Session 隔离机制;存在租户 schema 用户登录态与平台后台越权同会话风险。
|
||
- **改进方向**:平台后台独立子域 `admin.fonrey.com`,Cookie 域分离;中间件根据 `request.tenant.schema_name == 'public'` 强校验只允许 `platform_admins` 表用户进入。
|
||
- **责任角色**:安全负责人 + Backend Architect
|
||
|
||
### 🟠 S-3 短信 OTP 速率/防刷未定量
|
||
- **位置**:[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) §短信验证码 + [DATA_MODEL_LOGIN.md sms_otp_records](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md)
|
||
- **问题**:未定义"同号码 X 分钟内最多 N 次"、"同 IP 每日上限"、"图形/滑块校验前置"等防刷规则。
|
||
- **改进方向**:技术方案补防刷策略;DATA_MODEL 增 IP 维度计数器或在 Redis 中维护。
|
||
- **责任角色**:安全负责人
|
||
|
||
### 🟠 S-4 `phone_enc` 加密密钥轮换与 `phone_hash` salt 策略缺失
|
||
- **位置**:[DATA_MODEL_LOGIN.md L80-L81](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L80-L81) + [TECH_STACK.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/TECH_STACK.md)
|
||
- **问题**:未规定加密算法(AES-GCM?)、密钥来源(KMS?env?)、轮换流程、`phone_hash` 是否加 pepper。
|
||
- **改进方向**:技术方案补 §字段级加密:算法/Key 来源/轮换 SOP;`phone_hash` 使用 HMAC-SHA256 + 全局 pepper(不入库)。
|
||
- **责任角色**:安全负责人 + Backend Architect
|
||
|
||
### 🟠 S-5 平台后台审计日志覆盖范围未量化
|
||
- **位置**:[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) + [DATA_MODEL_PUBLIC.md platform_audit_logs](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md)
|
||
- **问题**:哪些操作必须审计、保留期限、防篡改(append-only / 哈希链)未规定。
|
||
- **改进方向**:列出"必审操作清单"(创建/暂停/删除租户、平台账号增删改、发版、备份恢复);表加 `prev_hash`/`row_hash` 形成哈希链或转写至追加型存储。
|
||
- **责任角色**:安全负责人
|
||
|
||
### 🟡 S-6 跨 schema 查询风险未在技术方案标注
|
||
- **位置**:[DATA_MODEL.md](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL.md) + [TECH_STACK.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/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](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md#L568-L609) + [平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md)
|
||
- **问题**:每条心跳直写 PG,N×M 客户端规模下会成为 IO 瓶颈。
|
||
- **改进方向**:心跳先写 Redis Stream / Kafka,再批量落表(每分钟一次);同时配合 D-6 分区。
|
||
- **责任角色**:Backend Architect
|
||
|
||
### 🟠 PF-2 平台后台租户列表 / 审计日志列表 缺分页/索引设计
|
||
- **位置**:[平台管理后台技术方案.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%8A%80%E6%9C%AF%E6%96%B9%E6%A1%88.md) + [DATA_MODEL_PUBLIC.md tenants/platform_audit_logs](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md)
|
||
- **问题**:未明示 keyset pagination 或 LIMIT/OFFSET;审计日志按时间倒序查询无 `(created_at DESC, id DESC)` 复合索引。
|
||
- **改进方向**:明确分页方案;增复合索引;列表 API 默认 page_size 上限。
|
||
- **责任角色**:Backend Architect + DBA
|
||
|
||
### 🟡 PF-3 登录端点未规定 P95 延迟 SLO
|
||
- **位置**:[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) + [测试规范.md](file:///mnt/d/Workspace/nexus/Project/fonrey/TECH_STACK/%E6%B5%8B%E8%AF%95%E8%A7%84%E8%8C%83.md)
|
||
- **问题**:无性能 SLO(如登录 P95 < 300ms)。
|
||
- **改进方向**:PRD 增非功能需求小节,列出关键端点 SLO;测试规范补压测脚本。
|
||
- **责任角色**:PM + QA
|
||
|
||
---
|
||
|
||
## 维度八:遗漏场景 & 边界
|
||
|
||
### 🔴 X-1 租户删除 / 数据导出 / GDPR 类合规流程缺失
|
||
- **位置**:[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md)
|
||
- **问题**:仅描述 `pending_delete` → `deleted` 状态,未覆盖:删除前数据导出/客户签字回执;平台管理员双人复核;保留期内可撤销。
|
||
- **改进方向**:新增"租户注销 SOP"用户故事;技术方案补软删除 + 冷却期 + 双人审批流程。
|
||
- **责任角色**:PM + 安全 + 合规
|
||
|
||
### 🟠 X-2 客户端版本回滚 / 灰度中止流程缺失
|
||
- **位置**:[平台管理后台PRD.md L476-L520](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L476-L520)
|
||
- **问题**:发版有,但回滚/灰度中止缺定义。
|
||
- **改进方向**:补 UC "回滚到上一稳定版本"、"立即停灰度"两条用户故事。
|
||
- **责任角色**:PM
|
||
|
||
### 🟠 X-3 备份恢复演练流程缺失
|
||
- **位置**:[平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md) §备份 + [DATA_MODEL_PUBLIC.md backup_records](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_PUBLIC.md)
|
||
- **问题**:仅描述备份生成,缺"恢复到独立 schema 验证"演练流程;恢复操作风险(覆盖现网)未提示。
|
||
- **改进方向**:增"恢复到隔离 schema 演练"用户故事;技术方案补恢复执行规范(必须先恢复至 `restore_*` 临时 schema 校验)。
|
||
- **责任角色**:PM + DBA
|
||
|
||
### 🟠 X-4 Tenant Admin 失联 / 转移流程未定义
|
||
- **位置**:[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md) + [平台管理后台PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md)
|
||
- **问题**:Tenant Admin 离职/换号场景下,由谁/如何重置或迁移管理员未定义。
|
||
- **改进方向**:PRD 增"平台运维代运营重置 Tenant Admin"流程,需双人复核 + 审计。
|
||
- **责任角色**:PM + 安全
|
||
|
||
### 🟡 X-5 同租户多设备登录策略未明示
|
||
- **位置**:[用户登录管理模块PRD.md](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.md)
|
||
- **问题**:是否允许同账号多端在线、互踢策略未定义。
|
||
- **改进方向**:PRD 明示"允许并发"或"后登挤掉前登"。
|
||
- **责任角色**:PM
|
||
|
||
### 🟡 X-6 跨场景同义概念差异(租户开通 → Tenant Admin 创建)
|
||
- **位置**:[平台管理后台PRD.md L122-L136](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0PRD.md#L122-L136) vs [DATA_MODEL_LOGIN.md L468-L469](file:///mnt/d/Workspace/nexus/Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md#L468-L469) vs [用户登录管理模块PRD.md L31-L33](file:///mnt/d/Workspace/nexus/Project/fonrey/PRD/%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86/%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E7%AE%A1%E7%90%86%E6%A8%A1%E5%9D%97PRD.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. 召开 1 次跨角色 Review 会议(PM + Architect + 安全 + DBA + UI + Frontend),就上表 8 项 Blocker 形成处理排期。
|
||
2. 由 ENUMS.md 维护者在 1 周内发布 v2.3,吸纳 D-3/D-4,并附数据迁移 SQL 草案(D-1/D-2)。
|
||
3. 由 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 闭环规则
|
||
|
||
1. 每条 Finding 修订完成后,处理人填写"修订位置 + 验证证据",状态置 `已完成`。
|
||
2. PM/架构师在每周例会复核:跨模块/跨文档变更必须先创建 ADR(`ADR.md`)再改文档,并在"关联 ADR"列填写 ID。
|
||
3. QA 在所有依赖 Finding 全部 `已完成` 后,对涉及业务路径执行回归测试,状态置 `已验证`。
|
||
4. 任何 Finding 在迭代结束仍未启动需在"备注"列说明原因并在下一次 Review 例会重新评估优先级。
|
||
5. 本表与 `REVIEW/` 目录后续增量 Review 报告同步:新增 Finding 追加编号(40+)继续延续。
|