9.4 KiB
9.4 KiB
数据库访问层重构专项 - 审计框架 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<T> |
无隐式推断 | 深读 |
| 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 执行:
- 完整读取每个文件(不使用 limit/offset)
- 按规则表逐条检测
- 命中即记录到问题清单
- 对每个问题给出修复建议与预估工作量
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
结构:
- 执行摘要:总文件数、问题总数、P0/P1/P2/P3 分布、模块热度图
- 量化指标仪表盘:cacheFn 覆盖率、平均行数、
as断言数、违规 import 数等 - 按维度分组的问题清单:每条含 文件:行号、规则 ID、严重性、现状描述、修复建议、预估工作量
- 按模块分组的问题清单:每个模块的累计问题数与 Top 问题
- P0-P3 优先级矩阵:四象限图(影响 × 紧迫度)
- 分阶段治理路线图:Phase 1 (P0) → Phase 2 (P1) → Phase 3 (P2) → Phase 4 (P3)
- 附录:完整规则表、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 完成后:
- 用户审查报告:确认问题清单与优先级
- 制定治理路线图:基于 P0-P3 分级,输出
data-access-refactor-roadmap-v1.md - 分阶段执行治理:每阶段完成后运行
npm run lint+npx tsc --noEmit验证 - 同步架构文档:每阶段完成后同步 004/005 文档与 known-issues.md