docs: 状态文件同步到 2026-09-18 实况(方案任务三)

- STATUS.md:顶部权威行由 "PHASE 20 COMPLETE"(09-17)更新为 09-18 口径(Phase 01~22 关闭 /
  Phase 23 部分关闭 / 三轮横向加固 / 669 tests / 停在 Phase 24 门前);版本演进表补 rc.11~rc.16;
  **合并三处重复的「V1.1 本地部署完成 (2026-09-09)」区块为一处**(996 行 → 946 行)并加
  「历史记录边界」声明;清「Phase 04~05 ⏳ 待开发」等与实测矛盾项。契约锚点全部保住
  (UI REDESIGN ACCEPTED BY USER / Phase 07 已通过用户验收 / 管理后台: http://localhost:13520/)。
- AGENTS.md + STATUS.md:UI 契约门禁口径 13/13 → **14/14**(历史时点行保留原值并注明,
  不篡改史实)。
- JIRA_BACKLOG.md:Epic 总览表补 P14/P15/P19~P23 的 ✅(P23 标「部分关闭」)。
- 客户需求基线计划:Phase 07 标题去 "UI REOPENED";Phase 10~15/19 补 ✅;Phase 20/21 勾选
  checkbox 并注日期;**Phase 22 如实标「未复验」**(口径澄清:计划的 Deployment/Ops 与 STATUS 的
  「部署运维配置扩展(Feature Flag)」是两份不同工作,后者复验结论不构成本节证据);
  Phase 23 标「部分关闭」,第 3/5 项(E2E 场景实现、CI 串联)**不虚勾**。
- PENDING_DECISIONS.md:历史部署声明 10 项按各 Phase Recovery 报告证据回写处置结果
  (9 项已关闭 / 1 项部分);补登 HTTP 与幂等检修遗留的第三方开放待决策 7 项。
- REMAINING_WORK.md:整体重写 —— 原文称 CHANGELOG 3.3MB(实为 4234 字节)、P1-3 指向从未存在的
  Phase-23-Completion-Report.md;改为「已关闭 / 仍未完成 / 原编号索引 / 验收标准」四段,保留原编号
  以便对照历史引用。
- database 两份:TABLE_INVENTORY 40 表 → **59 表**(带「来源迁移」列);MIGRATION_GUIDE
  V001~V011 → **V001~V046(46 个)**;两份均标注「以 backend/src/main/resources/db/migration/ 为准」。
This commit is contained in:
WorkBuddy
2026-09-18 21:15:29 +08:00
parent 4f37df3284
commit ae2405f645
8 changed files with 347 additions and 498 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ V1.1 是 V1.0 的增量升级。正确的 V1.0 核心按 KEEP 处理,不得因
业务 Phase 唯一执行计划:`docs/善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md`。
当前 UI 重设计唯一总计划:`docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`。首批范围(小程序 11 个核心页面 + 管理端框架/工作台)已于 **2026-09-16 通过用户验收(结论:基本达标)**,此前"视觉否决 / REOPENED"的判定随之关闭,UI 契约门禁 13/13 全绿。管理端桌面端目视复验仍待用户执行。
当前 UI 重设计唯一总计划:`docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`。首批范围(小程序 11 个核心页面 + 管理端框架/工作台)已于 **2026-09-16 通过用户验收(结论:基本达标)**,此前"视觉否决 / REOPENED"的判定随之关闭,UI 契约门禁 **14/14** 全绿(2026-09-16 时为 13 项,此后新增端口与 `/admin/` 子路径一致性门禁)。管理端桌面端目视复验仍待用户执行。
---
+74 -300
View File
@@ -1,322 +1,96 @@
# 丹阳公益婚恋服务平台 V1.0 — 上线前剩余工作
# 丹阳公益婚恋服务平台 V1.1 — 上线前剩余工作
> 本文件为上线前必须完成的工作清单,按优先级排序。
> 交由 WorkBuddy 执行。
> **最后更新:2026-09-18**(原文为 2026-09-01,内容已严重过期,本轮按实测重写)
>
> ⚠️ **重写说明**:本文件此前被多处引用,但内容与实际严重不符 —— 称 `CHANGELOG.md` 有 **3.3MB**(实际
> **4234 字节 / 73 行**);P1-3 指向**已删除**的 `docs/Phase-23-Completion-Report.md`。2026-09-18 文档治理按实测重写,
> 并保留原编号以便对照历史引用。**逐项处置计划与批次划分**见
> `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md`。
---
## P0 — 上线前必须完成(阻塞性)
## 一、已关闭项(原文标为阻塞 / 重要,实测已完成)
### P0-1: 产品确认16项技术默认值
**文件**: `docs/PENDING_DECISIONS.md`
**问题**: 以下技术默认值已硬编码,但无产品最终确认:
| 决策项 | 当前技术默认值 | 需要确认 |
| 原编号 | 事项 | 结论(2026-09-18 复核) |
|---|---|---|
| 每日推荐数量 | 6 人 | 产品确认 |
| 推荐最低阈值分数 | 60 分 | 产品确认 |
| Pass 冷却时间 | 180 天 | 产品确认 |
| 照片上限 | 6 张 | 产品确认 |
| 兴趣标签上限 | 8 个 | 产品确认 |
| 自我介绍长度上限 | 500 字符 | 产品确认 |
| Privacy 默认值 | 全部 TRUE | 产品确认 |
| 活动是否需要审核 | TRUE | 产品确认 |
| 活动互选最大人数 | 3 人 | 产品确认 |
| 活动互选截止时间 | 48 小时 | 产品确认 |
| 红娘是否允许电话联系 | FALSE | 产品确认 |
| "正在了解"是否自动暂停推荐 | 用户选择 | 产品确认 |
| RelationshipStatus 最终命名 | searching/getting_to_know/paused/matched_successfully/service_exited | 产品确认 |
| Appeal 是否 V1.0 首发 | 否(Feature Flag 预留) | 产品确认 |
| 每日推荐重置时间 | 00:00 Asia/Shanghai | 产品确认 |
**操作**:
1. 产品负责人逐一确认以上16项
2. 确认后更新 `application.yml` 或对应配置类
3. 从 `docs/PENDING_DECISIONS.md` 移除已确认项
4. 更新 `AGENTS.md` 中的规则说明(如有影响)
| P0-1 | 产品确认 16 项技术默认值 | ✅ **已确认 16 项**(见 `docs/PENDING_DECISIONS.md`「已确认决策列表」);仍有 13 项待确认(另见该文件「第三方开放遗留」7 项) |
| P0-2 | 隐私政策最终版本确认 | ✅ `docs/legal/privacy-policy.md` 已存在(2996 字节)。上线前仍需确认是否经法务终审签署 |
| P0-3 | PIA(隐私影响评估)书面记录 | ✅ `docs/security/PIA.md` 已存在(4700 字节) |
| P1-1 | CoreInvariantsTest 补实质性测试 | ✅ **已如实处置**:该类(195 行 / 12 用例)已明确降级为「**常量取值口径守卫,不验证行为**」(DisplayName 已改),真实行为验证转由各 Integration 测试承担(Phase 13 复验)。原文"只是检查常量定义"的批评成立,但处置方式是**如实命名 + 转移**,而非硬塞行为断言 |
| P1-2 | PermissionMatrixTest 补自动化验证 | ✅ 已有 341 行 / 12 用例;权限覆盖另由 `V11PermissionMatrixContractTest`(**扫描全部迁移**)+ `OperatorEndpointPermissionCoverageTest` 承担 |
| P1-3 | 补全 Phase 23 系统测试完成报告 | ✅ `docs/Phase-23-V11-Recovery-Completion-Report-2026-09-18.md` 已存在(结论:**部分关闭**)。**注意原文指向的 `docs/Phase-23-Completion-Report.md` 从未存在** |
| P1-4 | 清理 CHANGELOG 重复内容 | ✅ **不成立**:`CHANGELOG.md` 实际 **4234 字节 / 73 行**,无重复条目问题;已加指向 `docs/V1_1_CHANGELOG.md` 的指针头注(2026-09-18) |
| P2-1 | AccountLifecycle 注销联动完善 | ✅ Phase 21 复验关闭(2026-09-18):**CLOSED 仍可登录、两处 TODO 桩、匿名化死代码、注销障碍设计矛盾**等 6 处缺陷已修 |
| P2-2 | PhotoService Presigned URL 实现 | ⚠️ **部分**:`PhotoService` 魔数校验恒失败、PDF 被误挡等已修(Phase 10 复验);`POST /me/photos/upload-token` / 下载凭证 / EXIF 清理的落地程度**待确认** |
| P2-3 | WebSocket 在线状态管理 | ✅ Phase 09 复验关闭(2026-09-16):下行链路死代码、握手鉴权、Unmatch 不联动会话等 4 处缺陷已修 |
---
### P0-2: 隐私政策最终版本确认
## 二、仍未完成(按优先级)
**问题**: Go/No-Go 检查单标注"待确认",为上线前绝对阻塞项。
### A. 阻塞 Phase 24(UAT)启动
**操作**:
1. 确认隐私政策文本(用户数据采集、存储、使用、共享、权利)
2. 确认用户协议文本
3. 将最终版本放入 `docs/legal/` 目录
4. 更新小程序登录页和设置页的协议链接
1. **Phase 23 剩余**:E2E 场景真实实现 + CI 串联 E2E —— 需「活栈供给方式」**基础设施决策**
(占位文件头已保留场景清单:首页 11 / 本地资格 11 / 互选 8 / 权限 10 / 预约 7 项)。
2. **管理端桌面端目视复验** —— 需**用户执行**。
3. **`docs/PENDING_DECISIONS.md` 13 项待决策** —— 需产品确认。
> 在 A 组完成前,**不应宣布「失败为零可进入 UAT」**(Phase 23 Gate 要求端到端链路被真实执行)。
### B. 上线前(运维 / 产品,需人工)
- **P0-4** 微信小程序审核提交(人工)。
- **P0-5** SSL 证书申请与 DNS 配置(人工)。
- **Phase 22 Deployment / Ops 口径 5 项未复验**:删除镜像跳过测试的发布路径、生产关 Mock WeChat/演示 Seed/Debug/Swagger、
端口与依赖检测、**备份加密 + 真实恢复演练**、Rollback 目标明确。
⚠️ 该 Phase 与 `STATUS.md` 所述「Phase 22 部署运维配置扩展(Feature Flag)」**是两份不同工作**。
- **Phase 25 运营素材**(真实 Banner/站点/咨询/课堂/反诈内容,不 Seed 假数据)、**Phase 26 上线前 13 项 smoke**。
### C. 代码级遗留(不阻塞 UAT,但需清偿)
- **Phase 21**:① 红娘服务进行中拦截**硬编码 `0`** —— 根因是数据模型**没有 `matchmaker_services` 表**,
拦截项在设计上无法落地(建表属扩权,待产品确认存储模型);② `getPrivacySettings` / `updatePrivacySettings` 仍是 TODO 桩。
- **Phase 22**:T01~T05 五个模块开关 + T07 私有桶为**死配置**(配置暴露但从未被业务读取)。
- **任务级 ⏳**:P16-T13(互选超时接线)、P13A-T31(随访审计)、P13A-T33(`RiskEvent source=counseling`)、
P04-T10(Onboarding 本地资格步骤)。
---
### P0-3: PIA(隐私影响评估)书面记录
## 三、原编号索引(便于对照历史引用)
**问题**: 9个场景需要书面记录,当前无记录。
**操作**:
1. 按以下场景撰写PIA记录:
- 实名认证(身份证采集)
- 照片存储与展示
- 位置/地区信息
- 聊天消息存储
- 活动报名数据
- 红娘服务数据
- 举报与风控数据
- 账号注销与数据删除
- 跨组织数据访问
2. 保存到 `docs/security/PIA.md`
| 原编号 | 原文标题 | 本文件位置 |
|---|---|---|
| P0-1 | 产品确认 16 项技术默认值 | 一、已关闭 |
| P0-2 | 隐私政策最终版本确认 | 一、已关闭(待法务终审) |
| P0-3 | PIA 书面记录 | 一、已关闭 |
| P0-4 | 提交微信小程序审核 | 二、B |
| P0-5 | SSL 证书申请与 DNS 配置 | 二、B |
| P1-1 | CoreInvariantsTest 补充实质性测试 | 一、已关闭 |
| P1-2 | PermissionMatrixTest 补充自动化验证 | 一、已关闭 |
| P1-3 | 补全 Phase 23 系统测试完成报告 | 一、已关闭 |
| P1-4 | 清理 CHANGELOG.md 重复内容 | 一、已关闭(原描述不成立) |
| P2-1 | AccountLifecycle 注销联动完善 | 一、已关闭 |
| P2-2 | PhotoService Presigned URL 实现 | 一、部分 |
| P2-3 | WebSocket 在线状态管理 | 一、已关闭 |
---
### P0-4: 提交微信小程序审核
## 四、验收标准(更新)
**问题**: 用户端核心入口,无审核通过的小程序无法服务用户。
**操作**:
1. 在微信公众平台提交小程序审核
2. 确保所有页面符合微信小程序审核规范
3. 配置好 `app.json` 中的类目和标签
4. 准备好隐私政策链接(见 P0-2)
| 项目 | 验收条件 | 状态 |
|---|---|---|
| P0-1 | 16 项全部产品确认,配置正确,文档更新 | ✅ 已完成 |
| P0-2 | 隐私政策文本在 `docs/legal/` 中,链接正确 | ✅ 文件已就位(待终审确认) |
| P0-3 | `PIA.md` 存在,覆盖全部 9 个场景 | ✅ 文件已就位 |
| P1-1 | CoreInvariantsTest 用例如实命名;真实行为由 Integration 测试覆盖 | ✅ 已如实处置 |
| P1-2 | 权限矩阵 9×18 覆盖,实际调用验证 | ✅ 由契约守卫承担 |
| P1-3 | Phase 23 完成报告存在且内容完整 | ✅ 已存在(部分关闭) |
| P1-4 | `CHANGELOG.md` < 100KB,无重复条目 | ✅ 已满足(4.2KB) |
| P0-4 | 微信审核提交并通过 | ⬜ 待人工 |
| P0-5 | HTTPS 正常,证书有效 | ⬜ 待人工 |
| Phase 23 剩余 | E2E 场景实现 + CI 串联 | ⬜ 待决策 |
| Phase 24 | UAT 分角色验收,阻断缺陷为零 | ⬜ 待用户确认启动 |
---
### P0-5: SSL证书申请与DNS配置
**问题**: 生产HTTPS必需。
**操作**:
1. 申请SSL证书(Let's Encrypt 或商业证书)
2. 配置生产域名 DNS 解析(`match.danyang.gov.cn` 或约定域名)
3. 将证书放入 `infrastructure/certs/`
4. 验证 `nginx-production.conf` 中的证书路径
---
## P1 — 上线前应该完成(重要)
### P1-1: CoreInvariantsTest 补充实质性测试
**文件**: `backend/src/test/java/com/danyang/match/platform/invariants/CoreInvariantsTest.java`
**问题**: 当前测试只是检查常量定义,不是真正的业务逻辑验证。
**需要实现**(每个不变量需要真实业务逻辑测试):
```java
// INV-001: Required不可自动放宽
@Test
void testRequiredConditionNotRelaxed() {
// 创建用户A(要求对方学历=本科)和用户B(学历=专科)
// B进入A的推荐池 → 应该被Required条件过滤
// 验证B不在推荐结果中
}
// INV-002: 未Mutual不可聊天
@Test
void testCannotMessageWithoutMutual() {
// 用户A Like用户B,但B未Like A
// 调用发送消息接口 → 应返回403/禁止
}
// INV-003: Block优先级最高
@Test
void testBlockStopsAllInteractions() {
// A Block B后
// 验证B不在A的推荐中
// 验证A Like B后自动取消
// 验证A和B的Match自动解除
}
// INV-004: 双向并发Like只创建一个Match
@Test
void testConcurrentLikeCreatesOneMatch() {
// 线程A: A Like B
// 线程B: B Like A(并发)
// 验证只创建1个Match记录
}
// INV-005: 活动名额不超卖
@Test
void testActivityCapacityNotOversold() {
// 活动剩余1个名额
// 线程A和线程B同时报名
// 验证只有1人成功,1人被拒绝
}
// INV-006: 单向活动意向不泄露
@Test
void testActivityInterestNotDisclosed() {
// A选择B,但B没选A
// 验证B的查询结果中看不到A的选择
}
// INV-007: 红娘不能替用户Like
@Test
void testMatchmakerCannotLikeForUser() {
// 红娘角色调用Like接口 → 应返回403
}
// INV-008: 非授权Operator不能读取身份证
@Test
void testUnauthorizedOperatorCannotViewIdCard() {
// reviewer角色调用敏感身份查看接口 → 应返回403
}
// INV-009: 非案件上下文不能读取聊天
@Test
void testNoChatAccessOutsideCaseContext() {
// risk_operator无案件授权调用聊天记录 → 应返回403
}
// INV-010: 跨Organization不能越权
@Test
void testCrossOrgCannotAccess() {
// Organization A的用户,不能访问Organization B的数据
}
```
**注意**: 测试应使用真实数据库(集成测试模式),通过 `@SpringBootTest` + Testcontainers 或指定测试数据库。
---
### P1-2: PermissionMatrixTest 补充自动化验证
**文件**: `backend/src/test/java/com/danyang/match/platform/invariants/PermissionMatrixTest.java`
**问题**: 当前只有权限矩阵定义,没有实际API调用验证。
**需要实现**:
```java
@Test
void testPermissionMatrixAllRoles() {
// 遍历9个角色 × 18个权限
// 每个组合:
// 有权限 → 调用对应API → 应返回2xx
// 无权限 → 调用对应API → 应返回403
}
// 需要验证的角色:
// super_admin, platform_admin, organization_admin,
// reviewer, matchmaker, activity_manager,
// risk_operator, volunteer, data_viewer
// 需要验证的权限模块:
// user.view, user.sensitive.view, user.status.change,
// review.view, review.process,
// matchmaker.view, matchmaker.assign, matchmaker.service,
// activity.view, activity.create, activity.review_registration,
// risk.report.view, risk.report.process, risk.user.ban,
// organization.manage, permission.manage,
// analytics.view, data.export
```
**验证方式**: 通过 `MockMvc` 或 `RestAssured` 调用管理端API,使用不同角色的JWT Token认证。
---
### P1-3: 补全 Phase 23 系统测试完成报告
**文件**: `docs/Phase-23-Completion-Report.md`
**问题**: Phase 23(系统测试)缺少完成报告。
**需要包含**:
- 执行的测试类型和数量
- 测试结果(通过/失败/阻塞)
- 安全测试结果(SQL注入/XSS/CSRF等)
- 并发测试结果
- 发现的问题和修复情况
---
### P1-4: 清理 CHANGELOG.md 重复内容
**文件**: `CHANGELOG.md`
**问题**: 文件大小3.3MB,存在大量重复条目(同一个Phase变更被复制数十次)。
**操作**:
1. 去重,保留每项变更的唯一记录
2. 按版本(v1.0.0-rc.1, v1.0.0)组织
3. 文件压缩到合理大小(目标 < 100KB)
---
## P2 — 建议完成(非阻塞)
### P2-1: AccountLifecycle 注销联动完善
**现状**: 代码已实现,STATUS.md 标记为TODO。
**验证**: 确认注销后以下联动正确:
- 推荐停止
- 聊天停止(新消息禁止)
- 红娘服务停止
- 活动处理(未开始的按规则)
- 历史关系保留但标记为已注销
---
### P2-2: PhotoService Presigned URL 实现
**现状**: 代码骨架存在,功能未完整实现。
**需要完成**:
- `PhotoService` 生成 MinIO Presigned URL
- 上传凭证接口 `POST /me/photos/upload-token`
- 下载凭证接口(私有图片访问)
- EXIF信息清理逻辑
---
### P2-3: WebSocket 在线状态管理
**现状**: 骨架实现。
**需要完善**:
- 用户在线/离线状态跟踪
- 消息送达状态(已发送/已读)
- WebSocket 重连后的状态恢复
- 通知推送(`notification.new` 事件)
---
## 执行顺序建议
```
1. P0-1 (产品确认) → 产品负责人
2. P0-2 (隐私政策) → 产品/法务
3. P0-3 (PIA记录) → 安全负责人
4. P1-1 (Invariants测试) → 研发
5. P1-2 (权限矩阵测试) → 研发
6. P1-3 (Phase23报告) → 研发
7. P1-4 (CHANGELOG) → 研发
8. P0-4 (微信审核) → 产品
9. P0-5 (SSL/DNS) → 运维
10. P2-1 ~ P2-3 → 研发(可并行)
```
---
## 验收标准
每项完成后应满足:
| 项目 | 验收条件 |
|---|---|
| P0-1 | 16项全部产品确认,配置正确,文档更新 |
| P0-2 | 隐私政策文本在 `docs/legal/` 中,链接正确 |
| P0-3 | PIA.md 存在,覆盖全部9个场景 |
| P1-1 | CoreInvariantsTest 10个用例全部包含真实业务逻辑 |
| P1-2 | PermissionMatrixTest 9×18全部覆盖,实际调用验证 |
| P1-3 | Phase-23-Completion-Report.md 存在且内容完整 |
| P1-4 | CHANGELOG.md < 100KB,无重复条目 |
| P0-4 | 微信审核提交并通过 |
| P0-5 | HTTPS正常,证书有效 |
---
*最后更新: 2026-09-01*
*最后更新: 2026-09-18 — 按实测重写(原文 2026-09-01,含 3 处与实际不符的陈述)*
+7 -7
View File
@@ -219,16 +219,16 @@
| EPIC-P12-V11 | P12 | 关系状态轻量扩展 | P1 | ✅
| EPIC-P13-V11 | P13 | 红娘服务转介扩展 | P1 | ✅
| EPIC-P13A | P13A | 公益婚恋咨询与婚前辅导 | P1 | ✅
| EPIC-P14-V11 | P14 | 多类型公益活动 | P1 |
| EPIC-P15-V11 | P15 | 活动签到回归测试 | P1 |
| EPIC-P14-V11 | P14 | 多类型公益活动 | P1 | ✅
| EPIC-P15-V11 | P15 | 活动签到回归测试 | P1 | ✅
| EPIC-P16-V11 | P16 | 活动互选二阶段同意重构 | P0 | ✅
| EPIC-P17-V11 | P17 | 公益服务风险来源扩展 | P0 | ✅
| EPIC-P18-V11 | P18 | 申诉保持 | P1 | ✅
| EPIC-P19-V11 | P19 | 善缘丹阳综合运营后台 | P1 |
| EPIC-P20-V11 | P20 | 公益项目数据统计扩展 | P1 |
| EPIC-P21-V11 | P21 | 账户生命周期增量 | P1 |
| EPIC-P22-V11 | P22 | 部署运维配置扩展 | P1 |
| EPIC-P23-V11 | P23 | V1.1专项测试 | P0 |
| EPIC-P19-V11 | P19 | 善缘丹阳综合运营后台 | P1 | ✅
| EPIC-P20-V11 | P20 | 公益项目数据统计扩展 | P1 | ✅
| EPIC-P21-V11 | P21 | 账户生命周期增量 | P1 | ✅
| EPIC-P22-V11 | P22 | 部署运维配置扩展 | P1 | ✅
| EPIC-P23-V11 | P23 | V1.1专项测试 | P0 | ✅(部分关闭:E2E 场景实现与 CI 串联列为遗留)
| EPIC-P24-V11 | P24 | UAT增量 | P1 |
| EPIC-P25-V11 | P25 | RC内容检查 | P1 |
| EPIC-P26-V11 | P26 | Production初始化 | P1 |
+37 -13
View File
@@ -84,20 +84,44 @@
---
## V1.1 历史部署声明(当前待复验)
## V1.1 历史部署声明(复验处置结果,2026-09-18 回写)
以下记录只说明相关代码、配置或迁移曾被创建。重新审查已发现部分声明与实际运行不一致,因此在对应 Phase 重新通过前不得称为“已上线”:
以下记录只说明相关代码、配置或迁移曾被创建。重新审查曾发现部分声明与实际运行不一致,故在对应 Phase 重新通过前不得称为“已上线”。
| 决策项 | 确认值 | 状态 |
> **2026-09-18 文档治理**:按各 Phase Recovery 报告的实测证据回写处置结果 ——「待 Phase XX 复验」不得长期停留为悬空状态。
| 决策项 | 确认值 | 处置结果(2026-09-18 回写) |
|--------|--------|------|
| 首页8核心入口固定顺序 | 找对象/公益红娘/公益活动/婚恋咨询/婚恋课堂/婚前辅导/婚恋反诈/善缘服务站 | 待 Phase 07 复验 |
| Banner仅内部跳转 | target_type CHECK约束已生效 | 待 Phase 07/19 复验 |
| 活动互选二阶段同意 | 互选→双方确认→Match/Conversation | 已发现闭环缺失,待 Phase 16 修复 |
| Counselor只能访问Assigned Service | Assigned DataScope | 已发现接口绕过风险,待 Phase 02/13A 修复 |
| ContentEditor零用户数据权限 | 默认无user.view权限 | 待 Phase 02 负向测试 |
| ServiceStationOperator数据范围 | 仅服务站相关操作 | 已发现越权风险,待 Phase 02/19 修复 |
| 本地资格与实名认证分离 | 独立表、独立流程 | 数据结构存在,待 Phase 04/05 复验 |
| 运营商密码登录 | 凭证由本地环境变量或安全 Seed 提供 | 不在文档保存密码 |
| Feature Flags灰度控制 | 配置项存在 | 待 Phase 07/22 验证实际联动 |
| V1.1仪表盘 | 统计接口存在 | 已发现权限和口径风险,待 Phase 20 修复 |
| 首页8核心入口固定顺序 | 找对象/公益红娘/公益活动/婚恋咨询/婚恋课堂/婚前辅导/婚恋反诈/善缘服务站 | ✅ 已关闭(Phase 07 业务复验 2026-09-13;UI 首批 11 页 2026-09-16 通过用户验收) |
| Banner仅内部跳转 | target_type CHECK约束已生效 | ✅ 已关闭(Phase 19 复验 2026-09-17;外链校验 + 软删过滤已修) |
| 活动互选二阶段同意 | 互选→双方确认→Match/Conversation | ✅ 已关闭(Phase 16 复验 2026-09-17;**原「双确认后根本不建 Match/会话」Gate 缺陷已修**) |
| Counselor只能访问Assigned Service | Assigned DataScope | ✅ 已关闭(Phase 13A 复验 2026-09-17;INV-012 守卫 + 权限矩阵守卫) |
| ContentEditor零用户数据权限 | 默认无user.view权限 | ✅ 已关闭(权限矩阵守卫由硬编码改为**扫描全部迁移**,消除后续迁移权限变更隐形) |
| ServiceStationOperator数据范围 | 仅服务站相关操作 | ✅ 已关闭(Phase 19 复验 2026-09-17;**原类级 `view` 兜底致越权写已修**,权限下沉方法级并纳入覆盖守卫) |
| 本地资格与实名认证分离 | 独立表、独立流程 | ✅ 已关闭(Phase 04/05 复验 2026-09-12) |
| 运营商密码登录 | 凭证由本地环境变量或安全 Seed 提供 | ✅ 纪律项(非待办):不在文档保存密码,继续由环境变量/安全 Seed 提供 |
| Feature Flags灰度控制 | 配置项存在 | ⚠️ **部分关闭**(Phase 22 复验 2026-09-18):`FeatureFlagController` 的 2 处真实缺陷已修;但 **T01~T05 与 T07 为「死配置」——配置暴露但从未被业务读取**,已如实降级登记,交各模块 Phase 处理 |
| V1.1仪表盘 | 统计接口存在 | ✅ 已关闭(Phase 20 复验 2026-09-17;**D12 口径造假/死代码/系统性软删过滤修复 45 处**) |
---
## 第三方开放 / 平台化遗留待决策项(2026-09-18 补登)
> 来源:`docs/HTTP语义检修报告-2026-09-18.md` 第六节「遗留:真正开放第三方还需要什么」+
> `docs/幂等键检修报告-2026-09-18.md` 第七节「遗留与需要留意」。
> 均属**范围扩张**,需产品决策 —— 本轮及此前检修均**未擅自实施**。
| 决策项 | 现状(已就位部分) | 待确认 |
|---|---|---|
| 第三方凭据机制 | 目前只有微信登录与运营账号登录;第三方**无标准途径获取 token** | 是否定义 API Key / OAuth Client Credentials,及其**权限范围与配额** |
| 限流是否真实生效 | `RATE_LIMITED` 业务码与 429 映射已就位 | 限流本身**是否启用、阈值多少**(本轮未验证) |
| OpenAPI 文档对外发布 | `OpenApiConfig` 已存在 | 是否对外开放、**开放哪些端点** |
| `POST /activities/{id}/interests` 语义 | `API_INVENTORY` 曾承诺、后端**从未实现**;已更正文档并删除指向 404 的前端死代码 | 该端点**是否需要在 V1.1 内真正实现**(涉及活动意向的产品语义) |
| 第三方调用审计与配额计量 | 内部角色的敏感访问审计已就位(Phase 17) | 第三方需**独立的调用审计与配额计量** |
| 敏感字段脱敏边界(第三方场景) | INV-011 等约束面向内部角色 | 第三方场景需**重新界定**脱敏边界 |
| 幂等键 TTL 语义 | `idempotency_records` 有 TTL(默认 86400s)+ `idx_idempotency_expires` 清理扫描 | 需知悉:**清理后同一把键会被当作新操作** —— 幂等保证的是「短时间内不重复」,**不是「永久去重」**(永久去重仍由业务层唯一约束承担)。若开放第三方,需决定**键的 TTL 是否按调用方分级** |
---
*最后更新: 2026-09-18 — 历史部署声明 10 项已按各 Phase 复验证据回写处置结果;新增第三方开放遗留 7 项待决策*
+30 -76
View File
@@ -1,8 +1,8 @@
# 项目状态跟踪 — STATUS.md
> **2026-09-17 当前有效结论:`V1.1 INCREMENTAL RECOVERY PHASE 20 COMPLETE / UI REDESIGN ACCEPTED BY USER / GIT CLEAN`。**
> **2026-09-18 当前有效结论:`V1.1 RECOVERY PHASE 01~22 CLOSED / PHASE 23 PARTIALLY CLOSED / HORIZONTAL HARDENING DONE (HTTP SEMANTICS + IDEMPOTENCY + PORT/ENTRY GUARDS) / UI REDESIGN ACCEPTED BY USER / 669 TESTS GREEN / STOPPED BEFORE PHASE 24 (UAT) — AWAITING USER GO`。**
>
> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**、核心 11 页面**全部 TS-only(11/11)**。**UI 重设计首批 11 页已于 2026-09-16 通过用户验收(结论:基本达标)**;`/me/*` 前后端契约同轮收敛,17 个 404 调用已恢复。**Phase 08(Like / Match / Block)、Phase 09(Text Chat)、Phase 10(Image & Chat Safety)、Phase 11(Notification)、Phase 12(Relationship Progress)、Phase 13(公益红娘转介)、Phase 13A(婚恋咨询与婚前辅导)、Phase 14(多类型公益活动)、Phase 15(活动报名、审核与签到)、Phase 16(活动互选与双方开启沟通确认)、Phase 17(举报与风控)、Phase 18(申诉)、Phase 19(统一运营后台 + 用户端公益服务页面)、Phase 20(Analytics 数据统计与管理驾驶舱)复验已关闭**,十四轮共修复 130+ 处真实缺陷(含 3 处隐藏编译缺陷),并各自补齐测试保真度与守卫。**Phase 21、22 复验已关闭(2026-09-18)**;**Phase 23 为「部分关闭」(2026-09-18)** —— 已清除 44 个 `pass` 空壳与 14 个只断言常量的假不变量测试,新增 4 个经负向注入验证的真实行为守卫与空壳阻断闸门,后端回归 655 全绿;但 **E2E 进入 CI 因需「活栈供给方式」基础设施决策而列为遗留,故不宣布「失败为零可进入 UAT」**。**Phase 24 起需用户确认后启动。**
> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**、核心 11 页面**全部 TS-only(11/11)**。**UI 重设计首批 11 页已于 2026-09-16 通过用户验收(结论:基本达标)**;`/me/*` 前后端契约同轮收敛,17 个 404 调用已恢复。**Phase 08(Like / Match / Block)、Phase 09(Text Chat)、Phase 10(Image & Chat Safety)、Phase 11(Notification)、Phase 12(Relationship Progress)、Phase 13(公益红娘转介)、Phase 13A(婚恋咨询与婚前辅导)、Phase 14(多类型公益活动)、Phase 15(活动报名、审核与签到)、Phase 16(活动互选与双方开启沟通确认)、Phase 17(举报与风控)、Phase 18(申诉)、Phase 19(统一运营后台 + 用户端公益服务页面)、Phase 20(Analytics 数据统计与管理驾驶舱)复验已关闭**,十四轮共修复 130+ 处真实缺陷(含 3 处隐藏编译缺陷),并各自补齐测试保真度与守卫。**Phase 21、22 复验已关闭(2026-09-18)**;**Phase 23 为「部分关闭」(2026-09-18)** —— 已清除 44 个 `pass` 空壳与 14 个只断言常量的假不变量测试,新增 4 个经负向注入验证的真实行为守卫与空壳阻断闸门,后端回归 655 全绿;但 **E2E 进入 CI 因需「活栈供给方式」基础设施决策而列为遗留,故不宣布「失败为零可进入 UAT」**。**Phase 23B(E2E 测试基建重建,33→49 passed)、HTTP 语义检修(失败响应携带真实状态码)、幂等键检修(`Idempotency-Key` 30 端点落地,V045/V046)均已于 2026-09-18 完成**,后端全量回归 **669 / 0 failures / 0 errors / 3 skipped**。**管理端入口已收敛到 `/admin/` 子路径(vite base + router base + 三处 nginx 接线),staging 端口 13521;UI 契约门禁 14/14 全绿。Phase 24(UAT)启动需用户确认。**
最后更新: 2026-09-18 — 分支 `main`(`feat-ui-v11` 保留为冗余锚点)
@@ -30,7 +30,11 @@
| UI 契约测试 | **13/13 通过** | 2026-09-16 运行:全部退出码 0;含 capability 独立化适配与文档基线口径 |
| Git 工作区 | **已清零** | 阶段 0~4 共 24+ commit 可追溯;`git status --porcelain` 0 行 |
| 核心待清债务 | 0 项 | 已全部清偿:3 页 JS→TS 迁移、backend 全量回归(420 tests)、DevTools 真机截图留档(2026-09-14)、`/me/*` 路径族收敛(2026-09-16)、实体↔生产迁移漂移修复(V037/V038/V039,2026-09-16/17) |
| UAT / RC / Production | **UI 验收通过,前后端契约已收敛,Phase 08-13 已关闭** | 双端构建/契约/源码全部通过;UI 首批 11 页 2026-09-16 通过用户验收;`/me/*` 契约同轮收敛;Phase 08/09/10/11/12/13 复验通过并关闭,累计修复 23 处真实缺陷,可推进 Phase 13A(**需用户确认后启动**) |
| UAT / RC / Production | **Phase 01~22 复验关闭;Phase 23 部分关闭;停在 Phase 24(UAT)门前** | 后端 **669 / 0 failures / 0 errors / 3 skipped**;UI 契约门禁 **14/14**;管理端入口收敛至 `/admin/` 子路径(staging 13521);HTTP 语义 + 身份收敛 + 幂等键三轮横向加固完成。**Phase 24 启动需用户确认** |
> **下一阶段计划(唯一)**:`docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md`
> —— 批 1 快速收尾(ui-tests 接入 CI)/ 批 2 Phase 23 剩余(E2E 实现 + CI 串联,**需基础设施决策**)/
> 批 3 代码级遗留清偿 / 批 4 UAT 就绪(**需用户协作**)/ 批 5 Phase 25-26 前置登记。
---
@@ -48,6 +52,12 @@
| 1.1.0-rc.8 | 2026-09-17 | Phase 16 复验关闭(活动互选与双方开启沟通确认,7 处缺陷 + 1 处隐藏编译缺陷 + 1 处测试保真度:含**双确认后根本不建 Match/会话(Gate 缺陷)**、**Phase 15 提交态引用未定义 `reopenEpisode` 致模块不编译("474 绿"为假象)**、**INV-006 单向意向泄露**、**复用/新建 Match 后缺会话**;统一双实现到 `RelationshipService.confirmActivityInterest`;新增 V041 `expires_at`+`match_id`;新建 `ActivityMutualConsentServiceTest`(7 用例);全量回归 **481 tests** 全绿 |
| 1.1.0-rc.9 | 2026-09-17 | Phase 17 复验关闭(举报与风控,6 处真实缺陷:含**D1 测试库缺 reports/risk_events/risk_actions 三表致风控/举报真实 DB 路径零覆盖(必崩级盲区)+ ReportServiceTest 假绿**、**D3 敏感访问(查看他人风险画像/举报)无审计(AGENTS.md #8)**、**D4 审计缺 ip/userAgent**、**D5 findByUserId 未过滤软删**、**D2 人工标记无审计**、**D6 javax→jakarta 隐藏编译缺陷 + risk_events 漏 updated_at**);补齐三表并移出白名单入 REQUIRED_IN_TEST_SCHEMA;新增 `AuditLogService.recordSensitiveAccess` 并接线三端点;新增 `ReportAndRiskPhase17IntegrationTest`(7 用例);全量回归 **488 tests** 全绿 |
| 1.1.0-rc.10 | 2026-09-17 | Phase 18 复验关闭(申诉,8 处真实缺陷:含**D1 测试库缺 appeals 表 + AppealServiceTest 6 处 assertTrue(true) 假绿 → 申诉真实 DB 路径零覆盖**、**D2 escalate 向 operator 发用户通知撞 notifications.user_id→users(id) FK → PG 上升级 100% 失败**、**D3 appealType 未校验生产 chk_appeal_type**、D4 escalated 死胡同、D5 processAppeal 先读后写并发竞态、D6 三处查询漏软删过滤、D7 硬编码 resolved、D8 证据字段契约 evidenceFileIds);补 appeals 表并移出白名单入 REQUIRED_IN_TEST_SCHEMA;新增原子认领 `markReviewingIfProcessable`;新增 `AppealPhase18IntegrationTest`(15 用例),删除假绿 `AppealServiceTest`(9 用例);全量回归 **494 tests** 全绿;admin-web `vue-tsc` EXITCODE=0 |
| 1.1.0-rc.11 | 2026-09-17 | Phase 19 复验关闭(统一运营后台 + 用户端公益服务页面,修复 25 处真实缺陷:服务站公告整条不可达、服务站越权写、Banner 500、Content 发布死路、ServiceProgram 审批死路等);新增 V042 `service_location_announcements`;全量回归 **602 tests** 全绿 |
| 1.1.0-rc.12 | 2026-09-17 | Phase 20 复验关闭(Analytics,口径造假 / 死代码 / 系统性软删缺陷 D12 修复 45 处 / 权限授予脱节);新增 V043 `analytics.view` 授权;指标字典 `docs/ANALYTICS_METRICS.md` + `MetricCatalogGuardTest`;全量回归 **648 tests** 全绿 |
| 1.1.0-rc.13 | 2026-09-18 | Phase 21 复验关闭(账户生命周期,6 处缺陷:CLOSED 可登录、注销 TODO 桩 ×2、匿名化死代码等)+ Phase 22 复验关闭(Feature Flag,D-22-A/B 修复;T01~T05 死配置如实登记);全量回归 **657 tests** 全绿 |
| 1.1.0-rc.14 | 2026-09-18 | Phase 23 **部分关闭**(44 个 `pass` 空壳清除、4 个真实 INV 行为守卫、空壳阻断闸门);Phase 23B E2E 基建重建(conftest + seed + CI e2e job,本机活栈 33 passed);全量回归 **655 tests** 全绿 |
| 1.1.0-rc.15 | 2026-09-18 | HTTP 语义检修(105 处错误响应携带真实状态码,回归 664)→ 身份收敛(运营身份禁入用户端 + PathPattern 守卫)→ 幂等键检修(`Idempotency-Key` 30 端点落地,V045/V046,前端 25 处调用点修正,E2E 49 passed);admin 端口收敛 13520(vite / 文档 / 生产 compose 三处一致);全量回归 **669 / 0 / 0 / 3** 全绿 |
| 1.1.0-rc.16 | 2026-09-18 | 管理端入口收敛(承接 rc.15 的端口收敛):staging admin 端口 3001 → **13521**(保持「生产 + 1」,同步 `run-uat.sh` 默认入口);管理端产物改为 **`/admin/` 子路径部署**(vite 构建 base + router history base + 三处 nginx 接线统一为「不剥离前缀」转发);**修复生产 nginx `/admin/` 的假成功**——原 `alias` 指向 `nginx:alpine` 自带默认页目录,访问返回 200 + nginx 欢迎页(比 404 更难发现),已改为 `upstream admin_web` + `proxy_pass` 并以真实两跳容器实测;补修 `run-uat.sh` 被截断的尾部(原文件语法不完整、无法运行)并把 `ADMIN_URL` 接到管理端可达性实测;品牌资源引用统一走 `src/brand.ts` 的 `BASE_URL` 拼接(原 5 处写死根路径,子路径下会裂图),favicon 由不存在的 `/favicon.svg` 改为存在的品牌标;UI 门控 **14/14 绿**,新增端口/入口断言 6 条(全部经负向注入验证) |
---
@@ -916,81 +926,25 @@ OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界
---
## V1.1 本地部署完成 (2026-09-09)
## V1.1 本地部署完成(2026-09-09,历史记录)
### 已修复的关键问题
1. **CounselingServiceApp 通知FK约束** — 新增UserMapper检查,operator用户跳过通知
2. **HomeController路径重复** — `/api/v1/home` → `/home`(与其他Controller一致)
3. **LocalEligibilityController路径重复** — `/api/v1/local-eligibility` → `/local-eligibility`
4. **数据库updated_at列缺失** — 为18个表补充ALTER COLUMN
> ⚠️ **历史记录边界**:本节为 2026-09-09 的部署时点记录,其中的测试声明(11/11、25/25、16/16)
> **已在后续重新审查中被推翻**,不作为验收证据。当前有效状态见文首「当前有效结论」。
> 本区块在原文件中重复出现三次(内容高度雷同),2026-09-18 文档治理合并为一处。
### 部署状态
- Backend: http://localhost:8085 ✅
- Admin Web: http://localhost:8086 ✅
- PostgreSQL: localhost:5434 ✅
- Redis: localhost:6381 ✅
- MinIO: localhost:9003 ✅
### 修复的关键问题
- **CounselingServiceApp 通知 FK 约束** — operator 用户不在 `users` 表,改为检查后再发送通知
- **HomeController 路径重复** — `@RequestMapping("/api/v1/home")` → `"/home"`
- **LocalEligibilityController 路径重复** — 同上修复
- **数据库 `updated_at` 列缺失** — 为 18 个 V1.1 表补充 `ALTER COLUMN`
- **前端** — `CounselingView` / `ContentManagementView` 截断、路由缺失、侧边栏菜单缺失
### 测试结果: 11/11 PASS
健康检查、首页聚合、内容管理、服务预约、咨询创建、转介服务、V1.1仪表盘、Feature Flags、文章发布、活动列表、Admin Web
### 运营阶段遗留
- Phase 24: UAT(需真实用户)
- Phase 25: RC内容检查(需运营数据)
- Phase 26: Production Smoke Tests(13项手动验证)
---
## V1.1 本地部署完成 (2026-09-09)
### 修复的关键Bug
1. **CounselingServiceApp 通知FK约束** — operator用户不在users表,修复为检查后再发送通知
2. **HomeController路径重复** — @RequestMapping("/api/v1/home") → "/home"
3. **LocalEligibilityController路径重复** — 同上修复
4. **数据库updated_at列缺失** — 为18个V1.1表补充ALTER COLUMN
### 部署架构
### 历史测试声明: 25/25 PASS(已失效,待可信测试重建)
- 20个API端点全部正常
- 3个业务操作(咨询创建/转介/文章)全部正常
- Admin Web前端正常访问
### 运营商登录凭证
不在文档保存账号密码。开发/测试凭证由本地环境变量或安全 Seed 提供。
### 下一步: Phase 24-26 (UAT/RC/Production)
- Phase 24: UAT — 需要真实用户参与测试
- Phase 25: RC内容检查 — 运营团队填充真实内容
- Phase 26: Production Smoke Tests — 13项手动验证
---
## V1.1 本地部署完成 (2026-09-09)
### 修复的Bug (10项)
- 后端: 咨询通知FK约束、HomeController路径重复、LocalEligibility路径重复、服务预约userId获取
- 数据库: 18张表补充updated_at列
- 前端: CounselingView/ContentManagementView截断、路由缺失、侧边栏菜单缺失
### 历史测试结果(重新审查后失效)
- E2E 的 16/16 记录不能复现,测试文件存在大量空 `pass`。
### 为什么这些声明被推翻(保留为治理证据)
- E2E 的「16/16」记录**不可复现**,测试文件存在大量空 `pass` —— 这是 Phase 23「可信系统测试重建」的直接起因。
- API 人工测试未证明 Permission、DataScope 和业务闭环,不能作为上线依据。
- 「25/25 PASS」「11/11 PASS」均为当时自报,未附可复现命令与失败处理。
### 运行中的服务
| 服务 | 地址 | 状态 |
|------|------|------|
| 后端API | http://localhost:8085/api/v1 | UP |
| Admin Web | http://localhost:8086 | UP |
| PostgreSQL | localhost:5434 | Healthy |
| Redis | localhost:6381 | Healthy |
| MinIO | localhost:9003 | Healthy |
### 运营商账号
不在文档保存账号密码;使用本地环境变量或安全 Seed。
### 下一步: Phase 24-26 (需运营团队配合)
### 运营阶段遗留(至今不变)
- Phase 24: UAT — 需真实用户参与并确认启动
- Phase 25: RC 内容检查 — 需运营团队填充真实内容
- Phase 26: Production Smoke Tests — 13 项手动验证
+67 -34
View File
@@ -1,45 +1,78 @@
# 数据库迁移文件
# 数据库迁移清单 — MIGRATION_GUIDE.md
> **最后更新:2026-09-18** —— 原文仅列 **V001~V011**,实测 **46** 个迁移(最新 **V046**),本轮按实测重写。
>
> ⚠️ **权威来源**:`backend/src/main/resources/db/migration/`。本文件为**索引**,不一致时以迁移文件为准。
> 生产由 Flyway 驱动;**已发布的迁移只向前修复,不修改**(Phase 22 Gate 明确要求)。
> 相邻文档:`TABLE_INVENTORY.md`(表清单)、`docs/善缘丹阳 V1.1 数据库与API增量设计.md`(V1.1 增量设计)。
## 迁移命名规范
```
V{版本号}__{描述}.sql
V{三位版本号}__{描述}.sql
```
示例:
- `V001__init_base_tables.sql` — 初始化基础表
- `V002__add_profiles.sql` — 添加资料表
- `V003__add_review_tables.sql` — 添加审核表
- `V004__add_match_tables.sql` — 添加匹配表
- `V005__add_relationship_tables.sql` — 添加关系表
- `V006__add_messaging_tables.sql` — 添加聊天表
- `V007__add_activity_tables.sql` — 添加活动表
- `V008__add_matchmaker_tables.sql` — 添加红娘表
- `V009__add_risk_tables.sql` — 添加风控表
- `V010__add_notification_tables.sql` — 添加通知表
- `V011__add_analytics_tables.sql` — 添加统计表
## 迁移清单(V001~V046,共 46 个)
## 当前迁移
| 版本 | 文件 | 建表 | 说明 |
|---|---|---|---|
| V001 | `V001__init_base_tables.sql` | 11 | 基础表:users / organizations / operators / roles / permissions / role_permissions / operator_roles / audit_logs / sensitive_access_logs / system_configs / interest_dictionary + 初始化数据 |
| V002 | `V002__add_user_and_verification_tables.sql` | 7 | 用户资料 / 偏好 / 兴趣 / 照片 / 隐私设置 / 实名认证 / 同意记录 |
| V003 | `V003__add_review_and_relation_tables.sql` | 6 | 审核任务 / 明细 / 原因字典 + 用户关系 / 匹配 / 成功牵手请求 |
| V004 | `V004__add_messaging_and_recommendation_tables.sql` | 5 | 会话 / 会话成员 / 消息 / 通知 / 推荐记录 |
| V005 | `V005__add_review_tables.sql` | — | 审核表补强(无建表) |
| V006 | `V006__add_match_tables.sql` | 1 | `match_rule_configs` + 初始化规则 |
| V007 | `V007__add_relationship_tables.sql` | — | 关系表补强(无建表) |
| V008 | `V008__add_messaging_tables.sql` | 3 | 消息类表补强(以 `IF NOT EXISTS` 形式,与 V004 同名表) |
| V009 | `V009__add_matchmaker_tables.sql` | 3 | 红娘服务 / 推荐 / 跟进 |
| V010 | `V010__add_activity_tables.sql` | 2 | 活动 / 活动报名 |
| V011 | `V011__add_activity_interests.sql` | 1 | 活动互选意向 |
| V012 | `V012__add_risk_and_report_tables.sql` | 3 | 举报 / 风险事件 / 风控处置 |
| V013 | `V013__add_appeals_table.sql` | 1 | 申诉 |
| V014 | `V014__add_consent_and_privacy_tables.sql` | — | 同意与隐私字段扩展 |
| V015 | `V015__add_v11_roles_and_permissions.sql` | — | **V1.1 角色与权限**(13 条 INSERT) |
| V016 | `V016__add_liveness_verification_fields.sql` | — | 活体核验字段 |
| V017 | `V017__add_local_eligibility_tables.sql` | 2 | 本地资格 / 佐证 |
| V018 | `V018__extend_review_for_local_eligibility.sql` | — | 审核扩展至本地资格 |
| V019 | `V019__add_home_banners_and_service_locations.sql` | 2 | 首页 Banner / 善缘服务站 |
| V020 | `V020__extend_notification_types.sql` | — | 通知类型扩展(对齐 `chk_notification_type` 短名白名单) |
| V021 | `V021__add_service_appointments_and_referral_fields.sql` | 1 | 服务预约 + 红娘转介字段 |
| V022 | `V022__add_counseling_services.sql` | 2 | 婚恋咨询 / 婚前辅导 + 随访 |
| V023 | `V023__extend_activities_v11.sql` | 2 | 活动 V1.1 扩展(名额分组 / 主办单位) |
| V024 | `V024__add_activity_mutual_connection_consents.sql` | 1 | **互选二阶段同意** |
| V025 | `V025__extend_risk_sources.sql` | — | 风险来源扩展 |
| V026 | `V026__add_content_and_program_tables.sql` | 5 | 内容分类 / 文章、服务项目 / 成员、组织关系 |
| V027 | `V027__seed_production_data.sql` | — | **生产基础数据种子**(3 条 INSERT) |
| V028 | `V028__add_service_location_operator_scope.sql` | 1 | 服务站人员数据范围 |
| V029 | `V029__complete_service_station_permissions.sql` | — | 服务站权限补全 |
| V030 | `V030__add_operator_soft_delete.sql` | — | 运营账号软删 |
| V031 | `V031__align_audit_log_base_fields.sql` | — | 审计日志基础字段对齐 |
| V032 | `V032__align_admin_soft_delete_columns.sql` | — | 管理端软删列对齐 |
| V033 | `V033__align_messaging_entity_base_fields.sql` | — | 消息实体基础字段对齐 |
| V034 | `V034__extend_sensitive_access_audit.sql` | — | 敏感访问审计扩展 |
| V035 | `V035__align_sensitive_access_base_fields.sql` | — | 敏感访问基础字段对齐 |
| V036 | `V036__add_notification_idempotency_index.sql` | — | 通知幂等 partial unique index |
| V037 | `V037__align_entity_columns_with_migrations.sql` | — | **实体↔迁移列对齐(23 处 ALTER)** |
| V038 | `V038__align_matchmaker_status_constraints.sql` | — | 红娘状态 CHECK 白名单扩展 |
| V039 | `V039__add_counseling_idempotency_and_status_guards.sql` | — | 咨询幂等键 + 三个 CHECK 白名单显式固化 |
| V040 | `V040__add_activity_staff_assignments.sql` | 1 | 活动工作人员分配 |
| V041 | `V041__extend_mutual_consent_expiry.sql` | — | 互选同意 `expires_at` + `match_id` |
| V042 | `V042__add_service_location_announcements.sql` | 1 | 服务站公告 |
| V043 | `V043__grant_analytics_view_to_data_roles.sql` | — | 授予 `data_viewer` / `platform_admin` 的 `analytics.view` |
| V044 | `V044__grant_all_permissions_to_super_admin.sql` | — | super_admin 全权限授予 |
| V045 | `V045__add_idempotency_records.sql` | 1 | **通用幂等表** + 唯一索引 `uk_idempotency_scope` |
| V046 | `V046__fix_idempotency_actor_id_type.sql` | — | 修正幂等表 `actor_id` 类型(VARCHAR → uuid) |
### V001__init_base_tables.sql(已完成)
- users 表
- organizations 表
- operators 表
- roles 表
- permissions 表
- role_permissions 表
- operator_roles 表
- audit_logs 表
- sensitive_access_logs 表
- system_configs 表
- interest_dictionary 表
- match_rule_configs 表(需 V002 补充)
- 初始化数据(角色、权限、兴趣字典、系统配置)
---
## 注意事项
1. 所有迁移文件必须幂等(用 IF NOT EXISTS)
2. 敏感字段存储加密值
3. 索引命名规范:`idx_{table}_{columns}`
4. 唯一约束命名规范:`uk_{table}_{columns}`
5. 外键约束命名规范:`fk_{table}_{column}`
1. 所有迁移文件必须幂等(`CREATE TABLE IF NOT EXISTS` / `ADD COLUMN IF NOT EXISTS` 等)。
2. 敏感字段存储加密值。
3. 命名规范:索引 `idx_{table}_{columns}`;唯一约束 `uk_{table}_{columns}`;外键 `fk_{table}_{column}`。
4. **已发布的迁移不得修改** —— 修正一律追加新版本(如 V046 修正 V045 的列类型)。Phase 22 Gate 明确「Flyway 只向前修复,不破坏 V001~V027」。
5. **文档与实际不一致时以迁移文件为准**:本文件曾长期停留在 V001~V011(实际 46 个);`TABLE_INVENTORY.md` 曾列 40 表(实际 59 张)。两处已于 2026-09-18 按实测重写。
---
*最后更新: 2026-09-18 — 由 V001~V011 重写为实测 V001~V046(46 个)*
+88 -41
View File
@@ -1,41 +1,88 @@
# 1. 用户账号表
## 2. 实名认证表
## 3. 用户资料表
## 4. 用户偏好表
## 5. 用户兴趣表
## 6. 用户照片表
## 7. 隐私设置表
## 8. 兴趣字典表
## 9. 审核任务表
## 10. 审核明细表
## 11. 审核原因字典表
## 12. 推荐记录表
## 13. 用户关系表
## 14. 匹配关系表
## 15. 成功牵手请求表
## 16. 会话表
## 17. 会话成员表
## 18. 消息表
## 19. 活动表
## 20. 活动报名表
## 21. 活动反馈表
## 22. 红娘服务表
## 23. 红娘推荐表
## 24. 红娘跟进表
## 25. 举报表
## 26. 举报证据表
## 27. 用户风险档案表
## 28. 风险事件表
## 29. 风控处置表
## 30. 申诉表
## 31. 通知表
## 32. 组织表
## 33. 操作员表
## 34. 角色表
## 35. 权限表
## 36. 角色权限关联表
## 37. 操作员角色关联表
## 38. 操作审计日志表
## 39. 敏感访问日志表
## 40. 系统配置表
## 41. 匹配规则配置表
# 数据表清单 — TABLE_INVENTORY.md
> **最后更新:2026-09-18** —— 原文列 **40** 表,实测 **59** 表 / **46** 个迁移,本轮按 `backend/src/main/resources/db/migration/` 重写。
>
> ⚠️ **权威来源**:`backend/src/main/resources/db/migration/*.sql`。
> 本文件只是**索引**;若与迁移文件不一致,**以迁移文件为准**(迁移是唯一可执行的真相)。
> 相邻文档:`MIGRATION_GUIDE.md`(迁移清单)、`docs/善缘丹阳 V1.1 数据库与API增量设计.md`(V1.1 增量设计)、`docs/ANALYTICS_METRICS.md`(统计口径)。
**统计**:建表语句 **59** 张(去重后);迁移文件 **46** 个(V001~V046)。
「来源」列 = **首次创建**该表的迁移;后续迁移对该表的 `ALTER` 不重复列出。
---
| # | 表名 | 域 | 说明 | 来源 |
|---|---|---|---|---|
| 1 | `users` | 基础 | 用户账号 | V001 |
| 2 | `organizations` | 基础 | 组织 | V001 |
| 3 | `operators` | 基础 | 运营人员 | V001 |
| 4 | `roles` | 权限 | 角色 | V001 |
| 5 | `permissions` | 权限 | 权限 | V001 |
| 6 | `role_permissions` | 权限 | 角色-权限关联 | V001 |
| 7 | `operator_roles` | 权限 | 运营-角色关联 | V001 |
| 8 | `audit_logs` | 审计 | 操作审计日志 | V001 |
| 9 | `sensitive_access_logs` | 审计 | 敏感访问日志 | V001 |
| 10 | `system_configs` | 基础 | 系统配置 | V001 |
| 11 | `interest_dictionary` | 基础 | 兴趣字典 | V001 |
| 12 | `user_profiles` | 资料 | 用户资料 | V002 |
| 13 | `user_preferences` | 资料 | 择偶偏好 | V002 |
| 14 | `user_interests` | 资料 | 用户兴趣 | V002 |
| 15 | `user_photos` | 资料 | 用户照片 | V002 |
| 16 | `user_privacy_settings` | 资料 | 隐私设置 | V002 |
| 17 | `user_identities` | 实名 | 实名认证 | V002 |
| 18 | `consent_records` | 合规 | 同意记录 | V002 |
| 19 | `review_tasks` | 审核 | 审核任务 | V003 |
| 20 | `review_items` | 审核 | 审核明细 | V003 |
| 21 | `review_reasons` | 审核 | 审核原因字典 | V003 |
| 22 | `user_relations` | 关系 | 用户关系(Like / Pass / Block) | V003 |
| 23 | `matches` | 关系 | 匹配关系(Match Episode) | V003 |
| 24 | `relationship_success_requests` | 关系 | 成功牵手请求 | V003 |
| 25 | `conversations` | 消息 | 会话 | V004 |
| 26 | `conversation_members` | 消息 | 会话成员 | V004 |
| 27 | `messages` | 消息 | 消息 | V004 |
| 28 | `notifications` | 消息 | 通知 | V004 |
| 29 | `recommendation_records` | 推荐 | 推荐记录 | V004 |
| 30 | `match_rule_configs` | 推荐 | 匹配规则配置 | V006 |
| 31 | `matchmaker_services` | 红娘 | 红娘服务 | V009 |
| 32 | `matchmaker_recommendations` | 红娘 | 红娘推荐 | V009 |
| 33 | `matchmaker_followups` | 红娘 | 红娘跟进 | V009 |
| 34 | `activities` | 活动 | 活动 | V010 |
| 35 | `activity_registrations` | 活动 | 活动报名 | V010 |
| 36 | `activity_interests` | 活动 | 活动互选意向 | V011 |
| 37 | `activity_capacity_groups` | 活动 | 活动名额分组(男女独立) | V023 |
| 38 | `activity_organizations` | 活动 | 活动主办单位 | V023 |
| 39 | `activity_mutual_connection_consents` | 活动 | **互选二阶段同意**(→ 双方确认 → Match) | V024 |
| 40 | `activity_staff_assignments` | 活动 | 活动工作人员分配 | V040 |
| 41 | `reports` | 风控 | 举报 | V012 |
| 42 | `risk_events` | 风控 | 风险事件 | V012 |
| 43 | `risk_actions` | 风控 | 风控处置 | V012 |
| 44 | `appeals` | 风控 | 申诉 | V013 |
| 45 | `user_local_eligibilities` | 资格 | 用户本地资格 | V017 |
| 46 | `local_eligibility_evidences` | 资格 | 本地资格佐证 | V017 |
| 47 | `home_banners` | 首页 | 首页 Banner | V019 |
| 48 | `service_locations` | 服务 | 善缘服务站 | V019 |
| 49 | `service_appointments` | 服务 | 服务预约 | V021 |
| 50 | `counseling_services` | 服务 | 婚恋咨询 / 婚前辅导 | V022 |
| 51 | `counseling_followups` | 服务 | 咨询随访 | V022 |
| 52 | `content_categories` | 内容 | 内容分类 | V026 |
| 53 | `content_articles` | 内容 | 内容文章(婚恋课堂 / 反诈) | V026 |
| 54 | `service_programs` | 服务 | 专项公益服务项目 | V026 |
| 55 | `service_program_members` | 服务 | 项目成员 | V026 |
| 56 | `organization_relationships` | 基础 | 组织关系(主办单位等) | V026 |
| 57 | `service_location_operators` | 服务 | 服务站人员数据范围 | V028 |
| 58 | `service_location_announcements` | 服务 | 服务站公告 | V042 |
| 59 | `idempotency_records` | 平台 | 通用幂等记录(+ 唯一索引 `uk_idempotency_scope`) | V045 |
---
## 与原文的差异(治理证据)
原文以 40 项**无表名**的中文编号列表记录(如「21. 活动反馈表」「26. 举报证据表」「27. 用户风险档案表」),
其中**多项在实际迁移中并不存在**(如活动反馈表、举报证据表),且缺少 V1.1 新增的 19 张表(Banner / 服务站 /
预约 / 咨询 / 内容 / 项目 / 本地资格 / 互选同意 / 幂等记录等)。
**结论**:以中文名枚举表清单会随实现漂移且无法机械核对 —— 这正是本轮改为「表名 + 来源迁移」并标注权威来源的原因。
---
*最后更新: 2026-09-18 — 由 40 表重写为实测 59 表 / 46 迁移*
@@ -10,6 +10,8 @@
**Spec:** `docs/善缘丹阳 V1.1 WorkBuddy最终主启动提示词(整合版).md`、`docs/superpowers/specs/2026-09-13-reference-driven-dual-client-ui-redesign-design.md`、`docs/善缘丹阳 V1.1 数据库与API增量设计.md`、`docs/善缘丹阳 V1.1 页面级功能清单与交互流程修订版.md`、`docs/善缘丹阳 V1.1 WorkBuddy 开发执行计划修订版.md`、`docs/善缘丹阳 V1.1 WorkBuddy-Jira 最终开发任务增量清单.md`。
**下一阶段计划(当前停点:Phase 23 收尾 → Phase 24 就绪):** `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` —— 批 1 快速收尾 / 批 2 Phase 23 剩余(E2E 实现 + CI 串联,**需基础设施决策**)/ 批 3 代码级遗留 / 批 4 UAT 就绪(**需用户协作**)/ 批 5 Phase 25-26 前置登记。
## Global Constraints
- 这六份客户修订文档共同构成 V1.1 需求基线,不能以其中一份覆盖其余文档的专业域要求。
@@ -165,9 +167,9 @@
**Gate:** 双方任一 Required 不满足时永不入选;前台不显示数字匹配率。
### Phase 07:V1.1 首页唯一实现 + 找对象 — 业务证据保留,UI REOPENED(2026-09-13)
### Phase 07:V1.1 首页唯一实现 + 找对象 — ✅ 已完成(业务证据保留,UI 于 2026-09-16 通过用户验收)
> 后端聚合、Capability、8 入口及推荐规则的专项证据保留;旧页面视觉已被用户否决。当前 UI 实施入口仅为 `docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`,不得按本节历史完成标记恢复旧设计。
> 后端聚合、Capability、8 入口及推荐规则的专项证据保留。2026-09-13 作出的「旧页面视觉已被用户否决 / UI REOPENED」判定,已由 UI 按 2026-09-13 规格重新实现并于 **2026-09-16 通过用户验收(结论:基本达标)** 而**关闭**;当前 UI 实施入口仍为 `docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`。
**Files:** `home/**`、banner 读取服务、`miniapp/pages/index/**`、`miniapp/pages/discover/**`、首页组件、`miniapp/app.json`、Design Token。
@@ -211,7 +213,7 @@
**Gate:** 未 Mutual 或活动未双确认时不能发消息;正常会话不重复投递。
### Phase 10:Image & Chat Safety — KEEP-VERIFY
### Phase 10:Image & Chat Safety — KEEP-VERIFY ✅ 已完成(2026-09-16 复验关闭)
**Files:** photo 模块、message safety、对象存储配置和聊天页面。
@@ -222,7 +224,7 @@
**Gate:** 越权图片访问被拒绝,敏感内容不进入普通日志。
(2026-09-16 复验通过:修复 D1 图片上传魔数校验死代码——本地资格佐证上传曾 100% 失败;D2 高风险词写入普通日志。水印未实现,登记 gap。)
### Phase 11:Notification — EXTEND
### Phase 11:Notification — EXTEND ✅ 已完成(2026-09-16 复验关闭)
**Files:** `notification/**`、预约/咨询/资格/活动服务及通知页面。
@@ -235,7 +237,7 @@
V036;D2——接线婚前辅导及管理端排期通知。`sendExternal` 在事务内执行的缺口已登记,接入真实微信 API 前须
改为提交后发送。真机文案 INV-010 达标。)
### Phase 12:Relationship Progress — KEEP-VERIFY/EXTEND
### Phase 12:Relationship Progress — KEEP-VERIFY/EXTEND ✅ 已完成(2026-09-16 复验关闭)
**Files:** relationship 状态服务、Match Episode、relationship-status 页面。
@@ -253,7 +255,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
「实体字段 ⊆ 生产迁移列」「测试库覆盖关键表」固化为自动守卫,并经负向验证证明会变红。
真机行为:双确认/并发确认/历史 Episode 不恢复旧聊天/非成员不可代确认 —— 14 项全绿。)
### Phase 13:公益红娘转介 — EXTEND
### Phase 13:公益红娘转介 — EXTEND ✅ 已完成(2026-09-16 复验关闭)
**Files:** `matchmaker/**`、`referral/**`、Miniapp 红娘页面、Admin referral 页面。
@@ -303,7 +305,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
> Phase 12 基线 371 → 391(净 +20)。**Phase 13 已关闭。Phase 13A 未自动进入,等待用户确认。**
> 报告:`docs/Phase-13-V11-Recovery-Completion-Report-2026-09-16.md`
### Phase 13A:婚恋咨询与婚前辅导 — REFACTOR/EXTEND
### Phase 13A:婚恋咨询与婚前辅导 — REFACTOR/EXTEND ✅ 已完成(2026-09-17 复验关闭)
**Files:** `counseling/**`、`miniapp/pages/counseling-*`、`miniapp/pages/my-counseling/**`、`miniapp/pages/premarital-*`、`admin-web/src/modules/counseling/CounselingView.vue`、router。
@@ -347,7 +349,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
> **Phase 13A 已关闭。Phase 14 未自动进入,等待用户确认。**
> 报告:`docs/Phase-13A-V11-Recovery-Completion-Report-2026-09-17.md`
### Phase 14:多类型公益活动 — REFACTOR/EXTEND
### Phase 14:多类型公益活动 — REFACTOR/EXTEND ✅ 已完成(2026-09-17 复验关闭)
**Files:** activity 模块、Miniapp activity 页面、Admin activity 页面。
@@ -396,7 +398,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
> **Phase 14 已关闭。Phase 15 未自动进入,等待用户确认。**
> 报告:`docs/Phase-14-V11-Recovery-Completion-Report-2026-09-17.md`
### Phase 15:活动报名、审核与签到 — KEEP-VERIFY/EXTEND
### Phase 15:活动报名、审核与签到 — KEEP-VERIFY/EXTEND ✅ 已完成(2026-09-17 复验关闭)
**Files:** activity registration、checkin 服务和 U29~U32 页面。
@@ -475,7 +477,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
**复验结论:** 修复 8 处真实缺陷(D1 测试库缺 `appeals` 表 + `AppealServiceTest` 6 处假绿 → 零覆盖;**D2 escalate 向 operator 发用户通知撞 `notifications.user_id→users(id)` FK,PG 上升级 100% 失败**;**D3 appealType 未校验生产 `chk_appeal_type` 白名单**;D4 escalated 死胡同;D5 processAppeal 先读后写并发竞态;D6 三处查询漏软删过滤;D7 硬编码 resolved;D8 证据字段契约 evidenceFileIds);新增 `AppealPhase18IntegrationTest`(15 例),删除假绿 `AppealServiceTest`(9 例);全量回归 494 全绿。
**报告:** `docs/Phase-18-V11-Recovery-Completion-Report-2026-09-17.md`。**Phase 19 需用户确认后启动。**
### Phase 19:统一运营后台 + 用户端公益服务页面 — ADD/REFACTOR
### Phase 19:统一运营后台 + 用户端公益服务页面 — ADD/REFACTOR ✅ 已完成(2026-09-17 复验关闭)
**Files:** Admin banner/content/service-station/service-appointment/service-program/counseling/referral 模块、MainLayout/router;Miniapp 新增 U49~U54、U60、U61、U64 页面;service API 文件。
@@ -501,31 +503,40 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
全量回归 **602 tests 全绿**(起点 420);admin-web `vue-tsc` EXIT=0 + `vite build` EXIT=0;小程序 `tsc --noEmit` EXIT=0;ui-tests 14/14。
**报告:** `docs/Phase-19-V11-Recovery-Completion-Report-2026-09-17.md`。**Phase 20 需用户确认后启动。**
### Phase 20:公益服务 Analytics — EXTEND
### Phase 20:公益服务 Analytics — EXTEND ✅ 已完成(2026-09-17 复验关闭)
**Files:** analytics 模块、统计查询/事实表后续迁移、Admin Analytics 页面、`docs/ANALYTICS_METRICS.md`。
- [ ] 为每个指标登记名称、定义、分子分母、去重键、时间字段、时区、版本和负责人。
- [ ] 分离服务用户数与服务人次、活动 mutual/confirmed/match/chat/success、Banner impression/click。
- [ ] 有效交友匹配在口径未确认前标为 provisional,不能当正式成功或对外宣传。
- [ ] 所有统计接口应用 `analytics.view` 和组织/站点 DataScope,低权限账号返回 403。
- [x] 为每个指标登记名称、定义、分子分母、去重键、时间字段、时区、版本和负责人。(`docs/ANALYTICS_METRICS.md` + `MetricCatalogGuardTest` 11 例)
- [x] 分离服务用户数与服务人次、活动 mutual/confirmed/match/chat/success、Banner impression/click。
- [x] 有效交友匹配在口径未确认前标为 provisional,不能当正式成功或对外宣传。
- [x] 所有统计接口应用 `analytics.view` 和组织/站点 DataScope,低权限账号返回 403。(V043 授权 + `AnalyticsPermissionGrantTest` 6 例)
**Gate:** 用固定测试数据人工复算一致;相同用户多次服务不会污染去重人数。
### Phase 21:账户生命周期 — EXTEND
### Phase 21:账户生命周期 — EXTEND ✅ 已完成(2026-09-18 复验关闭)
**Files:** `account/service/AccountLifecycleService.java`、预约/咨询/项目/资格服务、数据保留文档。
- [ ] 注销前检查进行中的预约、咨询、项目和本地资格审核。
- [ ] 注销事务关闭未来服务、退出项目、失效本地资格并匿名化允许保留的服务历史。
- [ ] 数据保留期限未确认的敏感材料采用配置和人工审核,不擅自永久保存或删除。
- [x] 注销前检查进行中的预约、咨询、项目和本地资格审核。(`checkCanWithdraw`;已从「硬抛异常阻断」改为「信息性日志 + 继续清理」,尊重「注销不设置障碍」)
- [x] 注销事务关闭未来服务、退出项目、失效本地资格并匿名化允许保留的服务历史。(`cancelPendingActivityRegistrations` / `notifyActiveMatches` 两处 TODO 桩已实现;`anonymizeServiceHistory` 已接线;身份证与姓名脱敏补齐)
- [x] 数据保留期限未确认的敏感材料采用配置和人工审核,不擅自永久保存或删除。
> **遗留(未静默扩权,见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` 批 3)**:
> ① 红娘服务进行中拦截仍硬编码 `0` —— 根因是数据模型**没有 `matchmaker_services` 表**,拦截项在设计上无法落地;
> ② `getPrivacySettings` / `updatePrivacySettings` 仍为 TODO 桩。
**Gate:** 注销后不能登录/推荐/聊天;统计留痕不反向暴露个人和咨询正文。
### Phase 22:Deployment / Ops — EXTEND
### Phase 22:Deployment / Ops — EXTEND ⚠️ 未复验(与 STATUS 的「Phase 22 部署运维配置扩展」是两份不同工作)
**Files:** Dockerfiles、`infrastructure/docker-compose*.yml`、Nginx、backup/restore/deploy/gray-release scripts、OPS/DEPENDENCIES 文档。
> ⚠️ **口径澄清(2026-09-18 文档治理)**:本节为计划的 **Deployment / Ops 基础设施** Phase;而 `docs/STATUS.md` 遗留区与
> `Phase-22-V11-Recovery-Completion-Report-2026-09-18.md` 复验的是 **7 个 V1.1 Feature Flag + FeatureFlagController**
> (「部署运维配置扩展」标签),**两者是不同工作**。后者的复验结论**不构成本节的验收证据**。
> 下列 5 项**均未复验**,逐项处置见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` 批 2。
- [ ] 删除 Backend 镜像跳过测试的发布路径;CI 构建必须先测试再打包。
- [ ] 生产关闭 Mock WeChat、默认密码、Debug、Swagger 和演示 Seed;Secret 全部由环境变量/Secret 文件注入。
- [ ] 建立 `/api/v1`、WebSocket、私有对象、6688 端口检测及国内依赖镜像说明。
@@ -534,18 +545,24 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M
**Gate:** staging 部署、健康检查、恢复演练和版本回滚都有命令、日志与结果证据。
### Phase 23:可信系统测试重建 — REFACTOR
### Phase 23:可信系统测试重建 — REFACTOR ⚠️ 部分关闭(2026-09-18)
**Files:** `backend/src/test/**`、`tests/e2e/**`、`tests/invariants/**`、测试 fixture/seed、CI scripts。
- [ ] 删除测试体中的空 `pass`,建立可隔离的用户、角色、组织、活动、咨询和预约 fixture。
- [ ] INV-001~020 必须测试真实服务行为,不能只断言常量字符串存在。
- [ ] E2E 覆盖首页聚合、Banner、资格、咨询、预约、内容、多类型活动、二阶段同意、组织隔离。
- [ ] 增加 appointment owner、Counselor Assigned、ContentEditor zero-user-data、station scope 等负向安全测试。
- [ ] CI 串联迁移、backend test、admin type-check/build、miniapp type-check 和 E2E,任何失败阻断发布。
> ⚠️ **不虚勾**:下列第 3、5 项**确实未完成**,故本 Phase 判定为**部分关闭**,且**不宣布「失败为零可进入 UAT」**。
- [x] 删除测试体中的空 `pass`,建立可隔离的用户、角色、组织、活动、咨询和预约 fixture。(清除 44 个 `pass` 空壳 + 14 个只断言常量的假不变量测试;新增空壳阻断闸门)
- [x] INV-001~020 必须测试真实服务行为,不能只断言常量字符串存在。(新增 4 个经负向注入验证的真实行为守卫)
- [ ] E2E 覆盖首页聚合、Banner、资格、咨询、预约、内容、多类型活动、二阶段同意、组织隔离。**(未完成:场景清单已完整保留在各占位文件头部 —— 本地资格 11 项、互选 8 项、权限 10 项、预约 7 项、首页 11 项;待真实实现)**
- [ ] 增加 appointment owner、Counselor Assigned、ContentEditor zero-user-data、station scope 等负向安全测试。**(部分:INV-011 结构性满足但缺显式守卫,列为待补)**
- [ ] CI 串联迁移、backend test、admin type-check/build、miniapp type-check 和 E2E,任何失败阻断发布。**(未完成:D-23-D,CI 未串联 E2E)**
**Gate:** 不允许 skip/pass 空壳;报告列出总数、通过、失败、跳过及原因,失败为零才进入 UAT。
> **遗留(未静默扩权)**:E2E 需可用活栈(后端 + PostgreSQL + 种子数据 + `E2E_PASSWORD`),在 CI 中如何供给属**基础设施决策**,
> 按「不写无法验证的测试」纪律列为遗留。处置计划见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` 批 2。
> **报告**:`docs/Phase-23-V11-Recovery-Completion-Report-2026-09-18.md`(部分关闭);E2E 基建见 `docs/Phase-23B-V11-E2E-Infrastructure-Completion-Report-2026-09-18.md`。
### Phase 24:UAT — EXTEND
- [ ] 按用户、Reviewer、Matchmaker、Counselor、Counseling Manager、Service Station Operator、Content Editor、Activity Manager、Risk Operator 分角色验收。