Files
Nexus/docs/changelog/2026-05-28-push-5-features.md
T
Your Name 82c297776a feat: 推送页面 5 项迭代 — WS实时进度 + 分组选择 + 历史增强 + 文件操作 + 推送校验
F1: broadcast_sync_progress() + batch_id + 前端WS逐台更新
F2: get_paginated() platform_id/node_id + /categories端点 + 筛选下拉框
F4: _sync_log_to_dict() 补全字段 + diff_summary捕获 + 可展开详情面板
F7: /local-file-ops端点 + 文件管理器删除/重命名
F8: /verify端点 md5sum对比 + 推送后校验UI

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 21:01:27 +08:00

3.4 KiB
Raw Blame History

2026-05-28 推送页面 5 项迭代功能

变更摘要

  1. F1: 推送进度实时追踪 — WebSocket 逐台推送进度更新
  2. F2: 服务器分组选择 — 分类/平台筛选 + 选中当前筛选
  3. F4: 推送历史增强 — 可展开详情面板(耗时/错误/diff)
  4. F7: 文件管理器操作 — 解压文件删除/重命名
  5. F8: 推送后校验 — md5sum 对比本地源与远程目标

动机

推送页面已完成 ZIP 上传 + rsync 推送基础功能,但存在 5 个体验缺陷:批量推送无实时反馈、2000+ 服务器无法分组选择、历史记录无详情、文件管理器只读、推送后无法校验文件一致性。

涉及文件

后端

  • server/api/websocket.py — 新增 broadcast_sync_progress() 函数
    • 参数: batch_id, server_id, server_name, status, completed, failed, total, error_message, duration_seconds
    • 通过 _dispatch_ws_message() 发布到 Redis Pub/Sub + 本地 WebSocket
  • server/application/services/sync_engine_v2.py — 推送引擎改造
    • sync_files(): 新增 batch_id (uuid) 用于 WS 消息过滤
    • _sync_one(): 计数器更新后调用 broadcast_sync_progress()
    • _sync_one(): 捕获 diff_summary = result["stdout"][:2000]
    • _log_to_dict(): 新增 files_transferred, files_skipped, bytes_transferred, diff_summary
    • 返回 dict 新增 batch_id
  • server/api/servers.py — 服务器列表 + 历史增强
    • list_servers(): 新增 platform_id, node_id Query 参数
    • 新增 GET /api/servers/categories 端点(分类+平台列表)
    • _sync_log_to_dict(): 新增 files_skipped, bytes_transferred, diff_summary
  • server/infrastructure/database/server_repo.pyget_paginated() 增加 platform_id, node_id 参数
  • server/api/schemas.py — 新增 LocalFileOperation, SyncVerify 模型
  • server/api/sync_v2.py — 新增端点
    • POST /api/sync/local-file-ops: 删除/重命名上传临时目录中的文件
    • POST /api/sync/verify: md5sum 对比本地源与远程目标

前端

  • web/app/push.html — 全面改造
    • F1: WebSocket 连接 connectPushWS() + updateProgressFromWS() 逐台更新
    • F2: 分类/平台筛选下拉框 + filterServers() + "选中当前筛选" 按钮
    • F4: 历史记录可点击展开详情(源/目标路径、耗时、错误、diff_summary
    • F7: 文件管理器 hover 显示操作按钮 + deleteLocalFile()/renameLocalFile()
    • F8: "推送后校验" 复选框 + doVerify() + 校验结果面板

安全影响

  • F1 (WS): WS 消息需 JWT 认证 + batch_id 过滤防混淆
  • F7 (文件操作): os.path.realpath() + startswith("/tmp/nexus_upload_") 双重校验,新路径也必须在上传目录内
  • F8 (校验): SSH 命令中文件名通过 shlex.quote() 防注入
  • 所有新端点需 JWT 认证 + 审计日志

需要迁移/重启

  • 是:后端 Python 需重启(supervisorctl restart nexus
  • 否:无数据库 schema 迁移

验证方式

  1. F1: 推送 3+ 台服务器 → 观察 WS 逐台更新状态(不等全部完成)
  2. F2: 分类筛选 → 选中筛选 → 服务器列表正确过滤
  3. F4: 点击历史记录 → 展开详情 → 显示耗时/错误/diff
  4. F7: 上传 ZIP → 文件管理器 → 删除/重命名文件 → 刷新确认
  5. F8: 勾选校验 → 推送 → 校验结果正确显示匹配/缺失

进度条

☑实现 ☑WSL验证 ☐审计8步 ☐部署 ☐健康检查 ☐浏览器验证 ☐changelog