# 计划执行 - 性能测试模块读取系统配置被测系统URL

> **文档版本**: v1.0
> **创建日期**: 2026-08-19
> **关联 PRD**: `_PRD_性能测试模块读取系统配置被测系统URL.md`
> **优先级**: P1

---

## 一、目标

让性能测试模块的认证/登录 base URL 统一从系统配置（`settings.TARGET_URL`）运行时动态读取，并支持认证路径（登录/验证码）可配置化。

## 二、现状分析

### 2.1 关键代码位置

| 文件 | 第几行 | 当前逻辑 | 问题 |
|------|--------|---------|------|
| `backend/app/services/performance_service.py` | 34-45 | `_DEFAULT_BASE_URL = settings.TARGET_URL` 模块级常量 | 导入时固定，配置变更后不刷新 |
| 同上 | 605-613 | `_build_client_config()` 从任务 `target_url` 解析 base URL | 覆盖了系统配置的值 |
| 同上 | 42-45 | `_DEFAULT_AUTH_CONFIG` 硬编码登录/验证码路径 | 不可配置 |
| `backend/app/routers/system.py` | 262-314 | `/sut-config` GET/PUT 仅处理 `url` 字段 | 缺少认证路径字段 |
| `backend/app/schemas/dingtalk_config.py` | — | `SutConfigResponse` / `SutConfigUpdateRequest` 仅含 `url` | 缺少认证路径字段 |
| `backend/app/models/dingtalk_config.py` | — | 模型仅含 `target_url` | 缺少认证路径字段 |
| `frontend/src/views/system/Settings.vue` | 12-54 | 被测系统配置仅编辑 URL | 缺少认证路径输入框 |

### 2.2 参考实现（UI 自动化执行如何做）

`execution_service.py` 第 336 行：

```python
executor_config.setdefault("base_url", settings.TARGET_URL)
```

UI 自动化已经采用运行时读取 `settings.TARGET_URL` 的方式，性能测试需要对齐这一模式。

## 三、实施步骤

### Step 1: 扩展系统配置模型（后端）

**文件**：`backend/app/models/dingtalk_config.py`

在 `DingTalkConfig` 模型中增加两个字段：

```python
login_path: Mapped[str] = mapped_column(String(200), default="/platform/api/auth/login", comment="登录接口路径")
captcha_path: Mapped[str] = mapped_column(String(200), default="/platform/api/code", comment="验证码接口路径")
```

### Step 2: 扩展 Schema

**文件**：`backend/app/schemas/dingtalk_config.py`

- `SutConfigResponse` 增加：
  ```python
  login_path: str = "/platform/api/auth/login"
  captcha_path: str = "/platform/api/code"
  ```
- `SutConfigUpdateRequest` 增加：
  ```python
  login_path: Optional[str] = None
  captcha_path: Optional[str] = None
  ```

### Step 3: 扩展系统配置 API

**文件**：`backend/app/routers/system.py`

- `GET /api/sut-config`：返回 `url` + `login_path` + `captcha_path`（从数据库读取，空则回退环境变量默认值）
- `PUT /api/sut-config`：新增字段持久化到 `DingTalkConfig.login_path` / `captcha_path`，并更新运行时 `settings.AUTH_LOGIN_PATH` / `settings.AUTH_CAPTCHA_PATH`

### Step 4: 扩展 config.py 环境变量

**文件**：`backend/app/config.py`

```python
# 认证接口路径配置
AUTH_LOGIN_PATH: str = os.getenv("AUTH_LOGIN_PATH", "/platform/api/auth/login")
AUTH_CAPTCHA_PATH: str = os.getenv("AUTH_CAPTCHA_PATH", "/platform/api/code")
```

### Step 5: 重构 performance_service.py

**文件**：`backend/app/services/performance_service.py`

1. 删除 `_DEFAULT_BASE_URL` 常量
2. `_build_client_config()` 改为：

```python
@staticmethod
def _build_client_config(task_dict: Dict[str, Any]) -> Dict[str, Any]:
    """
    构建 HttpClient 配置

    被测系统 base_url 与认证路径均从系统配置（settings）运行时动态读取，
    不依赖任务中填写的 target_url。
    """
    return {
        "target": {
            "base_url": settings.TARGET_URL,
            "verify_ssl": False,
            "timeout": 30,
        },
        "accounts": dict(_DEFAULT_ACCOUNTS),
        "auth": {
            "login_path": settings.AUTH_LOGIN_PATH,
            "captcha_path": settings.AUTH_CAPTCHA_PATH,
        },
    }
```

### Step 6: 前端 Settings.vue 增加认证路径配置

**文件**：`frontend/src/views/system/Settings.vue`

- `sutForm` 增加 `loginPath`、`captchaPath`
- 表单中增加两个输入项：
  ```vue
  <el-form-item label="登录接口路径" prop="loginPath">
    <el-input v-model="sutForm.loginPath" placeholder="/platform/api/auth/login" />
  </el-form-item>
  <el-form-item label="验证码接口路径" prop="captchaPath">
    <el-input v-model="sutForm.captchaPath" placeholder="/platform/api/code" />
  </el-form-item>
  ```
- 保存/重置逻辑同步更新

### Step 7: 验证

1. 后端单元测试：确认 `_build_client_config()` 返回的 base URL 等于 `settings.TARGET_URL`，不依赖任务 `target_url`
2. 手动验证：
   - 在系统配置修改被测系统 URL → 创建性能测试任务（target_url 填旧地址）
   - 执行任务 → 登录请求应发送到新地址
   - 同时验证认证路径配置生效

## 四、涉及文件清单

| 文件 | 改动类型 |
|------|---------|
| `backend/app/models/dingtalk_config.py` | 修改（+2 字段） |
| `backend/app/schemas/dingtalk_config.py` | 修改（+2 字段在 2 个 Schema） |
| `backend/app/routers/system.py` | 修改（GET/PUT 处理新字段） |
| `backend/app/config.py` | 修改（+2 环境变量） |
| `backend/app/services/performance_service.py` | 修改（重构 `_build_client_config`） |
| `frontend/src/views/system/Settings.vue` | 修改（+2 输入项） |

无数据库迁移脚本（SQLite 自动加列；MySQL 生产库需手动 ALTER TABLE，见 Step 8）。

## 五、MySQL 生产库迁移（可选）

若部署在 MySQL，需执行：

```sql
ALTER TABLE dingtalk_configs
  ADD COLUMN login_path VARCHAR(200) NOT NULL DEFAULT '/platform/api/auth/login',
  ADD COLUMN captcha_path VARCHAR(200) NOT NULL DEFAULT '/platform/api/code';
```

## 六、验收标准

- [ ] `_build_client_config()` 返回的 `base_url` 恒等于 `settings.TARGET_URL`
- [ ] 修改系统配置后立即执行性能任务，登录请求使用新地址
- [ ] 登录路径/验证码路径可通过系统配置修改，且持久化生效
- [ ] 旧任务数据无需迁移即可正常工作
- [ ] 前端 Settings.vue 提供认证路径输入项，保存/重置正确

## 七、风险与回滚

- **风险**：任务 `target_url` 与系统配置的 base URL 不一致时，登录用新地址、压测请求仍用旧地址，可能导致 token 无效
- **缓解**：文档中注明用户应同步更新任务 `target_url`；如出现大量登录失败，优先检查系统配置与任务 URL 是否一致
- **回滚**：`_build_client_config()` 恢复从 `target_url` 解析 base URL 的逻辑即可（保留原代码注释）