# HANDOFF — 安全测试模块会话交接文档

> **生成时间**: 2026-07-22
> **最后更新**: 2026-08-19
> **当前分支**: `platform-auto-test`
> **开发窗口**: 安全测试模块
> **最近提交**: `1a3d52ad` fix(executor): 修复执行中无法取消（MySQL 1205 行锁）并加固 SUT URL 校验
> **状态**: ✅ 安全测试 P1 全部完成 + P2 执行验证完成 + 菜单升级 + ERP 配置子菜单 + ERP 上传流程对接完成 + ERP 任务创建对接完成 + **安全测试定时任务模块完成并部署 5.60**，全部已实现

---

## ⚠️ 多窗口并行开发注意（安全测试窗口）

本窗口是**安全测试模块开发**。**必须遵守** `Docs/多窗口并行开发指南.md`：

| 项目 | 安全测试窗口（本窗口） | 会议管理窗口 |
|------|----------------------|------------|
| 后端端口 | 8002（或不启动） | 8001 |
| 前端端口 | 3001（或不启动） | 3000 |
| 开发模块 | 安全测试（`module_type=security`） | 会议管理 |
| Playwright | **不执行 UI 用例** | 可执行 |
| Git 提交 | 提交前先 `git pull` | 提交后 push |
| 数据库 | 错开写入时间 | 错开写入时间 |

---

## 一、本次任务记录

### 本次任务（2026-08-19）：安全测试新增定时任务模块 + 部署 5.60 验证通过

**背景**：安全测试模块补充定时任务能力（设置执行周期 interval/daily/weekly + 执行时间），参考 UI 自动化定时任务模块实现，复用同一张 `scheduled_tasks` 表和调度引擎，按 `case_type` 分流调度。

**流程**：需求文档 → 计划执行文档 → 后端 → 前端 → 构建验证 → 部署 5.60 服务器 + 验证 全链路完成。

**核心成果**：
1. ✅ 按规范输出两份文档（`Docs/PRD/功能测试/需求文档/_PRD_功能测试模块读取系统配置被测试系统URL.md` 同目录规范）：
   - `Docs/PRD/需求文档/安全测试/_PRD_安全测试定时任务_需求文档.md`
   - `Docs/PRD/需求文档/安全测试/_PRD_安全测试定时任务_计划执行.md`
2. ✅ **后端实现**：
   - `backend/app/models/scheduled_task.py` — `scheduled_tasks` 表新增 `case_type VARCHAR(20) DEFAULT 'ui'` + `config_id VARCHAR(64) DEFAULT NULL` 字段（`_ensure_columns()` 迁移，重启自动加列）
   - `backend/app/services/scheduler_service.py` — `run_task_once()` 按 `task.case_type` 分流，新增 `_run_security_task_once()`：收集 `collect_module_cases(db, module_ids, "security")` → `SecurityService.create_execution(config_id, module_ids, case_ids)` → 覆盖 `trigger_type="scheduled"` / `trigger_by=task.name` → `run_execution()` → 可选 `SecurityReportService.generate_report()` → 更新 last_run_at/run_count/next_run_at
   - `backend/app/routers/security_scheduled_tasks.py`（新增）— 7 个端点：GET 列表（仅 `case_type=="security"`，含 config_name 映射）/ POST 创建（config_id 必填 422 / 配置不存在 404）/ PUT 更新（拒绝 case_type 变更 422）/ DELETE / POST toggle / POST run（asyncio.create_task）/ GET runs（按 trigger_type+trigger_by 过滤）
   - `backend/app/main.py` — 注册 `security_scheduled_tasks.router`，prefix `/api/security/scheduled-tasks`
3. ✅ **前端实现**：
   - `frontend/src/api/securityScheduledTasks.ts`（新增）— 完整 API 封装，baseURL 空字符串 + 完整 `/api/security/scheduled-tasks` 路径 + `as any` 返回类型模式
   - `frontend/src/views/security/ScheduledTasks.vue`（新增）— 任务表格（名称/模块/测试配置 config_name 标签/周期/自动报告/状态开关/上次/下次执行/运行次数/操作）+ 创建/编辑对话框（测试配置下拉 + 周期模式单选 interval/daily/weekly + 自动报告提示）+ 运行记录 drawer 跳转报告中心
   - `frontend/src/router/index.ts` — 新增 `/security/scheduled-tasks` 独立路由
   - `frontend/src/App.vue` — 安全测试子菜单新增「定时任务」+ `SECURITY_SUB_LABELS` 增加 `scheduled-tasks: '定时任务'`
4. ✅ **构建验证**：`npm run build` 通过（修复了 `getSecurityConfigs` 带类型返回值导致的 TS2339：改用 `(res as any).data || res` 解包模式）
5. ✅ **部署 5.60 服务器 + 全部验证通过**：
   - SFTP 上传 6 个后端文件（router/service/model/schema/database/main.py）+ 85/86 个前端 dist 文件，`docker restart plat-auto-test-app` 容器恢复 healthy
   - `GET /api/security/scheduled-tasks` → `{"total":0,"items":[]}`（路由加载正常）
   - DB 列验证：`scheduled_tasks.case_type`（varchar(20) 默认 ui）+ `config_id`（varchar(64) 默认 NULL）均已迁移成功
   - 前端 chunk `ScheduledTasks-*.js/.css` 已部署
   - **端到端冒烟测试**：POST 创建安全定时任务（1 分钟间隔、禁用、关联 `sec_cfg_default`）→ 返回完整对象含 next_run_at 计算 → 列表可见 → DELETE 清理成功

**注意事项**：
- 安全测试无父路由结构，定时任务复用 UI 定时任务的独立路由风格，采用 `/security/scheduled-tasks` 独立路由
- `scheduler_service.py` 已按 case_type 分流：`ui` 走原逻辑，`security` 走新 `_run_security_task_once`，互不影响
- 安全定时任务执行前检查 `_has_running_security_execution()`，有 pending/running 的安全执行时跳过本轮，避免 MySQL 行锁/并发冲突（与 UI 定时任务行为一致）
- 因对话在部署验证中途中断，本次已在后续会话补齐全部部署验证（创建/删除冒烟测试通过后方记录）

### 本次任务（2026-08-13）：安全测试新增 ERP 配置子菜单

**核心成果**：
1. ✅ 按规范输出两份文档：
   - `Docs/PRD/需求文档/安全测试/_PRD_安全测试ERP配置_需求文档.md`（需求文档）
   - `Docs/PRD/需求文档/安全测试/_PRD_安全测试ERP配置_计划执行.md`（计划执行文档）
2. ✅ 后端实现：新增 `GET/PUT /api/security/erp-config` 接口
   - `backend/app/schemas/security_erp.py`（Pydantic 请求/响应模型）
   - `backend/app/routers/security_erp.py`（复用 `ErpConfig` 模型 + `erp_configs` 表 + ERP 环境变量，与功能测试报告**共享同一套配置**）
   - `backend/app/main.py` 注册 `security_erp.router`（prefix `/api/security`）
3. ✅ 前端实现：
   - `frontend/src/api/securityErp.ts`（API 封装）
   - `frontend/src/views/security/ErpConfig.vue`（复制功能测试报告页面，替换 API 引用）
   - `frontend/src/router/index.ts` 新增 `/security/erp-config` 独立路由（⚠️ 安全测试无父路由结构，采用独立路由方案）
   - `frontend/src/App.vue` 安全测试子菜单新增「ERP 配置」+ 页面标题映射 `SECURITY_SUB_LABELS`
4. ✅ 构建 + 联调验证通过：
   - `npm run build` 通过，无 TS 错误
   - `GET/PUT /api/security/erp-config` 接口实测正常（含持久化与恢复）

**注意事项**：
- 安全测试模块没有 `/security` 父路由（用例/执行/报告复用 `/cases/:type` 等共享路由），ERP 配置采用独立路由 `/security/erp-config` 实现，与计划文档中的父子路由假设有差异，不影响功能
- 本次验证用端口 8002 起后端（8001 有无法杀掉的旧进程残留，见踩坑 S14）

### 本次任务（2026-08-13）：安全用例同步 5.60 + 报告加载失败修复

**核心成果**：
1. ✅ 26 个新安全测试用例同步部署到 5.60 MySQL 服务器（新增 25 个，全平台总计 67 个，覆盖 12 个模块）
   - 修复了 `create_security_cases.py` 中 aiomysql ↔ pymysql 同步引擎冲突（URL 自动转换）
2. ✅ **修复安全测试报告加载失败**（P1，报告查看功能阻塞）
   - 根因：Axios 响应拦截器自动解包 `response.data`，`Reports.vue` 再取 `.data` 得 `undefined`
   - 修复：`Reports.vue` 改为 `response.content`；`security.ts` 改用 `as any` 返回类型
3. ✅ 修复已部署至 5.60 服务器，**用户确认可正常访问报告页面**
4. ✅ 输出问题处理 + 计划执行两份文档

### 历史任务（2026-07-22）：安全测试模块 P1 待办 + P2 执行验证

**核心成果**：
1. ✅ 前端报告中心适配安全报告（Markdown 渲染 + 主题适配 + 下载功能）
2. ✅ 补充 API3/4/6/7/9/10 安全测试用例（18 个新用例，总计 42 个）
3. ✅ **P2 执行验证**：全量 42 个安全测试用例执行完成

### 本次任务（2026-08-17）：安全测试 ERP 任务创建对接（指派跟踪）

**背景**：参考 `develop/AuxiliaryTool/ScriptTool/ApiSecurityTest` 工具，其除报告上传外还对接了 **ERP 任务创建（指派跟踪）**，用于形成「扫描 → 修复 → 回归验证」闭环。本次实现将该能力集成到平台安全测试模块。

**流程**：需求文档 → 计划执行文档 → 后端 → 前端 → 构建验证 → Git 提交推送 → 部署 5.60 服务器 全链路完成。

**核心成果**：
1. ✅ 按规范输出两份文档：
   - `Docs/PRD/需求文档/安全测试/_PRD_安全测试ERP任务创建_需求文档.md`
   - `Docs/PRD/需求文档/安全测试/_PRD_安全测试ERP任务创建_计划执行.md`
2. ✅ **后端 API**（新增 2 个接口）：
   - `GET /api/security/executions/{id}/task-preview` — 任务创建预览（报告摘要 + 任务类型/状态/人员列表 + 关联需求 + 默认配置）
   - `POST /api/security/executions/{id}/create-task` — 创建 ERP 任务（`POST /openclaw/task`）
   - `backend/app/services/erp_task_client.py`（新增，ERP API 客户端：1h 缓存 + 4xx 不重试/5xx 重试 3 次 + `X-Api-Key` 认证）
   - `backend/app/services/security_erp_task_service.py`（新增，业务服务：报告解析、紧急程度计算、任务名生成 `{IP}接口安全测试及漏洞修复_{YYYYMMDD}`、HTML 描述生成）
   - `backend/app/schemas/security_erp_task.py`（新增，Pydantic 模型）
   - `backend/app/routers/security_erp_task.py`（新增，路由）
   - `backend/app/main.py`（注册 security_erp_task 路由）
3. ✅ **前端**：
   - `frontend/src/api/security.ts`（新增 `getSecurityTaskPreview` / `createSecurityTask`，`as any` 返回类型）
   - `frontend/src/views/Reports.vue`（安全报告弹窗新增「创建ERP任务」按钮 + 对话框：报告摘要只读折叠区 + 任务配置表单（类型/状态/责任人/创建人/紧急程度/期望工时/截止天数/关联需求））
4. ✅ **构建验证 + 提交推送**：`npm run build` 无 TS 错误；`236b3f3b` 提交推送 origin；`5b5b35de` 补充 HANDOFF 状态同步提交推送
5. ✅ **部署至 5.60 服务器**：7 个后端文件上传 + main.py 路由补丁（CRLF 适配） + 前端 dist 上传 + 容器重启
6. ✅ **task-preview 接口实测通过**：用服务器真实执行 ID `exec_66d76c33e6184906903ca13d24acf983` 测试，返回正确数据
   - `server_ip: 192.168.5.44`，`task_name: 192.168.5.44接口安全测试及漏洞修复_20260817`
   - `level: 5`（最高优先级，因有高危漏洞）
   - ERP 基础数据正常：5 种任务类型 + 130 名人员
7. ⏳ **create-task 待用户在界面实测**（ERP 端生成任务确认）

**默认任务配置**（对齐参考实现 config.yaml）：
- type_id=3（后端开发）、status_id=1（新建）、level=按漏洞自动计算（高危→5/中危→4/低危→3/信息→2/无→1）
- excepthour=21、user_id=101（李立键）、createuser_id=441（陈泽键）、deadline_days=7
- 关联需求搜索词：`【新统一平台】公司内部安全测试扫描及修复验证`

### 本次任务（2026-08-17）：安全测试报告 ERP 上传流程对接

**核心成果**：
1. ✅ **后端**：新增 `security_erp_upload.py` 路由，提供 3 个 ERP 上传接口
   - `POST /api/security/executions/{id}/upload-to-erp` — 上传到 ERP 测试单（自动生成 Markdown 报告 → 转换为 DOCX → 上传 ERP）
   - `POST /api/security/executions/{id}/upload-to-project` — 上传到 ERP 项目资料
   - `POST /api/security/executions/{id}/upload-to-cooperation` — 上传到 ERP 协作文档
   - 复用 `ErpService`（与功能测试报告共享），`Markdown→DOCX` 转换使用 `python-docx`
2. ✅ **前端**：`Reports.vue` 安全报告弹窗新增「上传到 ERP」按钮 + 上传对话框
   - 支持三种上传目标选择（ERP 测试单/项目资料/协作文档）
   - 测试单上传：可选测试单 ID、抄送人、创建人
   - 项目资料/协作文档：必填项目 ID，可选文件名称/分组 ID
3. ✅ **构建验证**：`npm run build` 通过，无 TS 错误
4. ✅ **后端路由验证**：`/api/security/executions/{id}/upload-to-*` 三个接口注册成功

### 执行验证结果（2026-07-22）

| 执行名称 | 用例数 | 通过 | 失败 | 耗时 | 执行ID |
|---------|--------|------|------|------|--------|
| security-test-pilot | 3 | 2 | 1 | 1.6s | exec_b6ebb6e51b5e4c0a908b6ccf343be468 |
| security-full-test | **42** | **29** | **13** | **3.7s** | exec_8ebb163888504621b0af9f75606b80cb |

**漏洞统计**：
| 风险等级 | 数量 |
|---------|------|
| 🔴🔴🔴 严重 | 1（第三方API密钥泄露） |
| 🔴 高危 | 12（越权7个 + API5/8/10各2个） |
| 🟢 已验证安全 | 29 |

**OWASP 覆盖矩阵**：
- API1 对象级授权失效：7 高危 / 4 安全
- API2 身份认证失效：4 安全
- API3 对象属性级授权失效：1 高危 / 2 安全
- API4 资源消耗不受限：3 安全
- API5 功能级授权失效：2 高危
- API6 敏感业务流：3 安全
- API7 SSRF：3 安全
- API8 安全配置错误：2 高危 / 2 安全
- API9 库存管理不当：3 安全
- API10 第三方API集成：1 严重 / 1 高危 / 1 安全

---

## 二、已完成事项清单

### 2.1 前端改造

| 文件 | 说明 |
|------|------|
| `frontend/package.json` | 新增 `marked` 依赖 |
| `frontend/src/views/Reports.vue` | 安全报告 Markdown 渲染 + 类型标签 + 下载功能 + 主题适配 |

**Reports.vue 关键变更**：
- 报告列表新增"报告类型"列，区分"安全测试"和"UI自动化"
- 新增安全测试报告弹窗，使用 `marked` 渲染 Markdown 内容
- `viewReport()` / `downloadReport()` 按 `case_type` 分流
- GitHub 风格 Markdown 样式，使用 CSS 变量适配深色/浅色主题
- 弹窗内和列表操作栏均支持下载

### 2.2 后端用例补充

| 文件 | 说明 |
|------|------|
| `backend/scripts/create_security_cases.py` | 新增 18 个用例定义 |

**新增用例清单**：

| 模块 | 用例数 | 用例 ID | 风险等级 |
|------|--------|---------|----------|
| API3 - 对象属性级别授权失效 | 3 | sec_2_3_001/002/003 | high/medium/high |
| API4 - 资源消耗不受限 | 3 | sec_2_4_001/002/003 | high/medium/medium |
| API6 - 无限制访问敏感业务流 | 3 | sec_2_6_001/002/003 | high/medium/high |
| API7 - 服务器端请求伪造 | 3 | sec_2_7_001/002/003 | critical/critical/high |
| API9 - 库存管理不当 | 3 | sec_2_9_001/002/003 | high/medium/low |
| API10 - 不安全的第三方API集成 | 3 | sec_2_10_001/002/003 | high/medium/critical |

### 2.3 菜单升级：安全测试作为一级菜单（2026-08-13）

**变更内容**：安全测试从"自动化测试"父菜单中拆出，升级为独立的一级菜单。

| 文件 | 修改内容 |
|------|---------|
| `frontend/src/App.vue` | 1. 从"自动化测试"子菜单中移除安全测试三个入口（用例管理/执行中心/报告中心）<br>2. 新增独立一级菜单"安全测试"（`<Lock />` 图标），含三个子项<br>3. 页面标题映射新增 `'/security': '安全测试'`<br>4. 菜单高亮逻辑新增 `/security` 路径支持 |

**菜单结构变更**：

```
自动化测试（改前）                         自动化测试（改后）
├── 用例管理                               ├── 用例管理
│   ├── UI自动化                            │   ├── UI自动化
│   ├── 接口自动化                           │   └── 接口自动化
│   └── 安全自动化测试 ← 移除                ├── 执行中心
├── 执行中心                                │   ├── UI自动化
│   ├── UI自动化                            │   └── 接口自动化
│   ├── 接口自动化                           └── 报告中心
│   └── 安全自动化测试 ← 移除                    ├── UI自动化测试
└── 报告中心                                    └── 接口测试
    ├── UI自动化测试
    ├── 接口测试                    安全测试（新增一级菜单）
    └── 安全测试 ← 移除                 ├── 用例管理
                                        ├── 执行中心
                                        └── 报告中心
```

**路由影响**：无变化。安全测试路由仍复用 `/cases/security`、`/execution/security`、`/reports/security`，仅菜单结构变更。

**构建验证**：✅ `npm run build` 通过。

### 2.4 文档

| 文件 | 说明 |
|------|------|
| `Docs/PRD/需求文档/_PRD_安全测试模块P1待办任务_需求文档.md` | P1 需求文档 |
| `Docs/PRD/需求文档/_PRD_安全测试模块P1待办任务_计划执行.md` | P1 计划执行文档 |

---

## 三、历史已完成（前次会话）

### 3.1 后端安全测试引擎

| 文件 | 说明 |
|------|------|
| `backend/app/models/security_config.py` | 安全测试配置 ORM（含 to_client_config） |
| `backend/app/models/vulnerability_result.py` | 漏洞测试结果 ORM（⚠️ 字段名用 `extra_data`，非 metadata） |
| `backend/app/schemas/security.py` | Pydantic 校验层 |
| `backend/app/executors/http_client.py` | HTTP 客户端（AES-CBC 签名算法） |
| `backend/app/executors/auth_helper.py` | 多账号登录辅助 |
| `backend/app/executors/security_executor.py` | 安全测试执行引擎核心 |
| `backend/app/services/security_service.py` | 安全测试业务逻辑层 |
| `backend/app/services/knowledge_base.py` | 知识库（14历史漏洞 + 15华为红线 + SQL载荷） |
| `backend/app/services/security_report_service.py` | 报告生成服务（7 章节 Markdown，格式对齐参考实现） |
| `backend/app/routers/security.py` | API 路由（13个接口，含报告 API） |

### 3.2 后端修改文件

| 文件 | 修改内容 |
|------|---------|
| `backend/app/main.py` | 注册 `/api/security` 路由 |
| `backend/app/models/__init__.py` | 导入 SecurityConfig、VulnerabilityResult |
| `backend/app/services/execution_service.py` | **核心**：`run_execution` 按 case_type 分流；新增 `_run_security_execution` |
| `backend/app/schemas/test_case.py` | `steps` 字段改为 Union（支持 list/dict） |
| `backend/app/services/case_service.py` | 创建用例时区分 UI(list)/security(dict) |

### 3.3 前端文件

| 文件 | 说明 |
|------|------|
| `frontend/src/types/security.ts` | TypeScript 类型定义 |
| `frontend/src/api/security.ts` | 安全测试 API 封装（含报告 API） |
| `frontend/src/views/Cases.vue` | 安全用例显示风险等级 emoji/标签、详情弹窗 |
| `frontend/src/views/Execution.vue` | 执行弹窗（配置选择）、分流安全/UI执行逻辑 |

---

## 四、安全测试报告生成服务

### 4.1 报告 7 章节结构（对齐参考实现）

| 章节 | 编号 | 内容 | 数据来源 |
|------|------|------|---------|
| 执行概要 | 一 | 统计总览 + OWASP 覆盖矩阵 | VulnerabilityResult 按 level/test_id 统计 |
| 漏洞详情 | 二 | 按风险等级排序，含请求/响应/修复建议 | VulnerabilityResult where is_vulnerable=True |
| 已验证安全项 | 三 | 按 OWASP 模块分组 | VulnerabilityResult where is_vulnerable=False |
| 风险评估与修复建议 | 四 | 按等级给出通用修复方案 | 根据漏洞分布动态生成 |
| 已知安全问题清单 | 五 | 6 个已知问题 | KNOWN_ISSUES 静态数据 |
| 历史漏洞回归验证 | **五.五** | HV-* 用例结果（6 列表格） | VulnerabilityResult + knowledge_base |
| 华为安全红线合规性检查 | **五.六** | HW-* 用例结果 | VulnerabilityResult + knowledge_base |
| 测试环境与工具 | **六** | 服务器（含架构）/工具/标准 | SecurityConfig |
| 参考资料 | **七** | Z 盘路径 | REFERENCE_MATERIALS 常量 |

### 4.2 报告 API

```
GET /api/security/executions/{id}/report         → 返回 Markdown 内容
GET /api/security/executions/{id}/report/download → 下载 .md 文件
```

### 4.3 前端报告渲染

- 使用 `marked` 库渲染 Markdown
- GitHub 风格样式，CSS 变量适配深色/浅色主题
- 报告弹窗内支持下载

---

## 五、当前数据状态

| 内容 | 数量 | 备注 |
|------|------|------|
| 安全测试模块 | 12 | sec_api01~sec_api10 + sec_regression + sec_redline |
| 安全测试用例 | 67 | 全部 OWASP API1-10 + 回归 + 红线覆盖（2026-08-13 新增 25 个） |
| 安全测试配置 | 1 | `sec_cfg_default`（新统一平台 192.168.5.44） |

**用例分布**：

| 模块 | 用例数 |
|------|--------|
| API1 - 对象级别授权失效 | 8 |
| API2 - 身份认证失效 | 4 |
| API3 - 对象属性级别授权失效 | 3 |
| API4 - 资源消耗不受限 | 3 |
| API5 - 功能级别授权失效 | 2 |
| API6 - 无限制访问敏感业务流 | 3 |
| API7 - 服务器端请求伪造 | 3 |
| API8 - 安全配置错误 | 4 |
| API9 - 库存管理不当 | 3 |
| API10 - 不安全的第三方API集成 | 3 |
| 历史漏洞回归测试 | 3 |
| 华为安全红线检查 | 3 |

---

## 六、下一步计划（按优先级）

| 优先级 | 待办 | 说明 |
|--------|------|------|
| **P2.5** | ✅ ~~前端报告类型标签修复~~ | 报告类型显示"UI自动化"应为"安全测试" |
| **P3** | ✅ ~~安全报告上传 ERP 流程对接~~ | ERP 配置入口已完成，ERP 上传流程已完成（2026-08-17） |
| **P3.5** | ✅ ~~安全测试 ERP 任务创建对接~~ | 任务创建预览 + 创建接口 + 前端对话框已完成（2026-08-17）；**已部署 5.60 并实测 task-preview 通过**（真实执行 ID 返回正确的任务名/紧急程度/ERP 基础数据），create-task 待用户在界面实测 |
| **P4** | ✅ ~~安全测试定时任务模块~~ | 周期调度（interval/daily/weekly）+ 自动报告可选 + 独立页面已完成（2026-08-19）；**已部署 5.60 并通过创建/删除冒烟测试**，定时调度触发待真实执行验证 |

---

## 七、踩坑记录（安全测试专项，绝对不要重复踩）

| # | 现象 | 根因 | 正确做法 |
|---|------|------|---------|
| S1 | 安全测试执行报 `'str' object has no attribute 'get'` | `execution_service` 未按 case_type 分流，安全用例被交给 PlaywrightExecutor 解析 dict steps | **`run_execution` 入口按 case_type 分流**，security 走专用 `_run_security_execution` |
| S2 | `metadata` 字段保存/查询报错 | `metadata` 是 SQLAlchemy 保留字段名 | 模型用 `extra_data`，service/schema 同步 |
| S3 | 执行时间显示比实际少 8 小时 | 全项目用 `utcnow()` 存 UTC，前端未转时区 | 全项目既有行为，单独评估 |
| S4 | 误判为"ORM 脱钩" | 未先看后端日志的错误来源模块 | **排查异常先 grep 日志确认是哪个 executor 报的** |
| S5 | Windows curl 发中文 JSON body 失败 | Windows bash 编码 | 用 Python requests 脚本测试，不用 curl |
| S6 | 报告测试目标为空 | 执行记录 config 无 config_id | **回退到默认 SecurityConfig** |
| S7 | OWASP 矩阵多出"严重"列 | 平台有 critical 等级，参考实现没有 | **critical 合并到 high 列统计** |
| S8 | 数据库 locked 执行用例创建脚本失败 | 另一个窗口后端服务占用数据库 | **与会议管理窗口协调脚本执行时间** |
| S9 | Windows 脚本打印 ✅❌ 报 UnicodeEncodeError | GBK 编码无法编码 emoji | `PYTHONIOENCODING=utf-8 python scripts/xxx.py` |
| S10 | 报告类型标签显示"UI自动化"而非"安全测试" | Reports.vue 中 case_type 判断逻辑未覆盖安全测试 | 需修复前端报告类型标签映射 |
| S11 | 安全报告预览报 `Cannot read properties of undefined (reading 'content')` | Axios 响应拦截器已自动解包 `response.data`，Reports.vue 再取 `.data` 得 `undefined` | 调用处直接用 `response.content`，不取 `.data`（已修复） |
| S12 | `TS2339: Property 'content' does not exist on type 'AxiosResponse<...>'` | `request.get<T>()` 泛型与实际运行时类型（解包后）不匹配 | API 函数统一用 `as any` 返回类型，绕过类型推断（已修复） |
| S13 | `create_security_cases.py` 用同步引擎连 MySQL 报 aiomysql 兼容错误 | 脚本复制了异步引擎 URL，同步连接用 `mysql+aiomysql://` 前缀冲突 | URL 自动转换：`mysql+aiomysql://` → `mysql+pymysql://`（已修复） |
| S14 | 端口 8001 旧 uvicorn 进程无法 taskkill 杀掉 | uvicorn `--reload` 残留父进程，MSYS bash 的 taskkill 权限/编码问题 | 用 `powershell Stop-Process -Id <pid> -Force`，或换端口 8002 起新实例验证 |
| S15 | 前端构建时 `getSecurityConfigs` 的 `items` 类型错误 | Axios 类型声明是 `AxiosResponse`，运行时拦截器已解包为 body | 调用处使用 `const data = (res as any).data || res`，再访问 `data.items` |
| S16 | 服务器远程命令通过 paramiko 读取超时 | 长时间 `curl`/MySQL 命令在 SSH channel 上未及时结束，PipeTimeout | 使用短命令 + `head -c`；健康检查优先使用容器内 `wget -qO- --timeout=10 http://127.0.0.1/health`；必要时对读取异常做容错 |
| S17 | 安全定时任务接口未返回/表字段缺失 | 新字段未迁移或容器未加载新代码 | 上传绑定挂载目录后执行 `docker restart plat-auto-test-app`；启动时 `init_db()` 自动运行 `_ensure_columns()`，并验证 `case_type/config_id` |

---

## 八、启动与验证

```bash
# 后端（端口 8001，会议管理窗口在跑时用 8002）
cd backend
uvicorn app.main:app --port 8001

# 前端（端口 3001，避免与会议管理窗口冲突）
cd frontend
npm run dev -- --port 3001

# 执行用例创建脚本（需确保另一个窗口未占用数据库）
cd backend
PYTHONIOENCODING=utf-8 python scripts/create_security_cases.py
```

- 前端: http://localhost:3001/cases/security
- 安全报告: http://localhost:3001/reports/security
- API 文档: http://localhost:8001/docs（搜 security 标签）
- 被测系统: https://192.168.5.44

---

## 九、已提交变更

**提交记录**：
- `001a68a9` feat(security): 新增API接口安全测试模块
- `68b2fbbf` feat(security): 安全测试报告生成服务+格式对齐参考实现
- `4c3301ee` feat(security): 前端报告中心适配安全报告+补充API3/4/6/7/9/10用例
- `236b3f3b` feat(security): 安全测试 ERP 配置/上传/任务创建全链路对接（✅ 已推送 origin/platform-auto-test）

**2026-08-13 菜单升级（已提交，随 236b3f3b）**：
- `frontend/src/App.vue` — 安全测试升级为一级菜单（详见二、2.3 节）

**2026-08-13 ERP 配置功能（已提交，随 236b3f3b）**：
- `backend/app/schemas/security_erp.py`（新增）
- `backend/app/routers/security_erp.py`（新增）
- `backend/app/main.py`（注册 security_erp 路由）
- `frontend/src/api/securityErp.ts`（新增）
- `frontend/src/views/security/ErpConfig.vue`（新增）
- `frontend/src/router/index.ts`（新增 `/security/erp-config` 路由）
- `frontend/src/App.vue`（安全测试子菜单新增 ERP 配置）
- 文档：`Docs/PRD/需求文档/安全测试/` 下两份 ERP 配置文档（新增）

**2026-08-17 安全报告 ERP 上传流程对接（已提交，随 236b3f3b）**：
- `backend/app/routers/security_erp_upload.py`（新增，含 Markdown→DOCX 转换 + 3 个 ERP 上传接口）
- `backend/app/main.py`（注册 security_erp_upload 路由）
- `frontend/src/api/security.ts`（新增 3 个 ERP 上传 API 函数）
- `frontend/src/views/Reports.vue`（安全报告弹窗新增 ERP 上传按钮 + 对话框 UI）

**2026-08-17 安全测试 ERP 任务创建对接（已提交，随 236b3f3b）**：
- `backend/app/services/erp_task_client.py`（新增，ERP API 客户端：1h 缓存 + 重试 + X-Api-Key 认证）
- `backend/app/services/security_erp_task_service.py`（新增，业务服务：报告解析、紧急程度计算、任务名/描述生成）
- `backend/app/schemas/security_erp_task.py`（新增，Pydantic 模型）
- `backend/app/routers/security_erp_task.py`（新增，2 个 API 端点）
- `backend/app/main.py`（注册 security_erp_task 路由）
- `frontend/src/api/security.ts`（新增 `getSecurityTaskPreview` + `createSecurityTask` 函数）
- `frontend/src/views/Reports.vue`（安全报告弹窗新增「创建ERP任务」按钮 + 对话框 UI）
- 文档：`Docs/PRD/需求文档/安全测试/` 下两份 ERP 任务创建文档（新增）
- **已提交并推送**，**已部署至 5.60**，task-preview 接口实测通过（真实执行 ID 返回正确数据），create-task 待用户在界面端到端实测

**2026-08-19 安全测试定时任务模块（已实现，已部署至 5.60 已验证）**：
- `backend/app/routers/security_scheduled_tasks.py`（新增，7 个 API 端点，prefix `/api/security/scheduled-tasks`）
- `backend/app/services/scheduler_service.py`（修改，`run_task_once` 按 case_type 分流 + `_run_security_task_once` 新函数）
- `backend/app/models/scheduled_task.py`（修改，`_ensure_columns` 新增 `case_type` / `config_id` 字段）
- `backend/app/schemas/scheduled_task.py`（修改，Pydantic 模型对齐新字段）
- `backend/app/database.py`（修改，`_ensure_columns` 支持安全定时任务表的列迁移）
- `backend/app/main.py`（修改，注册 `security_scheduled_tasks` 路由）
- `frontend/src/api/securityScheduledTasks.ts`（新增，API 封装）
- `frontend/src/views/security/ScheduledTasks.vue`（新增，完整页面：表格 + 创建/编辑对话框 + 周期配置 + 运行记录 drawer）
- `frontend/src/router/index.ts`（修改，新增 `/security/scheduled-tasks` 独立路由）
- `frontend/src/App.vue`（修改，安全测试子菜单新增「定时任务」+ 页面标题映射）
- 文档：`Docs/PRD/需求文档/安全测试/` 下两份安全定时任务文档（新增）
- **已部署至 5.60**，通过创建/删除冒烟测试验证，定时调度触发待真实执行验证

---

*本文档由安全测试开发窗口生成，供下一次会话快速恢复上下文。会议管理窗口的交接见 `HANDOFF.md`。*
