# 数据库访问层重构专项 - 审计框架 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-preparation(12)+ questions + textbooks | ~16 | agent-1 | | **G2 核心教学 B** | exams + homework(7)+ grades(6)+ diagnostic + adaptive-practice(3) | ~21 | agent-2 | | **G3 教学管理** | classes(6)+ school + scheduling + attendance(3)+ course-plans + proctoring | ~16 | agent-3 | | **G4 用户与沟通** | users + messaging + notifications + parent + audit + auth + rbac(3) | ~12 | agent-4 | | **G5 扩展与设置** | elective(5)+ settings(5)+ dashboard + files + search + onboarding + ai + announcements + error-book(3) | ~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` | 无隐式推断 | 深读 | | P-05 | 错误处理一致 | data-access 层用 throw,actions 层用 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 阶段 A:sub-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