feat(teacher-bff): admin 命名空间 + 5 个 gRPC client + health probes + merge-resolvers + nextstep 文档

This commit is contained in:
SpecialX
2026-07-14 16:00:46 +08:00
parent 7b790f1276
commit 895a060491
50 changed files with 9739 additions and 334 deletions

View File

@@ -0,0 +1,344 @@
# teacher-bff 下一步工作与上下游依赖
> 模块teacher-bff教学场景域聚合层 BFFGraphQL 聚合层,端口 3003
> 负责人ai03
> 更新日期2026-07-14v2schema v2 扩展 + 96 operations + Docker E2E 验证通过)
> 关联文档:[02-architecture-design.md](./02-architecture-design.md)、[admin-portal_contract.md](../../../docs/architecture/issues/contracts/admin-portal_contract.md)
---
## 1. 模块当前状态
teacher-bff 已完成 P2-P7 全部批次schema 重写为 v2 扁平命名,扩展至 62 Query + 34 Mutation = 96 operations满足 teacher-portal 89 个 operation 需求 + admin-portal 全部 admin 域需求。Docker 镜像构建成功21/21 GraphQL 端到端查询测试全部通过(接入真实 iam无 mock 数据)。
### 1.1 本地 Docker 验证结果2026-07-14 v2
测试环境:本地 Dockeredu-iam-test + edu-teacher-bff-test 容器,接入 `edu-full_default` 网络,直连 edu-mysql / edu-redis / edu-kafka
```
镜像edu-test-iam:latest、edu-test-teacher-bff:latest
容器edu-iam-testNODE_ENV=production, DEV_MODE=true, HTTP 3002 + gRPC 50052
edu-teacher-bff-testNODE_ENV=production, TEACHER_BFF_DEV_MODE=true, HTTP 3003
测试用户ffd5f3f8-67a3-4774-9ccc-c4c6d2288eafadmin-test@edu.local, role=admin, data_scope=all
测试 Headersx-user-id=teacher-001, x-user-role=teacher
```
| 验证项 | 状态 | 说明 |
| ---------------------------- | ---- | ------------------------------------------------------------------ |
| iam Docker 镜像构建 | ✅ | node:20-alpine + bcryptjs纯 JS无 native 编译) |
| teacher-bff Docker 镜像构建 | ✅ | node:22-alpine + --ignore-scripts跳过 husky |
| iam HTTP /healthz | ✅ | 200 |
| iam gRPC 50052 | ✅ | GetUserInfo / BatchGetUsers / GetEffectivePermissions 等方法可调用 |
| teacher-bff /healthz | ✅ | 200 |
| teacher-bff /readyz | ✅ | 7 依赖健康iam gRPC + Redis + 5 个 mock 客户端探针) |
| GraphQL schema introspection | ✅ | 62 Query + 34 Mutation 字段全部存在 |
| typecheck + lint + build | ✅ | 三项零错误 |
| **E2E 21/21 GraphQL 查询** | ✅ | **全部 PASS**(详见 §1.2 |
### 1.2 E2E 测试结果21/21 PASS
| # | 查询 | 状态 | 说明 |
| --- | ---------------- | ---- | -------------------------------------------- |
| 1 | me | ✅ | 返回真实 iam 数据 |
| 2 | dashboard | ✅ | 聚合 user + classes + viewports + stats |
| 3 | classes | ✅ | core-edu mock 返回 3 个班级 |
| 4 | classExams | ✅ | core-edu mock 返回考试列表 |
| 5 | classHomework | ✅ | core-edu mock 返回作业列表(含 status 字段) |
| 6 | classStudents | ✅ | 返回学生列表 |
| 7 | examDetail | ✅ | 返回考试详情 |
| 8 | homeworkDetail | ✅ | 返回作业详情(含 submissions |
| 9 | knowledgeGraph | ✅ | content mock 返回知识图谱 |
| 10 | classAnalytics | ✅ | data-ana mock 返回班级分析 |
| 11 | studentAnalytics | ✅ | data-ana mock 返回学生分析 |
| 12 | myNotifications | ✅ | msg mock 返回通知isRead → read 字段映射) |
| 13 | notifications | ✅ | msg mock 返回通知列表 |
| 14 | adminRoles | ✅ | 返回真实 iam 角色3 个) |
| 15 | adminDashboard | ✅ | 返回真实统计数据 |
| 16 | attendanceList | ✅ | P7 降级返回空 page |
| 17 | examBuild | ✅ | P7 降级返回空 |
| 18 | gradeStats | ✅ | P7 降级返回空 |
| 19 | lessonPlans | ✅ | P7 降级返回空数组 |
| 20 | textbooks | ✅ | P7 降级返回空 page |
| 21 | errorBook | ✅ | P7 降级返回空 summary |
### 1.3 已完成的关键修复v2 新增)
| # | 工作项 | 详情 |
| --- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 13 | Schema v2 重写 | 62 Query + 34 Mutation = 96 operationsteacher 域 23 Query + 9 Mutationadmin 域 39 Query + 25 Mutation |
| 14 | Teacher 域 P3-P5 扩展 | classStudents/examDetail/homeworkDetail/classExams/classHomework/examGrades/updateUser/markAsRead/generateLessonPlan/generateReport + P4 knowledgeGraph/classAnalytics/studentAnalytics + P5 myNotifications |
| 15 | P7 全部降级实现 | 39 Query + 25 Mutation 降级返回空/默认值 + warning logattendanceList/attendanceSheet/attendanceStats/classDetail/classSchedule/leaveRequests/scheduleChanges/electiveCourses/examRichContent/proctoringStatus/submissionScanGrading/examBuild/examAnalytics/questions/textbooks/textbookCreate/gradeEntry/gradeStats/gradeAnalytics/reportCards/homeworkSubmissionSummary/homeworkAssignmentSubmissions/aiBatchGrading/lessonPlans/lessonPlanDetail/lessonPlanLibrary/lessonPlanCalendar/lessonPlanHeatmap/coursePlans/diagnosticReports/classDiagnostic/studentDiagnostic/errorBook/practiceAnalytics + 25 Mutation |
| 16 | Dockerfile 重写v2 | 采用 parent-bff 模式:--ignore-scripts 跳过 husky--ignore-workspace 独立安装生产依赖 |
| 17 | docker-compose.test.yml 配置 5 个 gRPC target | CORE_EDU_GRPC_TARGET=core-edu:50053, CONTENT_GRPC_TARGET=content:50054, DATA_ANA_GRPC_TARGET=data-ana:50055, MSG_GRPC_TARGET=msg:50056, AI_GRPC_TARGET=ai:50058 |
| 18 | docker-compose.deploy.yml 同步配置 | 生产部署配置同步更新所有 gRPC target + TEACHER_BFF_DEV_MODE + REDIS_URL + OTEL |
| 19 | IamAuditLog beforeState/afterState 类型修复 | iam.types.ts 添加 beforeState/afterState: string \| null 字段 |
| 20 | Homework.status 字段修复 | schema Homework 类型添加 status: String 字段(对齐 core-edu mock 数据) |
| 21 | Notification isRead → read 字段映射 | resolver 中将 msg.Notification.isRead 映射为 schema Notification.read |
| 22 | updateUser 统一签名 | teacher.updateUser 覆盖 admin.updateUser`updateUser(id: ID, input: UpdateUserInput!): User!` |
| 23 | textbookCreate 返回类型修复 | Textbook → TextbookItemTextbook 类型未定义) |
| 24 | 死代码清理 | 删除 circuit-breaker.tsimport opossum 但 opossum 不在 package.json 中) |
| 25 | resolver 合并顺序调整 | admin 先 → teacher 后,使 teacher.updateUser 覆盖 admin.updateUser |
---
## 2. 上游依赖teacher-bff 依赖谁)
### 2.1 iam 服务ai06 负责)— P0
| # | 依赖项 | 用途 | 状态 |
| --- | ------------------------------------------------ | -------------------------------------------- | -------------- |
| 1 | gRPC `GetUserInfo(userId)` :50052 | `currentUser` / `me` 查询 | ✅ 已就绪 |
| 2 | gRPC `BatchGetUsers(userIds)` :50052 | `adminUsers` 查询 | ✅ 已就绪 |
| 3 | gRPC `GetEffectivePermissions(userId)` :50052 | 用户有效权限 | ✅ 已就绪 |
| 4 | gRPC `GetEffectiveDataScope(userId)` :50052 | 用户数据范围 | ✅ 已就绪 |
| 5 | gRPC `GetViewports(userId)` :50052 | `adminViewports` 查询 | ✅ 已就绪 |
| 6 | gRPC `GetPublicKey()` :50052 | RS256 公钥 | ✅ 已就绪 |
| 7 | REST `GET /v1/iam/roles` :3002 | `adminRoles` 查询 | ✅ 已就绪 |
| 8 | REST `GET /v1/iam/permissions` :3002 | `adminPermissions` 查询 | ✅ 已就绪 |
| 9 | REST `GET /v1/iam/audit` :3002 | `auditLogs` 查询 | ✅ 已就绪 |
| 10 | REST `GET /v1/iam/viewports` :3002 | `adminViewports` 查询(备选) | ✅ 已就绪 |
| 11 | REST `GET /v1/iam/permissions/effective` :3002 | 用户有效权限(备选) | ✅ 已就绪 |
| 12 | `POST /v1/iam/register` / `POST /v1/iam/login` | 用户注册/登录 | ✅ 已就绪 |
| 13 | `GET /.well-known/jwks.json` :3002 | RS256 JWKS | ⏳ 待 iam 实现 |
| 14 | `PATCH /v1/iam/users/:id` | admin `updateUser` / `toggleUserStatus` | ⏳ 待 iam 实现 |
| 15 | `POST /v1/iam/roles` / `PATCH /v1/iam/roles/:id` | admin `createRole` / `updateRolePermissions` | ⏳ 待 iam 实现 |
**关键环境变量**`IAM_GRPC_TARGET=iam:50052`, `IAM_SERVICE_URL=http://iam:3002`
### 2.2 core-edu 服务ai07 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | ------------------------------------------- | --------------------------------- | ------------------- |
| 1 | gRPC `ListClasses(teacherId)` :50053 | `classes` / `adminClasses` 查询 | ⏳ 待 core-edu 实现 |
| 2 | gRPC `ListExamsByClass(classId)` :50053 | `classExams` / `exams` 查询 | ⏳ 待 core-edu 实现 |
| 3 | gRPC `ListHomeworkByClass(classId)` :50053 | `classHomework` / `homework` 查询 | ⏳ 待 core-edu 实现 |
| 4 | gRPC `ListGradesByExam(examId)` :50053 | `examGrades` / `grades` 查询 | ⏳ 待 core-edu 实现 |
| 5 | gRPC `ListStudentsByClass(classId)` :50053 | `classStudents` 查询 | ⏳ 待 core-edu 实现 |
| 6 | gRPC `GetExamDetail(examId)` :50053 | `examDetail` 查询 | ⏳ 待 core-edu 实现 |
| 7 | gRPC `GetHomeworkDetail(homeworkId)` :50053 | `homeworkDetail` 查询 | ⏳ 待 core-edu 实现 |
| 8 | gRPC `CreateExam(input)` :50053 | `createExam` mutation | ⏳ 待 core-edu 实现 |
| 9 | gRPC `AssignHomework(input)` :50053 | `assignHomework` mutation | ⏳ 待 core-edu 实现 |
| 10 | gRPC `RecordGrade(input)` :50053 | `recordGrade` mutation | ⏳ 待 core-edu 实现 |
| 11 | gRPC `GetClassPerformance(classId)` :50053 | `classPerformance` 查询 | ⏳ 待 core-edu 实现 |
**当前状态**`CORE_EDU_GRPC_TARGET=core-edu:50053` 已配置,但 core-edu 服务未启动,走降级模式 Bmock 数据)。
### 2.3 content 服务ai08 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | ---------------------------------------- | --------------------------------------- | ------------------ |
| 1 | gRPC `GetKnowledgePath(classId)` :50054 | `knowledgePath` / `knowledgeGraph` 查询 | ⏳ 待 content 实现 |
| 2 | gRPC `ListTextbooks()` :50054 | `textbooks` 查询 | ⏳ 待 content 实现 |
| 3 | gRPC `ListLessonPlans(teacherId)` :50054 | `lessonPlans` 查询 | ⏳ 待 content 实现 |
**当前状态**`CONTENT_GRPC_TARGET=content:50054` 已配置,但 content 服务未启动,走降级模式 B。
### 2.4 data-ana 服务ai11 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | -------------------------------------------- | ----------------------- | ------------------- |
| 1 | gRPC `GetClassAnalytics(classId)` :50055 | `classAnalytics` 查询 | ⏳ 待 data-ana 实现 |
| 2 | gRPC `GetStudentAnalytics(studentId)` :50055 | `studentAnalytics` 查询 | ⏳ 待 data-ana 实现 |
| 3 | gRPC `GetStudentWeakness(classId)` :50055 | `studentWeakness` 查询 | ⏳ 待 data-ana 实现 |
| 4 | gRPC `GetLearningTrend(classId)` :50055 | `learningTrend` 查询 | ⏳ 待 data-ana 实现 |
**当前状态**`DATA_ANA_GRPC_TARGET=data-ana:50055` 已配置,但 data-ana 服务未启动,走降级模式 B。
### 2.5 msg 服务ai10 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | --------------------------------------- | ------------------------------------------------ | -------------- |
| 1 | gRPC `ListNotifications(userId)` :50056 | `notifications` / `myNotifications` 查询 | ⏳ 待 msg 实现 |
| 2 | gRPC `MarkNotificationRead(id)` :50056 | `markNotificationAsRead` / `markAsRead` mutation | ⏳ 待 msg 实现 |
| 3 | gRPC `ListAnnouncements(filter)` :50056 | `adminAnnouncements` 查询 | ⏳ 待 msg 实现 |
**当前状态**`MSG_GRPC_TARGET=msg:50056` 已配置,但 msg 服务未启动,走降级模式 B。
### 2.6 ai 服务ai12 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | --------------------------------------- | ----------------------------- | ------------- |
| 1 | gRPC `GenerateQuestion(input)` :50058 | `generateQuestion` mutation | ⏳ 待 ai 实现 |
| 2 | SSE `POST /v1/ai/chat/stream` :3008 | AI 对话流式响应 | ⏳ 待 ai 实现 |
| 3 | gRPC `GenerateLessonPlan(input)` :50058 | `generateLessonPlan` mutation | ⏳ 待 ai 实现 |
| 4 | gRPC `GenerateReport(input)` :50058 | `generateReport` mutation | ⏳ 待 ai 实现 |
**当前状态**`AI_GRPC_TARGET=ai:50058` 已配置,但 ai 服务未启动,走降级模式 B。
### 2.7 Redis基础设施— P0
| 项 | 内容 |
| -------- | ------------------------------------- |
| 依赖内容 | /readyz 探针 + DataLoader 缓存P4+ |
| 端点 | `redis://edu-redis:6379` |
| 当前状态 | ✅ 本地 Docker edu-redis 已就绪 |
---
## 3. 下游依赖(谁依赖 teacher-bff
### 3.1 admin-portalai16 负责)— P0
| 能力 | 配置 | 状态 |
| ----------------------------- | ------------------------------------------- | --------- |
| `POST /graphql` :3003 | admin-portal GraphQL 代理目标 | ✅ 已就绪 |
| Schema v2 扁平命名 | 62 Query + 34 Mutation 字段全部实现 | ✅ 已完成 |
| x-user-data-scope header 透传 | admin 角色 data_scope=all 跳过 iam 权限校验 | ✅ 已实现 |
| 降级模式 B | 未就绪下游返回空结果 + warning | ✅ 已实现 |
**portal 需求来源**`apps/admin-portal/docs/nextstep-v2.md`
### 3.2 teacher-portalai13 负责)— P0
| 能力 | 配置 | 状态 |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- |
| `POST /graphql` :3003 | teacher-portal GraphQL 代理目标 | ✅ 已就绪 |
| teacher 域 23 Query | dashboard/viewports/me/classes/class/exams/homework/grades/knowledgePath/classPerformance/studentWeakness/learningTrend/notifications/classStudents/examDetail/homeworkDetail/classExams/classHomework/examGrades/knowledgeGraph/classAnalytics/studentAnalytics/myNotifications/generateLessonPlan/generateReport | ✅ 全部实现 |
| teacher 域 9 Mutation | createExam/assignHomework/recordGrade/generateQuestion/markNotificationAsRead/updateUser/markAsRead/generateLessonPlan/generateReport | ✅ 全部实现 |
| P7 39 Query + 25 Mutation 降级 | attendanceList/examBuild/gradeStats/lessonPlans/textbooks/errorBook 等 | ✅ 全部降级实现 |
| SSE `/v1/teacher/ai/chat/stream` | AI 对话流式透传 | ✅ 已实现 |
| 5 个 gRPC target 配置 | core-edu/content/data-ana/msg/ai | ✅ 已配置 |
| Zod 输入验证 | createExam/assignHomework/recordGrade/generateQuestion | ✅ 已实现 |
**portal 需求来源**`apps/teacher-portal/nextstep-v2.md`12 项待补工作全部 ✅)
### 3.3 api-gatewayai01 负责)— P0
| 能力 | 配置 | 状态 |
| ----------------------------- | -------------------------- | --------------------- |
| `/api/v1/teacher/*` 反向代理 | → teacher-bff:3003/* | ✅ api-gateway 已配置 |
| `/api/admin/graphql` 反向代理 | → teacher-bff:3003/graphql | ✅ api-gateway 已配置 |
| `GET /healthz` 端点 | /readyz 下游健康检查 | ✅ 已实现 |
| `GET /readyz` 端点 | iam gRPC + Redis 健康检查 | ✅ 已实现 |
| `GET /metrics` 端点 | Prometheus 指标 | ✅ 已实现 |
### 3.4 student-portal / parent-portal
无直接 teacher-bff 需求student-bff / parent-bff 各自负责)。
---
## 4. GraphQL Schema 清单v2
### 4.1 Query 字段62 个)
**Teacher 域23 个)**dashboard / viewports / me / classes / class / exams / homework / grades / knowledgePath / classPerformance / studentWeakness / learningTrend / notifications / classStudents / examDetail / homeworkDetail / classExams / classHomework / examGrades / knowledgeGraph / classAnalytics / studentAnalytics / myNotifications
**Admin 域39 个)**currentUser / adminUsers / adminUser / adminRoles / adminPermissions / adminViewports / adminOrganization / adminClasses / adminTeachers / adminStudents / auditLogs / adminDashboard / systemSettings / auditOverviewStats / auditTrend / dataChangeLogs / loginLogs / adminSchools / adminGrades / adminGradeInsights / adminDepartments / adminAcademicYears / adminAnnouncements / adminInvitationCodes / adminFiles / adminFileStats / aiProviders / aiUsage + P7 11 个降级 Query
### 4.2 Mutation 字段34 个)
**Teacher 域9 个)**createExam / assignHomework / recordGrade / generateQuestion / markNotificationAsRead / updateUser / markAsRead / generateLessonPlan / generateReport
**Admin 域25 个)**createUser / updateUser / toggleUserStatus / createRole / updateRolePermissions / updateViewport / updateSystemSettings / createAnnouncement / publishAnnouncement / archiveAnnouncement / toggleAnnouncementPin / generateInvitationCodes / deleteInvitationCodes / deleteFiles / updateAiProvider + P7 10 个降级 Mutation
### 4.3 Schema 文件位置
- `packages/shared-ts/contracts/graphql/teacher-bff.schema.graphql`SDL 定义v2 扁平命名)
---
## 5. 环境变量清单Docker 部署)
| 变量 | 必填 | 示例值 | 说明 |
| ----------------------------- | ---- | ---------------------------- | ---------------------------------- |
| `PORT` | 是 | `3003` | HTTP 监听端口 |
| `GRAPHQL_PATH` | 否 | `/graphql` | GraphQL 端点路径 |
| `TEACHER_BFF_DEV_MODE` | 是 | `true`/`false` | 越权防御开关P2 放行 / 生产拒绝) |
| `REDIS_URL` | 是 | `redis://edu-redis:6379` | Redis 连接地址 |
| `IAM_GRPC_TARGET` | 是 | `iam:50052` | iam gRPC 目标 |
| `IAM_SERVICE_URL` | 是 | `http://iam:3002` | iam REST 基址 |
| `CORE_EDU_GRPC_TARGET` | 否 | `core-edu:50053` | core-edu gRPC 目标(留空走降级) |
| `CONTENT_GRPC_TARGET` | 否 | `content:50054` | content gRPC 目标(留空走降级) |
| `DATA_ANA_GRPC_TARGET` | 否 | `data-ana:50055` | data-ana gRPC 目标(留空走降级) |
| `MSG_GRPC_TARGET` | 否 | `msg:50056` | msg gRPC 目标(留空走降级) |
| `AI_GRPC_TARGET` | 否 | `ai:50058` | ai gRPC 目标(留空走降级) |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | 否 | `http://otel-collector:4318` | OTLP 上报端点 |
| `LOG_LEVEL` | 否 | `info` | 日志级别 |
---
## 6. 剩余工作
### 6.1 真实下游联调(按优先级)
| # | 工作项 | 阻塞条件 | 状态 |
| --- | ------------------------------------------------------------- | ------------------ | ---- |
| 1 | core-edu gRPC 联调 | core-edu 服务就绪 | ⏳ |
| 2 | content gRPC 联调 | content 服务就绪 | ⏳ |
| 3 | data-ana gRPC 联调 | data-ana 服务就绪 | ⏳ |
| 4 | msg gRPC 联调 | msg 服务就绪 | ⏳ |
| 5 | ai gRPC + SSE 联调 | ai 服务就绪 | ⏳ |
| 6 | iam REST CRUD 端点联调createUser/updateUser/createRole 等) | iam 补齐 REST CRUD | ⏳ |
> gRPC target 已全部配置,服务就绪后自动从 mock 切换为真实 gRPC 调用,无需修改 teacher-bff 代码。
### 6.2 P6 硬化任务
| # | 工作项 | 状态 |
| --- | ----------------------------- | ----------------------- |
| 1 | DataLoader 批量查询(防 N+1 | ⏳ 待下游就绪后实现 |
| 2 | Redis 多层缓存 | ⏳ 待下游就绪后实现 |
| 3 | OTel trace 上报 | ✅ 已实现tracer.ts |
| 4 | Prometheus 指标 | ✅ 已实现metrics.ts |
---
## 7. 已完成项汇总
| 工作项 | 状态 | 验证方式 |
| --------------------------------------------- | ---- | --------------------------------------------------------------------------------------------------- |
| P2 核心 5 Query | ✅ | typecheck + lint + Docker 联调 |
| P3 teacher 域 Query/Mutation | ✅ | typecheck + lint + Docker 联调 |
| P4 学习分析 Query | ✅ | typecheck + lint + E2E 测试 |
| P5 通知 + AI Query/Mutation | ✅ | typecheck + lint + E2E 测试 |
| P6 admin 扁平命名重构ARB-001 | ✅ | typecheck + lint + Docker 联调 |
| P6 admin 41 Query + 20 Mutation | ✅ | schema introspection + Docker 联调 |
| P6 x-user-data-scope header 透传 | ✅ | Docker 联调adminRoles 返回真实数据) |
| P6 IamGrpcController 注册修复 | ✅ | Docker 联调currentUser 返回真实数据) |
| P6 Zod 输入验证 | ✅ | typecheck |
| P6 SSE 流式透传 | ✅ | typecheck |
| **Schema v2 扩展96 operations** | ✅ | **schema introspection + E2E 21/21 PASS** |
| **Teacher 域 P3-P5 扩展12 项)** | ✅ | **E2E 测试全部 PASS** |
| **P7 全部降级实现39 Query + 25 Mutation** | ✅ | **E2E 测试全部 PASS** |
| **5 个 gRPC target 配置** | ✅ | **docker-compose.test.yml + deploy.yml** |
| **Dockerfile 重写(--ignore-scripts 模式)** | ✅ | **Docker 构建成功** |
| **Homework.status 字段修复** | ✅ | **E2E classHomework PASS** |
| **Notification isRead → read 映射** | ✅ | **E2E myNotifications PASS** |
| Docker 镜像构建 | ✅ | edu-test-teacher-bff:latestnode:22-alpine |
| Docker 容器运行 | ✅ | /healthz 200 + /readyz 200 |
| 真实 iam 联调(无 mock | ✅ | currentUser/me/adminRoles/adminPermissions/auditLogs/adminDashboard/systemSettings 全部返回真实数据 |
| `me` 查询 dataScope 修复v2 | ✅ | Docker 验证返回 ALL |
| DataScope 大小写转换v2 | ✅ | iam-grpc.client.ts toUpperCase() |
| IamModule 客户端选择修复v2 | ✅ | IAM_GRPC_TARGET 配置后强制 gRPC |
---
## 8. 关键文件路径
| 文件 | 用途 |
| ------------------------------------------------------------------- | ---------------------------------------- |
| `services/teacher-bff/src/admin/admin.resolver.ts` | admin GraphQL resolver扁平命名 |
| `services/teacher-bff/src/admin/admin.service.ts` | admin 业务逻辑层 |
| `services/teacher-bff/src/teacher/teacher.resolver.ts` | teacher 域 GraphQL resolverv2 扩展) |
| `services/teacher-bff/src/teacher/teacher.service.ts` | teacher 域业务逻辑层v2 扩展) |
| `services/teacher-bff/src/teacher/ai-chat-sse.controller.ts` | SSE 流式 AI 对话 |
| `services/teacher-bff/src/graphql/graphql.controller.ts` | GraphQL 入口 + mergeResolvers 深合并 |
| `services/teacher-bff/src/graphql/context.ts` | GraphQL 上下文(提取 x-user-* headers |
| `services/teacher-bff/src/clients/iam/iam-grpc.client.ts` | iam gRPC + REST 客户端 |
| `services/teacher-bff/src/clients/core-edu/core-edu-grpc.client.ts` | core-edu gRPC 客户端 |
| `services/teacher-bff/src/clients/content/content-grpc.client.ts` | content gRPC 客户端 |
| `services/teacher-bff/src/clients/data-ana/data-ana-grpc.client.ts` | data-ana gRPC 客户端 |
| `services/teacher-bff/src/clients/msg/msg-grpc.client.ts` | msg gRPC 客户端 |
| `services/teacher-bff/src/clients/ai/ai-grpc.client.ts` | ai gRPC 客户端 |
| `services/teacher-bff/src/clients/types.ts` | CallContext含 dataScope 字段) |
| `services/teacher-bff/src/clients/grpc/grpc.factory.ts` | gRPC 客户端工厂 |
| `services/teacher-bff/Dockerfile` | Docker 构建(--ignore-scripts 模式) |
| `packages/shared-ts/contracts/graphql/teacher-bff.schema.graphql` | GraphQL schema 契约v296 operations |
| `packages/shared-proto/proto/iam.proto` | iam gRPC proto 契约 |
| `infra/docker-compose.test.yml` | 测试环境 compose5 个 gRPC target |
| `infra/docker-compose.deploy.yml` | 生产部署 compose5 个 gRPC target |
---
**本文件由 ai03 维护,上游/下游工作项请各负责 AI 完成后通知 ai03 更新状态。**