4.9 KiB
4.9 KiB
进度系统修复总结
问题描述
- 前端进度显示问题: 前端始终显示0%进度,然后直接变成已完成,没有中间进度
- WebSocket系统复杂: 旧的WebSocket进度系统过于复杂,难以维护
- UI状态不统一: 下载中、处理中的状态色块UI不统一,高度不一致
- 下载进度不同步: 下载进度没有正常同步显示
解决方案
1. 实现简化的后端进度系统
文件: backend/services/simple_progress.py
- 6个固定阶段,每个阶段有固定权重
- 简单的百分比计算逻辑
- Redis存储和事件发布
- 支持子进度(可选)
文件: backend/api/v1/simple_progress.py
- 进度快照查询API接口
- 批量获取多个项目进度
- 阶段配置查询
文件: backend/services/simple_pipeline_adapter.py
- 在现有流水线中集成进度上报
- 每个阶段切换时自动发送事件
- 最多只发送6次事件
2. 前端状态管理重构
文件: frontend/src/stores/useSimpleProgressStore.ts
- Zustand状态管理
- 轮询控制机制
- 进度数据缓存
- 支持批量轮询
3. 统一UI组件设计
文件: frontend/src/components/UnifiedStatusBar.tsx
- 统一的状态栏组件
- 支持下载中、处理中、完成、失败等状态
- 固定高度32px,不会超出卡片
- 渐变背景,视觉效果统一
- 自动轮询下载进度和处理进度
文件: frontend/src/components/SimpleProgressDisplay.tsx
- 详细的进度条显示
- 仅在处理中时显示
- 支持阶段信息和消息显示
4. 主组件集成
文件: frontend/src/components/ProjectCard.tsx
- 移除旧的复杂进度系统
- 集成新的统一状态栏
- 支持下载进度轮询
- 简化状态显示逻辑
核心特性
固定阶段定义
STAGES = [
("INGEST", 10), # 下载/就绪
("SUBTITLE", 15), # 字幕/对齐
("ANALYZE", 20), # 语义分析/大纲
("HIGHLIGHT", 25), # 片段定位/打分
("EXPORT", 20), # 导出/封装
("DONE", 10), # 校验/归档
]
进度计算逻辑
def compute_percent(stage: str, subpercent: Optional[float] = None) -> int:
# 累加之前阶段权重
done = 0
for s in ORDER:
if s == stage:
break
done += WEIGHTS[s]
# 当前阶段
cur = WEIGHTS.get(stage, 0)
if subpercent is None:
return min(100, done + cur) if stage == "DONE" else min(99, done)
else:
return min(99, done + int(cur * subpercent / 100))
事件格式
{
"project_id": "46ab50a6-....",
"stage": "HIGHLIGHT",
"percent": 70,
"message": "已完成片段定位,共 12 段候选",
"ts": 1640995200
}
UI设计改进
统一状态栏样式
- 高度: 固定32px,不会超出卡片
- 背景: 渐变背景,根据状态使用不同颜色
- 布局: 左侧图标+文字,右侧百分比
- 颜色方案:
- 下载中: 蓝色渐变 (#1890ff → #40a9ff)
- 处理中: 根据阶段动态颜色
- 完成: 绿色渐变 (#52c41a → #73d13d)
- 失败: 红色渐变 (#ff4d4f → #ff7875)
- 等待: 灰色渐变 (#d9d9d9 → #f0f0f0)
响应式设计
- 支持不同屏幕尺寸
- 文字大小和间距适配
- 图标和文字对齐
轮询机制
下载进度轮询
- 每2秒轮询项目API获取下载进度
- 自动更新进度显示
- 下载完成后自动切换到处理状态
处理进度轮询
- 每2秒轮询简化进度API
- 获取最新阶段和进度信息
- 支持批量轮询多个项目
测试和验证
文件: frontend/src/pages/ProgressTestPage.tsx
- 提供完整的测试界面
- 可以模拟各种状态和进度
- 验证轮询机制和UI显示
迁移指南
后端迁移
- 使用
SimplePipelineAdapter替换旧的流水线适配器 - 在流水线关键点调用
emit_progress() - 移除复杂的WebSocket进度发布
前端迁移
- 使用
UnifiedStatusBar替换旧的进度组件 - 使用
useSimpleProgressStore管理状态 - 配置轮询替代WebSocket订阅
性能优化
- 批量轮询: 一次请求获取多个项目进度
- 智能缓存: 避免重复请求相同数据
- 条件轮询: 只在需要时启动轮询
- 自动清理: 定期清理过期进度数据
故障处理
- Redis连接失败: 记录警告日志,跳过进度发送
- 网络中断: 前端轮询自动重试,数据缓存在本地
- 阶段异常: 支持失败状态检测,提供重试机制
总结
通过这次修复,我们实现了:
✅ 可靠性: 基于HTTP轮询,不依赖WebSocket
✅ 简单性: 固定阶段,易于理解和维护
✅ 统一性: UI样式统一,高度一致
✅ 实时性: 下载和处理进度都能实时同步
✅ 扩展性: 易于添加新阶段和功能
✅ 调试性: 完整的日志和状态追踪
相比之前的复杂系统,这个方案更加稳定可靠,易于维护和扩展。