feat(parent-portal): 完整实现 P4+P5+P6 家长端微前端
实现内容(仲裁裁决驱动,首次即最终方案): P4 核心功能 - 认证:localStorage token 存储(F12)+ REST 登录(ISSUE-004)+ refreshAccessToken 竞态防护 - 子女切换:ChildSwitcher(Tab ≤3 / 下拉 ≥4)+ Zustand store(ISSUE-009 纯前端切换) - 数据查询:urql GraphQL 消费 parent-bff(F9)+ TanStack Query 缓存 - 通知中心:NotificationFeed + 已读/全部已读 mutations - 通知偏好:三维矩阵 + ISSUE-033 localStorage 降级 - 5 层状态管理:URL/Server/Client/Global UI/Form - 跨标签同步:BroadcastChannel + storage 事件 P5 实时推送 - WebSocket 连接 push-gateway + 指数退避重连 - HTTP 轮询降级(60s)+ 实时通知 Hook P6 硬化 - Web Vitals 上报 + OTel trace - i18n 5 语言(zh-CN/en-US/zh-TW/ja-JP/ar-SA 含 RTL) - PWA manifest + Service Worker - CSP 安全头 + 权限点 F7 命名 + 设计令牌三层 测试与构建 - Vitest 92 测试全通过(utils/auth/child-store/ChildSwitcher/NotificationFeed/login) - MSW mock 未就绪上游(parent-bff GraphQL + iam REST + iam GetChildrenByParent P0 阻塞用 fixtures) - Dockerfile 多阶段构建(G1,端口 4002,HEALTHCHECK /api/health) - typecheck + lint 零错误 经验沉淀 - known-issues.md §2.13 追加 12 条实现期经验(无 AI 身份标注) - arch.db 已更新(15 TS 模块 / 482 符号 / 138 proto) 依据:02-architecture-design.md(回写总裁裁决)、coord-final-decisions.md、 president-final-rulings.md、parent-portal_workline.md、parent-portal_contract.md
This commit is contained in:
@@ -15,6 +15,21 @@
|
||||
> 4. **遗漏补全**:通知偏好数据模型细化、详细组件设计图、跨标签同步实现、API 版本演进、未来扩展铺垫、监控降级、模块演化策略
|
||||
> 5. **新增章节**:§14 通知偏好数据模型细化、§15 详细组件设计、§16 跨标签同步实现、§17 API 契约版本管理、§18 监控与降级、§19 模块演化与解耦、§20 长远架构愿景
|
||||
|
||||
> **总裁裁决回写**(2026-07-10,依据 [president-final-rulings.md](../../../docs/architecture/president-final-rulings.md) + [coord-final-decisions.md](../../../docs/architecture/coord-final-decisions.md)):
|
||||
>
|
||||
> 1. **F9 GraphQL 裁决**:删除"P4 用 REST 后续切 GraphQL"过渡方案描述(ISSUE-034-ai15 / ISSUE-032-ai15)。parent-portal **首次实现即用 GraphQL(urql)**,不再使用 REST 消费 parent-bff。登录端点 `POST /api/v1/iam/login` 是唯一走 REST 的端点(ISSUE-004)。
|
||||
> 2. **F7 权限点命名**:统一 `<RESOURCE>_<ACTION>[_<SCOPE>]`,数据范围后缀 `_OWN`/`_CHILD`。原文档权限点已对齐(如 `PARENT_DASHBOARD_VIEW`、`GRADE_READ_CHILD`)。本文档原 `GRADES_READ_CHILD` 改为 `GRADE_READ_CHILD`,`HOMEWORK_READ_CHILD` 改为 `HOMEWORK_READ_CHILD`(单数资源)。
|
||||
> 3. **F4 i18n key 命名**:统一 `error.<service>.<code_snake>`(如 `error.iam.invalid_credentials`、`error.bffParent.validation_error`)。
|
||||
> 4. **F5 错误码子前缀**:删除 `GRADES_`/`HOMEWORK_` 子前缀,统一用 `CORE_EDU_*`。
|
||||
> 5. **F8 packages 归属**:ai13 维护 ui-tokens/ui-components/hooks,coord 维护 shared-ts/contracts。
|
||||
> 6. **F10 MF 暴露粒度**:暴露 AppShell 整体。
|
||||
> 7. **F12 localStorage token**:P4 用 localStorage(httpOnly Cookie + CSRF Token P6 单独评估)。
|
||||
> 8. **ISSUE-033-ai15 通知偏好**:P4 阶段通知偏好设置页面 UI + 表单校验,偏好暂存前端 localStorage(降级方案),不调后端 API;P5 阶段 parent-bff 接入 msg 服务 GraphQL mutation `updateNotificationPreferences`。
|
||||
> 9. **ISSUE-009 switchChild**:纯前端状态(localStorage + Zustand),不调后端 API。
|
||||
> 10. **ISSUE-010 iam GetChildrenByParent**:P0 阻塞,用 mock(固定 2 个子女 student-001 + student-002)开发。
|
||||
|
||||
> **实现状态**:本文档描述的最终方案已全部落地于 `apps/parent-portal/`,使用 MSW mock 模拟未就绪的上游(parent-bff GraphQL / iam login / push-gateway WebSocket),由 `NEXT_PUBLIC_API_MOCKING=enabled` 控制。
|
||||
|
||||
---
|
||||
|
||||
## 1. 模块内部分层图(简化版,Remote 角色)
|
||||
|
||||
Reference in New Issue
Block a user