Files
NextEdu/docs/architecture/audit/archive/data-access-audit-framework-v1.md

207 lines
9.4 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.
# 数据库访问层重构专项 - 审计框架 v1
> 创建日期2026-07-07
> 目标:对全项目 86 个 `data-access*.ts` + ~30 个 `actions.ts` 进行深度审计,输出可执行的分级治理路线图
> 推进路径:先审计后治理(用户已确认)
> 执行方案:纯深读(用户已确认方案 B
---
## 一、审计范围
### 1.1 文件范围
| 类型 | 路径模式 | 文件数(约) | 备注 |
|---|---|---|---|
| 数据访问层 | `src/modules/**/data-access*.ts` | 86 | 主审计对象 |
| Server Actions | `src/modules/**/actions.ts` | ~30 | 辅查(权限校验、业务逻辑归属) |
| 辅助文件 | `src/modules/**/schema.ts``types.ts` | 按需 | 仅当 data-access 引用时查看 |
### 1.2 排除范围
- `src/app/**`:仅在 A-05 规则app 直访 DB触发时反向查看
- `src/shared/**`:仅在 A-07 规则shared 反向依赖)触发时查看
- 已有的模块级 audit 报告(`docs/architecture/audit/*-audit-report.md`):作为参考但不直接复用,因本次为横切关注点
### 1.3 模块分组(并行执行单元)
| 组 | 模块 | data-access 文件数 | sub-agent |
|---|---|---|---|
| **G1 核心教学 A** | lesson-preparation12+ questions + textbooks | ~16 | agent-1 |
| **G2 核心教学 B** | exams + homework7+ grades6+ diagnostic + adaptive-practice3 | ~21 | agent-2 |
| **G3 教学管理** | classes6+ school + scheduling + attendance3+ course-plans + proctoring | ~16 | agent-3 |
| **G4 用户与沟通** | users + messaging + notifications + parent + audit + auth + rbac3 | ~12 | agent-4 |
| **G5 扩展与设置** | elective5+ settings5+ dashboard + files + search + onboarding + ai + announcements + error-book3 | ~21 | agent-5 |
---
## 二、审计维度与检查规则
### 2.1 维度 1模式标准化Pattern Standardization
| 规则 ID | 检查项 | 期望状态 | 检测方式 |
|---|---|---|---|
| P-01 | `import "server-only"` 文件头 | 每个文件首行 | 静态 |
| P-02 | 类型导入使用 `import type` | 类型导入与值导入分离 | 静态 |
| P-03 | 读函数是否走 `cacheFn` 包装Raw + Wrapper 配对) | 全部覆盖 | 深读 |
| P-04 | 函数返回类型显式标注 `Promise<T>` | 无隐式推断 | 深读 |
| P-05 | 错误处理一致 | data-access 层用 throwactions 层用 ActionState | 深读 |
| P-06 | 分页参数命名统一 | `page`/`pageSize``limit`/`offset` 全局统一 | 深读 |
| P-07 | 日期序列化走 helper | `serializeDate`/`toISODateString` | 深读 |
| P-08 | 列表项映射走 `mapListItem` 模式 | 避免 inline mapping 重复 | 深读 |
| P-09 | `as` 断言出现次数 | 0除 unknown 收窄) | 静态 |
| P-10 | `any` 出现次数 | 0 | 静态 |
### 2.2 维度 2性能与查询优化Performance
| 规则 ID | 检查项 | 期望状态 | 检测方式 |
|---|---|---|---|
| F-01 | 循环内 SQL 调用N+1 | 改批量查询 + Map 解析 | 深读 |
| F-02 | `LIKE '%xxx%'` 全表扫描 | 改 FULLTEXT 或前缀匹配 | 深读 |
| F-03 | SELECT * 未指定列 | 显式列枚举 | 深读 |
| F-04 | JOIN 表数量 > 3 | 评估拆分或冗余字段 | 深读 |
| F-05 | 大表查询无 LIMIT | 添加默认 LIMIT | 深读 |
| F-06 | 重复查询同表/同条件 | 走 cacheFn 或合并查询 | 深读 |
| F-07 | 缺失索引(高频 WHERE 字段) | 提示加索引 | 深读 |
| F-08 | 跨模块多次调用 `getXxxNamesByIds` | 批量化 | 深读 |
| F-09 | 事务范围过大(含网络调用) | 收紧事务 | 深读 |
| F-10 | `count()` 全表统计无过滤 | 添加过滤条件 | 深读 |
### 2.3 维度 3架构违规治理Architecture
| 规则 ID | 检查项 | 期望状态 | 检测方式 |
|---|---|---|---|
| A-01 | data-access 含 `requirePermission` 调用 | 移至 actions | 静态 |
| A-02 | data-access 含业务逻辑(条件分支、状态机) | 移至 actions 或 lib | 深读 |
| A-03 | data-access 含 `"use server"` 标记 | 移至 actions | 静态 |
| A-04 | data-access 含 `revalidatePath` 调用 | 移至 actions | 静态 |
| A-05 | app/ 直接 import `@/shared/db` | 违规,改走 data-access | 静态 |
| A-06 | modules 间直接 import 对方 `@/shared/db/schema` 表 | 改走对方 data-access | 静态 |
| A-07 | shared/ 反向 import `@/auth`/`@/proxy`/`modules/*` | 违规 | 静态 |
| A-08 | actions.ts 漏调 `requirePermission` | 补齐 | 深读 |
| A-09 | actions.ts 含直接 DB 查询 | 移至 data-access | 深读 |
| A-10 | data-access 含 `console.log` 调试代码 | 删除 | 静态 |
### 2.4 维度 4结构与可维护性Structure
| 规则 ID | 检查项 | 期望状态 | 检测方式 |
|---|---|---|---|
| S-01 | 文件行数 > 800 行警告,> 1000 行必须拆分 | 拆分 | 静态 |
| S-02 | 单文件导出函数数 > 20 | 警告,考虑拆分 | 静态 |
| S-03 | 重复 helper多模块各自实现 serializeDate/buildScopeFilter 等) | 提取到 shared/lib | 深读 |
| S-04 | 过细拆分(同模块 ≥ 5 个子文件且单文件 < 100 行) | 评估合并 | 静态 |
| S-05 | 未使用导出dead code | 删除 | 深读 |
| S-06 | 公共导出函数缺 JSDoc | 补齐 | 深读 |
| S-07 | 跨模块重复查询逻辑 | 提取共享 data-access | 深读 |
| S-08 | 模块内 data-access 与 actions 职责混淆 | 重新分层 | 深读 |
---
## 三、严重性分级
| 级别 | 含义 | 示例 | 治理窗口 |
|---|---|---|---|
| **P0 Critical** | 架构硬违规、安全漏洞、必定性能问题 | app 直访 DB、跨模块 schema 直查、actions 漏权限、N+1 循环 SQL | 立即 |
| **P1 High** | 显著性能/可维护性问题 | 超长文件(>1000 行)、缺 cacheFn 的热路径读函数、LIKE 全表扫描 | Phase 1 |
| **P2 Medium** | 模式偏差、可优化 | 错误处理不一致、缺 JSDoc、重复 helper、分页命名不统一 | Phase 2 |
| **P3 Low** | 风格问题、可选优化 | 单行格式、import 顺序、注释措辞 | Phase 3 |
---
## 四、执行流程
### 4.1 阶段 Asub-agent 分组深读(并行)
每个 sub-agent 接收:
- 该组所有 `data-access*.ts` + 同模块 `actions.ts` 文件清单
- 完整规则表4 维度 × 38 条规则)
- 统一输出格式(见 4.3
每个 sub-agent 执行:
1. 完整读取每个文件(不使用 limit/offset
2. 按规则表逐条检测
3. 命中即记录到问题清单
4. 对每个问题给出修复建议与预估工作量
### 4.2 阶段 B主 agent 汇总
- 收集 5 个 sub-agent 的结构化输出
- 去重(同一问题被多 agent 命中时合并)
- 跨模块统计(如重复 helper 在多少模块出现)
- 生成优先级矩阵
- 编写治理路线图
### 4.3 sub-agent 输出格式
每个 sub-agent 产出 JSON 数组,每条问题:
```json
{
"id": "G1-001",
"file": "src/modules/lesson-preparation/data-access.ts",
"lines": "L123-L145",
"ruleId": "F-01",
"severity": "P0",
"dimension": "performance",
"title": "循环内调用 getClassNamesByIds",
"description": "在 for 循环内对每个 classId 单独查询 className应改为批量查询后用 Map 解析",
"recommendation": "提取 classIds 数组,一次调用 getClassNamesByIds(classIds),循环内改为 map.get(classId)",
"effort": "S (≤30 分钟)"
}
```
工作量分级:
- **XS**:≤ 15 分钟(如删除 console.log、补 import type
- **S**:≤ 30 分钟(如替换 as 断言为类型守卫)
- **M**:≤ 2 小时(如 N+1 改批量、提取 helper
- **L**:≤ 1 天(如拆分超长文件、跨模块重构)
- **XL**> 1 天(如架构层重构)
---
## 五、报告输出
### 5.1 主报告
文件:`docs/architecture/audit/data-access-audit-v1.md`
结构:
1. **执行摘要**总文件数、问题总数、P0/P1/P2/P3 分布、模块热度图
2. **量化指标仪表盘**cacheFn 覆盖率、平均行数、`as` 断言数、违规 import 数等
3. **按维度分组的问题清单**:每条含 文件:行号、规则 ID、严重性、现状描述、修复建议、预估工作量
4. **按模块分组的问题清单**:每个模块的累计问题数与 Top 问题
5. **P0-P3 优先级矩阵**:四象限图(影响 × 紧迫度)
6. **分阶段治理路线图**Phase 1 (P0) → Phase 2 (P1) → Phase 3 (P2) → Phase 4 (P3)
7. **附录**完整规则表、sub-agent 原始输出索引
### 5.2 结构化数据
文件:`docs/architecture/audit/data-access-audit-v1-data.json`
字段:`issues[]``metrics{}``moduleSummary{}``roadmap{}`
### 5.3 速查手册同步
发现的新模式问题需追加到 `docs/troubleshooting/known-issues.md`(速查手册格式)。
---
## 六、质量约束
- **零误报**:每条问题必须给出文件:行号 + 代码证据,避免臆测
- **零遗漏**86 个 data-access 文件必须全部深读,不得抽样
- **可执行**:每条修复建议必须具体到代码示例或操作步骤
- **不修改代码**:审计阶段只产出报告,不做任何源码修改
- **架构同步**审计过程中发现的架构图遗漏004/005 文档)记录到报告附录,治理阶段统一补图
---
## 七、后续衔接
审计报告 v1 完成后:
1. **用户审查报告**:确认问题清单与优先级
2. **制定治理路线图**:基于 P0-P3 分级,输出 `data-access-refactor-roadmap-v1.md`
3. **分阶段执行治理**:每阶段完成后运行 `npm run lint` + `npx tsc --noEmit` 验证
4. **同步架构文档**:每阶段完成后同步 004/005 文档与 known-issues.md