# 从 curl 自动生成压测任务 - 计划执行文档

> **关联 PRD**：`_PRD_从curl自动生成压测任务.md`
> **文档版本**：v1.0
> **制定日期**：2026-08-19
> **执行分支**：`platform-auto-test`
> **优先级**：P3

---

## 一、执行目标

实现“粘贴 curl 命令自动生成压测任务配置”能力：后端负责将 curl 解析为结构化数据，前端在新建任务弹窗中提供导入入口并回填现有表单。功能不新增数据库表、不改变任务数据模型、不与接口预设联动。

---

## 二、实施原则

1. **先文档后代码**：本计划与 PRD 完成后再实施代码。
2. **最小改动**：复用现有性能测试任务创建表单、API 封装和 Pydantic camelCase 规则。
3. **纯函数解析**：解析器只使用 Python 标准库，和 FastAPI、数据库解耦。
4. **兼容优先**：未使用 curl 导入时，原有创建/编辑流程完全不变。
5. **安全默认**：Authorization 只用于识别登录需求，不把 Bearer Token 持久化到任务 headers；Cookie 按用户约定保留。

---

## 三、阶段计划

### Phase 0：文档准备

| 工作项 | 文件 | 结果 |
|---|---|---|
| 编写需求文档 | `_PRD_从curl自动生成压测任务.md` | 明确范围、输入输出、验收标准 |
| 编写本计划 | `_PRD_从curl自动生成压测任务_计划执行.md` | 明确代码阶段和验证方式 |

### Phase 1：后端解析能力

#### 1.1 新增解析器

文件：`backend/app/utils/curl_parser.py`

实现：

- `CurlParseResult` 数据结构
- `parse_curl(curl_command)` 纯函数
- 使用 `shlex.split()` 处理单引号、双引号和反斜杠续行
- 支持 `-X/--request`、`-H/--header`、`-d/--data*`、URL
- 自动推断 GET/POST
- 识别并剥离 Authorization Bearer 与签名 headers
- 保留 Cookie header
- 对 `-F`、`-u`、`--data-urlencode` 返回友好 errors
- 对空命令、无法分词、缺失选项值、缺失 URL 返回可识别错误

#### 1.2 新增 API Schema

文件：`backend/app/schemas/performance.py`

- `CurlParseRequest`：`curl_command` 必填，最大 10000 字符
- `CurlParseResponse`：与解析器输出一致，使用项目既有 camelCase alias 规则

#### 1.3 新增解析端点

文件：`backend/app/routers/performance.py`

- `POST /parse-curl`
- 调用 `parse_curl()`
- 解析输入无效时返回 HTTP 400
- 成功时返回 `CurlParseResponse`
- 路由放在 `/tasks/{task_id}` 动态路由之前，避免路径匹配歧义

### Phase 2：前端导入交互

#### 2.1 API 与类型

文件：

- `frontend/src/api/performance.ts`：新增 `parseCurl(curlCommand)`
- `frontend/src/types/performance.ts`：新增 `CurlParseResult`

请求路径使用完整 `/api/performance/parse-curl`，遵循 axios `baseURL` 为空的项目约定。

#### 2.2 任务表单入口

文件：`frontend/src/views/performance/TaskList.vue`

- 新建任务弹窗增加“从 curl 导入”按钮
- 增加导入 dialog 和 textarea
- 对话框提供取消、解析导入按钮
- 解析期间按钮 loading，防止重复提交
- 成功后回填 method、targetUrl、headers、body、authRequired、signRequest
- 清空 presetId，恢复接口字段可编辑
- errors 非空时用 warning 提示，不阻断可解析字段回填
- body 为 null 时清空表单 body
- 对象/数组使用格式化 JSON 字符串，普通字符串同样保证可提交

### Phase 3：验证与收尾

#### 3.1 后端解析器验证

使用 Python 直接调用 `parse_curl()` 覆盖：

1. 标准 POST + JSON body
2. GET 无 body
3. Authorization Bearer 剥离
4. 签名 headers 剥离
5. Cookie 保留
6. `-F`/`-u`/`--data-urlencode` errors
7. 多行 curl（反斜杠续行）
8. 缺少 URL、空命令、无效引号

#### 3.2 API 验证

- 启动后端后访问 OpenAPI，确认 endpoint 注册
- 使用 HTTP 客户端调用成功和失败输入
- 确认响应字段为 camelCase（`targetUrl`、`authRequired`、`signRequest`）且前端类型一致

#### 3.3 前端验证

- 执行 `npm run build`
- 打开新建任务弹窗，确认“从 curl 导入”入口可见
- 粘贴 curl，确认字段回填
- 验证选择预设后导入会清空 presetId
- 验证不支持参数提示不阻断
- 回填后保存任务，确认原创建链路成功

---

## 四、文件变更清单

### 新增

| 文件 | 说明 |
|---|---|
| `backend/app/utils/curl_parser.py` | curl 解析器 |
| `Docs/PRD/性能测试/需求文档/_PRD_从curl自动生成压测任务.md` | 需求文档 |
| `Docs/PRD/性能测试/需求文档/_PRD_从curl自动生成压测任务_计划执行.md` | 本执行计划 |

### 修改

| 文件 | 变更 |
|---|---|
| `backend/app/schemas/performance.py` | curl 请求/响应 Schema |
| `backend/app/routers/performance.py` | curl 解析 API |
| `frontend/src/api/performance.ts` | API 封装 |
| `frontend/src/types/performance.ts` | 返回类型 |
| `frontend/src/views/performance/TaskList.vue` | 导入交互与回填 |

### 明确不修改

- `backend/app/models/performance.py`
- `backend/app/database.py`
- `backend/app/services/performance_service.py`
- 接口预设相关模型、路由和页面

---

## 五、风险与应对

| 风险 | 应对 |
|---|---|
| Shell 引号与 Windows curl 格式差异 | 使用 `shlex.split(posix=True)`，异常返回 400；支持常见单/双引号及反斜杠续行 |
| curl 中包含敏感 Bearer Token | 解析后不返回 Authorization，避免回填/持久化 |
| 不支持 multipart 或 Basic Auth | 正常解析其余字段，并在 errors 中提示 |
| 预设字段 disabled 导致无法回填 | 导入成功前清空 presetId，再赋接口字段 |
| 空 body 与 JSON body 格式不同 | 前端统一将 null 转为空字符串，对象/数组格式化为 JSON |

---

## 六、验收门禁

代码合并前必须满足：

- [ ] PRD 与计划执行文档已落盘
- [ ] 后端解析器覆盖计划中的 curl 变体
- [ ] 空命令和缺少 URL 能得到明确 400
- [ ] Authorization/签名头不出现在返回 headers
- [ ] Cookie 出现在返回 headers
- [ ] 前端导入可回填并清空 presetId
- [ ] `npm run build` 通过
- [ ] 后端解析器验证通过
- [ ] 未修改数据库结构和既有任务创建链路

---

*本计划执行完成后，应同步更新性能测试 HANDOFF 文档中的 P3 进度。*