Files
Nexus/docs/design/specs/2026-05-29-push-round2-design.md
2026-07-08 22:31:31 +08:00

3.9 KiB
Raw Permalink Blame History

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: 点击文件名 → 弹出预览框