- 前端:React 18(ESM 直引)、单页应用(Hash 路由)、原生 SVG 思维导图、CSS 变量主题
- 后端:Node.js + Express(TypeScript)、Zod 校验、错误中间件、静态资源托管
- 数据层:MySQL(mysql2/promise 连接池)、迁移脚本与启动初始化、版本与审计日志
- 生成能力:文件解析(PDF、DOCX、纯文本)、规则生成 + LLM 生成(OpenAI/DeepSeek/OpenRouter/Ollama)
- 导出能力:Excel/CSV(xlsx)、PNG(SVG → Canvas)
- 回退机制:数据库失败时的内存存储回退(任务与用例),确保功能可用
- 入口与路由
- 单文件 SPA:
backend/public/app.html - Hash 路由与导航:
backend/public/app.html:44–48,backend/public/app.html:270–279 - 页面组件:Upload、History、Task、Profile、Mindmap、Detail (所有组件均集成在app.html中)
- 单文件 SPA:
- 思维导图(SVG)
- 渲染与交互:
backend/public/app.html:878–1173 - 颜色取自 CSS 变量,支持主题切换:
backend/public/app.html:896–917 - 节点 hover/拖拽/缩放:
backend/public/app.html:1141–1168 - 节点附带
title与data-id(显示用例ID):backend/public/app.html:1111–1112
- 渲染与交互:
- 详情面板(用例编辑/新建/删除)
- 显示并复制用例ID:
backend/public/app.html:1187–1193 - 保存/新建/删除的回调接入 API 并进行函数式状态更新:
- Upload 页:
backend/public/app.html:700–717 - Task 页:
backend/public/app.html:901
- Upload 页:
- 显示并复制用例ID:
- 历史记录
- 筛选与本地回退逻辑:
backend/public/app.html:732–757 - 复选与批量导出:
backend/public/app.html:760–777, 选择列backend/public/app.html:794–799
- 筛选与本地回退逻辑:
- 导出
- Excel/CSV:
backend/public/app.html:650–667,backend/public/app.html:760–777 - PNG:
backend/public/app.html:656–663,backend/public/app.html:898–903
- Excel/CSV:
- 主题与样式
- 设计令牌与组件样式:
backend/public/app.html:7–143,backend/public/app.html:144–465
- 设计令牌与组件样式:
- 应用初始化与路由挂载
backend/src/server.ts:22–27挂载各模块路由- 静态资源与错误处理:
backend/src/server.ts:16,backend/src/server.ts:29
- 用例集 API(模块
backend/src/web/testcases.ts)- 生成用例:
POST /api/testcases/generate(文件/文本,LLM 优先,失败回退规则)backend/src/web/testcases.ts:19–51 - 历史列表:
GET /api/testcases/tasksbackend/src/web/testcases.ts:59–62 - 历史筛选:
GET /api/testcases/tasks/filter(支持关键词/时间/用例数;合并内存与库)backend/src/web/testcases.ts:115–126 - 任务详情:
GET /api/testcases/tasks/:idbackend/src/web/testcases.ts:53–67 - 用例更新:
PATCH /api/testcases/:id(Zod 校验;库失败回内存)backend/src/web/testcases.ts:69–82 - 新建用例:
POST /api/testcases/tasks/:id/testcases(库失败回内存)backend/src/web/testcases.ts:84–94 - 删除用例:
DELETE /api/testcases/:id(事务 + affectedRows;失败回内存并明确 message)backend/src/web/testcases.ts:96–103 - 版本与审计:
GET /api/testcases/:id/versions、GET /api/testcases/:id/auditsbackend/src/web/testcases.ts:105–113
- 生成用例:
- 数据访问层(模块
backend/src/repo/tasks.ts)- 任务入库(修正列/占位符、写入用例数):
backend/src/repo/tasks.ts:12–24 - 用例 ID 标准化(生成阶段补全缺失ID):
backend/src/repo/tasks.ts:27–36 - 任务详情聚合(返回
sourceType与summary):backend/src/repo/tasks.ts:31–45 - 历史与筛选(SQL + 合并内存,关键词/时间/用例数):
backend/src/repo/tasks.ts:61–100, 103–112 - 用例更新(版本快照 + 审计日志):
backend/src/repo/tasks.ts:110–128 - 新建用例(库失败回内存):
backend/src/repo/tasks.ts:109–122 - 删除用例(事务 + affectedRows,失败回内存):
backend/src/repo/tasks.ts:124–131 - 用例存在性检查(明确错误原因):
backend/src/repo/tasks.ts:132–140
- 任务入库(修正列/占位符、写入用例数):
- 内存存储(模块
backend/src/store/cases.ts)- 任务/用例 Map 与列表统计:
backend/src/store/cases.ts:22–26 - 删除任务:
backend/src/store/cases.ts:28–31 - 就地更新用例:
backend/src/store/cases.ts:33–52 - 新增/删除用例(库失败时回退):
backend/src/store/cases.ts:53–67
- 任务/用例 Map 与列表统计:
- 连接池与环境变量:
backend/src/db/pool.ts:3–12DB_HOST,DB_PORT,DB_USER,DB_PASSWORD,DB_NAME
- 启动初始化:
backend/src/setup/dbInit.ts:5–21- 执行
db/migrations/001_init.sql - 追加表:
test_case_versions与audit_logs,含索引与外键(CASCADE) - 兼容迁移:
generation_tasks.template_id改为可空,避免插入失败backend/src/setup/dbInit.ts:21
- 执行
- 主要表结构(摘要)
generation_tasks(id,user_id,parameters,status,test_case_count,created_at,completed_at)test_cases(id,task_id,content,metadata,category,created_at)test_case_versions(id,case_id,version,content,metadata,category,created_at)audit_logs(id,user_id,case_id,action,payload,created_at)
- 文档解析:
backend/src/services/fileText.ts使用 pdf-parse 与 mammoth(DOCX)提取文本 - 规则引擎:
generateTestCasesFromDoc对文本做标题/段落/关键字分析生成初始用例 - LLM 生成:
generateCasesWithLLM多供应商适配,强制 JSON 输出,失败回退规则引擎
- PNG 导出:序列化 SVG → Image → Canvas →
toDataURL('image/png')下载 - Excel/CSV 导出:
XLSX.utils.json_to_sheet+XLSX.writeFile,支持批量导出并包含任务摘要与来源类型
- Zod 校验所有写入参数(生成、更新、新建)
- 删除用例:数据库事务 +
affectedRows检查;失败时内存回退并在响应 message 告知原因 - 前端:所有写操作均检查
response.ok并有console.error与用户提示;失败时保持视图一致(本地移除)
- 设计令牌、焦点环(2px 外描边)、按钮与表格 hover/active 明确,深浅色主题对比度 ≥ 4.5:1
- 启动:
npm run dev(后端)、浏览器打开http://localhost:3000/app.html - 预览适配:只读接口开放以避免预览环境无令牌时无法浏览
- SVG 布局:查看
Mindmap中的环形分布、曲线连接、交互层(缩放/拖拽) - 状态管理:函数式
setState更新避免闭包旧值;对并发更新有更强健性 - 事务与回退:从
deleteCaseById的事务实现入手理解“失败时仍保持用户可用”的设计 - 筛选策略:后端 SQL + 前端回退混合,实现“空结果不清空”的用户体验