Files
NextEdu/docs/work_log.md
SpecialX f8dfd1dddd docs: 全项目架构审查与文档体系重写
- 全项目逐文件审查: 4 份审计报告(shared/core-business/management/new-modules)
- 重写 004 架构影响地图: 图优先 + 模块依赖图 + 数据流 + 调用链 + 问题分级
- 更新 005 结构化数据: 新增 architectureOverview/moduleDependencyGraph/knownIssues/dbTables 节点
- 更新 006 功能清单: 143 项功能标注实现状态, P0 覆盖率 80%->92%
- 更新 007 差距审计: v2->v3, P0 完成 69%->84%, 新增架构技术债章节
- 更新 001 项目概览: 6 角色/54 权限/26 模块/54 表
- 新增 docs/README.md 文档索引
- 归档 11 份过时文档(002x2/003/designx8) 标注
- 更新 work_log
2026-06-17 21:51:32 +08:00

412 lines
22 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.
# Work Log
## 2026-06-17
### 架构全面审查与文档重构
#### 问题背景
用户反馈:架构文档阅读后仍无法理解各模块、函数关系,说明文档质量不足或代码耦合度过高。006/007 及其他文档长期未更新。
#### 完成工作
##### 1. 全项目逐文件审查(4 份审查报告)
- `docs/architecture/audit/shared-audit.md` - shared 基础设施层(69 文件,15 问题)
- `docs/architecture/audit/core-business-audit.md` - 核心业务模块(exams/homework/questions/textbooks/grades)
- `docs/architecture/audit/management-modules-audit.md` - 管理模块(school/classes/scheduling/attendance/users/audit/course-plans/announcements)
- `docs/architecture/audit/new-and-other-modules-audit.md` - 新增模块和其他模块(elective/proctoring/diagnostic/notifications/dashboard/messaging/parent/settings/files/auth/layout/student)
- `docs/architecture/audit/00_summary.md` - 汇总报告
##### 2. 发现的关键问题
**P0 严重问题(6 项)**:
1. `classes/data-access.ts` 2104 行,超硬上限 2.1 倍,混入 homework/scheduling/grades 逻辑
2. `homework/data-access.ts` 1038 行,超硬上限,混入排名计算
3. `shared/lib``auth` 循环依赖
4. `dashboard/data-access.ts` 直查 11 张跨模块表
5. `messaging` 绕过 `notifications` 直接写通知
6. `classSchedule` 表三处写入口(数据完整性风险)
**P1 较严重问题(6 项)**:
- 跨模块直接 DB 查询普遍存在(classes 被 8+ 处直接查询)
- actions 层混入数据访问逻辑
- auth.ts 混合 5 类职责
- users/import-export.ts 四重职责
- proctoring/exam-mode-config.tsx 死代码
- notifications 反向依赖 messaging
##### 3. 重写架构文档(5 份)
- **004 架构影响地图**:从"罗列函数签名"重构为"图优先 + 结构化",含分层架构图、模块依赖关系图(标注合理/违规/循环依赖)、数据流向图、核心调用链路、26 个模块清单、P0/P1/P2 问题分级与解耦建议
- **005 架构数据 JSON**:新增 architectureOverview、moduleDependencyGraph(25 节点 37 边)、knownIssues(12 问题)、dbTables(54 表按业务域分组)节点;补全 permissions(52→54)、apiRoutes(10→11)
- **006 功能清单**:添加"当前实现状态"列,143 个功能项标注 ✅/⚠️/❌,P0 覆盖率 80%→92%
- **007 差距审计报告**:v2→v3,总体完成度 P0 69%→84%,P2 路线图 8/14=57%,新增架构技术债章节
- **001 项目概览**:更新为 6 角色/54 权限/26 模块/54 表,新增架构原则和项目状态章节
##### 4. 文档治理
- 创建 `docs/README.md` 文档索引(架构/审查/专题/归档分类)
- 11 个过时文档添加"已归档"标注(002×2/003/设计文档×8)
- 所有文档保持活跃维护与归档分离
#### 验证
- 待验证 lint + tsc
---
### P2 质量保障类实现5 项全部完成)
#### 1. 屏幕阅读器兼容性增强a11y
- 新增无障碍工具库:`src/shared/lib/a11y.ts`useA11yId/mergeA11yProps/describeInput/loadingAria
- 新增 Hook`src/shared/hooks/use-aria-live.ts`aria-live 区域管理)
- 新增组件:`src/shared/components/a11y/`skip-link/visually-hidden/focus-trap/aria-status
- 增强 UI 组件table.tsx 添加系统性 ARIA roledialog.tsx 添加 aria-modal
- 审计文档:`docs/accessibility/a11y-audit.md`(含 WCAG 2.1 AA 合规清单)
#### 2. 视觉回归测试Visual Regression
- 配置:`tests/visual/visual.config.ts`3 视口 × 2 主题)
- 测试套件homepage/admin-dashboard/teacher-dashboard/student-dashboard
- 辅助函数auth.ts登录态管理、visual-helpers.ts视口/主题/遮罩)
- 更新 playwright.config.ts新增 visual-chromium 项目maxDiffPixelRatio 0.01
- 文档:`docs/testing/visual-regression.md`
#### 3. 短信/微信推送渠道集成notifications
- 新增模块:`src/modules/notifications/`
- 渠道实现SMS阿里云/腾讯云/Mock、WeChat公众号模板消息、EmailNodemailer SMTP、In-App
- 分发器:按用户通知偏好并行多渠道发送
- Server ActionssendNotificationAction、sendClassNotificationAction
- 外部 SDK 动态 importMock 模式开发环境可用
- 配置:`.env.example`,文档:`docs/notifications/channels.md`
#### 4. 漏洞扫描 CI 集成security
- 增强 CIsecurity-scan jobnpm audit + Snyk + Trivy FS + OWASP ZAP
- 独立工作流:`.gitea/workflows/security.yml`(每周一深度扫描,含容器镜像扫描)
- 配置:`.gitea/suppressions.json`Snyk 抑制)、`.trivyignore`Trivy CVE 忽略)
- 本地脚本:`scripts/security-scan.sh` + `scripts/security-scan.ps1`
- 文档:`docs/security/scanning.md`(含 SLAcritical 24h/high 7d/medium 30d/low 90d
#### 5. 灾备方案DR
- 脚本backup-verify.sh完整性校验、backup-offsite-sync.shS3/OSS/NFS 异地同步、dr-drill.sh/ps1灾备演练、failover.sh故障切换、health-check.sh健康检查
- CI 增强scheduled-backup 添加校验+异地同步,新增 weekly-dr-drill job
- 独立工作流:`.gitea/workflows/dr-drill.yml`(每周一凌晨 4 点自动演练)
- 文档:`docs/dr/dr-plan.md`RTO 4h/RPO 24h`docs/dr/dr-runbook.md`6 大故障场景操作手册)
- 配置:`.env.example` 灾备环境变量
#### 验证
- `npx tsc --noEmit`0 错误
- `npm run lint`0 错误 0 警告
---
### P2 功能扩展类实现(功能扩展 + 质量保障首批)
#### 1. 选课管理模块elective
- 新增 schema 表:`electiveCourses`(选修课程)、`courseSelections`(选课记录)
- 新增权限:`ELECTIVE_MANAGE``ELECTIVE_READ``ELECTIVE_SELECT`
- 模块文件:`src/modules/elective/`types/schema/data-access×3/actions/components×3
- 路由admin/teacher/student 三端 elective 页面
- 支持:先到先得 + 抽签两种选课模式,容量控制,退选
#### 2. 考试监考模块proctoring
- 新增 schema`exams` 表扩展 examMode/durationMinutes/antiCheatEnabled 等字段;新增 `examProctoringEvents`
- 新增权限:`EXAM_PROCTOR``EXAM_PROCTOR_READ`
- 模块文件:`src/modules/proctoring/`types/data-access/actions/components×3
- API 路由:`/api/proctoring/event` 接收学生端上报
- 页面:教师监考面板 + 学生端防作弊监控tab切换/复制粘贴/右键/开发者工具/全屏退出/空闲超时检测)
#### 3. 学情诊断报告模块diagnostic
- 新增 schema`knowledgePointMastery`(知识点掌握度)、`learningDiagnosticReports`(诊断报告)
- 新增权限:`DIAGNOSTIC_MANAGE``DIAGNOSTIC_READ`
- 模块文件:`src/modules/diagnostic/`types/data-access×2/actions/components×4
- 功能:基于提交答案自动计算知识点掌握度,生成个人/班级诊断报告(强项/弱项/建议),雷达图可视化
- 页面teacher 诊断管理 + 学生查看自己报告
#### 4. 项目规则更新
- `.trae/rules/project_rules.md` 单文件行数限制从 300 行调整为企业级规范:
- React 组件 ≤ 500 行(复杂场景可放宽至 800
- Server Actions / Data Access ≤ 800 行
- 硬性上限 1000 行
#### 5. 种子脚本 lint 修复
- `scripts/seed.ts` 消除全部 `any` 类型17 个 error → 0
- 定义内部类型SeedQuestion/SeedQuestionBank/SeedGradeRecord/SeedAttendanceRecord
- 移除未使用参数,函数签名精简
#### 6. 架构文档同步
- `docs/architecture/004_architecture_impact_map.md` 新增 elective/proctoring/diagnostic 三个模块章节
- `docs/architecture/005_architecture_data.json` 同步权限点、角色映射、dbTables、modules、dependencyMatrix、routes
#### 验证
- `npx tsc --noEmit`0 错误
- `npm run lint`0 错误 0 警告
---
### 前序工作(同日早些时候)
### 1. Next.js 16 Proxy 修复
- `src/proxy.ts` 导出函数从 `middleware` 重命名为 `proxy`Next.js 16 要求)
- 修复 `getToken()` 在 edge 运行时缺少 `secret` 导致的 `MissingSecret` 错误
- 显式传入 `secret: process.env.NEXTAUTH_SECRET`
- 主要修改:[proxy.ts](file:///e:/Desktop/CICD/src/proxy.ts)
### 2. MySQL 端口切换 + 数据库创建脚本
- `.env` 中 MySQL 端口从 13002 改为 14013
- 新增 `scripts/create-db.ts`:连接 MySQL不指定库后执行 `CREATE DATABASE IF NOT EXISTS next_edu`,字符集 utf8mb4_unicode_ci
- 主要修改:[.env](file:///e:/Desktop/CICD/.env)、[create-db.ts](file:///e:/Desktop/CICD/scripts/create-db.ts)
### 3. 种子脚本完全重写(小学场景)
- 完全重写 `scripts/seed.ts`,实现小学完整场景初始化
- 数据规模:
- 1 所学校实验小学、2 个年级(一/二年级)、每年级 2 个班级
- 8 名教师(每班 2 名1 班主任 + 1 科任,跨班覆盖语数外 3 科)
- 24 名学生(每班 6 名)+ 24 名家长
- 3 科教材(语数外各 1 本)+ 章节 + 知识点
- 15 道题目(每科 5 道:单选/文本/判断)
- 2 套试卷(语文/数学)+ 24 份提交 + 120 个答案
- 2 套作业 + 6 份提交 + 30 个答案
- 课表、成绩、考勤、课程计划、公告等完整数据
- 6 个角色 + 47 个权限点的 RBAC 映射149 条记录)
- 17 个顺序步骤,耗时约 127s
- 主要修改:[seed.ts](file:///e:/Desktop/CICD/scripts/seed.ts)
### 4. 迁移脚本系统重构
- **问题**:旧迁移系统存在多个缺陷
- `0011_ai_providers.sql` 未在 `_journal.json` 中注册,导致 `drizzle-kit migrate` 失败
- 缺少多数 snapshot 文件(仅存 0008、0009
- 迁移 SQL 使用复杂 PREPARE/EXECUTE 条件模式,维护困难
- **修复**:清理全部旧迁移文件与 meta 目录,使用 `drizzle-kit generate` 从 schema 重新生成
- 生成单一迁移文件 `0000_perfect_pestilence.sql`,包含全部 49 张表
- journal 重置为单条记录snapshot 完整
- **新增 npm 脚本**package.json
- `db:create`:创建数据库
- `db:push`:直接同步 schema开发用
- `db:setup`:一键 create → migrate → seed
- 主要修改:[package.json](file:///e:/Desktop/CICD/package.json)、drizzle/ 目录
### 5. 验证
- 干净数据库全流程测试:`db:create``db:migrate``db:seed` 全部通过
- 49 张表成功创建,种子数据完整写入
- 测试账号(密码均为 123456
- 管理员: admin@xiaoxue.edu.cn
- 语文老师/一年级1班班主任: t_chinese_1@xiaoxue.edu.cn
- 数学老师: t_math_1@xiaoxue.edu.cn
- 英语老师: t_english_1@xiaoxue.edu.cn
- 学生: student_g1c1_1@xiaoxue.edu.cn
- 家长: parent_g1c1_1@xiaoxue.edu.cn
## 2026-03-19
### 1. 作业与权限测试覆盖补齐(第二阶段)
- 新增角色路由与代理守卫集成测试:
- `tests/integration/dashboard-routing.test.ts`
- `tests/integration/proxy-guard.test.ts`
- 扩展 onboarding 完成接口集成测试,覆盖班级-学科映射与教师分配逻辑:
- `tests/integration/api-onboarding-complete.route.test.ts`
- 新增认证业务流 E2E注册 -> 登录 -> 受保护区域):
- `tests/e2e/auth-business-flow.spec.ts`
- 新增并补齐作业流程集成测试,覆盖创建、开始作答、提交、批改、保存答案:
- `tests/integration/homework-create-assignment.test.ts`
- `tests/integration/homework-actions.test.ts`
- `saveHomeworkAnswerAction` 增加关键分支用例:
- started 状态首次保存答案insert
- started 状态更新已有答案update
### 2. 验证
- `npm run test:integration`通过7 文件38 用例)
- `npm run lint`:通过
- `npm run typecheck`:通过
- `npm run test:e2e`通过40 通过1 跳过)
- 语言诊断:无错误
## 2026-03-18
### 1. 企业级测试体系落地(第一阶段)
- 新增集成测试与 E2E 基础设施:
- `vitest.config.ts`
- `playwright.config.ts`
- `tests/setup/integration.setup.ts`
- 新增接口集成测试:
- `tests/integration/api-ai-chat.route.test.ts`
- `tests/integration/api-onboarding-status.route.test.ts`
- `tests/integration/api-onboarding-complete.route.test.ts`
- 新增认证冒烟 E2E
- `tests/e2e/smoke-auth.spec.ts`
- 新增全路由回归 E2E
- `tests/e2e/full-route-regression.spec.ts`
- 新增工程脚本:
- `test``test:ci``test:integration``test:e2e``test:e2e:smoke``test:e2e:full-routes`
- 更新 CI 质量门禁:
- 增加 Playwright Chromium 安装
- 增加集成测试执行
- 增加 E2E 全量回归测试执行
### 2. 验证
- `npm run lint`:通过
- `npm run typecheck`:通过
- `npm run test:integration`通过3 文件10 用例)
- `npm run build`:通过
- `npm run test:e2e:smoke`:通过(本地使用系统 Chrome 通道2 用例通过)
- `npm run test:e2e:full-routes`通过38 用例通过)
## 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. 班级详情访问修复(基于会话身份)
- 将数据获取中的教师 ID 来源改为会话用户,移除默认教师 ID 逻辑,修复“新加入班级无法查看班级详情”问题。
- 主要修改:
- [data-access.ts](file:///e:/Desktop/CICD/src/modules/classes/data-access.ts)
- [page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/classes/my/%5Bid%5D/page.tsx)
### 2. 任课权限与班主任权限区分(学科可见范围)
- 班主任可查看班级下所有学科;任课老师仅可查看自己负责的学科。
- 新增并应用分配学科查询,过滤相应统计与列表。
- 主要修改:
- [data-access.ts](file:///e:/Desktop/CICD/src/modules/classes/data-access.ts)
### 3. 新注册学生默认班级问题修复
- 调整示例学生获取逻辑,避免为新注册学生展示“默认班级”。
- 主要修改:
- [data-access.ts](file:///e:/Desktop/CICD/src/modules/homework/data-access.ts)
### 4. 教材列表 UI 精简为纯色风格
- 将教材卡片头部背景从渐变与纹理改为简洁纯色;图标容器调整为简洁样式,视觉噪音更低。
- 主要修改:
- [textbook-card.tsx](file:///e:/Desktop/CICD/src/modules/textbooks/components/textbook-card.tsx)
### 5. 学生导航清理未实现入口
- 移除学生侧导航的“Resources”入口页面未实现避免死链
- 主要修改:
- [navigation.ts](file:///e:/Desktop/CICD/src/modules/layout/config/navigation.ts)
### 6. 验证
- 质量检查:`npm run lint``npm run typecheck` 均通过。
## 2026-02-24
### 1. Credentials 登录与密码安全修复
* **密码哈希规范化**
* 注册时统一生成标准 bcrypt 前缀(`$2a/$2b/$2y`),确保数据库内哈希格式一致。
* 登录时对非标准前缀(如 `$10$...`)自动补全为 `$2b$...` 再校验,避免格式不一致导致登录失败。
* **登录一致性修复**
* 登录校验不再对密码做 `trim()`,避免前后空格导致的 bcrypt 比对失败。
* **调试排障(已回收)**
* 临时加入安全日志定位失败原因(不输出明文),定位后已移除。
### 2. 验证
* `npm run typecheck`:通过
* `npm run lint`:存在既有告警(未新增)
## 2026-01-15
### 1. Schedule Module Optimization
* **Visual Overhaul (`schedule-view.tsx`)**:
* Refactored the schedule grid to match the exact design of the `ClassScheduleGrid` widget.
* Implemented a clean, borderless layout with no grid lines for a modern look.
* **Time-Based Positioning**: Replaced grid-row logic with absolute positioning based on time (8:00 - 18:00 range) using percentage calculations (`getPositionStyle`).
* **Color Coding**: Added `getSubjectColor` to auto-assign thematic colors (blue for Math, purple for Physics, etc.) based on course names.
* **Card Design**: Refined course cards with vertical centering, better spacing, and removed unnecessary UI elements (like the "+" button in headers).
* **Filter Bar Refinement (`schedule-filters.tsx`)**:
* **Minimalist Design**: Removed borders and shadows from the class selector and buttons to integrate seamlessly with the background.
* **Center Label**: Added a dynamic, absolute-centered text label that updates based on selection:
* Shows "All Classes" when no filter is active.
* Shows "{Class Name}" when a specific class is selected.
* **Simplified Controls**: Removed the "Reset" button (X icon) entirely for a cleaner interface.
* **Ghost Buttons**: Styled the "Add Event" button as a ghost variant with muted colors.
### 2. Architecture & Cleanup
* **Insights Module Removal**:
* Deleted the entire `src/app/(dashboard)/teacher/classes/insights` directory as the feature was deemed redundant.
* Removed `insights-filters.tsx` component.
* Updated `navigation.ts` to remove the "Insights" link from the sidebar.
* *Note*: Preserved `getClassHomeworkInsights` in `data-access.ts` as it's still used by the Class Detail dashboard widgets.
### 3. Verification
* **Type Safety**: Ran `npm run typecheck` multiple times during refactoring to ensure no regressions (Passed).
* **Build**: Attempted to clear build cache to resolve a chunk loading error (Windows permission issue encountered but workaround applied).
## 2026-01-14
### 1. Class Management Refactoring (Role Separation)
* **Separation of Duties**:
* Moved class creation and management responsibilities from the generic Teacher view to a dedicated Management view.
* Created **Grade Management Page** at `src/app/(dashboard)/management/grade/classes/page.tsx` for Grade Directors and Admins.
* Teachers can now only **Join Classes** (via code) or view their assigned classes in "My Classes".
* **New Components & Pages**:
* `GradeClassesView` (`src/modules/classes/components/grade-classes-view.tsx`): A comprehensive table view for managing classes within specific grades, supporting creation, editing, and deletion.
* `GradeClassesPage`: Server Component that fetches managed grades and classes using strict RBAC (Role-Based Access Control).
* **Teacher "My Classes" Update (`my-classes-grid.tsx`)**:
* Removed the "Create Class" button/dialog.
* Added a **"Join Class"** dialog that accepts a 6-digit invitation code.
* Updated styling to use standard design system colors (`bg-card`, `border-border`) instead of hardcoded gradients.
### 2. Backend & Logic Updates
* **Data Access (`data-access.ts`)**:
* Implemented `getGradeManagedClasses`: Fetches classes for grades where the user is either a Grade Head or Teaching Head.
* Implemented `getManagedGrades`: Fetches the list of grades managed by the user for the creation dropdown.
* Updated `getTeacherClasses`: Now returns both **owned classes** (assigned by admin) and **enrolled classes** (joined via code).
* Fixed a SQL syntax error in `getGradeManagedClasses` (unescaped backticks in template literal).
* **Server Actions (`actions.ts`)**:
* Added `createGradeClassAction`, `updateGradeClassAction`, `deleteGradeClassAction`: These actions enforce that the user manages the target grade before performing operations.
* Updated `joinClassByInvitationCodeAction`: Expanded to allow Teachers (role `teacher`) to join classes, not just Students.
### 3. Verification
* **RBAC**: Verified that users can only manage classes for grades they are assigned to.
* **Flow**: Verified Teacher "Join Class" flow correctly redirects and updates the list.
* **Syntax**: Fixed TypeScript/SQL syntax errors in the new data access functions.
### 4. Class UI/UX Optimization
* **Students Management Interface (`students-table.tsx`, `students-filters.tsx`)**:
* **Enhanced Table**: Added student avatars, gender display, and join date.
* **Pagination**: Implemented client-side pagination (10 items per page) to handle larger classes gracefully.
* **Status Filtering**: Added "Active/Inactive" filter with visual status badges (Emerald for active, muted for inactive).
* **Data Access**: Updated `getClassStudents` to fetch extended user profile data and support server-side status filtering.
* **Class Detail Dashboard (`/teacher/classes/my/[id]/page.tsx`)**:
* **Dashboard Layout**: Refactored into a responsive two-column layout (Main Content + Sidebar).
* **Key Metrics**: Added a 4-card stats grid at the top displaying critical insights:
* Total Students (Active/Inactive breakdown)
* Schedule Items (Weekly sessions)
* Active Assignments (Overdue count)
* Class Average (Based on graded submissions)
* **Sidebar Widgets**: Added "Class Schedule" and "Homework History" widgets for quick access to temporal data.
* **Visual Polish**: Integrated `lucide-react` icons throughout for better information scanning.
## 2026-01-13
### 1. Navigation & Layout Improvements
* **Dynamic Breadcrumbs (`site-header.tsx`)**:
* Replaced hardcoded "Dashboard > Overview" breadcrumbs with a dynamic system.
* Implemented a path-to-title lookup using `NAV_CONFIG` from `src/modules/layout/config/navigation.ts`.
* Added logic to filter out root role segments (admin/teacher/student/parent) for cleaner paths.
* Added fallback capitalization for segments not found in the config.
* Refactored `SiteHeader` to use `usePathname` for real-time route updates.
### 2. Code Quality & Bug Fixes
* **Type Safety (`homework-grading-view.tsx`)**:
* Fixed a TypeScript error where a boolean expression was returning `boolean | undefined` which is not a valid React node (implicit `true` check added).
* Resolved "Calling setState synchronously within an effect" React warning by initializing state lazily instead of using `useEffect`.
* Fixed implicit `any` type errors in map functions.
* **Linting**:
* Cleaned up unused imports across multiple files (`exam-actions.tsx`, `exam-assembly.tsx`, `textbook-reader.tsx`, etc.).
* Fixed unescaped HTML entities in `student-dashboard-header.tsx` and others.
* Removed unused variables to clear ESLint warnings.
* **Refactoring**:
* Updated `TextbookCard` to support `hideActions` prop for better reuse in student views.
* Added missing `Progress` component to `src/shared/components/ui/progress.tsx`.
### 3. Verification
* Ran `npm run typecheck`: **Passed** (0 errors).
* Ran `npm run lint`: **Passed** (0 errors, 28 warnings remaining for unused vars/components that may be needed later).