|
|
@@ -3368,3 +3368,76 @@ W0.2 双配置中心合并:`product_config` 已并入 `service_config`(唯
|
|
|
| SC-P-83 | 意见反馈/在线客服 | 反馈已存在(/api/health/feedback/*、/api/activity/feedback/*、/api/feedback/*);在线客服无专用端点 | 缺口 G-4,需产品侧确认 |
|
|
|
| SC-P-85 | 多端登录/会话互斥 | 登录族 + SSO 票据存在;无单端互斥/旧 token 踢出(JWT 无状态) | 缺口 G-5,需产品侧确认 |
|
|
|
*文档更新:2026-11-07(EVD-13 家长域剩余 30 SC 契约核对增补「家长域剩余」段落 4.63:家庭与成员 / 健康报告上传解析 / 食谱营养 / 测评类型与 AI 对话 / 成长记录 / 商城加购下单 / 联系人与社交 / 设置与通知 / 舌诊情绪·账号·活动·反馈·会话 + 已 GREEN 键复用登记 4 处 + 契约缺口 5 项。完整核验表见 `docs/superpowers/specs/2026-11-07-parent-rest-contract.md`)*
|
|
|
+
|
|
|
+### 4.64 跨角色域剩余(SC-X-03/08/11/14/15/16/17/18,EVD-15 契约核对增补)
|
|
|
+> 跨角色域 22 个 SC(SC-X-01~22)中已由既有开工包覆盖 13 个(测评-方案 EVD-8R:X-01/06/09;报告闭环 EVD-7R:X-02/10/13;任务-心愿 EVD-3:X-05;五维能量 EVD-5:X-19/20/21;商城-会员 EVD-4:X-07/12;家庭-成员 EVD-2:X-04;CF 值预估 TR-5:X-22);本批 = 剩余 8 个无键 SC,端点载体逐条实测核验。完整核验表与实现缺口见 `docs/superpowers/specs/2026-11-07-cross-role-contract.md`。
|
|
|
+> 约定:所有端点 `POST`;越权语义统一 403(`FamilyAccessInterceptor` enforcement 模式 + `canAccessFamily`)。
|
|
|
+> **命名回填**:SC-X-03 候选 `ParentController` 实为心愿单 `/api/parent/wishlist*`(非视角切换,视角切换 = `/api/family/member/switch` + `/api/auth/switch-role`);SC-X-08 候选 `AdminArticleController /api/admin/article/*` 实际为 `/api/admin/articles`(带 s)。
|
|
|
+#### 4.64.1 双角色数据隔离越权(SC-X-03)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/family/member/add`、`/list`、`/switch`、`/kick`、`/leave`、`/recycle`、`/update`、`/rename-family`、`/editable`、`/logs` | 成员 CRUD/权限(`FamilyMembersController`,`canAccessFamily` 校验有效家庭集,越权 403;`/switch` 切成员/孩子上下文视角 `SwitchMemberVO`) |
|
|
|
+| `POST /api/family/teacher-bindings/pending`、`/approve`、`/reject`、`/my-requests`、`/cancel` | 规划师绑定审核(`TeacherFamilyBindingController`) |
|
|
|
+| `POST /api/auth/switch-role` | 角色切换(`switchRoleForLogin` 重签 token,权限提升须登录,JwtInterceptor 强制登录) |
|
|
|
+| `POST /api/parent/wishlist`、`/wishlist/list`、`/wishlist/family`、`/wishlist/{id}/approve`、`/wishlist/{id}/exchange` | 家庭主账号心愿单(`ParentController`——**命名回填:非视角切换**) |
|
|
|
+> 越权语义载体:`FamilyAccessInterceptor`(请求携带 familyId 必须属于调用者有效家庭集,enforcement 模式越权 → 403「无权访问该家庭数据」,注册于 `WebConfig.addInterceptors`)+ `FamilyMembersController.canAccessFamily`(控制器内 403)。
|
|
|
+#### 4.64.2 文章发布闭环(SC-X-08)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/article/publish`、`/my-posts`、`/updated-since`、`/detail`、`/list`、`/featured`、`/record-read`、`/related`、`/related-products`、`/audio`、`/report-reading-time`、`/reading-stats`、`/daily-tip` | 文章发布/详情/列表(`ArticleController`,`/api/articles` 与 `/api/article` 双前缀兼容) |
|
|
|
+| `POST /api/articles/categories` | 文章分类(`ArticleCategoryController`) |
|
|
|
+| `POST /api/articles/comments/list`、`/create`、`/audit`、`/pending`、`/my`;`/quiz/generate`、`/quiz/submit` | 文章评论 + 答题(`ArticleCommentController`) |
|
|
|
+| `POST /api/admin/articles/list`、`/create`、`/update`、`/detail`、`/delete`、`/{id}/publish`、`/publish`、`/audit`、`/submit-review`、`/withdraw`、`/re-draft`、`/toggle-featured`、`/move`、`/upload/image`、`/upload/video`、`/comments/list`、`/categories/list`、`/categories/create`、`/categories/update`、`/categories/delete`、`/reading-records` | 文章管理端审核/上架/下架(`AdminArticleController`,**路径带 s:`/api/admin/articles`**) |
|
|
|
+| `POST /api/admin/review-center/summary` | 审核中心汇总(`ReviewCenterController`) |
|
|
|
+> 闭环 = 发布→审核→上架→评论,端点齐全 ✅。
|
|
|
+#### 4.64.3 消息通知闭环(SC-X-11)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/notification/list`、`/read` | 站内消息查看 + 已读(`UserNotificationController`,已读闭环) |
|
|
|
+| `POST /api/admin/notification-template/list`、`/save`、`/delete` | 通知模板/通道配置(`AdminNotificationTemplateController`) |
|
|
|
+| `NotificationDispatchService.sendByTemplate(type,userId,vars,refType,refId,defaultTitle,defaultContent)` | 通知发送统一入口(W3 五通道:in_app/sms/wechat/gzh/phone;in_app + wechat-webhook 投产,sms/gzh/phone/wechat-订阅 预留禁用) |
|
|
|
+| `InAppNotificationChannel`(isEnabled=true) | 站内通道,写 `user_notifications` 表 |
|
|
|
+| `WebhookNotificationChannel`(channelType=wechat,isEnabled=true) | 微信待办 webhook 通道,复用 `WechatWaitMsgService.sendWaitMsg`(按用户手机号定向 msgLabel) |
|
|
|
+> 事件触发 = 10 个 service 调 sendByTemplate(`TaskService`/`PointsService`/`EnergyService`/`CfBalanceServiceImpl`/`CouponGiftService`/`DanReportUploadService`/`ProblemCompletionService`/`ProcurementTaskService`/`ReportTransferService`/`TaskReminderScheduledTask`)。**⚠ 部分存在**:订单/活动/支付事件(`ProductOrderController`/`ActivityOrderController`/`VirtualPayController`)未挂接统一分发;微信订阅消息通道未接入 → 缺口 X-G-1。
|
|
|
+#### 4.64.4 解绑/重分配跨角色协同(SC-X-14)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/bind/accept`、`/guides`、`/unbind` | 家庭绑定/解绑(`BindController`) |
|
|
|
+| `POST /api/family/invite/generate`、`/validate`、`/request-join-by-code`、`/approve-request`、`/reject-request`、`/pending-requests`、`/my-request`、`/cancel-request`、`/bind-inviter`、`/accept`、`/check-family`、`/revoke`、`/transfer-admin` | 邀请重分配/管理员转移(`FamilyInviteController`) |
|
|
|
+| `POST /api/cf/transfer/send`、`/list` | CF 余额转移(`CfTransferController`) |
|
|
|
+> 协同 = 规划师/成员解绑(`/unbind`)+ 成员数据重分配(`/transfer-admin`、`/revoke`)+ CF 转移。
|
|
|
+#### 4.64.5 注销/数据导出跨角色(SC-X-15)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/user/deactivate` | 账号注销(`AccountCleanupService.deactivateAccount`:匿名化主账号 openid 哈希 + realName/idCard/phone/unionid/nickname/avatar/address/sessionKey 清空 + deleted=1,匿名化关联 `family_member` 记录,处理 PaymentOrder(familyId)/AssessmentOrder(userId)) |
|
|
|
+| `POST /api/user/data-export` | 个保法可携带权导出(`AccountCleanupService.exportUserData`) |
|
|
|
+> 跨角色语义 = 家长注销后家庭成员记录/家庭订单处理。
|
|
|
+#### 4.64.6 活动名额并发(SC-X-16)⭐
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/activity/register`、`/cancel-registration`、`/my-registrations`、`/registration-roster`、`/checkin`、`/checkin-review` | 活动报名/取消/名单/签到(`ActivityController`) |
|
|
|
+| `ActivityRegistrationService.occupyQuota` | 原子占用名额:`UPDATE activity SET approved_count=approved_count+1 WHERE id=? AND approved_count<max_participants`(返回 rows>0,**多端并发报名不超发**;`releaseQuota` 原子回退) |
|
|
|
+| `POST /api/activity/order/create`、`/pay`、`/notify`、`/status` | 付费活动订单(`ActivityOrderController`) |
|
|
|
+> 并发语义 = 同名额多端并发报名不超发,载体 = `occupyQuota` 条件自增(DB 行锁)。
|
|
|
+#### 4.64.7 多端登录会话互斥(SC-X-17)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `POST /api/auth/wechat-login`、`/silent-login`、`/phone-login`、`/switch-role`、`/sso-ticket`、`/sso-login`、`/verify`、`/verifyToken` | 登录族 + token 签发/校验(`AuthController`) |
|
|
|
+| `POST /api/auth/wechat-web/qr`、`/scan`、`/poll` | 微信 web 登录(`WechatWebAuthController`) |
|
|
|
+| `JwtInterceptor` | token 签名/过期校验(无效/过期 → 401,公开路径降级匿名放行) |
|
|
|
+> **⚠ 互斥无载体**:无 token 互斥/单点踢下线(无 tokenVersion/kickout/blacklist/会话注册表;JWT 无状态;SSO 为一次性免登票据非互斥踢出)→ 缺口 X-G-2(同因 EVD-13 SC-P-85 G-5)。
|
|
|
+#### 4.64.8 推送跨端送达(SC-X-18)
|
|
|
+| 路径 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `WechatService.sendTemplateMessage(toUserOpenid, templateId, keywordMap)` | 公众号模板消息(`/cgi-bin/message/template/send`,调用方 `WechatAlertTemplateService`/`PromotionTierEvalService`) |
|
|
|
+| `WechatWaitMsgService.sendWaitMsg(content, label)` | 微信待办 webhook 定向推送(调用方 `WebhookNotificationChannel`) |
|
|
|
+| `POST /api/internal/virtual-pay/notify`(GET URL 验证 + POST 签名校验) | 微信虚拟支付消息推送**接收**端点(`VirtualPayController`,非主动推送) |
|
|
|
+> **⚠ 部分存在**:小程序订阅消息(requestSubscribeMessage/subscribeMessage)前后端全仓 0 命中,`WechatNotificationChannel` isEnabled=false 预留禁用;cfc-langgraph 无推送载体 → 缺口 X-G-3。
|
|
|
+#### 4.64.9 契约缺口(无完整端点载体,需产品侧确认验收方式)
|
|
|
+| SC | 场景 | 现状 | 处置 |
|
|
|
+|----|------|------|------|
|
|
|
+| SC-X-11 | 消息通知闭环(事件挂接/订阅通道) | 五通道框架完整(in_app + wechat-webhook 投产);订单/活动/支付事件未挂接统一分发;微信订阅消息通道 `WechatNotificationChannel` 预留禁用 | 缺口 X-G-1,需产品侧确认 |
|
|
|
+| SC-X-17 | 多端登录会话互斥 | 登录族 + JwtInterceptor token 校验存在;无 token 互斥/单点踢出(JWT 无状态) | 缺口 X-G-2,需产品侧确认(同因 EVD-13 SC-P-85 G-5) |
|
|
|
+| SC-X-18 | 推送跨端送达 | 公众号模板消息 + 微信待办 webhook 已投产;小程序订阅消息(requestSubscribeMessage/subscribeMessage)前后端 0 命中,`WechatNotificationChannel` 预留禁用;cfc-langgraph 无推送 | 缺口 X-G-3,需产品侧确认 |
|
|
|
+> 本批仅登记缺口不实现,转产品/运维侧确认后由后续批次落地。
|
|
|
+*文档更新:2026-11-07(EVD-15 跨角色域剩余 8 SC 契约核对增补「跨角色域剩余」段落 4.64:双角色数据隔离越权 / 文章发布闭环 / 消息通知闭环 / 解绑重分配 / 注销数据导出 / 活动名额并发 / 多端登录互斥 / 推送跨端送达 + 命名回填 2 处 + 契约缺口 3 项。完整核验表见 `docs/superpowers/specs/2026-11-07-cross-role-contract.md`)*
|