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

9.4 KiB
Raw Blame History

数据库访问层重构专项 - 审计框架 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.tstypes.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/pageSizelimit/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 数组,每条问题:

{
  "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