This commit is contained in:
@@ -136,10 +136,10 @@ This release extends the Classes domain to support school-level sorting and per-
|
||||
|
||||
#### 2.2 Table: `class_subject_teachers`
|
||||
* **Action**: `CREATE TABLE`
|
||||
* **Primary Key**: (`class_id`, `subject`)
|
||||
* **Primary Key**: (`class_id`, `subject_id`)
|
||||
* **Columns**:
|
||||
* `class_id` (varchar(128), FK -> `classes.id`, cascade delete)
|
||||
* `subject` (enum: `语文/数学/英语/美术/体育/科学/社会/音乐`)
|
||||
* `subject_id` (varchar(128), FK -> `subjects.id`, cascade delete)
|
||||
* `teacher_id` (varchar(128), FK -> `users.id`, set null on delete)
|
||||
* `created_at`, `updated_at`
|
||||
* **Reason**: Maintain a stable default “subject list” per class while allowing admin/teacher to assign the actual teacher per subject.
|
||||
|
||||
@@ -240,3 +240,20 @@ Seed 脚本已覆盖班级相关数据,以便在开发环境快速验证页面
|
||||
- **移除 Insights**: 经评估,`src/app/(dashboard)/teacher/classes/insights` 模块功能冗余,已全量移除。
|
||||
- **保留核心数据**: 保留 `data-access.ts` 中的 `getClassHomeworkInsights` 函数,继续服务于班级详情页的统计卡片与图表。
|
||||
- **导航更新**: 从 `NAV_CONFIG` 中移除 Insights 入口。
|
||||
|
||||
---
|
||||
|
||||
## 9. 教师加入班级学科分配逻辑修复 (2026-03-03)
|
||||
|
||||
**日期**: 2026-03-03
|
||||
**范围**: 教师通过邀请码加入班级(含学科选择)的校验与分配
|
||||
|
||||
### 9.1 行为调整
|
||||
|
||||
- 教师已在班级中但选择学科加入时,不再直接返回成功,继续执行学科占用校验。
|
||||
- 班级未创建该学科映射时,先补齐映射再分配,避免误报“该班级不提供该学科”。
|
||||
- 学科已被其他老师占用时,返回明确提示。
|
||||
|
||||
### 9.2 影响代码
|
||||
|
||||
- [data-access.ts](file:///e:/Desktop/CICD/src/modules/classes/data-access.ts)
|
||||
|
||||
@@ -130,3 +130,21 @@ type QuestionContent = {
|
||||
### 6.6 校验
|
||||
- `npm run lint`:0 errors(仓库其他位置仍存在 warnings)
|
||||
- `npm run typecheck`:通过
|
||||
|
||||
---
|
||||
|
||||
## 7. 实现更新(2026-03-03)
|
||||
|
||||
### 7.1 登录态与权限校验
|
||||
- 题库创建/更新/知识点加载统一使用会话身份;缺失会话时回退到首个教师账号以保持演示可用。
|
||||
- 主要修改:
|
||||
- [actions.ts](file:///c:/Users/xiner/Desktop/CICD/src/modules/questions/actions.ts)
|
||||
|
||||
### 7.2 弹窗稳定性
|
||||
- Create Question 弹窗在打开时仅在默认知识点变化时更新,避免重复 setState 造成循环更新。
|
||||
- 主要修改:
|
||||
- [create-question-dialog.tsx](file:///c:/Users/xiner/Desktop/CICD/src/modules/questions/components/create-question-dialog.tsx)
|
||||
|
||||
### 7.3 校验
|
||||
- `npm run lint`:通过
|
||||
- `npm run typecheck`:通过
|
||||
|
||||
@@ -162,6 +162,12 @@ type ExamNode = {
|
||||
|
||||
## 7. 变更记录
|
||||
|
||||
**日期**:2026-03-03
|
||||
|
||||
- **题库列表稳定性**:
|
||||
- 题库卡片对题目 content/type 做解析兜底,避免异常数据导致运行时崩溃。
|
||||
- 主要修改: [question-bank-list.tsx](file:///c:/Users/xiner/Desktop/CICD/src/modules/exams/components/assembly/question-bank-list.tsx)
|
||||
|
||||
**日期**:2026-01-12 (当前)
|
||||
|
||||
- **列表页优化 (`/teacher/exams/all`)**:
|
||||
|
||||
@@ -304,3 +304,18 @@
|
||||
- 问题:`isCorrect` 字段可能为 `boolean | null`,直接用于 JSX 渲染导致 "Type 'unknown' is not assignable to type 'ReactNode'" 错误。
|
||||
- 修复:增加显式布尔值检查 `opt.isCorrect === true`,确保 React 条件渲染接收到合法的 boolean 值。
|
||||
|
||||
---
|
||||
|
||||
## 14. 实现更新(2026-03-03)
|
||||
|
||||
### 14.1 学生作业状态修复
|
||||
- 提交作业与学生列表查询改为使用真实登录用户,避免提交后仍显示未开始。
|
||||
- 学生列表优先展示最近一次已提交/已评分记录,提升状态准确性。
|
||||
- 主要修改:
|
||||
- [actions.ts](file:///c:/Users/xiner/Desktop/CICD/src/modules/homework/actions.ts)
|
||||
- [data-access.ts](file:///c:/Users/xiner/Desktop/CICD/src/modules/homework/data-access.ts)
|
||||
|
||||
### 14.2 校验
|
||||
- `npm run lint`:通过
|
||||
- `npm run typecheck`:通过
|
||||
|
||||
|
||||
313
docs/design/008_teacher_pages_implementation.md
Normal file
313
docs/design/008_teacher_pages_implementation.md
Normal file
@@ -0,0 +1,313 @@
|
||||
# 教师端页面实现分析文档
|
||||
|
||||
**日期**: 2026-03-03
|
||||
**范围**: Teacher 路由与页面实现(`src/app/(dashboard)/teacher`)
|
||||
|
||||
---
|
||||
|
||||
## 1. 总览
|
||||
|
||||
教师端页面采用服务端组件为主、按页面聚合数据的方式实现,页面负责:
|
||||
|
||||
- 读取数据(模块 data-access)
|
||||
- 组装 UI(模块 components)
|
||||
- 处理空状态与跳转
|
||||
|
||||
所有页面路由位于 `src/app/(dashboard)/teacher`,各业务能力落在 `src/modules/*` 中。
|
||||
|
||||
---
|
||||
|
||||
## 2. 路由总表
|
||||
|
||||
### 2.1 教师工作台
|
||||
- `/teacher/dashboard`
|
||||
实现:[dashboard/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/dashboard/page.tsx)
|
||||
|
||||
### 2.2 班级
|
||||
- `/teacher/classes` → `/teacher/classes/my`
|
||||
实现:[classes/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/page.tsx)
|
||||
- `/teacher/classes/my`
|
||||
实现:[classes/my/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/my/page.tsx)
|
||||
- `/teacher/classes/my/[id]`
|
||||
实现:[classes/my/[id]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/my/%5Bid%5D/page.tsx)
|
||||
- `/teacher/classes/students`
|
||||
实现:[classes/students/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/students/page.tsx)
|
||||
- `/teacher/classes/schedule`
|
||||
实现:[classes/schedule/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/schedule/page.tsx)
|
||||
|
||||
### 2.3 作业
|
||||
- `/teacher/homework` → `/teacher/homework/assignments`
|
||||
实现:[homework/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/page.tsx)
|
||||
- `/teacher/homework/assignments`
|
||||
实现:[homework/assignments/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/page.tsx)
|
||||
- `/teacher/homework/assignments/create`
|
||||
实现:[homework/assignments/create/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/create/page.tsx)
|
||||
- `/teacher/homework/assignments/[id]`
|
||||
实现:[homework/assignments/[id]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/%5Bid%5D/page.tsx)
|
||||
- `/teacher/homework/assignments/[id]/submissions`
|
||||
实现:[homework/assignments/[id]/submissions/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/%5Bid%5D/submissions/page.tsx)
|
||||
- `/teacher/homework/submissions`
|
||||
实现:[homework/submissions/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/submissions/page.tsx)
|
||||
- `/teacher/homework/submissions/[submissionId]`
|
||||
实现:[homework/submissions/[submissionId]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/submissions/%5BsubmissionId%5D/page.tsx)
|
||||
|
||||
### 2.4 考试
|
||||
- `/teacher/exams` → `/teacher/exams/all`
|
||||
实现:[exams/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/page.tsx)
|
||||
- `/teacher/exams/all`
|
||||
实现:[exams/all/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/all/page.tsx)
|
||||
- `/teacher/exams/create`
|
||||
实现:[exams/create/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/create/page.tsx)
|
||||
- `/teacher/exams/[id]/build`
|
||||
实现:[exams/[id]/build/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/%5Bid%5D/build/page.tsx)
|
||||
- `/teacher/exams/grading` → `/teacher/homework/submissions`
|
||||
实现:[exams/grading/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/grading/page.tsx)
|
||||
- `/teacher/exams/grading/[submissionId]` → `/teacher/homework/submissions`
|
||||
实现:[exams/grading/[submissionId]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/grading/%5BsubmissionId%5D/page.tsx)
|
||||
|
||||
### 2.5 题库
|
||||
- `/teacher/questions`
|
||||
实现:[questions/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/questions/page.tsx)
|
||||
|
||||
### 2.6 教材
|
||||
- `/teacher/textbooks`
|
||||
实现:[textbooks/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/textbooks/page.tsx)
|
||||
- `/teacher/textbooks/[id]`
|
||||
实现:[textbooks/[id]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/textbooks/%5Bid%5D/page.tsx)
|
||||
|
||||
---
|
||||
|
||||
## 3. 页面详解(逐页)
|
||||
|
||||
### 3.1 教师工作台 `/teacher/dashboard`
|
||||
实现:[dashboard/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/dashboard/page.tsx)
|
||||
|
||||
- **目的**: 教师总览工作台,展示班级、课表、作业、提交、成绩趋势与教师姓名。
|
||||
- **数据来源**:
|
||||
- 班级与课表:`getTeacherClasses`、`getClassSchedule`
|
||||
- 作业与提交:`getHomeworkAssignments`、`getHomeworkSubmissions`
|
||||
- 教师姓名:`users` 表查询
|
||||
- 成绩趋势:`getTeacherGradeTrends`
|
||||
- **关键组件**: `TeacherDashboardView`
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.2 班级入口 `/teacher/classes`
|
||||
实现:[classes/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/page.tsx)
|
||||
|
||||
- **目的**: 跳转入口,统一导向“我的班级”。
|
||||
- **行为**: `redirect("/teacher/classes/my")`
|
||||
|
||||
### 3.3 我的班级 `/teacher/classes/my`
|
||||
实现:[classes/my/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/my/page.tsx)
|
||||
|
||||
- **目的**: 展示教师负责班级的卡片列表,并支持学科筛选/加入。
|
||||
- **数据来源**:
|
||||
- 班级:`getTeacherClasses`
|
||||
- 学科选项:`getClassSubjects`
|
||||
- **关键组件**: `MyClassesGrid`
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.4 班级详情 `/teacher/classes/my/[id]`
|
||||
实现:[classes/my/[id]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/my/%5Bid%5D/page.tsx)
|
||||
|
||||
- **目的**: 展示班级概览(作业趋势、学生、课表、作业摘要)。
|
||||
- **数据来源**:
|
||||
- 班级作业洞察:`getClassHomeworkInsights`
|
||||
- 学生列表:`getClassStudents`
|
||||
- 课表:`getClassSchedule`
|
||||
- 学科成绩:`getClassStudentSubjectScoresV2`
|
||||
- **关键组件**:
|
||||
- `ClassHeader`
|
||||
- `ClassOverviewStats`
|
||||
- `ClassTrendsWidget`
|
||||
- `ClassStudentsWidget`
|
||||
- `ClassScheduleWidget`
|
||||
- `ClassAssignmentsWidget`
|
||||
- **空状态**: `insights` 缺失返回 `notFound()`
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.5 学生列表 `/teacher/classes/students`
|
||||
实现:[classes/students/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/students/page.tsx)
|
||||
|
||||
- **目的**: 按班级、关键词、状态筛选学生,并显示学科成绩。
|
||||
- **数据来源**:
|
||||
- 教师班级:`getTeacherClasses`
|
||||
- 学生列表:`getClassStudents`
|
||||
- 学科成绩:`getStudentsSubjectScores`
|
||||
- **关键组件**:
|
||||
- `StudentsFilters`
|
||||
- `StudentsTable`
|
||||
- `EmptyState` / `Skeleton`
|
||||
- **筛选逻辑**: 未显式选择班级时默认第一班级
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.6 课表 `/teacher/classes/schedule`
|
||||
实现:[classes/schedule/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/schedule/page.tsx)
|
||||
|
||||
- **目的**: 按班级查看课表。
|
||||
- **数据来源**:
|
||||
- 班级:`getTeacherClasses`
|
||||
- 课表:`getClassSchedule`
|
||||
- **关键组件**:
|
||||
- `ScheduleFilters`
|
||||
- `ScheduleView`
|
||||
- `EmptyState` / `Skeleton`
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.7 作业入口 `/teacher/homework`
|
||||
实现:[homework/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/page.tsx)
|
||||
|
||||
- **目的**: 统一导向作业列表。
|
||||
- **行为**: `redirect("/teacher/homework/assignments")`
|
||||
|
||||
### 3.8 作业列表 `/teacher/homework/assignments`
|
||||
实现:[homework/assignments/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/page.tsx)
|
||||
|
||||
- **目的**: 查看作业列表与状态,支持按班级筛选,提供创建入口。
|
||||
- **数据来源**:
|
||||
- 作业列表:`getHomeworkAssignments`
|
||||
- 班级列表(用于显示名称):`getTeacherClasses`
|
||||
- **关键组件**: `Table`、`Badge`、`EmptyState`
|
||||
- **空状态**: 无作业时提示创建
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.9 创建作业 `/teacher/homework/assignments/create`
|
||||
实现:[homework/assignments/create/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/create/page.tsx)
|
||||
|
||||
- **目的**: 从 Exam 派发作业。
|
||||
- **数据来源**:
|
||||
- 可派发的 Exam:`getExams`
|
||||
- 班级列表:`getTeacherClasses`
|
||||
- **关键组件**: `HomeworkAssignmentForm`
|
||||
- **空状态**:
|
||||
- 无 Exam:提示先创建考试
|
||||
- 无班级:提示先创建班级
|
||||
|
||||
### 3.10 作业详情 `/teacher/homework/assignments/[id]`
|
||||
实现:[homework/assignments/[id]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/%5Bid%5D/page.tsx)
|
||||
|
||||
- **目的**: 展示作业详情、错题概览与试卷内容。
|
||||
- **数据来源**: `getHomeworkAssignmentAnalytics`
|
||||
- **关键组件**:
|
||||
- `HomeworkAssignmentQuestionErrorOverviewCard`
|
||||
- `HomeworkAssignmentExamContentCard`
|
||||
- **空状态**: 查不到作业时 `notFound()`
|
||||
|
||||
### 3.11 作业提交列表 `/teacher/homework/assignments/[id]/submissions`
|
||||
实现:[homework/assignments/[id]/submissions/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/assignments/%5Bid%5D/submissions/page.tsx)
|
||||
|
||||
- **目的**: 按作业查看提交与评分进度。
|
||||
- **数据来源**:
|
||||
- 作业信息:`getHomeworkAssignmentById`
|
||||
- 提交列表:`getHomeworkSubmissions`
|
||||
- **关键组件**: `Table`、`Badge`
|
||||
- **空状态**: 作业不存在时 `notFound()`
|
||||
|
||||
### 3.12 全部提交 `/teacher/homework/submissions`
|
||||
实现:[homework/submissions/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/submissions/page.tsx)
|
||||
|
||||
- **目的**: 按作业汇总查看所有提交与批改入口。
|
||||
- **数据来源**:
|
||||
- 教师身份:`getTeacherIdForMutations`
|
||||
- 作业审阅列表:`getHomeworkAssignmentReviewList`
|
||||
- **关键组件**: `Table`、`Badge`、`EmptyState`
|
||||
|
||||
### 3.13 提交批改 `/teacher/homework/submissions/[submissionId]`
|
||||
实现:[homework/submissions/[submissionId]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/submissions/%5BsubmissionId%5D/page.tsx)
|
||||
|
||||
- **目的**: 作业批改视图,按题打分与反馈。
|
||||
- **数据来源**: `getHomeworkSubmissionDetails`
|
||||
- **关键组件**: `HomeworkGradingView`
|
||||
- **空状态**: 查不到提交时 `notFound()`
|
||||
|
||||
### 3.14 考试入口 `/teacher/exams`
|
||||
实现:[exams/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/page.tsx)
|
||||
|
||||
- **目的**: 统一导向考试列表。
|
||||
- **行为**: `redirect("/teacher/exams/all")`
|
||||
|
||||
### 3.15 考试列表 `/teacher/exams/all`
|
||||
实现:[exams/all/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/all/page.tsx)
|
||||
|
||||
- **目的**: 列出考试并支持筛选、统计、创建入口。
|
||||
- **数据来源**: `getExams`(按关键词/状态/难度过滤)
|
||||
- **关键组件**:
|
||||
- `ExamFilters`
|
||||
- `ExamDataTable`
|
||||
- `EmptyState` / `Skeleton`
|
||||
- **统计**: 对列表结果进行状态数量统计(draft/published/archived)
|
||||
|
||||
### 3.16 创建考试 `/teacher/exams/create`
|
||||
实现:[exams/create/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/create/page.tsx)
|
||||
|
||||
- **目的**: 创建考试基础信息。
|
||||
- **关键组件**: `ExamForm`
|
||||
|
||||
### 3.17 组卷 `/teacher/exams/[id]/build`
|
||||
实现:[exams/[id]/build/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/%5Bid%5D/build/page.tsx)
|
||||
|
||||
- **目的**: 从题库选择题目并构建考试结构。
|
||||
- **数据来源**:
|
||||
- 考试数据:`getExamById`
|
||||
- 题库数据:`getQuestions`
|
||||
- **关键组件**: `ExamAssembly`
|
||||
- **关键逻辑**:
|
||||
- 读取已选题并初始化 `initialSelected`
|
||||
- 将题目数据映射为 `Question` 类型
|
||||
- 归一化 `structure` 并保证节点 `id` 唯一
|
||||
|
||||
### 3.18 阅卷入口 `/teacher/exams/grading*`
|
||||
实现:[exams/grading/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/grading/page.tsx)、[exams/grading/[submissionId]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/grading/%5BsubmissionId%5D/page.tsx)
|
||||
|
||||
- **目的**: 统一重定向至作业批改视图。
|
||||
- **行为**: `redirect("/teacher/homework/submissions")`
|
||||
|
||||
### 3.19 题库 `/teacher/questions`
|
||||
实现:[questions/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/questions/page.tsx)
|
||||
|
||||
- **目的**: 题库管理与筛选。
|
||||
- **数据来源**: `getQuestions`(按关键词/题型/难度过滤)
|
||||
- **关键组件**:
|
||||
- `QuestionFilters`
|
||||
- `QuestionDataTable`
|
||||
- `CreateQuestionButton`
|
||||
- `EmptyState` / `Skeleton`
|
||||
|
||||
### 3.20 教材列表 `/teacher/textbooks`
|
||||
实现:[textbooks/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/textbooks/page.tsx)
|
||||
|
||||
- **目的**: 教材管理与筛选,创建入口。
|
||||
- **数据来源**: `getTextbooks`
|
||||
- **关键组件**:
|
||||
- `TextbookFilters`
|
||||
- `TextbookCard`
|
||||
- `TextbookFormDialog`
|
||||
- `EmptyState`
|
||||
- **渲染策略**: `dynamic = "force-dynamic"`
|
||||
|
||||
### 3.21 教材详情 `/teacher/textbooks/[id]`
|
||||
实现:[textbooks/[id]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/textbooks/%5Bid%5D/page.tsx)
|
||||
|
||||
- **目的**: 教材章节与知识点结构阅读与维护。
|
||||
- **数据来源**:
|
||||
- 教材:`getTextbookById`
|
||||
- 章节:`getChaptersByTextbookId`
|
||||
- 知识点:`getKnowledgePointsByTextbookId`
|
||||
- **关键组件**:
|
||||
- `TextbookReader`
|
||||
- `TextbookSettingsDialog`
|
||||
- **空状态**: 教材不存在时 `notFound()`
|
||||
|
||||
---
|
||||
|
||||
## 4. 依赖模块清单
|
||||
|
||||
教师端页面主要依赖以下模块:
|
||||
|
||||
- 班级与排课:`src/modules/classes`
|
||||
- 作业:`src/modules/homework`
|
||||
- 考试:`src/modules/exams`
|
||||
- 题库:`src/modules/questions`
|
||||
- 教材:`src/modules/textbooks`
|
||||
- 工作台:`src/modules/dashboard`
|
||||
|
||||
150
docs/design/009_feature_gap_analysis.md
Normal file
150
docs/design/009_feature_gap_analysis.md
Normal file
@@ -0,0 +1,150 @@
|
||||
# 功能实现对比文档(已实现 vs 规划)
|
||||
|
||||
**日期**: 2026-03-03
|
||||
**范围**: 基于 PRD 与现有设计文档的功能落地对比
|
||||
|
||||
---
|
||||
|
||||
## 1. 依据与来源
|
||||
|
||||
本对比基于以下文档:
|
||||
|
||||
- 产品规划:PRD(`docs/product_requirements.md`)
|
||||
- 已实现模块:
|
||||
- 教师仪表盘与班级管理:[002_teacher_dashboard_implementation.md](file:///e:/Desktop/CICD/docs/design/002_teacher_dashboard_implementation.md)
|
||||
- 教材模块:[003_textbooks_module_implementation.md](file:///e:/Desktop/CICD/docs/design/003_textbooks_module_implementation.md)
|
||||
- 题库模块:[004_question_bank_implementation.md](file:///e:/Desktop/CICD/docs/design/004_question_bank_implementation.md)
|
||||
- 考试模块:[005_exam_module_implementation.md](file:///e:/Desktop/CICD/docs/design/005_exam_module_implementation.md)
|
||||
- 作业模块:[006_homework_module_implementation.md](file:///e:/Desktop/CICD/docs/design/006_homework_module_implementation.md)
|
||||
- 学校管理模块:[007_school_module_implementation.md](file:///e:/Desktop/CICD/docs/design/007_school_module_implementation.md)
|
||||
|
||||
---
|
||||
|
||||
## 2. 便利贴视图(按 Roles / Page / 功能)
|
||||
|
||||
> **🟨 Roles**
|
||||
>
|
||||
> - **教师(Teacher)**:备课、出卷、作业批改与班级管理
|
||||
> - **学生(Student)**:作业完成与教材阅读(只读)
|
||||
> - **管理端(Admin/校长/年级主任/教研组长/班主任)**:规划中,未完全落地
|
||||
|
||||
> **🟨 Page**
|
||||
>
|
||||
> - **教师工作台**:`/teacher/dashboard`
|
||||
> - **班级**:`/teacher/classes/*`
|
||||
> - **作业**:`/teacher/homework/*`
|
||||
> - **考试**:`/teacher/exams/*`
|
||||
> - **题库**:`/teacher/questions`
|
||||
> - **教材**:`/teacher/textbooks/*`
|
||||
|
||||
> **🟨 功能(规划目标)**
|
||||
>
|
||||
> - **权限与角色**:多角色矩阵 + RLS 行级隔离
|
||||
> - **智能题库**:嵌套题、知识点关联
|
||||
> - **知识图谱**:知识点树 + 题目/章节关联
|
||||
> - **教材映射**:章节 ↔ 知识点
|
||||
> - **组卷引擎**:筛选/分组/结构化试卷
|
||||
> - **作业闭环**:派发-提交-批改-统计
|
||||
> - **通知中心**:分级提醒策略
|
||||
|
||||
---
|
||||
|
||||
## 3. 已实现页面功能清单(简述)
|
||||
|
||||
> **🟨 教师工作台**
|
||||
>
|
||||
> - `/teacher/dashboard`
|
||||
> 功能:汇总班级、课表、作业、提交与成绩趋势
|
||||
> 目标:快速掌握教学全局
|
||||
|
||||
> **🟨 班级**
|
||||
>
|
||||
> - `/teacher/classes`
|
||||
> 功能:班级入口重定向
|
||||
> 目标:统一进入我的班级
|
||||
> - `/teacher/classes/my`
|
||||
> 功能:班级列表与学科选择
|
||||
> 目标:管理所教班级
|
||||
> - `/teacher/classes/my/[id]`
|
||||
> 功能:班级详情概览、作业趋势、学生与课表
|
||||
> 目标:掌握班级学习情况
|
||||
> - `/teacher/classes/students`
|
||||
> 功能:学生筛选与成绩查看
|
||||
> 目标:定位学生画像与状态
|
||||
> - `/teacher/classes/schedule`
|
||||
> 功能:班级课表查看
|
||||
> 目标:排课信息可视化
|
||||
|
||||
> **🟨 作业**
|
||||
>
|
||||
> - `/teacher/homework/assignments`
|
||||
> 功能:作业列表与状态
|
||||
> 目标:管理作业发布
|
||||
> - `/teacher/homework/assignments/create`
|
||||
> 功能:从考试派发作业
|
||||
> 目标:快速生成作业
|
||||
> - `/teacher/homework/assignments/[id]`
|
||||
> 功能:作业详情与错题概览
|
||||
> 目标:定位薄弱题型
|
||||
> - `/teacher/homework/assignments/[id]/submissions`
|
||||
> 功能:作业提交列表
|
||||
> 目标:查看班级完成度
|
||||
> - `/teacher/homework/submissions`
|
||||
> 功能:所有作业提交汇总
|
||||
> 目标:统一批改入口
|
||||
> - `/teacher/homework/submissions/[submissionId]`
|
||||
> 功能:作业批改与反馈
|
||||
> 目标:完成评分与讲评
|
||||
|
||||
> **🟨 考试**
|
||||
>
|
||||
> - `/teacher/exams/all`
|
||||
> 功能:考试列表与筛选
|
||||
> 目标:管理考试资产
|
||||
> - `/teacher/exams/create`
|
||||
> 功能:创建考试基础信息
|
||||
> 目标:建立试卷草稿
|
||||
> - `/teacher/exams/[id]/build`
|
||||
> 功能:题库选题与结构化组卷
|
||||
> 目标:完成试卷构建
|
||||
|
||||
> **🟨 题库**
|
||||
>
|
||||
> - `/teacher/questions`
|
||||
> 功能:题库检索与管理
|
||||
> 目标:积累与复用题目
|
||||
|
||||
> **🟨 教材**
|
||||
>
|
||||
> - `/teacher/textbooks`
|
||||
> 功能:教材管理与筛选
|
||||
> 目标:组织课程资源
|
||||
> - `/teacher/textbooks/[id]`
|
||||
> 功能:章节与知识点维护
|
||||
> 目标:构建教材结构
|
||||
|
||||
---
|
||||
|
||||
## 4. 差距清单(简述)
|
||||
|
||||
> **🟨 权限与治理**
|
||||
>
|
||||
> - 多角色 RBAC 细化权限未落地
|
||||
> - RLS 数据隔离策略未落地
|
||||
|
||||
> **🟨 教学质量与推荐**
|
||||
>
|
||||
> - 章节 → 知识点 → 题库的自动推荐链路未落地
|
||||
> - 知识点图谱深层能力未落地
|
||||
> - 学科维度与权重/标签机制未落地
|
||||
|
||||
> **🟨 组卷与作业高级能力**
|
||||
>
|
||||
> - AB 卷与乱序策略未落地
|
||||
> - 作业分层与交集筛选未落地
|
||||
> - 学习画像/成长档案层的评估闭环尚未体现
|
||||
|
||||
> **🟨 通知与消息闭环**
|
||||
>
|
||||
> - 分级通知体系未落地
|
||||
|
||||
@@ -4,6 +4,7 @@ import { users, exams, questions, knowledgePoints, examSubmissions, examQuestion
|
||||
import { createId } from "@paralleldrive/cuid2"
|
||||
import { faker } from "@faker-js/faker"
|
||||
import { eq } from "drizzle-orm"
|
||||
import { hash } from "bcryptjs"
|
||||
|
||||
/**
|
||||
* Seed Script for Next_Edu
|
||||
@@ -19,6 +20,7 @@ const DIFFICULTY = [1, 2, 3, 4, 5]
|
||||
|
||||
async function seed() {
|
||||
console.log("🌱 Starting seed process...")
|
||||
const passwordHash = await hash("123456", 10)
|
||||
|
||||
// 1. Create a Teacher User if not exists
|
||||
const teacherEmail = "teacher@example.com"
|
||||
@@ -36,6 +38,7 @@ async function seed() {
|
||||
email: teacherEmail,
|
||||
role: "teacher",
|
||||
image: "https://api.dicebear.com/7.x/avataaars/svg?seed=Teacher",
|
||||
password: passwordHash,
|
||||
})
|
||||
} else {
|
||||
teacherId = existingTeacher.id
|
||||
@@ -54,6 +57,7 @@ async function seed() {
|
||||
email: faker.internet.email(),
|
||||
role: "student",
|
||||
image: `https://api.dicebear.com/7.x/avataaars/svg?seed=${sId}`,
|
||||
password: passwordHash,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
# Work Log
|
||||
|
||||
## 2026-03-03
|
||||
|
||||
### 1. 教师加入班级学科分配逻辑修复
|
||||
- 修复教师已在班级中但选择学科加入时被直接返回成功的问题。
|
||||
- 班级未创建该学科映射时,先补齐映射再分配。
|
||||
- 学科已被其他老师占用时,返回明确提示。
|
||||
- 主要修改:
|
||||
- [data-access.ts](file:///e:/Desktop/CICD/src/modules/classes/data-access.ts)
|
||||
|
||||
### 2. 验证
|
||||
- 质量检查:`npm run lint`、`npm run typecheck` 均通过。
|
||||
|
||||
## 2026-03-02
|
||||
|
||||
### 1. 班级详情访问修复(基于会话身份)
|
||||
|
||||
Reference in New Issue
Block a user