# 设计说明 — 服务器全选筛选结果 + 脚本执行失败分组/CSV

**日期**: 2026-06-08  
**基线**: `main@5f63fb0`（分类/分页/执行详情已上线）

## 背景与目标

1. **服务器列表**：`v-data-table-server` 表头 checkbox 仅选当前页，批量操作无法覆盖「分类 Chip + 搜索」下的全部匹配项。
2. **脚本执行详情**：失败项已有「仅失败」筛选与单行操作，但同类错误分散在多行，缺少聚合视图与离线导出。

## 方案对比

| 能力 | 方案 A（选用） | 方案 B |
|------|----------------|--------|
| 全选筛选 | 前端复用 `loadAllServers()`（已有 search/category/sort） | 新 API `GET /servers/ids` |
| 失败分组 | 前端按 `summary` 首行归一化分组 | 后端解析 stderr 分类 |
| CSV | 前端 BOM UTF-8 下载 | 后端 StreamingResponse |

**选定 A**：零后端变更、与现有分页/filter 参数一致、部署风险低。

**2026-06-08 范围确认**：CSV 不做；留档改为「复制失败清单 + 复制分组摘要」；分组规则 **B**（去动态 IP/端口/路径）。

## 接口与数据

- 无新 API。
- 全选：`fetchPagePerPage('/servers/', { search, category, sort_by, sort_order }, 1, -1)` → ID 列表。
- 分组键：`normalizeExecErrorKey(summary)` — 首行 trim，空则「未知错误」，上限 200 字符。
- CSV 列：服务器、域名、状态、退出码、错误摘要、完整输出。

## 安全与性能

- 全选 300+ 台：多页 GET（200/页），与「分页全部」相同；批量操作仍走既有 authenticated API。
- CSV 含命令输出，仅管理员 JWT 会话内下载，不落库。
- 筛选条件变更时清空 `selectedItems`，避免误对旧选择批量操作。

## 验收标准

### 服务器 `#/servers`

- [ ] 分类 Chip 筛选后点「全选筛选结果 (N)」→ N 等于 Chip 数量，批量改分类生效。
- [ ] 搜索 + 全选 → 仅匹配项被选中。
- [ ] 分类视图：每组可「全选本组」；顶部可「全选筛选结果」。
- [ ] 更改分类/搜索/排序后选择被清空。

### 脚本 `#/scripts` 执行详情

- [ ] 存在失败时可选「列表 / 按错误分组」；分组按错误摘要聚合，显示台数。
- [ ] 「复制失败清单」「复制分组摘要」剪贴板内容正确
- [ ] **不做** CSV 文件下载
