# 2026-05-29 推送页面迭代 Round 2 — 设计文档 ## 背景与目标 推送页面 Round 1 已完成 5 项功能(WS 实时进度、分组选择、历史增强、文件操作、推送校验)。用户在实际使用中发现 5 项体验/功能缺陷: 1. **推送失败需手动切页重试** — 失败后需跳到"重试队列"页面,操作割裂 2. **无法识别服务器在线状态** — 选中离线服务器推送必然超时失败,浪费等待时间 3. **推送完成无即时通知** — 批量推送耗时长,用户离开页面后无法得知结果 4. **文件管理器无法预览内容** — 不确定推送的是否是正确文件,需下载验证 5. **同步模式含义不明确** — "增量/全量/校验和"对非运维用户不直观 ## 方案对比 ### F1 失败自动重试 | 方案 | 优点 | 缺点 | |------|------|------| | A: 行内重试按钮 | 不离开页面,体验流畅 | 需要从推送结果中获取 retry_job_id | | B: 自动重试无需按钮 | 全自动 | 可能对临时性错误造成无意义重试 | | C: 弹窗显示失败列表+批量重试 | 可选择重试哪些 | 交互重 | **选定方案 A** — 推送失败的行内"🔄 重试"按钮,利用现有 `PushRetryJob` + `/api/retries/` 体系 ### F2 在线状态标识 | 方案 | 优点 | 缺点 | |------|------|------| | A: 选项文字前加🟢/🔴 | 直观,零交互成本 | 无 | | B: hover 显示状态详情 | 信息更多 | 需额外交互 | **选定方案 A** — 最简方案,API 已返回 `is_online` 字段 ### F3 Telegram 通知 | 方案 | 优点 | 缺点 | |------|------|------| | A: 推送完成后发一条汇总通知 | 信息集中,不扰 | 延迟感知差 | | B: 逐台通知 | 实时 | 消息太多 | | C: 完成时汇总 + 部分失败时额外通知 | 覆盖全面 | 两条消息 | **选定方案 A** — 推送完成后发一条汇总 Telegram 消息,含成功/失败数、失败服务器名、耗时 ### F4 文件内容预览 | 方案 | 优点 | 缺点 | |------|------|------| | A: 点击文件名弹模态框预览 | 体验流畅 | 需新增后端端点 | | B: 新 tab 打开 | 简单 | 跳离上下文 | **选定方案 A** — 新增 `/api/sync/local-file-preview` 端点,前端模态框预览 ### F5 同步模式说明 | 方案 | 优点 | 缺点 | |------|------|------| | A: radio 下方固定说明文字 | 简单直观 | 占空间 | | B: hover tooltip | 不占空间 | 可能被忽略 | | C: 模式旁❓图标hover显示 | 平衡 | 交互多一步 | **选定方案 A** — radio 组下方增加动态说明文字,切换模式时更新 ## 选定方案及理由 所有 5 项均选方案 A(最简方案),理由: - 利用现有基础设施(重试体系、Telegram 模块、Redis heartbeat) - 改动范围最小,风险最低 - 用户需求明确,无需复杂设计 ## 接口/数据模型 ### F1: 新增 WS 字段 - `broadcast_sync_progress()` 增加可选参数 `retry_job_id: int = None` - WS 消息 `{type: "sync_progress", ..., retry_job_id: 123}` (失败时有值) ### F3: 新增 Telegram 函数 - `send_telegram_sync_complete(completed, failed, total, source_path, operator, failed_servers, duration_seconds)` ### F4: 新增 API 端点 - `POST /api/sync/local-file-preview` — `{path: str}` → `{name, size, content_base64, truncated, encoding_hint}` - 新增 Schema: `LocalFilePreview` ## 安全与性能约束 - F1: 重试按钮调已有 `/api/retries/{id}/retry`,已有 JWT 认证 + 审计 - F3: Telegram 消息经 `sanitize_external_message()` 脱敏 - F4: 文件预览限制:仅 `/tmp/nexus_upload_*` 目录 + 最多 4KB + realpath 校验 - F4: 预览端点需 JWT 认证 + 审计日志 ## 验收标准 1. F5: 切换同步模式 → 下方说明文字正确更新 2. F2: 服务器列表在线🟢/离线🔴标识正确 3. F1: 推送失败 → 行内出现重试按钮 → 点击可重试 4. F3: 推送完成 → Telegram 收到通知含详情 5. F4: 点击文件名 → 弹出预览框