# 项目状态跟踪 — STATUS.md > **2026-09-16 当前有效结论:`V1.1 INCREMENTAL RECOVERY PHASE 4 COMPLETE / UI REDESIGN ACCEPTED BY USER / PHASE 08-13 RECOVERY CLOSED / GIT CLEAN`。** > > 阶段 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(公益红娘转介)复验已关闭**,六轮共修复 23 处真实缺陷,并各自补齐测试保真度与守卫。**Phase 13A 需用户确认后启动。** 最后更新: 2026-09-16 — 分支 `main`(`feat-ui-v11` 保留为冗余锚点) ## 当前唯一有效状态 | 当前有效项 | 状态 | 证据 | |---|---|---| | Phase 01~06 Recovery | 已完成 | 各 Phase Completion Report;38+9+3+4+21 后端专项通过 | | Phase 07 V1.1 首页业务与找对象 | **业务+UI 已通过用户验收**(2026-09-16) | HomeApplicationService 真实聚合;CapabilityService 独立化;discover 筛选完整重设计(5 chip + 4 section + 底部抽屉 + 滚动定位高亮);UI 按 2026-09-13 规格重新实现,11 页经用户验收通过 | | **Phase 08 V1.1 Like / Match / Block** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。修复 3 处真实缺陷:① `DiscoverService.searchUsers` 无查看者身份 → INV-004「搜索不可见」整体失效;② 详情路径无 Block 判断;③ `RelationshipService.like()` 把 `"liked"` 当 match source 写库 → 违反 `V003 chk_match_source`(H2 测试库无该约束故长期静默)。新增 `DiscoverBlockInvisibilityIntegrationTest`(9 用例,含反向拉黑);`schema-h2.sql` 补齐生产约束与 `user_profiles`;负向验证确认守卫会红。报告:`docs/Phase-08-V11-Recovery-Completion-Report-2026-09-16.md` | | **Phase 09 V1.1 Text Chat** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。修复 4 处真实缺陷:① WebSocket 下行整条链路是死代码(无握手鉴权/无 userId 写入/`sendToUser` 零调用点)→ 新增 `ChatHandshakeInterceptor` + 落库后推 `message.new`;② Unmatch 不联动会话 + 发消息只校验会话状态 → 解除后仍可发消息 → 新增 `assertMatchAlive` + `MatchController.unmatch` 联动;③ `RelationService.block` 调静态 `MatchService.unmatch`(只改内存态)→ Block 后 Match 未落库;④ 聊天四个接口无成员校验 → IDOR。新增 `ChatPhase09IntegrationTest`(11 用例)+ `ChatWebSocketHandlerTest`(7 用例);负向验证 3 处守卫精准变红。报告:`docs/Phase-09-V11-Recovery-Completion-Report-2026-09-16.md` | | **Phase 10 V1.1 Image & Chat Safety** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。**Gate 通过**。修复 2 处缺陷:① **D1(Critical,生产故障)** `PhotoService.uploadAndSave` 魔数校验因 `new byte[n]` 从不读取流而**恒失败** → 本地资格佐证上传 100% 失败;且 image-only MIME 在 local_eligibility 后无条件执行致 PDF 被挡 → 改为 `readNBytes` 真读取 + MIME 按 photoType 分流 + PDF 跳过图片魔数;② **D2(Low)** `ChatSafetyService` 把命中的高风险词写入 warn 日志 → 改为不记具体词汇。**推翻旧报告**「伪装恶意图片被拒(Magic Number校验)」与「EXIF清理预留(stripExif占位,符号不存在)」两声明。新增 `PhotoUploadValidationTest`(6 用例,`MockMultipartFile` 真走校验链路)+ 负向验证精准变红。报告:`docs/Phase-10-V11-Recovery-Completion-Report-2026-09-16.md` | | **Phase 11 V1.1 Notification** | **已完成**(2026-09-16) | KEEP-VERIFY 复验。Gate 部分通过。修复 3 处缺陷:① **D3(Critical,生产故障)** `NotificationService` 全部 10 种通知传入复合 type(`appointment_submitted`/`counseling_assigned`/`le_verified` 等),违反生产 `chk_notification_type`(仅允许短名)→ 真实 PG 上**全部落库失败**,Phase 11 核心交付不可用;测试库未复刻该约束故长期静默 → type 归一为白名单短名 + 测试库补约束;② **D1(High)** 幂等仅靠 SELECT-then-INSERT 无 DB 兜底 → 新增 `V036__add_notification_idempotency_index.sql`(partial unique index);③ **D2(Medium)** 婚前辅导排期通知零调用 + 管理端排期路径完全不发通知 → 接线并按 service_type 分流。新增测试 12 用例(含**真实调用模板方法**的 type 守卫)。报告:`docs/Phase-11-V11-Recovery-Completion-Report-2026-09-16.md` | | 阶段 0 在途收口 | 已完成 | 56 个改动分类提交为 7 个 commit;Git 清零;Flyway 实际 V036 已登记 | | 阶段 1 小程序 C 组 + discover | 已完成 | C 组 content/anti-fraud/service-station 迁 TS 唯一源;discover 筛选从参数到 UI 完整重写 | | 阶段 2 管理端 Vue 适配 | 已完成 | 18 modules + 22 routes + vue-tsc 全绿 + vite build 11.68s | | 阶段 3 CapabilityService 独立化 | 已完成 | New `capability` 模块:CapabilityService(getCapabilities + 公共判断方法)+ CapabilityController(GET /api/v1/capabilities);HomeApplicationService 完全委托 | | 阶段 4 双端总验收 | **已完成**(2026-09-14) | 三端构建全绿 + 13/13 契约全绿 + 源码健康检查通过;验收报告见 docs/superpowers/plans/2026-09-14-phase4-acceptance-report.md | | Flyway 迁移 | V001~V038 | V028~V038 已纳入 STATUS;V037 为 Phase 12 新增(实体列与生产迁移对齐,23 表 50 列);V038 为 Phase 13 新增(`matchmaker_recommendations.status` + `matchmaker_services.service_type` 的 CHECK 白名单扩展) | | Backend 全量回归 | **已清偿**(2026-09-16) | 离线容器(`danyang-match-backend-test`)`mvn -o test` 实测:**391 tests / 0 failures / 0 errors / 3 skipped / BUILD SUCCESS**(4 分 59 秒);含 `CanonicalRouteContractTest`、`ChatContractJsonTest`、`MeRouteContractTest`、`DiscoverBlockInvisibilityIntegrationTest`、`ChatPhase09IntegrationTest`、`ChatWebSocketHandlerTest`、`PhotoUploadValidationTest`、`NotificationPhase11IntegrationTest`、`NotificationTemplateTypeGuardTest`、`NotificationPrivacyCopyTest`、`EntityMigrationParityTest`、`RelationshipProgressPhase12Test`、`HomePremaritalGuidancePhase12Test`、`MatchmakerReferralPhase13Test`、`MatchmakerServiceTest` | | 路由/字段契约收敛 | **已完成**(2026-09-15) | 字段:会话 `target*` + `sentAt` + `relationStatus`(commit `687a156`);路径:采用 2026-09-14 canonical(`/likes` `/passes` `/blocks` `/matches`,缘分保留 `/relations/fate/*`),旧路径与 `success` 桩实现已移除;裁决由 `CanonicalRouteContractTest` 锁定 | | `/me/*` 路径族 | **已完成**(2026-09-16) | 小程序按 REST 规范(§16 / §22-§40 / §80 / §83-§84)调用 `/me/*`,后端此前**无 `/me` 基路径**致 17 个调用 404。新增 `MeController` 委托既有 service 暴露规范路径,旧路径全部保留,小程序三条历史写法(`/me/privacy-settings`、`/me/photos/{id}/main`、`/me/appeals`)一并兼容;由 `MeRouteContractTest` 锁定 | | Admin Web | **验证通过** | 2026-09-14 阶段 4:vue-tsc ✅、vite build ✅ 11.68s;18 modules 齐全;壳层+工作台通过参考图 QA | | Miniapp | **验证通过** | 2026-09-16:tsc ✅;**11 核心页全部 TS-only(11/11)**;首批 11 页于 2026-09-16 通过用户验收;discover 筛选重设计已通过 DevTools 验证 | | UI 契约测试 | **13/13 通过** | 2026-09-16 运行:全部退出码 0;含 capability 独立化适配与文档基线口径 | | Git 工作区 | **已清零** | 阶段 0~4 共 24+ commit 可追溯;`git status --porcelain` 0 行 | | 核心待清债务 | 0 项 | 已全部清偿:3 页 JS→TS 迁移、backend 全量回归(391 tests)、DevTools 真机截图留档(2026-09-14)、`/me/*` 路径族收敛(2026-09-16)、实体↔生产迁移漂移修复(V037/V038,2026-09-16) | | UAT / RC / Production | **UI 验收通过,前后端契约已收敛,Phase 08-13 已关闭** | 双端构建/契约/源码全部通过;UI 首批 11 页 2026-09-16 通过用户验收;`/me/*` 契约同轮收敛;Phase 08/09/10/11/12/13 复验通过并关闭,累计修复 23 处真实缺陷,可推进 Phase 13A(**需用户确认后启动**) | --- ## 版本演进 | 版本 | 日期 | 说明 | |------|------|------| | 1.0.0-RC.2 | 2026-09-01 | V1.0 核心功能冻结 | | 1.1.0-dev | 2026-09-08 | V1.1 基线搭建启动(Phase 01 进行中) | | 1.1.0-rc.3 | 2026-09-16 | Phase 08~12 复验关闭;新增 V037 对齐实体↔生产迁移;全量回归 371 tests 全绿 | | 1.1.0-rc.4 | 2026-09-16 | Phase 13 复验关闭(公益红娘转介,修复 7 处缺陷);新增 V038 扩展 matchmaker CHECK 白名单;全量回归 **391 tests** 全绿 | --- ## V1.0 基线状态 > **历史记录边界:** 从本节起至文件末尾均为 2026-09-09 重新审查前的开发日志,仅用于追溯,不代表当前验收状态;其中所有 `✅`、`已完成`、`已部署`、测试数量和运行地址均须在对应新 Phase Completion Report 中重新举证。当前唯一有效状态如下。 | 当前有效项 | 状态 | 证据 | |---|---|---| | Phase 01 项目治理与检查基线 | 已交付,带阻断 | `scripts/verify-phase01.ps1` 可重复执行并真实返回 5 个失败门禁;详见 `Phase-01-V11-Recovery-Completion-Report-2026-09-09.md` | | Git 基线 | 阻断 | 当前目录及父目录均无 `.git`,未擅自初始化新仓库 | | Admin Web | 部分通过 | production build 通过;type-check 失败(3 个错误) | | Miniapp | 失败 | TypeScript 检查失败(27 个错误) | | Backend | 未验证 | 本机无 JDK/Maven,Docker Desktop 当前未运行 | | V1.1 E2E | 失败 | 1 passed、26 failed、48 errors、9 warnings | | Phase 02 及以后 | 未开始 | 等待 Phase 01 门禁确认 | | UAT / RC / Production | NO-GO | 构建、权限、E2E 与页面闭环未通过 | --- ## 历史状态记录(仅供追溯,不作为验收证据) | Phase | 名称 | 状态 | |-------|------|------| | P01~P26 | 全部核心功能 | **已完成** ✅ | | 不变量 INV-001~010 | 核心不变量 | **23/23 通过** ✅ | | 权限矩阵 9角色×18权限 | RBAC+DataScope | **已通过** ✅ | | API 测试 | 16/16 | **通过** ✅ | | 代码审查问题 | 16项 | **全部清零** ✅ | | Demo数据 | 12用户+活动+红娘 | **已就绪** ✅ | --- ## V1.1 当前进度 ### Phase 01 — V1.1 基线搭建 ✅ 已完成 | 任务 | 状态 | |------|------| | AGENTS.md 更新至 V1.1 | ✅ | | STATUS.md 更新至 v1.1.0-dev | ✅ | | PENDING_DECISIONS.md 新增V1.1 pending | ✅ | | JIRA_BACKLOG.md 创建 | ✅ | | 测试骨架(6个spec文件) | ✅ | | Phase-01-V11-Completion-Report | ✅ | ### Phase 02 — Auth + Operator + RBAC 扩展 ✅ 已完成 | 任务 | 状态 | |------|------| | V015 迁移:4角色+30权限 | ✅ | | Demo Seed 扩展:3新操作员 | ✅ | | 角色权限分配(含边界约束) | ✅ | | JIRA_BACKLOG 更新 | ✅ | ### Phase 03 — 实名认证扩展(人脸核验预留) ✅ 已完成 | 任务 | 状态 | |------|------| | V016 迁移:verification_level/liveness/provider | ✅ | | UserIdentity 实体扩展 | ✅ | | Feature Flag 系统配置(8项) | ✅ | | Demo Seed 扩展 | ✅ | ### Phase 04 — Profile + Preference + 本地资格 ✅ 已完成 | 任务 | 状态 | |------|------| | V017 迁移:local_eligibility 表 | ✅ | | Entity + Mapper(LocalEligibility/Evidence) | ✅ | | API:GET/POST declaration/evidences/submit | ✅ | | /me/status 扩展 localEligibilityStatus | ✅ | | Miniapp U62 本地资格说明页 | ✅ | | Miniapp U63 本地资格补充页 | ✅ | | AuthService 注入 LocalEligibilityMapper | ✅ | ### Phase 05 — 审核模块扩展(本地资格) ✅ 已完成 | 任务 | 状态 | |------|------| | V018 迁移:review_type 扩展 local_eligibility | ✅ | | ReviewService 新增本地资格审核方法 | ✅ | | LocalEligibilityService 集成审核流程 | ✅ | | SensitiveAccessLog 佐证访问审计 | ✅ | | Constants 新增 REVIEW_TYPE_LOCAL_ELIGIBILITY | ✅ | ### Phase 06 — Match Engine 扩展(本地资格 Eligibility) ✅ 已完成 | 任务 | 状态 | |------|------| | MatchEligibilityService 接入本地资格检查 | ✅ | | MatchRuleConfigProperties 新增 localEligibilityRequired | ✅ | | LocalEligibilityService 缓存失效处理 | ✅ | | eligibility test matrix 扩展 | ✅ | ### Phase 07 — V1.1首页重构 + 找对象 ✅ 已完成 | 任务 | 状态 | |------|------| | HomeApplicationService + HomeDTO | ✅ | | GET /api/v1/home 聚合接口 | ✅ | | V019 Banner + ServiceLocation 迁移 | ✅ | | BannerService(时间/受众过滤) | ✅ | | HomeController | ✅ | | Miniapp 首页完整重构(U18 V1.1) | ✅ | | 5种用户状态首页适配 | ✅ | ### Phase 08 — Like / Match / Block ✅ 已完成(2026-09-16 复验关闭) | 任务 | 状态 | |------|------| | MATCH_SOURCE常量定义 | ✅ | | createMatch 重载(autoCreateConversation参数) | ✅ | | confirmActivityInterest 方法 | ✅ | | ActivityInterest.hasMutualInterest 方法 | ✅ | | ActivityInterestController 新增confirm接口 | ✅ | | INV-014/015 不变量保障(不自动建Chat) | ✅ | | 通知文案更新(V1.1二阶段确认规则) | ✅ | | **INV-004 搜索不可见(双向)修复** | ✅ 新增(复验发现原实现完全绕过 Block) | | **详情路径 Block 拦截(双向 → 404)** | ✅ 新增(复验发现两条详情路径均无检查) | | **`matches.source` 取值越界修复** | ✅ 新增(`"liked"` → `MATCH_SOURCE_USER_LIKE`) | | **测试库保真度对齐(`chk_match_source` + `user_profiles`)** | ✅ 新增 | | **`DiscoverBlockInvisibilityIntegrationTest`(9 用例)** | ✅ 新增 | ### Phase 09 — Text Chat 验证 ✅ 已完成 | 任务 | 状态 | |------|------| | Activity Match source 聊天兼容性验证 | ✅ | | 消息幂等性验证(client_message_id唯一索引) | ✅ | | INV-002/003 不变量验证 | ✅ | | WebSocket 推送机制确认 | ✅ | | REST Send + WS Receive 架构确认 | ✅ | ### Phase 10 — Image & Chat Safety ✅ 已完成 | 任务 | 状态 | |------|------| | ChatController 限流检测集成 | ✅ | | MessagingService 风险关键词检测接入 | ✅ | | insertRiskNotice 高风险消息系统通知 | ✅ | | sendChatSafetyTip 首次聊天安全提示 | ✅ | | POST /messages/conversations/{id}/safety-tip API | ✅ | | ChatController safety-tip 端点 | ✅ | ### Phase 11 — 公益服务通知扩展 ✅ 已完成 | 任务 | 状态 | |------|------| | V020 迁移:通知类型扩展(6种新类型) | ✅ | | Constants 新增 5 个 NOTIFICATION_TYPE | ✅ | | NotificationService 新增 10 个业务通知方法 | ✅ | | ReviewService 集成本地资格审核通知 | ✅ | | 隐私安全文案(中性化,不暴露敏感信息) | ✅ | ### Phase 13A — 公益婚恋咨询与婚前辅导(核心链路)✅ 已完成 | 任务 | 状态 | |------|------| | V022 counseling_services + counseling_followups 迁移 | ✅ | | CounselingServiceApp(Service/Controller/DTO) | ✅ | | 用户端 API:intro / create / list / detail / cancel | ✅ | | 后台 API:queue / assign / schedule / start / followup / complete / close | ✅ | | INV-012 Counselor assigned scope 实现 | ✅ | | Miniapp U55-U59 页面(咨询介绍/申请/我的/婚前辅导) | ✅ | | app.json 路由注册 | ✅ | | companionUserId 伴侣支持 | ✅ | ### Phase 13 — 公益红娘服务转介 ✅ 已完成 | 任务 | 状态 | |------|------| | P13-V11-T01 转介婚恋咨询(service_type扩展 + request_source) | ✅ | | P13-V11-T02 转介公益活动(activity_registrations.source字段) | ✅ | | P13-V11-T03 转介善缘服务站(service_appointments表 + 转介追踪) | ✅ | | P13-V11-T04 referral source tracking(Constants常量 + DB字段) | ✅ | | P13-V11-T05 user consent/confirmation(confirmReferral 两阶段确认) | ✅ | | V021 数据库迁移(service_appointments + activity_registrations扩展) | ✅ | | ServiceAppointment Java 模块(Entity/Mapper/Service/Controller) | ✅ | | ReferralService + ReferralController(转介核心逻辑) | ✅ | | NotificationService 转介通知方法 | ✅ | | Constants 新增转介来源常量 | ✅ | | INV-005 红娘不可代用户操作验证 | ✅ | ### Phase 12 — 关系状态轻量扩展 ✅ 已完成(2026-09-16 KEEP-VERIFY 复验通过) | 任务 | 状态 | |------|------| | Successful首页服务建议(婚前辅导引导) | ✅ | | GettingToKnow服务建议规则 | ✅ | | Counseling recommendation rules | ✅ | | 成功关系双确认 / 恢复 / 退出 / 历史 Episode / 并发确认 | ✅ 行为测试 14 项 | | getting_to_know 阶段婚前辅导入口引导(计划项 2) | ✅ 已接线 `HomeApplicationService.buildServiceRecommendations` | | 工作人员不能替用户确认成功关系(INV-005) | ✅ 非成员路径断言抛业务异常 | > **2026-09-16 复验结论(KEEP-VERIFY/EXTEND)**:历史 ✅ 不可信,逐条核对运行时路径后修复 4 处缺陷: > - **D1(Critical,生产故障 · 同一族系统性缺陷)** 实体与生产迁移**系统性漂移**:23 张表、50 个列在 > `db/migration` 中根本不存在,而测试库 `schema-h2.sql` 手写了它们 → 全量测试绿 = 假绿。其中 > **11 张表属"INSERT 必崩"级**(缺 `id`/`created_at`/`updated_at`,被 `AutoFillHandler` 强制填充, > 每次写入必进 SQL):`matches`(缺 `episode`/`source_id`/`last_activity_at`/`unmatched_by`/`deleted_at`)、 > `user_preferences`(缺 `id` + 11 个权重列)、`permissions`、`roles`、`consent_records`、`risk_events`、 > `review_reasons`、`match_rule_configs`、`matchmaker_followups`、`matchmaker_recommendations`、 > `user_privacy_settings`。**真实 PG 上 Match 创建、择偶偏好保存、权限/角色写入、同意记录、风险事件 > 全部失败**。修复:新增 `V037__align_entity_columns_with_migrations.sql`(幂等 `ADD COLUMN IF NOT > EXISTS`,含存量数据 `episode` 回填与 `id` 补发)。 > - **D2(High)** `RelationshipService.createMatch` 不写 `episode`/`lastActivityAt`,与 > `MatchService.createOrReuseMatch` 形成**双路径字段填充不一致**;且 `episode` 为 null 时 > `MatchService` 的 `m.getEpisode() + 1` 对 `Integer` **自动拆箱抛 NPE**。修复:两条路径统一按 > AGENTS.md #20 推导 episode,并做 null 兜底。 > - **D3(High)** 测试库缺 `user_identities` 等 7 张表 → `GET /api/v1/home` 在测试环境直接 > `BadSqlGrammar("Table USER_IDENTITIES not found")`,**首页接口零回归覆盖**。修复:补齐 > `user_identities`/`review_tasks`/`local_eligibility_evidences`/`home_banners`/`service_locations`/ > `content_articles`/`activities` 七张表(列对齐生产迁移)。 > - **D4(Medium)** Phase 12 计划项 2 实际**未实现**:`getting_to_know` 分支只产出 `counseling`, > 婚前辅导入口仅在 `matched_successfully` 才出现。修复:`HomeApplicationService.buildServiceRecommendations` > 的 `getting_to_know` 分支补 `premarital` 引导(与 counseling 并列,不互相挤占)。 > - **新增永久守卫** `EntityMigrationParityTest`(5 用例):把「实体字段 ⊆ 生产迁移累积列」与 > 「测试库覆盖关键业务表」固化为**编译后自动可验证的不变量**,并区分「必崩级 / 潜伏级」。经 > **两轮负向验证**证明会变红(第一轮分级过窄已修正:`episode` 由"潜伏级"纠正为"必崩级")。 > - **删除假测试**:`RelationshipStatusServiceTest` 与 `RelationshipStatusServiceDoubleConfirmTest` > 原含 `assertTrue(true); // 占位测试`,对 INV-005 零覆盖(AGENTS.md 明令禁止)→ 已删除占位断言, > 行为验证移至走真实服务方法的 `RelationshipProgressPhase12Test`(14 用例,含并发确认)。 > - 报告:`docs/Phase-12-V11-Recovery-Completion-Report-2026-09-16.md` ### Phase 13 — 公益红娘转介 ✅ 已完成(2026-09-16 KEEP-VERIFY/EXTEND 复验通过) | 任务 | 状态 | |------|------| | 保留红娘服务和人工推荐;任何工作人员不能替用户 Like(INV-005) | ✅ 行为测试 4 项 | | 补齐转介咨询、活动、服务站的用户同意、来源追踪和状态记录 | ✅ 行为测试 6 项 | | 红娘只能看转介状态和必要摘要,不能读取 counseling followup 正文(INV-013) | ✅ 行为测试 3 项 | | 红娘归属校验(推荐/转介不得越权代操作) | ✅ 负向测试 4 项 | > **2026-09-16 复验结论(KEEP-VERIFY/EXTEND)**:历史 ✅ 不可信,逐条核对**运行时路径**与**生产约束**后修复 7 处缺陷: > - **D1(Critical,生产故障)** `matchmaker_recommendations.status` 代码写入 `liked`/`passed`/`confirmed_mutual`, > 而生产 `V009 chk_rec_status` 只允许 `pending_view/viewed/responded` 且从未扩展 → **真实 PG 上用户接受/跳过 > 推荐必崩**(`DataIntegrityViolation`)。测试库 `schema-h2.sql` 未复刻该 CHECK,故长期静默。修复: > `V038__align_matchmaker_status_constraints.sql` 以 `DROP CONSTRAINT IF EXISTS` + `ADD CONSTRAINT` 扩展白名单。 > - **D2(Critical,生产故障)** `MatchmakerController` 缺省 `serviceType="recommendation"` 不在 > `chk_matchmaker_service_type` 白名单 → **提交红娘服务必崩**。修复:同 `V038` 扩展(原 7 值 + > `recommendation`/`referral_counseling`/`referral_activity`/`referral_station`)。 > - **D3(High,越权)** `MatchmakerServiceService.recommendPartner` 无 `assignedOperatorId` 归属校验 → > 任意红娘可替非本人负责的服务发起推荐(并可推荐给自己)。修复:补归属校验 + 禁止自我推荐。 > - **D4(High,越权读)** `getServiceDetail` 无归属校验且返回**完整**用户资料(`userId`/`description`/`userProfile`/ > `followups`)→ 任意红娘可读任意用户敏感详情。修复:签名加 `requesterId`,负责人得完整视图, > 非负责人得脱敏视图(去 `userProfile`/`userId`/`followups`,仅 `followupCount` + `viewerIsOwner=false`)。 > - **D5(High,越权写)** `ReferralService` 的 `userId` 取自**请求体**且**零授权校验** → 任意持 > `matchmaker.service` 权限者可替任意用户发起转介。修复:新增 `assertMatchmakerServesUser`, > 在 `referToServiceStation`/`referToActivity` 入口强制校验"存在进行中的服务关系"。 > - **D6(High,生产故障)** `MatchmakerFollowupMapper.findByServiceId` 只声明方法、**无 `@Select`** → > 运行时 `Invalid bound statement (not found)`,`getServiceDetail` **必崩**。**该缺陷由本轮新增测试首次暴露** > (历史测试从未调用该路径)。修复:补 `@Select`。 > - **D7(Medium,契约缺口)** admin-web 5 处 API 缺口:`/matchmaker/services/operator/queue`、 > `/matchmaker/recommendations/operator`、`PUT /matchmaker/services/{id}/assign`、 > `POST /matchmaker/services/{id}/recommendation`、`/referrals/my-history`(C 端端点被运营端误用)。 > 修复:后端补 `GET /operator/matchmaker/recommendations` 与 `GET /referrals/operator/history` > 两个运营端端点(含 `MatchmakerServiceMapper.findActiveByOperatorAndUser`、 > `MatchmakerRecommendationMapper.findByOperatorId`、`ReferralService.getReferralHistoryByOperator`), > 前端改路径、`assign` 改 `POST` + body `operatorId`;小程序新增 `miniapp/services/referralService.js`。 > - **测试库盲区修复**:`schema-h2.sql` 补 `matchmaker_services`/`matchmaker_recommendations`/ > `matchmaker_followups` 三表(约束与 V038 对齐);`EntityMigrationParityTest` 的 3 张 matchmaker 表 > 从 `TEST_SCHEMA_OPTIONAL_TABLES` 移入 `REQUIRED_IN_TEST_SCHEMA`;`MigrationValidationTest` 基线 37 → 38。 > - **新增永久守卫** `MatchmakerReferralPhase13Test`(17 用例,`@SpringBootTest` 走真实方法路径)+ 重写 > `MatchmakerServiceTest`(6 用例)。**关键教训**:首版常量守卫**硬编码白名单副本**,注入 D1 缺陷后 > **仍全绿**(对漂移零反应)→ 重写为**直接解析 `db/migration/V*.sql`**,按文件名顺序应用 > `DROP CONSTRAINT IF EXISTS` + `ADD CONSTRAINT` 取"最终有效"白名单,并内置解析器自检用例。 > 修正后经**第二轮负向验证**证明会红(`Tests run: 23, Failures: 1, Errors: 2 / BUILD FAILURE`)。 > - **删除假测试**:`MatchmakerServiceTest.testMatchmakerCannotLike` 原为 `assertTrue(true)`; > `CoreInvariantsTest` 的 INV-007 断言的是 `MATCHMAKER_STATUS_*` 常量(名不副实)、INV-010 亦为 > `assertTrue(true)` → 已删除占位、如实改名并注明行为验证位置。 > - 报告:`docs/Phase-13-V11-Recovery-Completion-Report-2026-09-16.md` ### V1.1 待实现模块(按 Phase 顺序) | 模块 | 对应 Phase | 状态 | |------|-----------|------| | Home Aggregate API + V1.1首页 | Phase 07 | ✅ 已完成 | | Banner 管理(后端+前端) | Phase 19 | ⏳ 待开发 | | 本地资格声明与审核 | Phase 04~05 | ⏳ 待开发 | | 公益红娘服务转介 | Phase 13 | ✅ 已完成 | | 婚恋咨询 + 婚前辅导(Phase 13A) | Phase 13A | ⏳ 待开发(**需用户确认后启动**) | | 内容管理(婚恋课堂/反诈) | Phase 19 | ⏳ 待开发 | | 专项公益服务项目 | Phase 19 | ⏳ 待开发 | | V1.1新增不变量测试(INV-011~020) | Phase 23 | ⏳ 待开发 | ### 当前运行状态 ``` 管理后台: http://localhost:3000/ (凭证由本地环境变量或安全 Seed 提供) API 网关: http://localhost:8085/api/v1/ PostgreSQL: localhost:5434 (danyang_match) Redis: localhost:6381 MinIO: localhost:9003 (凭证由本地环境变量提供) ``` --- ## 当前 Phase ### Phase 14 — 多类型公益活动(核心链路)✅ 已完成 | 任务 | 状态 | |------|------| | V023 activity_type/registration_policy/target_group/industry_scope 字段扩展 | ✅ | | activity_organizations 多组织关联表 | ✅ | | activity_capacity_groups 容量分组表 | ✅ | | Activity Java实体扩展(6个新字段) | ✅ | | ActivityOrganization + ActivityCapacityGroup 实体/Mapper | ✅ | | ActivityService 新增4个V1.1方法 | ✅ | | ActivityController 新增6个API端点 | ✅ | | Constants 新增 ACTIVITY_TYPE_* + ORG_ROLE_* 常量 | ✅ | **Phase 13A(公益婚恋咨询与婚前辅导)— 已完成** ✅ ### Phase 19 — 统一运营后台(后端API核心链路)✅ 已完成 | 任务 | 状态 | |------|------| | V026 内容+专项项目+组织关系表 | ✅ | | ContentService(分类/文章 CRUD + publish/offline) | ✅ | | ServiceProgramService(项目CRUD + 成员审批) | ✅ | | V021~V026 共6个迁移文件 | ✅ | | Admin Web前端 | ⏳ 后续补充 | ### Phase 20 — Analytics数据统计扩展 ✅ 已完成 | 任务 | 状态 | |------|------| | P20-T01~T11 全部11项统计指标 | ✅ | | GET /operator/analytics/v11-dashboard 综合接口 | ✅ | **Phase 20(Analytics数据统计扩展)— 已完成** ✅ ### Phase 21 — 账户生命周期增量 ✅ 已完成 | 任务 | 状态 | |------|------| | P21-T01 注销时取消服务预约 | ✅ (cancelServiceAppointments) | | P21-T02 注销时取消咨询记录 | ✅ (cancelCounselingServices) | | P21-T03 注销时退出专项项目 | ✅ (exitServicePrograms) | | P21-T04 失效本地资格 | ✅ (invalidateLocalEligibility) | | P21-T05 服务历史脱敏钩子 | ✅ (anonymizeServiceHistory) | | checkCanWithdraw 扩展(V1.1业务检查) | ✅ | **Phase 20(Analytics数据统计扩展)— 已完成** ✅ ### Phase 22 — 部署运维配置扩展 ✅ 已完成 | 任务 | 状态 | |------|------| | P22-T01 counselingEnabled flag | ✅ | | P22-T02 premaritalEnabled flag | ✅ | | P22-T03 contentEnabled flag | ✅ | | P22-T04 serviceLocationEnabled flag | ✅ | | P22-T05 localEligibilityEnabled flag | ✅ | | P22-T06 local evidence upload policy | ✅ (maxFiles/maxSizeMB/allowedTypes) | | P22-T07 private storage for counseling attachments | ✅ (private/bucket) | | FeatureFlagController API | ✅ (GET/PUT /operator/feature-flags) | | application.yml 默认配置 | ✅ (15个V1.1 flag) | **Phase 21(账户生命周期增量)— 已完成** ✅ ### Phase 22 — 部署运维配置扩展 ✅ 已完成 | 任务 | 状态 | |------|------| | P22-T01 counselingEnabled flag | ✅ | | P22-T02 premaritalEnabled flag | ✅ | | P22-T03 contentEnabled flag | ✅ | | P22-T04 serviceLocationEnabled flag | ✅ | | P22-T05 localEligibilityEnabled flag | ✅ | | P22-T06 local evidence upload policy | ✅ | | P22-T07 private storage for counseling attachments | ✅ | | FeatureFlagController API | ✅ | | application-dev.yml + application-docker.yml 配置 | ✅ | **Phase 21(账户生命周期增量)— 已完成** ✅ ### Phase 23 — V1.1专项测试 ✅ 已完成 | 任务 | 状态 | |------|------| | P23-T01 Home V1.1 E2E | ✅ (home_v11_test.py) | | P23-T02 Banner timing filter | ✅ (home_v11_test.py) | | P23-T03 Banner audience filter | ✅ (home_v11_test.py) | | P23-T04 Quick Entry order | ✅ (home_v11_test.py) | | P23-T05 Local Eligibility E2E | ✅ (local_eligibility_test.py) | | P23-T06 Counseling E2E | ✅ (counseling_v11_test.py) | | P23-T07 Counseling permission | ✅ (counseling_permission_test.py) | | P23-T08 Service Appointment E2E | ✅ (service_appointment_test.py) | | P23-T09 Content E2E | ✅ (content_e2e_test.py) | | P23-T10 Multi-type Activity E2E | ✅ (multi_type_activity_test.py) | | P23-T11 Activity Mutual Consent E2E | ✅ (activity_mutual_consent_test.py) | | P23-T12 Service Station permission | ✅ (service_station_permission_test.py) | | P23-T13 Organization relation isolation | ✅ (organization_isolation_test.py) | | P23-T14 INV-011~INV-020 | ✅ (V11InvariantsTest.java) | E2E测试文件:10个(~80+测试用例) Invariant测试:10个(INV-011~INV-020) **Phase 22(部署运维配置扩展)— 已完成** ✅ ### Phase 24 — UAT增量 ✅ 已就绪(测试数据支持) | 任务 | 状态 | |------|------| | P24-T01 Service Station Operator UAT | ✅ 测试数据已就位(stationop账号) | | P24-T02 Counselor UAT | ✅ 测试数据已就位(counselor01账号) | | P24-T03 Counseling Manager UAT | ✅ 角色权限已配置 | | P24-T04 Content Editor UAT | ✅ 角色权限已配置 | | P24-T05 服务站扫码→预约→到场 | ✅ API链路完整 | | P24-T06 咨询申请→服务完成 | ✅ API链路完整 | | P24-T07 婚前辅导申请 | ✅ Miniapp页面U58/U59完整 | | P24-T08 活动双方互选→双方确认→Chat | ✅ API+Miniapp完整 | **备注**:UAT需要人工操作验证,后端API和数据模型已全部就绪。 **Phase 23(V1.1专项测试)— 已完成** ✅ ### Phase 25 — RC内容检查 ✅ 可执行 | 任务 | 状态 | |------|------| | P25-T01~T09 真实素材填充 | ⏳ 待运营提供内容 | | Banner真实素材 | ⏳ 等待运营 | | 服务站真实地址/开放时间 | ✅ 已初始化万善公园站 | | 咨询服务介绍 | ✅ API已就绪 | | 婚前辅导介绍 | ✅ API已就绪 | | 婚恋反诈首批内容 | ⏳ 待运营提供 | | 婚恋课堂首批内容 | ⏳ 待运营提供 | | 关于善缘丹阳 | ⏳ 待运营提供 | | 主办/执行信息 | ⏳ 待运营提供 | ### Phase 26 — Production初始化 ✅ 已完成 | 任务 | 状态 | |------|------| | P26-T01 Seed Content Categories | ✅ (V027) | | P26-T02 Seed Activity Types | ✅ (CHECK约束已定义) | | P26-T03 Seed Service Types | ✅ (CHECK约束已定义) | | P26-T04 创建万善公园服务站 | ✅ (V027) | | P26-T05 初始化Banner | ✅ (V027) | | P26-T06 初始化Feature Flags | ✅ (application.yml配置) | | P26-T07 初始化新增Roles/Permissions | ✅ (V015已覆盖) | | P26-T08~T13 Smoke tests | ⏳ 上线前手动验证 | **V027 生产种子数据迁移**已创建,包含: - 4个内容分类(婚恋课堂/反诈/婚前辅导/婚俗新风) - 万善公园服务站基础数据 - 3条首页Banner **Phase 24(UAT增量)— 已就绪** ✅ --- ## 整体进度总结 | Phase范围 | 状态 | |-----------|------| | Phase 01~12 (V1.0基线) | ✅ 已完成 | | Phase 13~22 (V1.1核心增量) | ✅ 已完成 | | Phase 23 (V1.1专项测试) | ✅ 已完成 | | Phase 24~26 (UAT/RC/Production) | ⏳ 运营/上线阶段 | ### Phase 24 — UAT增量 ✅ 已就绪 | 任务 | 状态 | |------|------| | P24-T01~T04 各角色UAT | ✅ 权限模型已配置 | | P24-T05~T08 业务场景验收 | ✅ API链路完整 | ### Phase 25 — RC内容检查 ⏳ 待运营 | 任务 | 状态 | |------|------| | P25-T01~T09 真实素材 | ⏳ 需运营提供 | ### Phase 26 — Production初始化 ✅ 已完成 | 任务 | 状态 | |------|------| | P26-T01~T07 种子数据 | ✅ (V027) | | P26-T08~T13 Smoke测试 | ⏳ 上线前手动验证 | ### Admin Web V1.1 模块扩展 ✅ 已完成 | 模块 | 文件 | 说明 | |------|------|------| | Banner管理 | BannerManagementView.vue | CRUD + 上架/下架 | | 内容管理 | ContentManagementView.vue | 分类+文章CRUD + 发布/下架 | | 善缘服务站 | ServiceStationView.vue | 站点信息编辑 | | 服务预约 | ServiceAppointmentView.vue | 确认/完成/取消 | | 专项项目 | ServiceProgramView.vue | CRUD + 成员审批 | | 婚恋咨询 | CounselingView.vue | 分配/排期/跟进/完成 | | 转介记录 | ReferralManagementView.vue | 转介历史查询 | | 路由扩展 | router/index.ts | 7个新菜单+路由 | --- ## V1.1 整体进度总结 | 类别 | 状态 | |------|------| | 数据库迁移 (V001~V027) | ✅ 27个文件 | | 后端 Java API | ✅ 100% 完成 | | Miniapp 页面 (U55~U61) | ✅ 7个新页面 | | E2E 测试 (12个文件) | ✅ 80+用例 | | Invariant 测试 (INV-011~020) | ✅ 10个用例 | | Feature Flag 配置 | ✅ 15个V1.1开关 | | Admin Web V1.1 模块 | ✅ 7个新页面 | | Admin Web 前端开发 | ⏳ 需完善样式和联调 | **V1.1 核心功能 100% 完成,可进入 UAT 验收和上线准备阶段** --- ## 已知限制 | 限制 | 说明 | |------|------| | 人脸核验 | Feature Flag 预留,Provider 未确认 | | 本地资格佐证触发规则 | 待运营确认 | | 微信公众号审核 | 需人工操作 | | SSL证书 | 需人工申请 | | 有效交友匹配报送口径 | 待运营确认 | --- *版本基线: 1.1.0-dev(2026-09-08)— V1.0 核心 100% 就绪,V1.1 增量开发中* --- ## 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 ### 部署状态 - Backend: http://localhost:8085 ✅ - Admin Web: http://localhost:8086 ✅ - PostgreSQL: localhost:5434 ✅ - Redis: localhost:6381 ✅ - MinIO: localhost:9003 ✅ ### 测试结果: 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`。 - API 人工测试未证明 Permission、DataScope 和业务闭环,不能作为上线依据。 ### 运行中的服务 | 服务 | 地址 | 状态 | |------|------|------| | 后端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 (需运营团队配合)