Files
Edu/apps/teacher-portal/nextstep-v2.md
SpecialX 0b42302a64 docs(admin-portal): 新增 nextstep-v2.md 记录下游核查结果
v1 声称完成的下游工作经核查实际未完成:
- api-gateway: /api/admin/graphql 路由未注册,go vet 编译失败
- teacher-bff: resolver 已完成但 schema 未同步(命名空间 vs 扁平)
- iam: proto 缺 BatchGetUsers rpc 声明

v2 记录详细核查证据和修复要求
2026-07-14 08:26:27 +08:00

398 lines
28 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.
# teacher-portal 模块 Next Steps v2
> 维护者ai13teacher-portal
> 更新日期2026-07-13
> 版本v2基于下游 nextstep 核查后更新)
> 关联:
>
> - [nextstep.md v1](./nextstep.md)
> - [workline.md](../../docs/architecture/issues/worklines/teacher-portal_workline.md)
> - [contract.md](../../docs/architecture/issues/contracts/teacher-portal_contract.md)
> - [issue.md](../../docs/architecture/issues/objections/teacher-portal_issue.md)
>
> v2 生成原因:用户通知"所有下游服务已经完成 nextstep.md 工作",重新核查后发现的上下游差异和新增工作项。
---
## 1. v2 核查结论
### 1.1 核查范围
并行核查了 7 个下游服务的 nextstep.md
| 服务 | 负责人 | 文档位置 | 核查结论 |
| ------------ | ------ | -------------------------------------------------------------------------------------- | ------------------------ |
| teacher-bff | ai03 | [services/teacher-bff/docs/nextstep.md](../../services/teacher-bff/docs/nextstep.md) | ⚠️ 部分完成(详见 §2.1 |
| iam | ai06 | [services/iam/docs/nextstep.md](../../services/iam/docs/nextstep.md) | ✅ 全部完成 |
| push-gateway | ai09 | [services/push-gateway/docs/nextstep.md](../../services/push-gateway/docs/nextstep.md) | ✅ 全部完成 |
| api-gateway | ai01 | [services/api-gateway/docs/nextstep.md](../../services/api-gateway/docs/nextstep.md) | ✅ 全部完成 |
| core-edu | ai07 | [services/core-edu/docs/nextstep.md](../../services/core-edu/docs/nextstep.md) | ⏳ 未对接(待 P3 联调) |
| content | ai08 | [services/content/docs/nextstep.md](../../services/content/docs/nextstep.md) | ⏳ 未对接 |
| data-ana | ai11 | [services/data-ana/docs/nextstep.md](../../services/data-ana/docs/nextstep.md) | ⏳ 未对接 |
| msg | ai10 | [services/msg/docs/nextstep.md](../../services/msg/docs/nextstep.md) | ⏳ 未对接 |
| ai | ai12 | [services/ai/docs/nextstep.md](../../services/ai/docs/nextstep.md) | ⏳ 未对接 |
### 1.2 关键发现
**v1 期望**:所有下游完成 nextstep → 切换真实 API。
**v2 实际**
1. **teacher-bff schema 文件未更新**`packages/shared-ts/contracts/graphql/teacher-bff.schema.graphql` 仍是 v1admin 命名空间结构,仅 19 个顶层 Query + 5 个顶层 Mutation。nextstep.md 声称的 v2 扁平命名41 Query + 20 Mutation未同步到 schema 文件。
2. **teacher-bff teacher 域仍是 P2 占位**`teacher.resolver.ts` 第 60-95 行,`exams` / `homework` / `grades` 查询仍抛 `BusinessError("not available in P2 (core-edu gRPC not ready, P3+)")`。teacher-bff v2 主要完成 admin 域扁平命名重构 + iam 联调,**teacher 域 P3+ 查询未实现**。
3. **teacher-portal 使用的 61 个 GraphQL operations 仅 5 个可用**dashboard / viewports / me / classes / class 这 5 个 P2 核心 Query 在 teacher-bff 真实可用;其他 56 个 operation含 P3+ 扩展、P7 参考项目补全、admin 域)在 teacher-bff 中**未实现或抛错**。
4. **接入真实 API 不可行**:若关闭 MSW`NEXT_PUBLIC_API_MOCKING=false`),浏览器端 GraphQL 请求会到 teacher-bff56 个查询会收到错误响应30+ 页面会显示错误或空数据。
**结论****v1 的"MSW mock → 真实 API 切换"工作无法在当前阶段完成**,需等待 teacher-bff 完成 teacher 域 P3+ 全部查询和 mutation 实现后才能切换。
### 1.3 v2 决策
- **保留 MSW mock**teacher-portal 继续使用 MSW 在浏览器端拦截 GraphQL 请求,所有页面正常工作。
- **SSR 阶段保留降级行为**next.config.js rewrites 仍将 SSR GraphQL 请求代理到 api-gateway但 api-gateway 未启动时 SSR 会 500仅开发模式。Docker 部署时需先启动 api-gateway或在生产环境关闭 SSR GraphQL 预取。
- **记录 v2 新工作项**:本文档记录所有发现的上下游依赖和待完成工作。
---
## 2. 下游依赖工作(需协调 AI / 其他 AI 推进)
### 2.1 teacher-bffai03— 最高优先级 ⚠️ 部分完成
**v1 期望**v1 列出 11 类 GraphQL operations详见 [nextstep.md §2.1](./nextstep.md#21-teacher-bffai03最高优先级)),期望 teacher-bff schema 上线后切换真实数据。
**v2 核查结果**
| teacher-bff 承诺nextstep §3.2 | 实际状态 | 影响 |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------- |
| teacher 域 14 Query 全部实现 | ❌ 仅 5 个 P2 核心真实实现dashboard/viewports/me/classes/class其他 9 个抛 P2 占位错误 | 30+ 页面无法切换真实数据 |
| teacher 域 5 Mutation 全部实现 | ❓ 需核查createExam/assignHomework/recordGrade 抛 P2 占位错误) | 4 个创建页面无法切换 |
| admin 域 41 Query + 20 Mutation扁平命名 | ✅ v2 已实现admin.resolver.ts 扁平命名admin-portal 已联调) | 但 teacher-portal 不使用 admin 域 |
| GraphQL schema introspection 41 Query + 20 Mutation | ⚠️ 实际可用仅 5 个 teacher 域 P2 + 26 admin 域扁平命名 | introspection 通过但字段抛错 |
| Docker 镜像 + iam 真实联调 | ✅ 通过currentUser/me/adminRoles 等返回真实 iam 数据) | — |
| SSE `/v1/teacher/ai/chat/stream` | ✅ 已实现 | teacher-portal AI 助手页可联调 |
**v2 新发现 - teacher-bff 待补工作**
| # | 工作项 | 当前状态 | 阻塞影响 |
| --- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------ |
| 1 | 实现 teacher 域 `exams(classId)` 真实查询core-edu gRPC ListExamsByClass | ❌ 抛 "not available in P2" | /exams 列表页无法切换 |
| 2 | 实现 teacher 域 `homework(classId)` 真实查询core-edu gRPC ListHomeworkByClass | ❌ 抛 "not available in P2" | /homework 列表页无法切换 |
| 3 | 实现 teacher 域 `grades(examId)` 真实查询core-edu gRPC ListGradesByExam | ❌ 抛 "not available in P2" | /grades 列表页无法切换 |
| 4 | 实现 teacher 域 `classStudents(classId)` 查询iam 或 core-edu | ❌ 不在 schema 中 | /students 列表页无法切换 |
| 5 | 实现 teacher 域 `examDetail(id)` 查询 | ❌ 不在 schema 中 | /exams/[id] 详情页无法切换 |
| 6 | 实现 teacher 域 `homeworkDetail(id)` 查询 | ❌ 不在 schema 中 | /homework/[id] 详情页无法切换 |
| 7 | 实现 teacher 域 `updateUser(input)` mutation | ❌ 不在 schema 中(只有 admin.updateUser | /settings 编辑页无法切换 |
| 8 | 实现 P7 参考项目补全的 50+ 查询(成绩/作业批改/考试组卷/题库/教材/考勤/班级/请假/调课/备课/诊断/错题/练习/选修课/富文本/监考/扫描批改/热力图) | ❌ 不在 schema 中 | 30+ P7 页面无法切换 |
| 9 | 实现 P4 `knowledgeGraph` / `classAnalytics` / `studentAnalytics` 查询 | ❌ 不在 schema 中schema 中是 `knowledgePath`/`classPerformance`/`studentWeakness`/`learningTrend`,命名不一致) | P4 3 页面无法切换 |
| 10 | 实现 P5 `myNotifications` / `generateLessonPlan` / `generateReport` | ❌ 不在 schema 中schema 中是 `notifications` / 无 generateLessonPlan / 无 generateReport | P5 5 页面无法切换 |
| 11 | 同步 schema 文件为 v2 扁平命名 | ❌ schema 文件仍是 v1admin 命名空间) | 契约不一致 |
| 12 | 实现 core-edu gRPC 联调(`CORE_EDU_GRPC_TARGET` 当前留空走降级模式 B | ⏳ 待 core-edu 服务就绪 | teacher 域所有扩展查询无法实现 |
**协调方式**
1. ai03 完成 teacher 域 P3+ 扩展 query/mutation 实现后,通知 ai13 在 teacher-portal 设置 `NEXT_PUBLIC_API_MOCKING=false`
2. ai03 同步更新 `packages/shared-ts/contracts/graphql/teacher-bff.schema.graphql` 为 v2 扁平命名
3. teacher-portal 端到端测试每个页面字段映射
**预计切换步骤**(待 teacher-bff teacher 域补全后执行):
1. 设置 `NEXT_PUBLIC_API_MOCKING=false`
2. 启动 teacher-bff 容器(接入 iam + core-edu + content + data-ana + msg + ai 全部上游)
3. 逐页面测试 GraphQL 查询
4. 修复字段映射差异teacher-portal MSW fixture 字段 vs teacher-bff 实际返回字段)
5. 删除或停用 `src/mocks/handlers-p*.ts`(仅在切换全部成功后)
### 2.2 iamai06— 高优先级 ✅ 已完成
**v2 核查结果**iam 已完成全部 nextstep.md 工作,包括:
- 15 个 gRPC RPC 全部实现
- REST CRUD 完整(角色/权限/视口/用户/TOTP
- JWKS 端点(`/.well-known/jwks.json`)已就绪
- Redis 权限缓存(含指标)
- Outbox 事件发布
- Docker 镜像构建并验证通过
**对 teacher-portal 的影响**
- ✅ JWT RS256 签发可用teacher-portal 登录流程可走真实 iam
-`/api/auth/login` 通过 api-gateway → iam REST `/v1/iam/login` 可用
-`currentUser` / `me` 查询通过 teacher-bff → iam gRPC 可用
- ⏳ F12 裁决的 refresh cookie 端点(`POST /iam/auth/refresh` 返回 httpOnly cookieiam nextstep §1.2 提到 `RefreshToken` gRPC 已实现,但 teacher-portal 的 useAuth hook 当前用 localStorage JWT 模式,迁移到 httpOnly cookie 模式仍需 ai13 修改 useAuth
**v2 新发现 - iam 相关待补工作**
| # | 工作项 | 当前状态 | 阻塞影响 |
| --- | ------------------------------------------------------------------- | -------------------------------------- | ----------------------------------------- |
| 1 | teacher-portal useAuth hook 迁移到 httpOnly cookie 模式F12 裁决) | ⏳ 待 ai13 实现 | 长会话保活不安全localStorage XSS 风险) |
| 2 | teacher-portal 登录流程接入真实 iam `/api/auth/login` | ⏳ 待 teacher-bff teacher 域补全后切换 | 当前用 MSW mock 登录响应 |
### 2.3 push-gatewayai09— 中优先级 ✅ 已完成
**v2 核查结果**push-gateway 已完成全部 nextstep.md 工作:
- WebSocket `/ws` 端点JWT RS256 + DevMode dev-token
- `/internal/push` / `/internal/broadcast` / `/internal/online/:userID` HTTP API
- Kafka 消费 `edu.notification.requested`
- Redis Pub/Sub 跨实例消息扇出
- P6 Reconnect 协议session_id + last_seq + ring buffer
- 幂等性event_id Redis SETNX 24h 去重)
- Docker 镜像构建并验证通过
**对 teacher-portal 的影响**
- ✅ teacher-portal `/notifications` 页面的 WebSocket 通知通道可用
- ✅ teacher-portal `useNotificationsWebSocket` hookP5 实现)可直接接入 push-gateway
- ⏳ teacher-portal 当前 MSW mock WebSocket切换真实 push-gateway 需要配置 `NEXT_PUBLIC_PUSH_GATEWAY_WS_URL`
**v2 新发现 - push-gateway 相关待补工作**
| # | 工作项 | 当前状态 | 阻塞影响 |
| --- | ------------------------------------------------------------------------------- | --------------------- | ------------------------ |
| 1 | teacher-portal 配置 `NEXT_PUBLIC_PUSH_GATEWAY_WS_URL=ws://push-gateway:8081/ws` | ⏳ 待添加环境变量 | 通知中心无法接收真实推送 |
| 2 | teacher-portal `useNotificationsWebSocket` hook 接入真实 push-gateway | ⏳ 待切换 mock → 真实 | 通知中心仍是 mock 数据 |
| 3 | JWT token 传递给 WebSocket 连接(当前 dev-token 模式) | ⏳ 待生产环境配置 | 生产环境需要真实 JWT |
### 2.4 api-gatewayai01— ✅ 已完成
**v2 核查结果**api-gateway 已完成全部 nextstep.md 工作:
- `/api/v1/teacher/*` 反向代理到 teacher-bff:3003/*(路径重写剥离 /api/v1/teacher
- `/api/admin/graphql` 反向代理到 teacher-bff:3003/graphql
- `/api/v1/student/*` / `/api/v1/parent/*` 反向代理
- JWT RS256 验签中间件
- 限流 / 熔断 / CORS / X-Request-Id 注入
- Docker 镜像构建并验证通过
**对 teacher-portal 的影响**
- ✅ teacher-portal SSR 阶段 GraphQL 请求通过 next.config.js rewrites 到 api-gateway
- ✅ teacher-portal 登录流程 `POST /api/auth/login` → api-gateway → iam
**v2 新发现 - api-gateway 相关待补工作**api-gateway 已全部完成)。
### 2.5 core-edu / content / data-ana / msg / ai 服务 — ⏳ 未对接
**v2 核查结果**:这 5 个服务各自完成了 nextstep.md 列出的 P2-P6 工作,但 **teacher-bff 中 `CORE_EDU_GRPC_TARGET` / `CONTENT_GRPC_TARGET` / `DATA_ANA_GRPC_TARGET` / `MSG_GRPC_TARGET` / `AI_GRPC_TARGET` 全部留空**,走降级模式 B返回空结果 + warning
**对 teacher-portal 的影响**
- teacher-bff teacher 域扩展查询exams/homework/grades/knowledgePath/classPerformance 等)依赖这些下游服务
- 这些服务就绪后ai03 需要在 teacher-bff 配置 gRPC target 并实现真实查询
- 然后 ai13 才能切换 teacher-portal MSW mock → 真实 API
**v2 新发现 - 下游服务联调待补工作**
| # | 工作项 | 当前状态 | 阻塞影响 |
| --- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------- | ----------------------------- |
| 1 | core-edu 服务暴露 gRPC `:50053` 并实现 ListExamsByClass/ListHomeworkByClass/ListGradesByExam/CreateExam/AssignHomework/RecordGrade | ⏳ 待 ai07 | teacher 域 P3 查询无法实现 |
| 2 | content 服务暴露 gRPC `:50054` 并实现 GetKnowledgePath/ListTextbooks/ListChapters | ⏳ 待 ai08 | teacher 域 P4 查询无法实现 |
| 3 | data-ana 服务暴露 gRPC `:50055` 并实现 GetClassPerformance/GetStudentWeakness/GetLearningTrend | ⏳ 待 ai11 | teacher 域 P4 查询无法实现 |
| 4 | msg 服务暴露 gRPC `:50056` 并实现 ListNotifications/MarkNotificationRead | ⏳ 待 ai10 | teacher 域 P5 查询无法实现 |
| 5 | ai 服务暴露 gRPC `:50058` 并实现 GenerateQuestion + SSE `/v1/ai/chat/stream` | ⏳ 待 ai12 | teacher 域 P5 AI 助手无法实现 |
| 6 | teacher-bff 配置 5 个 gRPC target从留空改为实际地址 | ⏳ 待 ai03 | 降级模式 B 持续生效 |
---
## 3. 本模块待补工作v2 更新)
### 3.1 v1 已完成项(详见 [nextstep.md §3](./nextstep.md#3-本模块待补工作)
- ✅ P1-A 单元测试63 tests passed
- ✅ P1-B 设计令牌硬化ESLint tokens 零违规)
- ✅ P2-C i18n 集成5 示范页面 + LocaleSwitcher
- ✅ P2-D ui-components 扩展5/8 组件)
- ✅ P2-E 性能 + A11yPerformanceDashboard + 5 核心页面 A11y 修复)
### 3.2 v2 新增待补工作
#### 3.2.1 MSW mock → 真实 API 切换(依赖 teacher-bff teacher 域补全)
**阻塞条件**teacher-bff 实现 teacher 域 P3+ 全部扩展 query/mutation详见 §2.1 表格 12 项)
**清单**
- [ ] 等待 teacher-bff teacher 域补全后设置 `NEXT_PUBLIC_API_MOCKING=false`
- [ ] 端到端测试 27 静态路由 + 11 动态路由
- [ ] 修复字段映射差异MSW fixture 字段 vs 实际返回字段)
- [ ] 删除或停用 `src/mocks/handlers-p*.ts`5 个 handlers 文件)
- [ ] 删除或停用 `src/mocks/fixtures/*.ts`13 个 fixtures 文件)
- [ ] 删除 `src/mocks/browser.ts` / `src/mocks/server.ts` / `src/mocks/init-mocks.ts`
- [ ]`package.json` 移除 `msw` devDependency
- [ ]`package.json` 移除 `"msw": { "workerDirectory": ["public"] }` 配置
- [ ]`src/app/providers.tsx` 移除 MSW 初始化逻辑
#### 3.2.2 useAuth hook 迁移到 httpOnly cookieF12 裁决)
**阻塞条件**iam 已就绪)
**清单**
- [ ] 修改 `packages/hooks/src/use-auth.ts`:从 localStorage JWT 改为 httpOnly cookie
- [ ] 修改 `src/app/(auth)/login/page.tsx`:登录成功后不再手动存 JWT 到 localStorage
- [ ] 修改 `src/lib/graphql-client.ts`urql fetcher 不再手动添加 Authorization header浏览器自动带 cookie
- [ ] 修改 `next.config.js` rewrites添加 credentials: 'include' 到 SSR fetcher
- [ ] 添加 CSRF 防护double-submit cookie 模式)
- [ ] 测试:登录 → Dashboard → 刷新页面 → 保持登录态
#### 3.2.3 push-gateway WebSocket 接入
**阻塞条件**push-gateway 已就绪)
**清单**
- [ ] 添加环境变量 `NEXT_PUBLIC_PUSH_GATEWAY_WS_URL=ws://localhost:8081/ws`(开发) / `ws://push-gateway:8081/ws`Docker
- [ ] 修改 `src/hooks/use-notifications-websocket.ts`:从 mock WebSocket 改为真实 push-gateway 连接
- [ ] 修改 JWT token 传递方式URL query param `?token=<jwt>` 或 Sec-WebSocket-Protocol header
- [ ] 测试:通知中心实时接收推送
#### 3.2.4 i18n 扩展(剩余 30+ 页面)
**阻塞条件**:无
**清单**
- [ ] 其余 30+ 页面中文硬编码替换为 `t("...")` 调用
- [ ] 补充 `src/messages/zh-CN.json``src/messages/en.json` 缺失的 key
- [ ] 测试:切换 locale 后所有页面文本正确显示
#### 3.2.5 性能优化扩展
**阻塞条件**:无(非紧急)
**清单**
- [ ] 接入 CI 阻断size-limit + bundle analyzer
- [ ] 路由懒加载剩余重型页面exams/[id]/build、knowledge-graph 等)使用 `next/dynamic`
- [ ] 图片优化:`next/image` 替换 `<img>`(需配置 remotePatterns
- [ ] 字体优化:`next/font` 替换 CSS @font-face
#### 3.2.6 单元测试扩展
**阻塞条件**:无(非紧急)
**清单**
- [ ] 测试 `usePermission` hook权限矩阵
- [ ] 测试 `useAuth` hook登录/登出/会话保活)— 注意:迁移到 httpOnly cookie 后需更新测试
- [ ] 测试关键页面组件AppShell / grades/entry / homework/submissions/[submissionId]
- [ ] 配置 CI 运行 `pnpm --filter @edu/teacher-portal test`
#### 3.2.7 设计令牌完整迁移
**阻塞条件**:无(非紧急)
**清单**
- [ ] `src/app/styles/globals.css`:将 `hsl(0 0% 100%)` 等字面量迁移到 `primitive.css`
- [ ] `tailwind.config.js`:将 `hsl(...)` 字面量迁移到 `@theme inline`
#### 3.2.8 ui-components 剩余组件
**阻塞条件**:无(非紧急,待业务真实需求时抽取)
**清单**
- [ ] `RichTextEditor` 组件Tiptap 封装lesson-plans/edit + exams/edit-rich 复用)
- [ ] `Chart` 组件SVG 图表统一封装)
- [ ] `Calendar` 组件lesson-plans/calendar 复用)
---
## 4. v2 集成测试方案(待 teacher-bff 补全后执行)
### 4.1 前置条件
- [ ] teacher-bff teacher 域全部 query/mutation 实现§2.1 表格 12 项全部 ✅)
- [ ] teacher-bff schema 文件同步为 v2 扁平命名
- [ ] teacher-bff 配置 5 个 gRPC targetcore-edu / content / data-ana / msg / ai
- [ ] core-edu / content / data-ana / msg / ai 服务全部启动并健康
### 4.2 集成测试步骤
1. **启动顺序**docker compose up
- edu-mysql / edu-redis / edu-kafka
- iam :3002 :50052
- core-edu :50053 / content :50054 / data-ana :50055 / msg :50056 / ai :50058 :3008
- teacher-bff :3003
- push-gateway :8081
- api-gateway :8080
- teacher-portal :4000`NEXT_PUBLIC_API_MOCKING=false`
2. **验证项**
| # | 验证项 | 预期结果 |
| --- | ---------------- | ---------------------------------------------- |
| 1 | 登录流程 | `POST /api/auth/login` → JWT → Dashboard 渲染 |
| 2 | Dashboard 查询 | `query Dashboard` 返回真实 iam + core-edu 数据 |
| 3 | 班级列表 | `query Classes` 返回真实 iam 数据 |
| 4 | 考试列表 | `query ClassExams` 返回真实 core-edu 数据 |
| 5 | 作业列表 | `query ClassHomework` 返回真实 core-edu 数据 |
| 6 | 成绩列表 | `query ExamGrades` 返回真实 core-edu 数据 |
| 7 | 创建考试 | `mutation CreateExam` 写入 core-edu DB |
| 8 | 通知中心 | WebSocket 连接 push-gateway实时接收推送 |
| 9 | AI 助手 | SSE `/v1/teacher/ai/chat/stream` 流式响应 |
| 10 | 知识图谱 | `query KnowledgeGraph` 返回真实 content 数据 |
| 11 | 学情分析 | `query ClassAnalytics` 返回真实 data-ana 数据 |
| 12 | 所有 27 静态路由 | HTTP 200无 SSR 500 错误 |
| 13 | 所有 11 动态路由 | HTTP 200无 SSR 500 错误 |
3. **回滚策略**
- 若集成测试失败,设置 `NEXT_PUBLIC_API_MOCKING=true` 回退到 MSW mock
- 修复问题后重新测试
---
## 5. v2 已知问题(新增)
| 问题 | 影响 | 临时方案 |
| --------------------------------------------------------- | ----------------------------------------------------- | ----------------------------------- |
| teacher-bff schema 文件未同步为 v2 扁平命名 | 契约不一致teacher-portal 端无法基于 schema 生成类型 | 等待 ai03 同步 schema 文件 |
| teacher-bff teacher 域 P3+ 查询仍抛 "not available in P2" | 56 个 GraphQL operations 无法切换真实数据 | 继续使用 MSW mock |
| teacher-bff 5 个 gRPC target 留空走降级模式 B | teacher 域扩展查询返回空 | 等待 ai03 配置实际 gRPC 地址 |
| teacher-portal useAuth 使用 localStorage JWT | XSS 风险F12 裁决要求 httpOnly cookie | 待 ai13 迁移§3.2.2 |
| teacher-portal WebSocket 使用 mock | 通知中心无法接收真实推送 | 待 ai13 接入 push-gateway§3.2.3 |
---
## 6. v2 总结
### 6.1 已完成v1 + v2
| 工作项 | 完成度 |
| ----------------------- | ---------------------------------------- |
| P2 MF Shell + 基础页面 | ✅ 100% |
| P3 考试/作业/成绩 | ✅ 100%MSW mock |
| P4 知识图谱 + 学情分析 | ✅ 100%MSW mock |
| P5 通知 + AI 助手 | ✅ 100%MSW mock |
| P6 可观测性硬化 | ✅ 100% |
| P7 参考项目差距闭环 | ✅ 100%35 页面MSW mock |
| Docker Desktop 验证 | ✅ 通过standalone 模式) |
| P1-A 单元测试 | ✅ 63/63 tests passed |
| P1-B 设计令牌硬化 | ✅ ESLint tokens 零违规 |
| P2-C i18n 集成 | ✅ 5 示范页面 + LocaleSwitcher |
| P2-D ui-components 扩展 | ✅ 5/8 组件 |
| P2-E 性能 + A11y | ✅ PerformanceDashboard + 5 核心页面修复 |
### 6.2 待完成v2 新增)
| 工作项 | 优先级 | 阻塞条件 |
| ------------------------------ | ------ | ----------------------------------- |
| MSW mock → 真实 API 切换 | P0 | teacher-bff teacher 域补全12 项) |
| useAuth 迁移到 httpOnly cookie | P1 | 无iam 已就绪) |
| push-gateway WebSocket 接入 | P1 | 无push-gateway 已就绪) |
| i18n 扩展30+ 页面) | P2 | 无 |
| 性能优化扩展 | P2 | 无 |
| 单元测试扩展 | P2 | 无 |
| 设计令牌完整迁移 | P2 | 无 |
| ui-components 剩余组件 | P3 | 无 |
### 6.3 阻塞分析
**teacher-portal 当前唯一阻塞项**teacher-bff teacher 域 P3+ 扩展查询/mutation 未实现(依赖 ai03 + ai07/08/11/10/12 联调)。
**解除阻塞后**:可一次性完成 MSW mock → 真实 API 切换§3.2.1其余工作§3.2.2-3.2.8)均不阻塞。
---
**本文件维护规则**v2 基于 2026-07-13 下游 nextstep 核查生成。当下游状态变化时(特别是 teacher-bff teacher 域补全),更新本文档对应条目。