Files
nexus/Project/fonrey/REVIEW/REVIEW_全局_2026-04-28.md
2026-04-29 07:08:27 +08:00

422 lines
26 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.
# Fonrey 全局系统设计 Review 报告
> **Review 类型**:全量 ReviewPRD + DATA_MODEL + TECH_STACK + UI/UX + TASK 交叉验证)
> **Review 模式**:增量对比 `REVIEW_全局_2026-04-26.md`,逐条核对 4 Blocker + 12 Major 状态,识别新增风险
> **Review 日期**2026-04-28
> **Reviewer**:首席系统设计 ReviewerAI 辅助6 路并行 explore agent 取证)
> **当前阶段**:需求 ~90% / 数据模型 ~80% / UI 设计 ~35%HTML 原型推进中)/ TECH 横切规范 ~70%
> **覆盖文档**9 份 PRD + 10 份 TECH_STACK + 9 份 DATA_MODEL含新增 ENUMS.md v2.2+ 3 份 UI_SYSTEM + 11 份 UI_DESIGN + TASK 总表
> **问题分级**:🔴 Blocker阻塞开发 / 🟠 Major必须修复但不阻塞 / 🟡 Minor建议优化
> **状态标记**:✅ 已修复 / ⚠️ 部分修复 / ❌ 未修复 / 🆕 新增
---
## 、执行摘要Executive Summary
### 整体评价
相较 2026-04-26 版本,本期文档体系出现 **5 项实质性进展**,是历次 Review 以来修复力度最大的一次:
1. **🟢 B-01 系统配置 PRD 落地**`PRD/系统配置/系统配置模块PRD.md`273 行)+ `系统配置参数数据.md`1100 行)+ `系统配置数据模型设计说明_for_Atlas.md`275 行)三件套已完整产出,含 US-SETTING-001-A/B/C 三条 P0 Story 与完整验收标准。MVP 范围被显式约束(明确 ❌ 标签/带看/通知/发布平台等推迟到 P1/P2**降低实施风险**。
2. **🟢 B-02 枚举三方不一致根除**`DATA_MODEL/ENUMS.md` v2.2780 行2026-04-28作为**唯一权威源**已建立,全量统一为 `lower_snake_case`,历史大写值(`SUCCESS`/`A_urgent`/`A_app`)的迁移规则已写明,并要求 DB CHECK / `enum_labels` / 前端三方同步。
3. **🟢 B-03 权限档位冲突收敛**:权限 PRD §3 已显式表述"五档基线 + 各权限项可选子集(含三档场景)"DATA_MODEL_PERMISSION 的 `staff_data_scopes` 表(已建 DDL含 3 条索引)实现"跨层级并集"模型PRD ↔ Data ↔ Code 三方对齐。
4. **🟢 B-04 Keyset 分页规范化**`API_CONTRACT.md` §4 已写入 `{"mode":"keyset","cursor":"...","limit":20}` 标准合约 + 不透明游标禁令;客源/房源/楼盘/组织 4 个模块技术方案均已采用此契约。
5. **🟢 M-01 测试规范多租户化**`TECH_STACK.md:208` + `测试规范.md:69,146` 三处明确"必须使用 `TenantClient`,禁止 Django 原生 `Client()`"4 个模块技术方案同步引用。
但本期 Review 也确认 **3 类系统性债务未动**,且因其他模块详化反而更显突出:
- **❌ 主表乐观锁 `version` 字段** —— 全量 DATA_MODEL 0 命中89k 房源并发编辑场景PRD 明确双经纪人同时改房)将出现"后写覆盖前写"。
- **❌ 高写入表 `PARTITION BY` DDL** —— `follow_logs` / `property_photos` / `permission_change_logs` / `login_attempts` / `platform_audit_logs` 全量 0 命中分区子句,仅文字"建议月度分区"。**200 万跟进日志 + 2 年保留期** 的查询性能未保障。
- **❌ KMS / 密钥轮换 SOP** —— 仅见"`R2_ADMIN_KEY` 通过 Docker Secret 注入",无主密钥轮换流程、无应急吊销、无加密字段重新封装。
### 核心问题摘录Top 10
| # | 等级 | 编号 | 问题 | 维度 | 状态 |
|---|------|------|------|------|------|
| 1 | 🔴 | **B-05** | 主表乐观锁 `version` 字段全量 0 实现:`properties` / `clients` / `complexes` 在 PRD 多人协作场景中是核心DDL 无并发控制 | Data↔PRD | 🆕 升 Blocker持续 3 次未修) |
| 2 | 🔴 | **B-06** | 高写入表分区 DDL 仍未落地M-03 持续 3 次未修5 张高频表无 `PARTITION BY RANGE` 子句,仅注释"建议月度分区",无法在迁移期补加分区 | Data | 🆕 升 Blocker |
| 3 | 🟠 | **M-11** | KMS / 密钥轮换 SOP 仍未补:`core/encryption.py` 已声明,但主密钥轮换、密钥版本号、加密字段重新封装、应急吊销四类流程在 TECH_STACK 与系统管理 PRD 中均无对应章节 | 安全 | ❌ 持续未修 |
| 4 | 🟠 | **M-12** | Celery 任务 schema 切换缺统一封装:多模块技术方案声明 `tenant_schema_name` 入参,但无 `with_tenant_context` 装饰器或基类抽象,开发期容易漏写导致跨租户脏读 | TECH/多租户 | ⚠️ 部分修复 |
| 5 | 🟠 | **M-13** | R2 路径前缀全局规范不一致:系统管理已规范 `backups/{tenant_schema}/...` `exports/{tenant_schema}/...`,但客源/房源/楼盘模块 R2 路径仍写"`property_photos/...`"无 tenant 前缀模板 | TECH/多租户 | ⚠️ 部分修复 |
| 6 | 🟠 | **M-06** | 客户端发布无签名校验/防降级:`/api/client/updates/latest/``download_url` 对外公开,仅 SHA256 完整性校验,可被 MITM 投递降级版本(昨日 M-06 未修) | 安全 | ❌ 持续未修 |
| 7 | 🟠 | **M-14** | ORM Manager / QuerySet 数据范围统一封装规范缺失:`DATA_MODEL_PERMISSION.md:143-145``ScopeQueryBuilder` 只是 helper未规定"所有业务 QuerySet 必须经过 Scope 包装"的强制约束,开发期容易漏权限校验 | 安全/Data | 🆕 新增 |
| 8 | 🟠 | **M-05** | 89k 数据 < 2 秒列表查询 NFR 仍无 p95/EXPLAIN/性能基准测试任务(昨日 M-05 未修) | NFR↔TECH↔测试 | ❌ 持续未修 |
| 9 | 🟠 | **M-09** | UI_SYSTEM 复杂组件虚拟滚动列表、批量操作面板、抽屉表单嵌套规则、文件上传批量、富权限树规范深度不足UI_DESIGN 11 份原型仅覆盖客源 + 房源列表,**楼盘/权限/系统配置/组织人事/发布管理 5 大模块全部缺原型** | UI | ⚠️ 部分修复 |
| 10 | 🟡 | **N-01** | ENUMS.md v2.2 已统一,但 PRD 文本中仍混用中文枚举(如客源 PRD 仍写"求购/求租"),需要一次全文档"中文枚举 → ENUMS 锚点链接"替换 | PRD↔Data | 🆕 新增 |
### 风险等级分布
| 等级 | 本次2026-04-28 | 上次2026-04-26 | 净变化 |
|------|---|---|---|
| 🔴 Blocker | **2** | 4 | -2B-01/B-02/B-03/B-04 全部清零B-05/B-06 由历史 Major 升级) |
| 🟠 Major | **9** | 12 | -3M-01 已修复关闭M-02→B-05、M-03→B-06 升级) |
| 🟡 Minor | **3** | 6 | -3聚焦 Top 风险) |
| 合计 | **14** | 22 | -8 |
### 增量对比一览(昨日 Blocker / Major → 今日状态)
| 上次编号 | 简述 | 状态 | 今日处置 |
|----------|------|------|----------|
| **B-01** | 系统配置 PRD 空骨架 | ✅ **已修复**273+1100+275 行三件套) | 关闭 |
| **B-02** | 枚举三方不一致 | ✅ **已修复**ENUMS.md v2.2 权威源) | 关闭,遗留 N-01PRD 文本回写) |
| **B-03** | 权限三档/五档冲突 | ✅ **已修复**(五档基线 + 子集子句) | 关闭,遗留 M-14ORM 强制约束) |
| **B-04** | Keyset 分页缺失 | ✅ **已修复**API_CONTRACT §4 + 4 模块) | 关闭 |
| M-01 | 测试规范多租户化 | ✅ 已修复TenantClient 强制) | 关闭 |
| M-02 | 主表乐观锁 / 楼盘锁 | ❌ 持续未修 | **升 B-05** |
| M-03 | 高写入表分区 | ❌ 持续未修 | **升 B-06** |
| M-04 | Celery/R2/索引规范 | ⚠️ 部分修复(拆分) | 拆分为 M-12 / M-13 / 残留索引矩阵 |
| M-05 | 89k 数据 < 2s NFR 测试 | ❌ 持续未修 | M-05 |
| M-06 | 客户端发布签名 | ❌ 持续未修 | M-06 |
| M-07~M-08 | 价格走势 / 楼盘市场报盘 | ⚠️ 降级 | 转 N-02Minor |
| M-09 | UI 组件 + Wireframe | ⚠️ 部分修复 | M-09 |
| M-10 | Redis Key tenant 前缀 | ✅ 已修复(系统设置技术方案 §6.4 | 关闭 |
| M-11 | 加密密钥管理 | ❌ 持续未修 | M-11 |
| M-12 | 数据保留与归档 | ⚠️ 部分修复 | 转 N-03 |
---
## 一、PRD 一致性审查PRD ↔ PRD ↔ TASK
### ✅ 历史 B-01系统配置 PRD 空骨架)已修复
**证据**
- `PRD/系统配置/系统配置模块PRD.md`273 行v0.12026-04-27含目标度量、非目标范围、3 条 P0 User StoryUS-SETTING-001-A/B/C与完整 Given-When-Then 验收标准。
- `PRD/系统配置/系统配置参数数据.md`1100 行):实际参数清单。
- `PRD/系统配置/系统配置数据模型设计说明_for_Atlas.md`275 行):与 DATA_MODEL_SETTING.md 对齐。
**剩余风险(降级为 Minor N-04**US-SETTING-001 的"配置变更生效时效 ≤ 5 分钟Redis 缓存 TTL"与 `DATA_MODEL_SETTING.md` 的 Redis Key TTL = 300s 一致,但**无 Cache Invalidation 主动失效路径**(仅靠 TTL 过期),管理员保存后 5 分钟内一线经纪人仍看不到新选项 —— PRD AC-2 "刷新后立即可见" 与实现存在间隙。
---
### ✅ 历史 B-02核心枚举三方不一致已修复
**证据**
- `DATA_MODEL/ENUMS.md` v2.2780 行2026-04-28作为唯一权威源覆盖 Publictenant 生命周期、平台管理员、备份导出、升级发布)+ Tenant客源/房源/楼盘/权限/组织/系统设置)所有枚举域。
- 命名规范统一为 `lower_snake_case`,历史大写值(`SUCCESS`/`FAILED`/`A_urgent`/`A_app`/`B_schema`/`C_feature`/`REPLACE`/`RESTRICT`/`GRANT`)的迁移路径已书面化。
**剩余风险N-01 Minor**PRD 文本与 TASK AC 中仍存在大量中文/旧值混用(如客源 PRD 仍写"求购/求租")。需要一次性回写:
- 在每份 PRD 顶部加 `> 枚举值参见 DATA_MODEL/ENUMS.md` 锚点
- 在 ENUMS.md 中给每个枚举值附"中文展示标签"列(部分已有)
- TASK.md 排一条 P0 任务PRD 中文枚举 → 英文锚点引用
---
### ✅ 历史 B-03权限档位三档/五档冲突)已修复
**证据**
- `PRD/权限管理/权限管理模块PRD.md:46`:明文"采用**五档模型**:本人 / 本组 / 本门店 / 本区域 / 全公司。注意:并非所有权限项均开放五档,各项的实际可选范围以权限编辑页的下拉配置为准(例如某些权限项仅提供「本人 / 本门店 / 全公司」三个选项)"
- `:499`:复述同一约定,闭环。
- `DATA_MODEL_PERMISSION.md:24,31,254-275,967-987``staff_data_scopes` 表 DDL 完整,索引 3 条到位,"员工数据范围 = 所有 staff_data_scopes 对应 org_units.path 子树并集"实现"跨层级叠加"。
**剩余风险M-14 Major见 §五**DATA_MODEL_PERMISSION 的 `ScopeQueryBuilder` 只是 helper class未在 TECH_STACK 中强制规定"所有业务 QuerySet 必须经过 Scope 包装",开发期容易漏写导致越权读取。
---
### 🟡 N-01 PRD 文本回写 ENUMS 锚点(来自 B-02 残留)
详见上文。**责任**PM 在 Phase 1 编码启动前完成全量 PRD 文本扫描替换。
---
## 二、TECH_STACK / API / 测试规范审查
### ✅ 历史 B-04Keyset 分页缺失)已修复
**证据**
- `API_CONTRACT.md:143,154,157,182`:标准请求/响应契约 `{"mode":"keyset","cursor":"opaque_cursor","limit":20}` + `next_cursor`
- `API_CONTRACT.md:165``cursor` MUST 为不透明字符串,**禁止暴露内部排序字段组合** ✅ 与 OWASP 推荐一致
- `API_CONTRACT.md:378`drf-spectacular `OpenApiParameter("cursor", ...)` 注解
- 客源 / 房源 / 楼盘 / 组织 4 个模块技术方案均同步采用
**剩余 Minor**:尚无 Keyset SQL 模板(含 `WHERE (sort_key, id) < (?, ?)` 的复合键模板)。建议在 `TECH_STACK.md` 新增 §"分页 SQL 模板"章节,给出含 `tenant_schema` schema-search-path 切换 + 复合键的标准实现。
---
### ✅ 历史 M-01测试规范多租户化已修复
**证据**
- `TECH_STACK.md:203,208,211`:明确 TenantClient 强制 + R2/Redis/邮件 Mock
- `测试规范.md:55,69,146,230``TenantClient` 在测试金字塔图、约束章节、请求路径、Mock 策略 4 处统一表述
- 4 个模块技术方案均引用
---
### 🟠 M-12 Celery 多租户 schema 切换无统一封装M-04 拆分)
**文档**`TECH_STACK/客源管理技术方案.md` / `房源管理技术方案.md` / `楼盘管理技术方案.md` / `组织人事技术方案.md`(均声明 `tenant_schema_name` 入参vs `TECH_STACK.md`(无统一规范)
**事实**
- 模块技术方案约定 Celery 任务签名带 `tenant_schema_name: str` 形参,但**无 `with_tenant_context(schema)` 装饰器或基类**。
- 系统设置技术方案虽给出 schema 切换示例(`:28-31`),但未提取为通用规范。
- `core/cache.py` 已规范带前缀,但 ORM 查询的 schema 切换由开发者手写 `connection.set_schema(...)`**漏写不报错**。
**影响**
- Celery worker 在多租户调度下,相邻任务可能因 search_path 残留导致跨租户脏读/脏写。
- 单元测试若忘记设置 schema测试通过但生产出错。
**改进方向**
-`TECH_STACK.md` 新增 §"Celery 多租户规范"
- 强制所有业务 task 用 `@tenant_task(schema_arg="tenant_schema_name")` 装饰器
- 装饰器职责:进入时 `set_schema_to(schema)`,退出/异常时 `set_schema_to_public()`,记录 task_id 与 schema 到结构化日志
- 测试规范补:"Celery 任务测试必须显式 mock schema 切换断言"
---
### 🟠 M-13 R2 路径前缀全局规范不一致M-04 拆分)
**文档**`TECH_STACK/系统管理技术文档.md:521-525`已规范vs 客源/房源/楼盘技术方案(未规范)
**事实**
- 系统管理已统一:`backups/{tenant_schema}/{record_id}.tar.gz` / `exports/{tenant_schema}/{task_id}.zip` / `releases/system/{version}/...`(无 tenant 前缀,公共资源)✅
- 房源 / 客源模块的图片 / 跟进附件 R2 路径**未在文档中给出 key 模板**,仅写"预签名上传"。
- 公开发布包路径无 tenant 前缀(合理:客户端尚未登录),但**生产环境 bucket policy 需明示**:哪些 prefix 是 public-read哪些需要 signed URL。
**影响**
- 跨租户文件越权访问风险(房源图片如果误用全局 prefixA 租户能猜到 B 租户对象 key
- 生命周期策略(如客源跟进附件 90 天清理)无 prefix 难以配置。
**改进方向**
-`TECH_STACK.md` 新增"R2 路径规范"统一表:
```
公共资源 → releases/system/{version}/... public-read
租户 backup → backups/{tenant_schema}/{rid}.tar.gz signed only
租户 export → exports/{tenant_schema}/{tid}.zip signed-24h
房源图片 → media/{tenant_schema}/property/{pid}/{photo_id}.{ext}
跟进附件 → media/{tenant_schema}/follow/{log_id}/{idx}.{ext}
审计归档 → exports/audit/{task_id}.csv signed only
```
- 路径中**禁止出现 tenant_idUUID**,统一用 `tenant_schema_name`,便于跨环境迁移。
---
### 🟠 M-05 89k 数据 < 2 秒列表查询 NFR 仍无性能基准(持续未修)
**文档**`PRD/客源管理/客源管理模块PRD.md` US-CLIENT-002 / `PRD/房源管理/房源管理模块PRD.md` US-PROPERTY-002 NFR列表查询 p95 < 2s89k 数据)
**事实**
- 测试规范未含 p95 / EXPLAIN ANALYZE / pg_stat_statements 集成。
- 无 89k 量级 seed factory仅有单条 fixture
- 无 CI 性能回归任务(如 pgTAP / pytest-benchmark
- AC 中"< 2 秒"实质不可测。
**改进方向**
- 在 `测试规范.md` 增补 §"性能测试"
- seed: `make seed-perf` 灌入 89k 房源 + 200k 客源 + 200 万 follow_logs
- 工具: `pytest-benchmark` + `EXPLAIN (ANALYZE, BUFFERS)` 输出归档
- 阈值: 列表 p95 < 2s / 详情 p95 < 500ms / 写入 p95 < 1s
- CI: nightly 跑一次,回归 > 20% 标 fail
- 优先 instrument 客源/房源列表 API含 keyset 翻第 100 页场景)
---
## 三、DATA_MODEL 审查
### 🔴 B-05 主表乐观锁 `version` 字段全量未实现M-02 升级,连续 3 次未修)
**文档**`DATA_MODEL/DATA_MODEL_PROPERTY.md` / `DATA_MODEL_CLIENT.md` / `DATA_MODEL_COMPLEX.md`
**事实**grep `version|乐观锁|optimistic` 在 properties / clients / complexes 主表 DDL 中 **0 命中**`version` 仅出现在 ENUMS.md 文档版本号、`SystemVersion` 表名、Permission 缓存 key `:perm:version` 等不相关上下文中)。
**业务场景**PRD 多处):
- 房源 PRD双经纪人同时编辑同一房源一人改价、一人改状态
- 客源 PRD录入员 + 跟进经纪人同时编辑客源等级
- 楼盘 PRD4 类锁字段lock_building/lock_room/lock_info/lock_standard_room已建但**无 `lock_version` 触发 update conflict**
**影响**:后写覆盖前写、数据丢失,**89k 房源体量下必然出现**。
**改进方向**
- DDL 增加:
```sql
ALTER TABLE properties ADD COLUMN version INTEGER NOT NULL DEFAULT 1;
ALTER TABLE clients ADD COLUMN version INTEGER NOT NULL DEFAULT 1;
ALTER TABLE complexes ADD COLUMN version INTEGER NOT NULL DEFAULT 1;
```
- 应用层:`Model.objects.filter(id=x, version=v_old).update(..., version=F('version')+1)`,受影响行 0 → 抛 `ConflictError`,前端展示"已被他人修改,请刷新后重试"。
- API_CONTRACT.md 增补 `If-Match: <version>` Header 规范PUT/PATCH 必传)。
---
### 🔴 B-06 高写入表分区 DDL 仍未落地M-03 升级,连续 3 次未修)
**文档**`DATA_MODEL/DATA_MODEL_CLIENT.md`follow_logs/ `DATA_MODEL_PROPERTY.md`property_photos/ `DATA_MODEL_PERMISSION.md`permission_change_logs/ `DATA_MODEL_LOGIN.md`login_attempts/ `DATA_MODEL_PUBLIC.md`platform_audit_logs
**事实**grep `PARTITION BY|分区表|partition` 在 DATA_MODEL 全量 0 命中。仅文字"建议月度分区"。
**业务体量**PRD 与 NFR
- `follow_logs`200 万 / 2 年保留期
- `property_photos`89k 房源 × 平均 8 张 ≈ 70 万行
- `login_attempts`:所有登录失败/成功审计
- `platform_audit_logs`:跨租户全平台审计
**影响**单表过大导致索引膨胀、VACUUM 阻塞、按时间窗口归档不可分区操作。**编码后再切分区将停机迁移**,是必须前置的设计决策。
**改进方向**
- DDL 改为:
```sql
CREATE TABLE follow_logs (
id BIGSERIAL,
created_at TIMESTAMPTZ NOT NULL,
...
PRIMARY KEY (id, created_at) -- 分区键必须含 created_at
) PARTITION BY RANGE (created_at);
CREATE TABLE follow_logs_2026_04 PARTITION OF follow_logs
FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');
```
- 增补 Celery 周期任务 `partition_maintenance_task`(每月最后一天):自动建下月分区 + drop 超出保留期分区。
- DATA_MODEL.md 增 §"分区策略"统一表(保留期 / 分区粒度 / 维护任务)。
---
### 🟠 M-14 ORM 数据范围统一封装规范缺失B-03 残留)
**文档**`DATA_MODEL/DATA_MODEL_PERMISSION.md:143-145, 414-455`
**事实**
- `ScopeQueryBuilder` 已实现(含 `is_protected` 二次 AND 规则)。
- 但**未在 TECH_STACK 中强制要求"所有业务 QuerySet 必须经过 ScopeQueryBuilder"**。
- 模块技术方案 view 层示例代码直接 `Property.objects.filter(...)`,可绕过权限控制。
**影响**:开发新功能时漏接 ScopeQueryBuilder → 越权读取,且测试不易发现。
**改进方向**
- TECH_STACK 增补"ORM 数据范围强制规范"
- 业务 Model 不暴露默认 `objects` Manager统一暴露 `scoped(staff)` 入口
- 写一个 lint rulepylint plugin / pre-commit禁止业务模块直接调用 `<Model>.objects.<query>`
- 测试规范补"权限边界测试矩阵":每个 Model 至少 3 caseown / department / cross_department denied
---
### 🟡 N-02 楼盘价格走势 / 市场报盘M-07/M-08 降级)
历史 M-07/M-08 已写明"P2 不做",本期降为 Minor。
---
### 🟡 N-03 数据保留与归档策略M-12 降级)
`platform_audit_logs` / `follow_logs` 在 PRD 中提到"2 年保留",但 DATA_MODEL 无对应 Celery 归档任务定义。建议在 B-06 分区落地后顺带补全 archive job。
---
## 四、安全审查(含多租户 / 权限 / 审计)
### 🟠 M-06 客户端发布无签名校验 / 防降级(持续未修)
**文档**`PRD/发布管理/客户端发布管理模块PRD.md:165,198,284,347` / `TECH_STACK.md:119`
**事实**
- 端点 `GET /api/client/updates/latest/` 公开(合理)。
- `download_url` 走 R2 / CDN 公开(合理)。
- 完整性校验仅 SHA256仅防偶然篡改不防 MITM 主动替换)。
- **无代码签名Authenticode / OS-level codesign**、**无服务端响应签名**、**无版本号单调递增校验(防降级)**。
**改进方向**
- 升级响应 JSON 增加 `signature` 字段HMAC-SHA256密钥服务端持有客户端校验签名后再 fetch download_url。
- `electron-updater` 配合 `publisherName`Windows Authenticode在 CI 用代码签名证书签 EXE。
- 客户端本地存"已安装版本 N",若服务端返回版本 < N**拒绝降级**(除非配置允许 force_downgrade=true 由后端控制)。
---
### 🟠 M-11 加密密钥管理 / 轮换 SOP 仍未补(持续未修)
**文档**`TECH_STACK/系统管理技术文档.md:877`(仅"密钥通过 Docker Secret 注入"一句)
**事实**
- `core/encryption.py` 中央加密 helper 已声明(散见模块技术方案)。
- **缺**主密钥KEK轮换流程、字段加密密钥DEK版本号设计、密钥泄露应急吊销 + 全量字段重新封装、生产-staging 密钥隔离。
**改进方向**
- 在 `TECH_STACK.md` 新增 §"密钥管理 SOP"
- 三层结构环境主密钥KMS / sops + age → 应用 KEK启动时加载 → 字段 DEKper-row 或 per-column
- DDL 加密字段必须含 `key_version SMALLINT NOT NULL`
- 季度轮换 + 异常吊销 runbook
- 短期(无 KMS方案`age` + `sops` 加密 secrets 文件,运维流程文档化。
---
### 🟠 M-14 ORM 数据范围(详见 §三)
---
## 五、UI/UX 审查
### 🟠 M-09 UI 设计覆盖率与复杂组件深度(部分修复)
**文档**`UI_DESIGN/`11 份 markdown + 11 份 HTML 原型 + `UI_设计任务总表.md`/ `UI_SYSTEM/`3 份)
**事实**
- ✅ 已覆盖:客源列表 / 客源详情 / 客源新增 / 客源编辑 / 房源列表 5 类原型HTML + Markdown 双版本)。
- ❌ 仍缺:
- 楼盘管理(详情 / 新增 / 锁字段交互)
- 权限管理(权限树 / 数据范围编辑器 / 五档下拉子集)
- 系统配置lookup_items 编辑抽屉 / 必填规则配置)
- 组织人事org tree / 员工卡)
- 发布管理(升级表单 / 灰度名单 / 进度面板)
- ❌ UI_SYSTEM 复杂组件规范深度仍不足虚拟滚动列表89k 房源必需)、批量操作面板、抽屉表单嵌套规则、文件上传批量、富权限树。
**改进方向**
- 把 UI_DESIGN 11 份 task 按 PRD 优先级排进 Phase 1客源已齐→ 房源详情 → 楼盘 → 权限 → 系统配置;
- UI_SYSTEM 增补"复杂组件清单"5 项,每项给出 Alpine.js + HTMX 实现范本;
- 89k 房源列表必须用虚拟滚动或固定窗口(如 PageDown 分页HTMX 按 keyset cursor 局部刷新。
---
## 六、TASK ↔ 文档交叉验证
### 🟡 N-04 系统配置 Cache InvalidationB-01 残留)
详见 §一。
---
## 七、汇总 Action Items
| # | 等级 | 编号 | Action | 责任 | 建议完成时间 | 编码门禁 |
|---|------|------|--------|------|--------------|----------|
| 1 | 🔴 | B-05 | 主表 `version` 字段 + `If-Match` API 规范 | 架构师 + 后端 Lead | T+3 天 | **Phase 1 启动前** |
| 2 | 🔴 | B-06 | 5 张高写入表 `PARTITION BY RANGE` DDL + 分区维护 Celery 任务 | 架构师 + DBA | T+5 天 | **Phase 1 启动前** |
| 3 | 🟠 | M-05 | 性能基准测试方案seed 89k + pytest-benchmark + p95 阈值) | 测试 Lead | T+7 天 | Phase 1 内 |
| 4 | 🟠 | M-06 | 客户端发布签名 + 防降级HMAC + Authenticode | 安全 + 发布运维 | T+10 天 | 客户端发布 GA 前 |
| 5 | 🟠 | M-09 | 楼盘 / 权限 / 系统配置 / 组织人事 / 发布 5 模块原型 + 5 复杂组件规范 | UX + 前端 Lead | T+14 天 | 各模块编码前 |
| 6 | 🟠 | M-11 | 密钥管理 SOPKEK/DEK/版本/轮换/吊销) | 安全 + 运维 | T+10 天 | 加密字段上线前 |
| 7 | 🟠 | M-12 | `@tenant_task` 装饰器 + Celery 多租户规范文档 | 架构师 | T+5 天 | Celery 任务编码前 |
| 8 | 🟠 | M-13 | R2 路径前缀统一规范表 + bucket policy | 架构师 + 运维 | T+5 天 | R2 上传任务编码前 |
| 9 | 🟠 | M-14 | ORM 数据范围强制 lint + `scoped(staff)` 入口 | 架构师 + 后端 Lead | T+7 天 | Phase 1 内 |
| 10 | 🟡 | N-01 | PRD 文本中文枚举 → ENUMS 锚点全量替换 | PM | T+3 天 | 编码前清零 |
| 11 | 🟡 | N-04 | 系统配置 Cache Invalidation 主动失效路径补充 | 后端 Lead | T+5 天 | US-SETTING-001 编码前 |
| 12 | 🟡 | N-02/N-03 | 楼盘走势/数据归档策略 | PM + DBA | Phase 2 | 非阻塞 |
---
## 八、Review 结论
### 编码门禁Phase 1 启动前必清零)
**🔴 Blocker2 项必修)**
1. **B-05** 主表 `version` 乐观锁字段 —— 涉及 properties / clients / complexes DDL + API_CONTRACT 增补 `If-Match` Header
2. **B-06** 5 张高写入表分区 DDL + 分区维护任务 —— 后期切分需停机,必须前置
### 整体判断
- **本期是历次 Review 进展最大的一次**4 个 Blocker 全部清零1 个 MajorM-01已修复文档体系特别是 PRD ↔ ENUMS ↔ DATA_MODEL建立了真正的"权威源"。
- **剩余 Blocker 集中在 DATA_MODEL 物理设计层面**(并发控制 + 分区),属于"知道但没动"的债务,**修复成本可估、风险可控**,建议本周内打磨完毕。
- **Phase 1 编码可在 B-05 / B-06 修复后立即启动**,其余 9 个 Major 可与编码并行推进,但需在对应模块进入开发前清零(参见上表"编码门禁"列)。
- **下一次 Review 焦点**B-05 / B-06 修复后,应重点审查 M-09UI 覆盖率)+ M-05性能基准以及编码启动后第一波集成测试反馈。
### 文档健康度趋势
| 维度 | 04-25 | 04-26 | 04-28 | 趋势 |
|------|-------|-------|-------|------|
| PRD 完整性 | 60% | 75% | **90%** | ↑↑ |
| DATA_MODEL 严谨性 | 50% | 65% | **80%** | ↑↑ |
| TECH_STACK 横切规范 | 30% | 50% | **70%** | ↑ |
| 测试规范多租户化 | 20% | 40% | **85%** | ↑↑↑ |
| UI/UX 覆盖率 | 5% | 30% | **35%** | ↑(最弱环节) |
| 安全设计 | 40% | 45% | **55%** | ↑M-06/M-11 持续债务) |
---
> **Reviewer 签字**:首席系统设计 ReviewerAI 辅助)
> **下次 Review 建议触发条件**B-05 + B-06 完成 PR 合并后,或 Phase 1 编码启动后第 1 个 Sprint 结束。