docs: 全文档合规检查与修正 - 代码示例规范/行数准确性/路径一致性/状态同步

This commit is contained in:
SpecialX
2026-06-18 03:31:07 +08:00
parent 0423b2b984
commit 4d659ad9a1
18 changed files with 595 additions and 522 deletions

View File

@@ -12,19 +12,19 @@
| 模块 | 行数(最大文件) | 职责单一性 | 耦合度 | 严重度 |
|------|----------------|-----------|--------|--------|
| school | 325 | ✅ 良好 | ✅ 低 | 🟢 合格 |
| classes | ~~2104~~656 | ✅ 已修复 | ❌ 严重 | 🟡 需改进 |
| scheduling | 310算法/ 302actions | ✅ 算法独立 | ⚠️ 中 | 🟡 需改进 |
| classes | ~~2104~~548 | ✅ 已修复 | ❌ 严重 | 🟡 需改进 |
| scheduling | 335data-access/ 266actions | ✅ 算法独立 | ⚠️ 中 | 🟡 需改进 |
| attendance | 271 | ✅ 良好 | ⚠️ 中 | 🟢 合格 |
| users | 291import-export | ❌ 违反 | ❌ 高 | 🟠 较严重 |
| users | 157import-export | ✅ 已修复 | ⚠️ 中 | 🟢 合格 |
| audit | 212 | ⚠️ 部分违反 | ✅ 低 | 🟡 需改进 |
| course-plans | 320 | ✅ 良好 | ✅ 低 | 🟢 合格 |
| announcements | 242 | ⚠️ 部分违反 | ✅ 低 | 🟡 需改进 |
| announcements | 197 | ✅ 已修复 | ✅ 低 | 🟢 合格 |
**核心结论**
1. ~~`classes` 模块是全项目耦合最严重的模块,单文件 2104 行远超 1000 行硬性上限,混入了 schedule、homework、grades 三个业务领域的逻辑。~~ ✅ 已修复2026-06-17 拆分为 5 个文件,均 ≤800 行)
2. `users/import-export.ts` 违反单一职责,同时处理导入、导出、用户创建、班级注册四类逻辑。
2. ~~`users/import-export.ts` 违反单一职责,同时处理导入、导出、用户创建、班级注册四类逻辑。~~ ✅ 已修复2026-06-17 拆分为 import-export.ts + user-service.ts + class-registration.ts
3. `scheduling/auto-scheduler.ts` 是算法独立化的**优秀范例**,纯函数、无 DB 访问、可独立测试。
4. `announcements``audit` 模块的 data-access 层不完整,写操作或导出逻辑泄漏到 actions 层。
4. ~~`announcements` 和 `audit` 模块的 data-access 层不完整,写操作或导出逻辑泄漏到 actions 层。~~ announcements ✅ 已修复(写操作下沉 data-accessaudit 仍有导出逻辑内联。
---
@@ -51,28 +51,25 @@
### 2.2 classes 模块 — 🟡 需改进(文件拆分已修复,跨模块耦合仍存在)
**文件清单**actions.ts (765 行) / data-access.ts (656 行) / data-access-stats.ts (604 行) / data-access-schedule.ts (230 行) / data-access-students.ts (280 行) / data-access-admin.ts (441 行) / types.ts (201 行)
**文件清单**actions.ts (676 行) / data-access.ts (548 行) / data-access-stats.ts (531 行) / data-access-schedule.ts (194 行) / data-access-students.ts (244 行) / data-access-admin.ts (406 行) / types.ts (201 行)
> ✅ `data-access.ts` 已于 2026-06-17 拆分为 5 个文件,所有文件均 ≤800 行,通过 re-export 保持向后兼容。
#### 2.2.1 职责混乱 — 混入三个外部业务领域
#### 2.2.1 职责混乱 — 混入三个外部业务领域(拆分后仍存在于子文件中)
`data-access.ts` 实际承载了四个业务领域的逻辑:
`data-access-*.ts` 文件群仍承载了四个业务领域的逻辑(已按职责分文件,但跨域逻辑尚未迁移回所属模块)
| 行范围 | 逻辑 | 应属模块 |
|--------|------|---------|
| 49-145 | 教师身份解析、班级访问控制 | classes合理 |
| 156-601 | 班级列表/学生/教师查询 | classes合理 |
| 697-735 | 课表查询 `getClassSchedule` | **scheduling** |
| 760-998 | `getClassHomeworkInsights` 班级作业洞察238 行) | **homework** |
| 1006-1300 | `getGradeHomeworkInsights` 年级作业洞察294 行) | **homework** |
| 1302-1775 | 班级 CRUD + 邀请码 + 注册 | classes合理 |
| 1838-1968 | 课表项 CRUD `createClassScheduleItem` 等 | **scheduling** |
| 1970-2103 | `getStudentsSubjectScores` 学生科目成绩133 行) | **grades / homework** |
| 文件 | 逻辑 | 应属模块 |
|------|------|---------|
| data-access.ts | 教师身份解析、班级访问控制、班级 CRUD | classes合理 |
| data-access-students.ts | 班级学生查询 | classes合理 |
| data-access-stats.ts | `getClassHomeworkInsights` / `getGradeHomeworkInsights` 班级/年级作业洞察 | **homework** |
| data-access-schedule.ts | 课表查询 `getClassSchedule`、课表项 CRUD | **scheduling** |
| data-access-admin.ts | `getStudentsSubjectScores` 学生科目成绩 | **grades / homework** |
**关键问题**
- `getClassHomeworkInsights``getGradeHomeworkInsights` 合计 **532 行**作业统计逻辑,直接查询 `homeworkAssignments``homeworkSubmissions``homeworkAssignmentTargets``homeworkAssignmentQuestions``exams` 五张表,属于 homework 模块的核心业务,不应存在于 classes 模块。
- 课表 CRUD`createClassScheduleItem` / `updateClassScheduleItem` / `deleteClassScheduleItem`与 scheduling 模块的 `applyAutoScheduleAction` 写入同一张 `classSchedule` 表,**两个模块对同一张表有写权限**,边界严重模糊
**关键问题**P1-1 待修复)
- `getClassHomeworkInsights``getGradeHomeworkInsights` 直接查询 `homeworkAssignments``homeworkSubmissions``homeworkAssignmentTargets``homeworkAssignmentQuestions``exams` 五张表,属于 homework 模块的核心业务,不应存在于 classes 模块。
- 课表 CRUD`createClassScheduleItem` / `updateClassScheduleItem` / `deleteClassScheduleItem`写入 `classSchedule`P0-6 已统一 scheduling/data-access 为写入口,但 classes 侧的写函数仍存在(待后续迁移)
- `getStudentsSubjectScores` 直接关联 `homeworkSubmissions` + `exams` + `subjects` 计算学生科目分数,属于成绩分析逻辑。
#### 2.2.2 types.ts 跨领域类型污染
@@ -121,9 +118,9 @@
---
### 2.3 scheduling 模块 — 🟡 需改进(算法层优秀)
### 2.3 scheduling 模块 — 🟡 需改进(算法层优秀,写入口已统一
**文件清单**actions.ts (302 行) / auto-scheduler.ts (310 行) / data-access.ts (272 行) / schema.ts / types.ts
**文件清单**actions.ts (266 行) / auto-scheduler.ts (310 行) / data-access.ts (335 行) / schema.ts / types.ts
#### 2.3.1 auto-scheduler.ts — ✅ 优秀范例
@@ -136,19 +133,21 @@
**建议**:以此为模板,指导其他模块的算法抽取(如 homework 的批改评分算法、grades 的统计算法)。
#### 2.3.2 actions.ts — 跨模块直接写入
#### 2.3.2 actions.ts — 跨模块直接查询(写入口已统一)
| 行号 | 函数 | 问题 |
|------|------|------|
| 110-116 | `autoScheduleAction` | 直接 `db.select().from(users)` 查询教师,绕过 data-access 的 `getTeachersForScheduling` |
| 168-180 | `applyAutoScheduleAction` | 直接 `db.transaction` 写入 `classSchedule` 表,**绕过 data-access 且跨模块写 classes 领域的表** |
| 110-116 | `autoScheduleAction` | 直接 `db.select().from(users)` 查询教师,绕过 data-access 的 `getTeachersForScheduling`P1-2 待修复) |
| ~~168-180~~ | ~~`applyAutoScheduleAction`~~ | ~~直接 `db.transaction` 写入 `classSchedule` 表~~ ✅ 已修复P0-6改为调用 `replaceClassSchedule` |
`applyAutoScheduleAction`问题尤为突出:它删除并重建 `classSchedule` 表数据,但该写操作既未经过 scheduling/data-access也未经过 classes/data-access形成**第三个对 classSchedule 表的写入口**(另两个在 classes/data-access 的 createClassScheduleItem 等)。
`applyAutoScheduleAction`直接 transaction 写入问题已于 P0-6 修复,现在通过 `scheduling/data-access.ts``replaceClassSchedule()` 统一写入。但 `autoScheduleAction` 仍直接查询 users 表P1-2 待修复)。
#### 2.3.3 data-access.ts — 跨模块读查询
#### 2.3.3 data-access.ts — 跨模块读查询 + 统一写入口
包含 `getAdminClassesForScheduling` / `getTeachersForScheduling` / `getClassroomsForScheduling` / `getClassSubjectsForScheduling` 四个辅助查询,直接访问 `classes` / `classSubjectTeachers` / `subjects` / `users` / `classrooms` 表。
P0-6 后新增 `replaceClassSchedule()` 作为 `classSchedule` 表的统一写入口。
这些是排课场景的只读辅助查询,耦合度可接受,但理想情况下应通过各所属模块的 data-access 暴露接口。
#### 2.3.4 actions.ts 末尾 re-export
@@ -156,12 +155,12 @@
```typescript
export { getSchedulingRules, getScheduleChanges, ... } from "./data-access"
```
actions 层 re-export data-access 函数是反模式,应让消费方直接从 data-access 导入。
actions 层 re-export data-access 函数是反模式,应让消费方直接从 data-access 导入。P2 待修复)
**整改建议**
1.`applyAutoScheduleAction` 中的 `classSchedule` 写入逻辑下沉到 data-access(或与 classes 协商统一写入口)。
2.`autoScheduleAction` 中的 users 查询改用 `getTeachersForScheduling`
3. 移除 actions.ts 末尾的 re-export
1. ~~将 `applyAutoScheduleAction` 中的 `classSchedule` 写入逻辑下沉到 data-access~~ ✅ 已完成P0-6
2.`autoScheduleAction` 中的 users 查询改用 `getTeachersForScheduling`P1-2 待修复)
3. 移除 actions.ts 末尾的 re-exportP2 待修复)
---
@@ -183,40 +182,41 @@ actions 层 re-export data-access 函数是反模式,应让消费方直接从
---
### 2.5 users 模块 — 🟠 较严重
### 2.5 users 模块 — 🟢 合格(已修复)
**文件清单**actions.ts (151 行) / data-access.ts (71 行) / import-export.ts (291 行)
**文件清单**actions.ts (131 行) / data-access.ts (133 行) / import-export.ts (157 行) / user-service.ts (82 行) / class-registration.ts (21 行)
#### 2.5.1 import-export.ts — 四重职责混合
> ✅ `import-export.ts` 已于 2026-06-17 拆分为 3 个文件,四重职责已分离。
该文件同时承载四类互不相关的职责:
#### 2.5.1 import-export.ts — 四重职责已修复 ✅
| 行范围 | 职责 | 应属位置 |
|--------|------|---------|
| 54-73 | `generateUserImportTemplate` 生成导入模板 | export 模块 |
| 78-111 | `parseUserImportData` 解析+校验导入数据 | import 模块 |
| 116-207 | `batchImportUsers` 批量导入(含用户创建) | **data-access** |
| 212-291 | `exportUsersToExcel` 导出用户列表 | export 模块 |
原文件同时承载四类互不相关的职责,现已拆分:
**核心问题**
1. **导入与导出未分离**:应拆分为 `import.ts``export.ts`
2. **用户创建逻辑泄漏**`batchImportUsers`(行 158-167直接 `db.insert(users)` + 密码哈希 + `db.insert(usersToRoles)`,这是 data-access 层的职责,不应存在于 import-export 工具文件中。
3. **跨模块写 classEnrollments**:行 174-184`batchImportUsers` 直接 `db.insert(classEnrollments)` 将学生注册到班级,**这是 classes 模块的写操作**,严重违反模块边界。
4. **跨模块读 classes**:行 130-137直接查询 `classes` 表根据邀请码查找班级,应通过 classes/data-access 暴露接口。
| 文件 | 职责 | 行数 |
|------|------|------|
| `import-export.ts` | 文件解析与生成(`generateUserImportTemplate` / `parseUserImportData` / `exportUsersToExcel` | 157 |
| `user-service.ts` | 用户创建(含密码哈希 + 角色绑定) | 82 |
| `class-registration.ts` | 班级注册(调用 classes/data-access | 21 |
#### 2.5.2 actions.ts — 绕过 data-access
**已修复问题**
1.**导入与导出未分离** → import-export.ts 仅负责文件解析与生成
2.**用户创建逻辑泄漏** → 迁移至 `user-service.ts`
3.**跨模块写 classEnrollments** → 迁移至 `class-registration.ts`,调用 classes/data-access
4.**跨模块读 classes** → 通过 classes/data-access 暴露接口调用
`updateUserProfile`(行 29-51直接 `db.update(users)` 写入数据库,绕过 data-access 层。data-access.ts 仅有 `getUserProfile` 一个读函数,写操作缺失。
#### 2.5.2 actions.ts — 绕过 data-access(部分修复)
#### 2.5.3 data-access.ts — 过于单薄
`updateUserProfile`(行 29-51仍直接 `db.update(users)` 写入数据库,绕过了 data-access 层。P1-2 待修复)
仅 71 行,只包含 `getUserProfile`。用户创建、更新、角色绑定等写操作均未在此层实现。
#### 2.5.3 data-access.ts — 已扩展
从 71 行扩展到 133 行,包含 `getUserProfile` 及 dashboard 聚合查询函数 `getUsersDashboardStats`。用户创建、更新等写操作部分仍在 user-service.ts 中P1-2 待进一步下沉)。
**整改建议**(优先级 P1
1.`import-export.ts` 拆分为 `import.ts`(解析+校验)和 `export.ts`(模板生成+列表导出)。
2.`batchImportUsers` 中的用户创建逻辑迁移至 `data-access.ts``createUser` 函数import.ts 仅负责编排。
3. 将 classEnrollments 写入改为调用 classes/data-access 的注册接口(如 `enrollStudentByInvitationCode`)。
4.`updateUserProfile` 的 DB 写入下沉到 data-access
1. ~~将 `import-export.ts` 拆分为 `import.ts` 与 `export.ts`~~ ✅ 已完成(采用按职责拆分)
2. ~~将 `batchImportUsers` 中的用户创建逻辑迁移至 `user-service.ts`~~ ✅ 已完成
3. ~~将 classEnrollments 写入改为调用 classes/data-access~~ ✅ 已完成
4.`updateUserProfile` 的 DB 写入下沉到 data-accessP1-2 待修复)
---
@@ -252,34 +252,33 @@ actions 层 re-export data-access 函数是反模式,应让消费方直接从
---
### 2.8 announcements 模块 — 🟡 需改进
### 2.8 announcements 模块 — 🟢 合格(已修复)
**文件清单**actions.ts (242 行) / data-access.ts (120 行) / schema.ts / types.ts
**文件清单**actions.ts (197 行) / data-access.ts (171 行) / schema.ts / types.ts
**核心问题 — 写操作泄漏到 actions 层**
> ✅ 写操作已下沉到 data-access 层2026-06-17commit 84d6636
data-access.ts 仅包含两个**只读**函数(`getAnnouncements` / `getAnnouncementById`),所有写操作均直接在 actions.ts 中执行 `db.insert` / `db.update` / `db.delete`
#### 核心问题 — 写操作泄漏到 actions 层 ✅ 已修复
| Action | 直接 DB 操作 | 行号 |
|--------|-------------|------|
| `createAnnouncementAction` | `db.insert(announcements)` | 53-63 |
| `updateAnnouncementAction` | `db.update(announcements)` | 118-130 |
| `deleteAnnouncementAction` | `db.delete(announcements)` | 154 |
| `publishAnnouncementAction` | `db.update(announcements)` | 176-183 |
| `archiveAnnouncementAction` | `db.update(announcements)` | 206-212 |
~~data-access.ts 仅包含两个**只读**函数(`getAnnouncements` / `getAnnouncementById`),所有写操作均直接在 actions.ts 中执行 `db.insert` / `db.update` / `db.delete`~~
这违反了"data-access 层封装所有 DB 操作"的分层约定,导致
- 写逻辑无法被其他 server 端代码复用
- publishedAt 计算逻辑散落在 actions 中,难以测试
**已完成修复**data-access.ts 从 120 行扩展到 171 行,新增 5 个写函数
- `createAnnouncement`
- `updateAnnouncement`
- `deleteAnnouncement`
- `publishAnnouncement`
- `archiveAnnouncement`
actions.ts 从 242 行降至 197 行,仅保留权限校验 + 解析 + 委托调用。
**其他问题**
- ⚠️ 死代码:`updateAnnouncementAction` 行 108 计算 `wasPublished`,行 135 `void wasPublished` 显式丢弃,未实际使用。
- ⚠️ `getAnnouncementsAction` 使用 `requireAuth()` 而非 `requirePermission(ANNOUNCEMENT_READ)`,与其他模块的权限模式不一致。
- ⚠️ 死代码:`updateAnnouncementAction` 行 108 计算 `wasPublished`,行 135 `void wasPublished` 显式丢弃,未实际使用。P2 待清理)
- ⚠️ `getAnnouncementsAction` 使用 `requireAuth()` 而非 `requirePermission(ANNOUNCEMENT_READ)`,与其他模块的权限模式不一致。P2 待统一)
**整改建议**
1. 在 data-access.ts 补充 `createAnnouncement` / `updateAnnouncement` / `deleteAnnouncement` / `publishAnnouncement` / `archiveAnnouncement` 写函数
2. actions 层仅保留权限校验 + 解析 + 委托调用
3. 清理 `wasPublished` 死代码
1. ~~在 data-access.ts 补充 `createAnnouncement` / `updateAnnouncement` / `deleteAnnouncement` / `publishAnnouncement` / `archiveAnnouncement` 写函数~~ ✅ 已完成
2. ~~actions 层仅保留权限校验 + 解析 + 委托调用~~ ✅ 已完成
3. 清理 `wasPublished` 死代码P2 待处理)
---
@@ -287,16 +286,16 @@ data-access.ts 仅包含两个**只读**函数(`getAnnouncements` / `getAnnoun
### 3.1 跨模块写操作(严重)
| 源文件 | 目标表 | 操作 | 应通过 |
|--------|--------|------|--------|
| classes/data-access.ts | classSchedule | CRUD | scheduling/data-access |
| scheduling/actions.ts | classSchedule | delete + insert | scheduling/data-access |
| users/import-export.ts | classEnrollments | insert | classes/data-access |
| users/import-export.ts | users, usersToRoles | insert | users/data-access |
| announcements/actions.ts | announcements | insert/update/delete | announcements/data-access |
| users/actions.ts | users | update | users/data-access |
| 源文件 | 目标表 | 操作 | 应通过 | 状态 |
|--------|--------|------|--------|------|
| classes/data-access.ts | classSchedule | CRUD | scheduling/data-access | ⚠️ P0-6 已统一 scheduling 为写入口classes 侧写函数待迁移 |
| ~~scheduling/actions.ts~~ | ~~classSchedule~~ | ~~delete + insert~~ | ~~scheduling/data-access~~ | ✅ 已修复P0-6改用 replaceClassSchedule |
| ~~users/import-export.ts~~ | ~~classEnrollments~~ | ~~insert~~ | ~~classes/data-access~~ | ✅ 已修复(迁移至 class-registration.ts |
| ~~users/import-export.ts~~ | ~~users, usersToRoles~~ | ~~insert~~ | ~~users/data-access~~ | ✅ 已修复(迁移至 user-service.ts |
| ~~announcements/actions.ts~~ | ~~announcements~~ | ~~insert/update/delete~~ | ~~announcements/data-access~~ | ✅ 已修复P1-2写操作下沉 |
| users/actions.ts | users | update | users/data-access | ❌ 待修复P1-2 |
> ⚠️ `classSchedule` 表存在 **三个写入口**classes/data-access、scheduling/actions、scheduling/data-access 间接),是数据完整性高风险点
> `classSchedule` 表写入口已于 P0-6 统一到 `scheduling/data-access.ts` 的 `replaceClassSchedule()`
### 3.2 跨模块读操作(需评估)
@@ -330,21 +329,21 @@ data-access.ts 仅包含两个**只读**函数(`getAnnouncements` / `getAnnoun
### P0 — 立即整改(影响数据完整性 & 严重违反规范)
1. **classes/data-access.ts 拆分**2104 行远超硬性上限,且混入 homework/scheduling/grades 三个领域。优先迁移 `getClassHomeworkInsights` / `getGradeHomeworkInsights`532 行)至 homework 模块。
2. **统一 classSchedule 表写入口**classes 与 scheduling 两个模块对该表有写权限,需协商归属并收敛为单一写入口。
1. ~~**classes/data-access.ts 拆分**2104 行远超硬性上限,且混入 homework/scheduling/grades 三个领域。优先迁移 `getClassHomeworkInsights` / `getGradeHomeworkInsights`532 行)至 homework 模块。~~ ✅ 已完成(拆分为 5 个文件)
2. ~~**统一 classSchedule 表写入口**classes 与 scheduling 两个模块对该表有写权限,需协商归属并收敛为单一写入口。~~ ✅ 已完成P0-6replaceClassSchedule 统一入口)
### P1 — 尽快整改(模块边界违反)
3. **users/import-export.ts 拆分**:分离导入/导出,用户创建逻辑下沉 data-accessclassEnrollments 写入改调 classes 接口。
4. **announcements 写操作下沉**:在 data-access 补充写函数actions 仅编排。
5. **classes/actions.ts 权限校验**grades 表查询改通过 school/data-access 接口。
3. ~~**users/import-export.ts 拆分**:分离导入/导出,用户创建逻辑下沉 data-accessclassEnrollments 写入改调 classes 接口。~~ ✅ 已完成
4. ~~**announcements 写操作下沉**:在 data-access 补充写函数actions 仅编排。~~ ✅ 已完成
5. **classes/actions.ts 权限校验**grades 表查询改通过 school/data-access 接口。P1-1 待处理)
### P2 — 持续优化(代码质量)
6. **audit 导出逻辑抽取**:内联的 Excel 列定义移至独立 export.ts。
7. **school 审计日志补全**department/academicYear/grade 的 CRUD 补充 logAudit。
8. **attendance 跨模块查询**`getClassStudentsForAttendance` 改调 classes 接口。
9. **scheduling/actions.ts**:移除 re-exportDB 写入下沉 data-access。
9. **scheduling/actions.ts**:移除 re-export`autoScheduleAction` 的 users 查询下沉 data-accessP1-2
10. **announcements 死代码清理**:移除 `void wasPublished`
---
@@ -365,28 +364,34 @@ data-access.ts 仅包含两个**只读**函数(`getAnnouncements` / `getAnnoun
| 文件 | 行数 | 上限 | 状态 |
|------|------|------|------|
| classes/data-access.ts | 2104 | 1000 | 🔴 超限 2.1x |
| classes/actions.ts | 765 | 800建议 | 🟢 合规 |
| ~~classes/data-access.ts~~ | ~~2104~~ → 548 | 1000 | ✅ 已拆分5 个文件均 ≤800 行) |
| classes/data-access-stats.ts | 531 | 800建议 | 🟢 合规 |
| classes/data-access-admin.ts | 406 | 800建议 | 🟢 合规 |
| classes/data-access-students.ts | 244 | 800建议 | 🟢 合规 |
| classes/data-access-schedule.ts | 194 | 800建议 | 🟢 合规 |
| classes/actions.ts | 676 | 800建议 | 🟢 合规 |
| classes/types.ts | 201 | 无限制 | 🟢 合规 |
| school/actions.ts | 325 | 800建议 | 🟢 合规 |
| school/data-access.ts | 186 | 800建议 | 🟢 合规 |
| scheduling/auto-scheduler.ts | 310 | 无限制 | 🟢 合规 |
| scheduling/actions.ts | 302 | 800建议 | 🟢 合规 |
| scheduling/data-access.ts | 272 | 800建议 | 🟢 合规 |
| scheduling/actions.ts | 266 | 800建议 | 🟢 合规 |
| scheduling/data-access.ts | 335 | 800建议 | 🟢 合规 |
| attendance/actions.ts | 271 | 800建议 | 🟢 合规 |
| attendance/data-access.ts | 271 | 800建议 | 🟢 合规 |
| attendance/data-access-stats.ts | 145 | 800建议 | 🟢 合规 |
| users/import-export.ts | 291 | 800建议 | 🟢 合规(但职责混合 |
| users/actions.ts | 151 | 800建议 | 🟢 合规 |
| users/data-access.ts | 71 | 800建议 | 🟢 合规 |
| users/import-export.ts | 157 | 800建议 | 🟢 合规(已拆分 |
| users/user-service.ts | 82 | 800建议 | 🟢 合规(新增) |
| users/class-registration.ts | 21 | 800建议 | 🟢 合规(新增) |
| users/actions.ts | 131 | 800建议 | 🟢 合规 |
| users/data-access.ts | 133 | 800建议 | 🟢 合规 |
| audit/actions.ts | 212 | 800建议 | 🟢 合规 |
| audit/data-access.ts | 260 | 800建议 | 🟢 合规 |
| course-plans/actions.ts | 265 | 800建议 | 🟢 合规 |
| course-plans/data-access.ts | 320 | 800建议 | 🟢 合规 |
| announcements/actions.ts | 242 | 800建议 | 🟢 合规 |
| announcements/data-access.ts | 120 | 800建议 | 🟢 合规 |
| announcements/actions.ts | 197 | 800建议 | 🟢 合规 |
| announcements/data-access.ts | 171 | 800建议 | 🟢 合规 |
> `classes/data-access.ts` 突破硬性上限,需立即拆分
> ✅ 所有文件均已在 1000 行硬性上限内。原 `classes/data-access.ts`2104 行)已拆分为 5 个文件
---