Files
Edu/apps/portal-shell/docs/needtodo/teacher-NeedTodo.md
SpecialX 04b7a40bdc feat(portal-shell): 学生域全页面迁移与规范合规修复
- 学生域 32 页全量迁移(含作答/自动保存/提交/诊断)

- 补齐 4 个 MSW mock 缺口,修 diagnostic case 名

- 修 4 处 Tailwind 任意值;新增共享组件与路由
2026-08-31 11:25:21 +08:00

480 lines
51 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待完成功能分析
> 参考项目:`e:\desktop\CICD\src\app\(dashboard)\teacher\`CICD 原版53 个 page.tsx
> 当前项目:`e:\Desktop\Edu\apps\portal-shell\src\app\shell\teacher\`63 个 page.tsx
> 规划依据:`apps\portal-shell\ARCHITECTURE.md` §9.1(教师域 56 页规划B1+B2+B2末
> 分析日期2026-08-04
> 分析方式:逐页面读取 page.tsx 文件内容 + features/*-client.tsx 集成核查 + lib/api hooks + mocks/graphql-data.ts 覆盖核查
---
## 〇、方法论与对比基线
1. CICD 单体Next.js App Router + Server Actions + Drizzle作为**功能基线**,反映"老版单体已实现"的教师功能完整态。
2. portal-shell 作为**目标态**,遵循 ARCH §9.1 的契约与批次规划B1+B2+B2末
3. portal-shell 普遍采用「Server Component page.tsx 仅做 `<Suspense>` 边界包裹 + Client Component `*-client.tsx` 承载业务」的统一架构CICD 多为「Server Component 直接拉数据 + Rich Client Component 渲染」。
4. ARCH §9.1 规划 56 页portal-shell 已实现 **63 页**(含 5 个路径别名 `/classes/my``/classes/my/[id]``/exams/all``/exams/create``/homework/assignments/create` 复用同一 client+ 3 个占位页 `/classes/students``/exams/grading``/exams/grading/[submissionId]`+ 2 个 ARCH §9.1 原未规划但已补做 `/exams/[id]/proctoring``/diagnostic/student/[studentId]`)。
5. CICD 中 `exams/page.tsx``classes/page.tsx``exams/grading/*``exams/create` 等为**重定向/等价路径**,不算独立功能缺口。
6. CICD 中 `diagnostic/student/[studentId]` 在 ARCH §9.1 中**原未规划**ARCH 仅规划 `diagnostic` + `diagnostic/class/[classId]` 共 2 页),属 CICD 历史功能portal-shell 已补做(**待同步更新 ARCH §9.1 + 004 + arch.db**)。
### 0.1 三态分类严格定义(本次核查采用)
| 状态 | 定义 | 判据 |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| ✅ 完整实现 | page.tsx 引入并渲染 `features/teacher/*-client.tsx` 客户端组件,或 page.tsx 自身包含真实业务逻辑(调用 lib/api hooks、渲染数据、处理 loading/error/empty 三态) | 文件内 `import``*-client.tsx``<XxxClient />` 渲染;或直接调用 `useXxx` hook |
| 🟡 占位空态 | page.tsx 仅用 `ListPageShell` / `DetailPageShell` / `FormPageShell` / `WorkbenchPageShell` 等 page-templates 直接渲染空态(如 `empty` 属性或无 children 内容),**没有引入任何 `*-client.tsx`,也没有真实业务逻辑** | 文件内仅 `import { ListPageShell } from "@/shared/components/page-templates"`,无 client 组件 |
| ❌ 缺失 | 文件不存在 | 路径下无 page.tsx |
> **重要说明**:本核查的"完整实现"指**页面骨架与数据流闭环**client 组件已集成、hooks 已接入、三态已处理),**不代表与 CICD 功能完全对等**。与 CICD 的功能差距详见 §三.B原 §3.4-§3.18 内容保留,归类为"功能差距"而非"占位空态")。
### 0.2 配套资产核查
| 资产 | 路径 | 覆盖情况 |
| ----------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| features/teacher/*-client.tsx | `src/features/teacher/<module>/` | **55 个页面级 client 组件**(不含 dashboard-cards-client 子组件),覆盖 20 个模块,详见 §七.2 |
| lib/api hooks | `src/lib/api/<module>.ts` | **20 个模块文件**ai/analytics/attendance/classes/course-plans/dashboard/diagnostic/elective/error-book/exams/grades/homework/knowledge-graph/leave/lesson-plans/practice/proctoring/questions/schedule-changes/students/textbooks另含 admin/universal/sidebar/topbar/notifications/settings/profile 等共享域文件) |
| mocks/graphql-data.ts | `src/mocks/graphql-data.ts` | **269KB / 116 个 mock 数据集**(含教师域全部模块 + 学生/家长/管理域),所有占位页与功能差距页均有 MSW 兜底 |
---
## 一、页面完成度总览
| 状态 | 数量 | 说明 |
| ----------- | ------ | ---------------------------------------------------------------------------- |
| ✅ 完整实现 | **60** | page.tsx 集成 `*-client.tsx` 或自身含真实业务逻辑lib/api hook + 三态处理) |
| 🟡 占位空态 | **3** | 仅用 page-templates 渲染空态,无 client 组件集成,无真实业务 |
| ❌ 完全缺失 | **0** | 教师域 63 个 page.tsx 全部存在 |
### 与原核查2026-07-24的差异
| 项目 | 原07-24 | 现08-04 | 变化 |
| -------- | ----------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- |
| 总页面数 | 53 | 63 | +105 别名 + 3 占位 + 2 补做) |
| ✅ 完整 | 33 | 60 | +27原 14 页"功能不完整"实为已集成 client 归入 ✅ + 新补做 2 页 + 新增别名 5 页 - 占位 3 页归 🟡 - 共享域 2 页非教师域) |
| 🟡 占位 | 14 | 3 | -11原 14 页均集成 client 组件归 ✅;新增 3 个真占位页) |
| ❌ 缺失 | 4 | 0 | -4proctoring 与 diagnostic/student 已补做notifications/settings 属共享域非教师域核查范围) |
### ✅ 完整实现60 页)
按模块分布(含别名/复用):
| 模块 | 页面数 | 页面路径 |
| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| dashboard | 1 | `/shell/teacher`page.tsx 含 useTeacherDashboard hook + 7 张卡片 + i18n + 三态) |
| ai | 3 | `/ai/ai-assist``/ai/ai-lesson-plan``/ai/ai-report`(全 MSWB2末工作台 |
| analytics | 2 | `/analytics``/analytics/[studentId]`MSW 兜底) |
| attendance | 4 | `/attendance``/report``/sheet``/stats` |
| classes | 5 | `/classes``/classes/my`(别名)、`/classes/[id]``/classes/my/[id]`(别名)、`/classes/schedule` |
| course-plans | 2 | `/course-plans``/course-plans/[id]` |
| diagnostic | 3 | `/diagnostic``/diagnostic/class/[classId]``/diagnostic/student/[studentId]`(已补做) |
| elective | 3 | `/elective``/elective/create``/elective/[id]/edit` |
| error-book | 1 | `/error-book`(✅ errorBookItems/Stats 真实契约) |
| exams | 9 | `/exams``/exams/all`(别名)、`/exams/new``/exams/create`(别名)、`/exams/[id]``/exams/[id]/analytics``/exams/[id]/build``/exams/[id]/edit``/exams/[id]/proctoring`(已补做) |
| grades | 5 | `/grades``/grades/analytics``/grades/entry``/grades/report-card``/grades/stats` |
| homework | 8 | `/homework``/homework/new``/homework/assignments/create`(别名)、`/homework/[id]``/homework/assignments/[id]/submissions``/homework/submissions``/homework/submissions/[submissionId]``/homework/submissions/[submissionId]/scan-grading` |
| knowledge-graph | 1 | `/knowledge-graph`B2末混合契约 knowledgePoint ✅) |
| leave | 1 | `/leave` |
| lesson-plans | 6 | `/lesson-plans``/lesson-plans/new``/lesson-plans/calendar``/lesson-plans/heatmap``/lesson-plans/library``/lesson-plans/[planId]/edit` |
| practice | 1 | `/practice` |
| questions | 1 | `/questions` |
| schedule-changes | 1 | `/schedule-changes` |
| students | 1 | `/students`(原 /classes/students 已迁到顶级) |
| textbooks | 2 | `/textbooks``/textbooks/[id]` |
> **注**:原"🟡 已完成但功能不完整"的 14 页dashboard、exams/page、exams/[id]、exams/new、exams/[id]/edit、exams/[id]/build、classes/[id]、classes/page、students、homework/[id]、homework/new、lesson-plans/[planId]/edit、grades/entry、attendance/sheet、diagnostic/class/[classId])均**已集成真实 client 组件**,按本次严格三态定义归入 ✅;其与 CICD 的功能差距见 §三.B§3.4-§3.18 保留原核查的详细对比分析)。
### 🟡 占位空态3 页)
详见 §三.A§3.1-§3.3)。
### ❌ 缺失0 页)
教师域 63 个 page.tsx 全部存在,无缺失。
> **共享域说明**:原 `/shell/notifications` 与 `/shell/settings` 为 B1 共享页(非教师域独有),不属于本次教师域核查范围。如需补做,应在 `/shell/notifications/page.tsx` 与 `/shell/settings/page.tsx` 实现,供所有角色共用。
---
## 二、缺失页面清单
### 2.1 教师域缺失页面
**无缺失**。教师域 63 个 page.tsx 全部存在。
### 2.2 已补做的原"缺失"页面(相对 2026-07-24 核查)
#### 2.2.1 `/shell/teacher/exams/[id]/proctoring`(监考工作台)— ✅ 已补做
- **CICD 参考实现**`e:\desktop\CICD\src\app\(dashboard)\teacher\exams\[id]\proctoring\page.tsx`
- **portal-shell 现状**`exams/[id]/proctoring/page.tsx` + `features/teacher/exams/proctoring-client.tsx`
- **实现状态**:✅ page.tsx 引入 `ProctoringClient``<Suspense fallback={<WorkbenchPageSkeleton />}>` 包裹client 组件使用 `useExamProctoring` / `useStudentProctoringStatuses` / `useRecentProctoringEvents` 三个 Apollo hook全 MSW 兜底);通过 5s 轮询模拟实时刷新,后端补齐 WS subscription 后切换。
- **ARCHITECTURE.md 契约**schema 无,需 WS 契约工单 + MSW 先行,已 MSW 兜底)
- **批次**B2 末二期WS— MSW 阶段已完成,待 WS 契约就绪后切换。
#### 2.2.2 `/shell/teacher/diagnostic/student/[studentId]`(学生诊断详情)— ✅ 已补做
- **CICD 参考实现**`e:\desktop\CICD\src\app\(dashboard)\teacher\diagnostic\student\[studentId]\page.tsx`
- **portal-shell 现状**`diagnostic/student/[studentId]/page.tsx` + `features/teacher/diagnostic/student-diagnostic-client.tsx`
- **实现状态**:✅ page.tsx 引入 `StudentDiagnosticClient``<Suspense fallback={<DetailPageSkeleton />}>` 包裹client 组件使用 `useStudentDiagnostic` Apollo hookMSW 兜底)。
- **ARCHITECTURE.md 契约**:🟡 `diagnosticReports` ✅ schema 真实字段,单生维度查询未明确。
- **批次**B2CICD 历史功能ARCH §9.1 原未规划)— **需同步更新 ARCH §9.1 + 004 + arch.db**
### 2.3 共享域缺口(非教师域核查范围,仅作记录)
| 路径 | 状态 | 说明 |
| ---------------------- | ------- | ------------------------------------------------------------------- |
| `/shell/notifications` | ❌ 缺失 | B1 共享,`notifications(userId)` ✅ schema 已就绪,需在共享域补页面 |
| `/shell/settings` | ❌ 缺失 | B1 共享,需在共享域补页面 |
### 2.4 不算缺失的"伪缺失"(路径合并/重定向/别名)
以下路径在 portal-shell 中通过路径合并、别名或等价入口覆盖,**不算缺失**
| CICD 路径 | portal-shell 等价 | 说明 |
| --------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
| `exams/page.tsx` | `/exams/page.tsx`ExamsListClient | CICD 是 redirect 到 `/exams/all`portal-shell 直接渲染列表 + 同时保留 `/exams/all` 别名 |
| `exams/all/page.tsx` | `/exams/all/page.tsx`ExamsListClient 别名) | portal-shell 已补 `/exams/all` 别名复用 `ExamsListClient` |
| `exams/create/page.tsx` | `/exams/create/page.tsx`NewExamClient 别名) | portal-shell 已补 `/exams/create` 别名复用 `NewExamClient` |
| `classes/page.tsx` | `/classes/page.tsx`ClassesListClient | CICD 是 redirect 到 `/classes/my`portal-shell 直接渲染列表 + 同时保留 `/classes/my` 别名 |
| `classes/my/page.tsx` | `/classes/my/page.tsx`ClassesListClient 别名) | portal-shell 已补 `/classes/my` 别名复用 `ClassesListClient` |
| `classes/my/[id]/page.tsx` | `/classes/my/[id]/page.tsx`ClassDetailClient 别名) | portal-shell 已补 `/classes/my/[id]` 别名复用 `ClassDetailClient` |
| `classes/students/page.tsx` | `/students/page.tsx`StudentsListClient + `/classes/students/page.tsx`(🟡 占位) | 路径从 `/classes/students` 迁到顶级 `/students`ARCH §9.1 规划);旧路径保留为占位页(见 §3.1 |
| `homework/assignments/create/page.tsx` | `/homework/assignments/create/page.tsx`NewHomeworkClient 别名) | portal-shell 已补 `/homework/assignments/create` 别名复用 `NewHomeworkClient` |
| `exams/grading/page.tsx` | 无CICD 自身是 redirect | CICD `grading/page.tsx``redirect("/teacher/homework/submissions")`portal-shell 保留为占位页(见 §3.2 |
| `exams/grading/[submissionId]/page.tsx` | 无CICD 自身是 redirect | 同上,仅 redirectportal-shell 保留为占位页(见 §3.3 |
---
## 三、占位空态页面 + 与 CICD 功能差距
> 本节分两部分:
>
> - **§三.A§3.1-§3.3**3 个**真占位页**(仅 page-templates 渲染空态,无 client 组件集成)— **本次核查最优先补做项**
> - **§三.B§3.4-§3.18**15 个**已集成 client 但与 CICD 有功能差距**的页面 — 保留原 §3.1-§3.15 详细对比分析
### 三.A 占位空态页面3 页P0 优先补做)
#### 3.1 `/shell/teacher/classes/students`(班级学生列表占位)
- **路径**`/shell/teacher/classes/students`
- **page.tsx 实现**
```tsx
import { ListPageShell } from "@/shared/components/page-templates";
export default function ClassStudentsPage(): React.ReactElement {
return (
<ListPageShell title="班级学生" description="查看各班级学生名单" empty />
);
}
```
- **当前状态**:🟡 占位空态,仅 `ListPageShell` + `empty` 属性,无 children 内容,无 client 组件集成。
- **已有但未集成的组件**:❌ 无。`features/teacher/classes/` 仅有 `class-detail-client.tsx`、`class-schedule-client.tsx`、`classes-list-client.tsx`**无 `class-students-client.tsx`**。
- **可用资源**
- lib/api`lib/api/classes.ts` 有 `useClassStudents(classId)` hook
- mocks`graphql-data.ts` 有 `ClassStudents` mock 数据集
- 同域可复用:`/students/page.tsx` 已实现 `StudentsListClient`顶级路由ARCH §9.1 已迁出)
- **需要补全的内容**
1. **方案 A推荐**:删除 `/classes/students/page.tsx`,统一使用顶级 `/students`ARCH §9.1 已规划迁移)
2. **方案 B兼容旧路径**:改为 `redirect("/shell/teacher/students")` 重定向到顶级路由
3. **方案 C保留独立功能**:新建 `features/teacher/classes/class-students-client.tsx`,按 `classId` 查询展示某班学生名单(不同于顶级 `/students` 的全校学生视图)
- **建议**:方案 B重定向。ARCH §9.1 已明确迁移到顶级 `/students`,保留旧路径作为重定向入口即可,无需重复实现。
#### 3.2 `/shell/teacher/exams/grading`(阅卷列表占位)
- **路径**`/shell/teacher/exams/grading`
- **page.tsx 实现**
```tsx
import { ListPageShell } from "@/shared/components/page-templates";
export default function ExamGradingPage(): React.ReactElement {
return (
<ListPageShell
title="阅卷列表"
description="查看待批阅的考试提交"
empty
/>
);
}
```
- **当前状态**:🟡 占位空态,仅 `ListPageShell` + `empty` 属性,无 children无 client 组件。
- **已有但未集成的组件**:❌ 无。`features/teacher/exams/` 有 7 个 clientexam-analytics、exam-build、exam-detail、exam-edit、exams-list、new-exam、proctoring**无 `exam-grading-list-client.tsx`**。
- **可用资源**
- lib/api`lib/api/exams.ts` 有相关 hook`lib/api/homework.ts` 有 `useHomeworkSubmissions` hook
- mocks`graphql-data.ts` 有 `HomeworkSubmissions`、`ExamDetail` 等 mock 数据集
- CICD 行为CICD `exams/grading/page.tsx` 仅 `redirect("/teacher/homework/submissions")`,无实际功能
- **需要补全的内容**
1. **方案 A与 CICD 一致)**:改为 `redirect("/shell/teacher/homework/submissions")` 重定向到作业提交列表
2. **方案 B实现独立阅卷入口**:新建 `features/teacher/exams/exam-grading-list-client.tsx`,展示待批阅的考试提交(区分于作业提交)
- **建议**:方案 A重定向。与 CICD 行为一致,避免重复实现;如产品需要独立的"考试阅卷"入口(区分于作业批改),再按方案 B 补做。
#### 3.3 `/shell/teacher/exams/grading/[submissionId]`(阅卷详情占位)
- **路径**`/shell/teacher/exams/grading/[submissionId]`
- **page.tsx 实现**
```tsx
import { DetailPageShell } from "@/shared/components/page-templates";
/**
* 阅卷详情页ARCHITECTURE.md §7.3 详情页 / §9.1 / §10 P2
*
* Server Component 入口:使用 DetailPageShell 直接渲染。
* 通过 /shell/teacher/exams/grading/[submissionId] 路由定位具体提交,
* 后续可接入阅卷专属 client component 进行逐题评分。
*
* 数据契约submission(id) schema 无, MSW 兜底(@contract-pending
*
* 关联ARCHITECTURE.md §5.3 / §5.4 / §7.3 / §9.1 / §10 P2 / §11.3 / §11.4
*/
export default function ExamGradingDetailPage(): React.ReactElement {
return (
<DetailPageShell
title="阅卷详情"
description="批阅学生考试提交"
backHref="/shell/teacher/exams/grading"
/>
);
}
```
- **当前状态**:🟡 占位空态,仅 `DetailPageShell` + `title/description/backHref`,无 children无 client 组件。
- **已有但未集成的组件**:❌ 无。`features/teacher/exams/` 无阅卷详情 client阅卷能力当前在 `features/teacher/homework/submission-grading-client.tsx`(已被 `/homework/submissions/[submissionId]` 集成)。
- **可用资源**
- lib/api`lib/api/homework.ts` 有 `useSubmissionDetail(submissionId)` / `useGradeSubmission` hook
- mocks`graphql-data.ts` 有 `SubmissionDetail`、`HomeworkSubmissions` mock 数据集
- 同域可复用:`/homework/submissions/[submissionId]/page.tsx` 已实现 `SubmissionGradingClient`(含逐题评分、批注、自动判分、保存草稿)
- CICD 行为CICD `exams/grading/[submissionId]/page.tsx` 仅 `redirect("/teacher/homework/submissions")`注意CICD 未保留 submissionId 参数,会丢失上下文)
- **需要补全的内容**
1. **方案 A推荐优于 CICD**:改为重定向到 `/shell/teacher/homework/submissions/[submissionId]`,保留 submissionId 参数(修复 CICD 丢失参数的问题)
2. **方案 B实现独立阅卷详情**:新建 `features/teacher/exams/exam-grading-detail-client.tsx`,对接 `useSubmissionDetail` hook 实现考试阅卷专属视图(区别于作业批改)
- **建议**:方案 A重定向并保留参数。与 CICD 行为一致但修复其缺陷;如产品需要独立的考试阅卷详情视图(区分于作业批改),再按方案 B 补做。
### 三.A 小结:占位页共性特征
3 个占位页的共性:
1. **路径来源**:均为 CICD 单体中的重定向占位路径portal-shell 迁移时保留了路径但未集成业务
2. **page-templates 直接渲染**:均仅用 `ListPageShell` / `DetailPageShell` 直接渲染空态,无 `*-client.tsx` 集成
3. **已有等价实现**3 个占位页对应的功能均已在不同路径实现:
- `/classes/students` → 顶级 `/students`(已实现 `StudentsListClient`
- `/exams/grading` → `/homework/submissions`(已实现 `SubmissionsListClient`
- `/exams/grading/[submissionId]` → `/homework/submissions/[submissionId]`(已实现 `SubmissionGradingClient`
4. **推荐统一处理**3 个占位页均建议改为 `redirect()` 重定向到等价路径,避免重复实现
5. **优先级**P0占位页影响用户体验路径存在但无内容
---
### 三.B 与 CICD 功能差距页面15 页,已集成 client 但与 CICD 有差距)
> 以下 15 页**均已集成 `*-client.tsx`**,按本次严格三态定义归入 ✅ 完整实现。但与 CICD 单体相比仍存在功能差距(如缺少某些子功能、操作按钮、数据维度等),保留原核查的详细对比分析供后续迭代参考。
>
> **优先级**P1-P2功能增强非阻塞性
>
> **说明**:本节为原 §3.1-§3.15 的内容保留归类。由于 60 页均已完成页面骨架与数据流闭环,本节作为后续迭代的功能增强 backlog不再视为占位/缺失。详细页面级差距分析详见原核查记录2026-07-24与 CICD 源码对比,本次核查不重复展开,仅列清单:
| 序号 | 页面路径 | 集成的 client | 与 CICD 主要差距概述 |
| ---- | ------------------------------------------- | ----------------------- | ---------------------------------------------------------------- |
| 1 | `/shell/teacher`dashboard | dashboard-cards-client | CICD 7 张卡片含交互态portal-shell 已对齐 7 卡 + i18n差距较小 |
| 2 | `/shell/teacher/exams` | exams-list-client | 列表筛选维度、状态筛选、批量操作 |
| 3 | `/shell/teacher/exams/[id]` | exam-detail-client | 详情页子 Tab 数量、阅卷入口跳转 |
| 4 | `/shell/teacher/exams/new` | new-exam-client | 表单步骤、题型选择、知识点绑定 |
| 5 | `/shell/teacher/exams/[id]/edit` | exam-edit-client | 编辑权限点、草稿恢复 |
| 6 | `/shell/teacher/exams/[id]/build` | exam-build-client | 组卷策略、难度校准 |
| 7 | `/shell/teacher/classes/[id]` | class-detail-client | 详情子 Tab、学生名单 inline |
| 8 | `/shell/teacher/classes` | classes-list-client | 列表筛选、班级切换 |
| 9 | `/shell/teacher/students` | students-list-client | 学生筛选、详情抽屉 |
| 10 | `/shell/teacher/homework/[id]` | homework-detail-client | 作业详情 Tab、提交统计 |
| 11 | `/shell/teacher/homework/new` | new-homework-client | 作业类型、附件上传 |
| 12 | `/shell/teacher/lesson-plans/[planId]/edit` | lesson-plan-edit-client | 编辑器富文本、模板插入 |
| 13 | `/shell/teacher/grades/entry` | grade-entry-client | 成绩录入批量、导入导出 |
| 14 | `/shell/teacher/attendance/sheet` | attendance-sheet-client | 考勤表批量、快捷标记 |
| 15 | `/shell/teacher/diagnostic/class/[classId]` | class-diagnostic-client | 诊断维度、对比分析 |
> **后续处理建议**:本节 15 页的功能差距属 P1-P2 增强项,建议按产品优先级逐模块迭代补齐;每次补齐后运行 `pnpm run arch:scan` 同步 arch.db并视情况更新 004 与本核查文档。
---
## 四、配套资产覆盖核查
### 4.1 features/teacher/*-client.tsx 覆盖55 个页面级 client
详见 §七.2(附录)。覆盖 20 个教师域模块,所有 ✅ 完整实现页均有对应 client 集成。
### 4.2 lib/api hooks 覆盖20 个模块文件)
| 模块 | 文件 | 关键 hook |
| ---------------- | ----------------------------- | --------------------------------------------------------------------------------------------------- |
| ai | `lib/api/ai.ts` | useAiAssist / useAiLessonPlan / useAiReport |
| analytics | `lib/api/analytics.ts` | useAnalytics / useStudentAnalytics |
| attendance | `lib/api/attendance.ts` | useAttendance / useAttendanceReport / useAttendanceSheet / useAttendanceStats |
| classes | `lib/api/classes.ts` | useClasses / useClassDetail / useClassStudents / useClassSchedule |
| course-plans | `lib/api/course-plans.ts` | useCoursePlans / useCoursePlanDetail |
| dashboard | `lib/api/dashboard.ts` | useTeacherDashboard |
| diagnostic | `lib/api/diagnostic.ts` | useClassDiagnostic / useStudentDiagnostic |
| elective | `lib/api/elective.ts` | useElectiveCourses / useElectiveDetail |
| error-book | `lib/api/error-book.ts` | useErrorBookItems / useErrorBookStats |
| exams | `lib/api/exams.ts` | useExams / useExamDetail / useExamAnalytics / useExamBuild / useExamProctoring |
| grades | `lib/api/grades.ts` | useGrades / useGradeEntry / useGradeStats / useReportCard |
| homework | `lib/api/homework.ts` | useHomework / useHomeworkDetail / useHomeworkSubmissions / useSubmissionDetail / useGradeSubmission |
| knowledge-graph | `lib/api/knowledge-graph.ts` | useKnowledgeGraph |
| leave | `lib/api/leave.ts` | useLeaveRequests |
| lesson-plans | `lib/api/lesson-plans.ts` | useLessonPlans / useLessonPlanDetail / useLessonPlanCalendar / useLessonPlanHeatmap |
| practice | `lib/api/practice.ts` | usePractice |
| proctoring | `lib/api/proctoring.ts` | useStudentProctoringStatuses / useRecentProctoringEvents |
| questions | `lib/api/questions.ts` | useQuestions |
| schedule-changes | `lib/api/schedule-changes.ts` | useScheduleChanges |
| students | `lib/api/students.ts` | useStudents / useStudentDetail |
| textbooks | `lib/api/textbooks.ts` | useTextbooks / useTextbookDetail |
### 4.3 mocks/graphql-data.ts 覆盖116 个 mock 数据集)
269KB 文件覆盖教师域全部模块(含 3 个占位页的兜底数据:`ClassStudents`、`HomeworkSubmissions`、`SubmissionDetail`、`ExamDetail`)。所有占位页与功能差距页均有 MSW 兜底。
---
## 五、结论与建议
### 5.1 总体结论
- 教师域 63 个 page.tsx **全部存在,无缺失**
- 60 页 ✅ 完整实现(集成 client + hooks + 三态处理)
- 3 页 🟡 占位空态(均为 CICD 重定向路径,建议改为 `redirect()` 重定向到等价已实现路径)
- 配套资产齐全55 个 client 组件 + 20 个 lib/api 模块 + 116 个 mock 数据集
### 5.2 优先级建议
| 优先级 | 项目 | 工作量 | 说明 |
| --------- | ---------------------------------- | ----------------- | --------------------------------------------------------------------------------------- |
| **P0** | 3 个占位页改为 `redirect()` 重定向 | 小(每页约 5 行) | 见 §3.1-§3.3 方案 A/B统一重定向到等价已实现路径 |
| **P1-P2** | 15 页与 CICD 功能差距补齐 | 中-大 | 见 §三.B按产品优先级逐模块迭代 |
| **P2** | 同步更新 ARCH §9.1 + 004 + arch.db | 小 | 补做 `diagnostic/student/[studentId]` 与 `exams/[id]/proctoring` 已实现但未同步规划文档 |
### 5.3 不需补做的项
- `/shell/notifications`、`/shell/settings`:属 B1 共享域(非教师域),需在共享域补页面,不在本次教师域核查范围
- `/exams/all`、`/exams/create`、`/classes/my`、`/classes/my/[id]`、`/homework/assignments/create`:为路径别名,复用同一 client不算缺失
---
## 六、核查元信息
- **核查日期**2026-08-04
- **核查范围**`apps/portal-shell/src/app/shell/teacher/` 下全部 63 个 page.tsx
- **核查方式**:逐页面读取 page.tsx 文件内容PowerShell `Get-Content -LiteralPath`+ features/*-client.tsx 集成核查 + lib/api hooks 覆盖核查 + mocks/graphql-data.ts 覆盖核查
- **三态判据**:见 §0.1(✅ 引入 client 或含真实业务 / 🟡 仅 page-templates 渲染空态 / ❌ 文件不存在)
- **对比基线**`e:\desktop\CICD\src\app\(dashboard)\teacher\`CICD 原版 53 页)
- **规划依据**`apps/portal-shell/ARCHITECTURE.md` §9.1(教师域 56 页规划)
---
## 七、附录
### 7.1 教师域 63 个 page.tsx 完整清单
| # | 路径 | 状态 | 集成的 client |
| --- | ----------------------------------------------------------------- | ---- | ----------------------------------------------------------- |
| 1 | `/shell/teacher` | ✅ | dashboard-cards-client |
| 2 | `/shell/teacher/ai/ai-assist` | ✅ | ai-assist-client |
| 3 | `/shell/teacher/ai/ai-lesson-plan` | ✅ | ai-lesson-plan-client |
| 4 | `/shell/teacher/ai/ai-report` | ✅ | ai-report-client |
| 5 | `/shell/teacher/analytics` | ✅ | analytics-client |
| 6 | `/shell/teacher/analytics/[studentId]` | ✅ | student-analytics-client |
| 7 | `/shell/teacher/attendance` | ✅ | attendance-client |
| 8 | `/shell/teacher/attendance/report` | ✅ | attendance-report-client |
| 9 | `/shell/teacher/attendance/sheet` | ✅ | attendance-sheet-client |
| 10 | `/shell/teacher/attendance/stats` | ✅ | attendance-stats-client |
| 11 | `/shell/teacher/classes` | ✅ | classes-list-client |
| 12 | `/shell/teacher/classes/my` | ✅ | classes-list-client别名 |
| 13 | `/shell/teacher/classes/[id]` | ✅ | class-detail-client |
| 14 | `/shell/teacher/classes/my/[id]` | ✅ | class-detail-client别名 |
| 15 | `/shell/teacher/classes/schedule` | ✅ | class-schedule-client |
| 16 | `/shell/teacher/classes/students` | 🟡 | (占位,建议重定向到 /students |
| 17 | `/shell/teacher/course-plans` | ✅ | course-plans-list-client |
| 18 | `/shell/teacher/course-plans/[id]` | ✅ | course-plan-detail-client |
| 19 | `/shell/teacher/diagnostic` | ✅ | diagnostic-client |
| 20 | `/shell/teacher/diagnostic/class/[classId]` | ✅ | class-diagnostic-client |
| 21 | `/shell/teacher/diagnostic/student/[studentId]` | ✅ | student-diagnostic-client |
| 22 | `/shell/teacher/elective` | ✅ | elective-list-client |
| 23 | `/shell/teacher/elective/create` | ✅ | elective-create-client |
| 24 | `/shell/teacher/elective/[id]/edit` | ✅ | elective-edit-client |
| 25 | `/shell/teacher/error-book` | ✅ | error-book-client |
| 26 | `/shell/teacher/exams` | ✅ | exams-list-client |
| 27 | `/shell/teacher/exams/all` | ✅ | exams-list-client别名 |
| 28 | `/shell/teacher/exams/new` | ✅ | new-exam-client |
| 29 | `/shell/teacher/exams/create` | ✅ | new-exam-client别名 |
| 30 | `/shell/teacher/exams/[id]` | ✅ | exam-detail-client |
| 31 | `/shell/teacher/exams/[id]/analytics` | ✅ | exam-analytics-client |
| 32 | `/shell/teacher/exams/[id]/build` | ✅ | exam-build-client |
| 33 | `/shell/teacher/exams/[id]/edit` | ✅ | exam-edit-client |
| 34 | `/shell/teacher/exams/[id]/proctoring` | ✅ | proctoring-client |
| 35 | `/shell/teacher/exams/grading` | 🟡 | (占位,建议重定向到 /homework/submissions |
| 36 | `/shell/teacher/exams/grading/[submissionId]` | 🟡 | (占位,建议重定向到 /homework/submissions/[submissionId] |
| 37 | `/shell/teacher/grades` | ✅ | grades-client |
| 38 | `/shell/teacher/grades/analytics` | ✅ | grade-analytics-client |
| 39 | `/shell/teacher/grades/entry` | ✅ | grade-entry-client |
| 40 | `/shell/teacher/grades/report-card` | ✅ | report-card-client |
| 41 | `/shell/teacher/grades/stats` | ✅ | grade-stats-client |
| 42 | `/shell/teacher/homework` | ✅ | homework-list-client |
| 43 | `/shell/teacher/homework/new` | ✅ | new-homework-client |
| 44 | `/shell/teacher/homework/assignments/create` | ✅ | new-homework-client别名 |
| 45 | `/shell/teacher/homework/[id]` | ✅ | homework-detail-client |
| 46 | `/shell/teacher/homework/assignments/[id]/submissions` | ✅ | submissions-list-client |
| 47 | `/shell/teacher/homework/submissions` | ✅ | submissions-list-client |
| 48 | `/shell/teacher/homework/submissions/[submissionId]` | ✅ | submission-grading-client |
| 49 | `/shell/teacher/homework/submissions/[submissionId]/scan-grading` | ✅ | scan-grading-client |
| 50 | `/shell/teacher/knowledge-graph` | ✅ | knowledge-graph-client |
| 51 | `/shell/teacher/leave` | ✅ | leave-client |
| 52 | `/shell/teacher/lesson-plans` | ✅ | lesson-plans-list-client |
| 53 | `/shell/teacher/lesson-plans/new` | ✅ | new-lesson-plan-client |
| 54 | `/shell/teacher/lesson-plans/calendar` | ✅ | lesson-plan-calendar-client |
| 55 | `/shell/teacher/lesson-plans/heatmap` | ✅ | lesson-plan-heatmap-client |
| 56 | `/shell/teacher/lesson-plans/library` | ✅ | lesson-plan-library-client |
| 57 | `/shell/teacher/lesson-plans/[planId]/edit` | ✅ | lesson-plan-edit-client |
| 58 | `/shell/teacher/practice` | ✅ | practice-client |
| 59 | `/shell/teacher/questions` | ✅ | questions-client |
| 60 | `/shell/teacher/schedule-changes` | ✅ | schedule-changes-client |
| 61 | `/shell/teacher/students` | ✅ | students-list-client |
| 62 | `/shell/teacher/textbooks` | ✅ | textbooks-list-client |
| 63 | `/shell/teacher/textbooks/[id]` | ✅ | textbook-detail-client |
### 7.2 features/teacher 模块与 client 组件清单20 模块 / 55 client
| 模块目录 | client 组件数 | client 组件清单 |
| ---------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------- |
| ai | 3 | ai-assist / ai-lesson-plan / ai-report |
| analytics | 2 | analytics / student-analytics |
| attendance | 4 | attendance / attendance-report / attendance-sheet / attendance-stats |
| classes | 3 | classes-list / class-detail / class-schedule |
| course-plans | 2 | course-plans-list / course-plan-detail |
| dashboard | 1 | dashboard-cards |
| diagnostic | 3 | diagnostic / class-diagnostic / student-diagnostic |
| elective | 3 | elective-list / elective-create / elective-edit |
| error-book | 1 | error-book |
| exams | 7 | exams-list / new-exam / exam-detail / exam-analytics / exam-build / exam-edit / proctoring |
| grades | 5 | grades / grade-analytics / grade-entry / report-card / grade-stats |
| homework | 8 | homework-list / new-homework / homework-detail / submissions-list / submission-grading / scan-grading |
| knowledge-graph | 1 | knowledge-graph |
| leave | 1 | leave |
| lesson-plans | 6 | lesson-plans-list / new-lesson-plan / lesson-plan-calendar / lesson-plan-heatmap / lesson-plan-library / lesson-plan-edit |
| practice | 1 | practice |
| proctoring | 1 | proctoring共享给 exams |
| questions | 1 | questions |
| schedule-changes | 1 | schedule-changes |
| students | 1 | students-list |
| textbooks | 2 | textbooks-list / textbook-detail |
> **注**proctoring-client 位于 `features/teacher/proctoring/`,被 `exams/[id]/proctoring/page.tsx` 集成scan-grading-client 位于 `features/teacher/homework/`,被 `homework/submissions/[submissionId]/scan-grading/page.tsx` 集成。
---
## 八、变更历史
| 日期 | 版本 | 变更内容 |
| ---------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2026-07-24 | v1 | 初版核查53→63 页迁移分析) |
| 2026-08-04 | v2 | 严格三态核查(逐页读 page.tsx60 ✅ / 3 🟡 / 0 ❌3 占位页改为重定向建议15 功能差距页归 P1-P2 backlog补全附录 §七.1 63 页完整清单 + §七.2 55 client 清单 |