3.9 KiB
3.9 KiB
2026-05-29 推送页面迭代 Round 2 — 设计文档
背景与目标
推送页面 Round 1 已完成 5 项功能(WS 实时进度、分组选择、历史增强、文件操作、推送校验)。用户在实际使用中发现 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 认证 + 审计日志
验收标准
- F5: 切换同步模式 → 下方说明文字正确更新
- F2: 服务器列表在线🟢/离线🔴标识正确
- F1: 推送失败 → 行内出现重试按钮 → 点击可重试
- F3: 推送完成 → Telegram 收到通知含详情
- F4: 点击文件名 → 弹出预览框