Files
MusicWorkshop/docs/superpowers/specs/2026-05-07-exception-center-redesign.md
T
liumangmang be3c086975 chore: add project configs, backend repair services, docs, and code quality tooling
- Add pre-commit hooks (ruff, black, prettier) and ESLint/Prettier configs
- Add backend repair services (execution, orchestration, preview) with tests
- Add project documentation (CLAUDE.md, README.md, design specs and plans)
- Add MissingTagsInlinePanel component for exception handling
- Add pyproject.toml with ruff/black configuration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-08 15:49:37 +08:00

251 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 异常中心页面优化 — 设计规格
> 创建日期: 2026-05-07
> 状态: 设计中
## 概述
对 MusicWorkshop 异常中心页面(`ExceptionPage.jsx`)进行全面的视觉、交互、流程和代码结构优化。
### 核心痛点
- 页面不够美观(首要痛点)
- 操作太繁琐
- 向导流程太长(保留 5 步但优化界面)
- 代码维护困难(800+ 行单文件)
## 设计决策
| 维度 | 决策 |
|------|------|
| 视觉风格 | 深色专业(Dark Professional)— 暗色主题 + 靛蓝高亮 + 微弱边框 |
| 页面布局 | 向导聚焦布局(Wizard Focus)— 顶部步骤条 + 左侧队列 + 右侧操作区 |
| 向导步骤 | 保持 5 步(确保入库数据精准性) |
| 代码重构 | 按功能区拆分组件 + 提取自定义 hooks |
| 后端改动 | 无需改动(API 和数据结构不变) |
## 视觉设计
### 配色方案
```
背景: #0f172a (slate-900) — 主背景
卡片: #1e293b (slate-800) — 面板/卡片背景
边框: #334155 (slate-700) — 微弱的组件边框
文字: #e2e8f0 (slate-200) — 主文字
次要: #94a3b8 (slate-400) — 辅助文字/标签
高亮: #6366f1 (indigo-500) — 主要操作/选中状态
成功: #22c55e (green-500) — 完成/入库操作
警告: #f59e0b (amber-500) — 需注意的异常
错误: #ef4444 (red-500) — 失败状态
```
### 异常类型标签色
```
元数据缺失: amber (amber-700 背景, amber-400 文字)
匹配失败: red (red-900 背景, red-400 文字)
匹配分过低: amber
转码失败: red
文件重复: slate
入库失败: red
```
### 排版
- 字体: 继承项目现有 Tailwind 配置(系统字体栈)
- 步骤标题: text-lg font-semibold
- 歌曲名称: text-sm font-medium
- 元数据标签: text-xs text-slate-400
- 按钮: text-sm font-medium rounded-lg
## 页面布局
```
┌──────────────────────────────────────────────────┐
│ 🏠 异常中心 [高级视图] │
├──────────────────────────────────────────────────┤
│ ①选择歌曲 ── ②试听确认 ── ③推荐匹配 ── ④手动编│
│ 辑 ── ⑤入库确认 │
├────────────┬─────────────────────────────────────┤
│ 队列 (12) │ 🎵 01 - 夜曲.mp3 │
│ │ ┌─────────────────────────────────┐│
│ ▸ 01-夜曲 │ │ 匹配候选: ││
│ track_02 │ │ ▸ 夜曲 / 周杰伦 · 十一月的萧邦 ││
│ unknown │ │ 95% · MusicBrainz ││
│ │ │ Nocturne / Jay Chou ││
│ │ │ 78% · Spotify ││
│ │ └─────────────────────────────────┘│
│ │ [确认选择] [手动编辑] [跳过 →] │
├────────────┴─────────────────────────────────────┤
│ ⚡ 修复任务: 3/12 完成 · running │
└──────────────────────────────────────────────────┘
```
## 组件架构
```
src/
├── pages/
│ └── ExceptionPage.jsx # 页面容器(路由入口 + 顶层状态协调)
├── components/exceptions/
│ ├── ExceptionStatsBar.jsx # 顶部统计概览条
│ ├── ExceptionTypeNav.jsx # 异常类型筛选标签
│ ├── ExceptionWizard.jsx # 5步向导主控制器
│ ├── ExceptionListView.jsx # 高级列表视图(备用,对应高级模式)
│ ├── steps/
│ │ ├── StepSelect.jsx # 步骤1:选择歌曲
│ │ ├── StepListen.jsx # 步骤2:试听确认
│ │ ├── StepMatch.jsx # 步骤3:推荐匹配
│ │ ├── StepEdit.jsx # 步骤4:手动编辑
│ │ └── StepConfirm.jsx # 步骤5:入库确认
│ ├── RepairTaskPanel.jsx # 修复任务实时状态面板
│ └── ActionPreviewModal.jsx # 操作预览/确认弹窗
├── hooks/
│ ├── useExceptionSummary.js # 异常概览数据获取
│ ├── useExceptionList.js # 异常列表(分页/筛选/队列)
│ ├── useExceptionDetail.js # 单条异常详情
│ ├── useRepairTask.js # WebSocket 修复任务跟踪
│ └── useWizardState.js # 向导步骤状态管理
```
### 组件职责
**ExceptionPage** — 页面容器,轻量级
- 仅持有顶层路由和视图模式切换(wizard / advanced
- 通过 props 传递共享状态
- 不包含任何步骤逻辑或 UI 细节
**ExceptionStatsBar** — 顶部统计概览
- Props: summary (总数/分类统计)
- 显示:开放中 / 处理中 / 已解决 三个统计卡片
- 深色主题:渐变靛蓝背景卡片
**ExceptionTypeNav** — 类型筛选标签
- Props: activeFilter, onFilterChange, counts
- 水平滚动的胶囊标签,显示各类型数量
- 深色主题:选中靛蓝填充,未选中 slate 边框
**ExceptionWizard** — 5步向导控制器
- 管理 5 个步骤的切换(由 useWizardState hook 驱动)
- 渲染当前步骤组件,传递必要的 props
- 步骤条 UI:圆形步骤编号 + 连接线,已完成绿色/当前靛蓝/待完成 slate
**步骤组件 (StepSelect, StepListen, StepMatch, StepEdit, StepConfirm)**
- 每个步骤是独立组件
- 通过 props 接收:detailRecord, action, params, previewState
- 通过回调通知:onActionChange, onParamsChange, onPreview, onExecute
**RepairTaskPanel** — 修复任务面板
- 显示当前修复任务的进度
- WebSocket 实时日志流
- 可折叠设计
**ActionPreviewModal** — 操作预览弹窗
- 显示批量操作的预览结果
- 风险等级标识(低/中/高)
- 确认/取消操作
### 自定义 Hooks
**useExceptionSummary**
- 封装 fetchExceptionSummary API 调用
- 返回 { summary, error, refresh }
**useExceptionList**
- 封装 fetchExceptionItems API(分页/筛选/队列模式)
- 管理 items, total, page, filter 状态
- 返回 { items, total, page, filter, setFilter, setPage, refresh, loading, error }
**useExceptionDetail**
- 封装 fetchExceptionItem API
- 由 selectedExceptionId 驱动自动获取
- 返回 { detail, loading, error, refresh }
**useRepairTask**
- 封装 WebSocket 连接 + repair task 状态
- 管理 repairTask, repairLogs
- 自动处理重连
**useWizardState**
- 管理:wizardStep, selectedAction, actionParams, previewState, executeError
- 步骤切换逻辑:inferDefaultAction, buildDefaultParams
- 返回 { wizardStep, setWizardStep, selectedAction, setSelectedAction, ... }
### 数据流
```
ExceptionPage (顶层)
├─ useExceptionSummary() ──→ ExceptionStatsBar
├─ useExceptionList() ──→ 左侧歌曲队列
├─ useExceptionDetail() ──→ 当前选中歌曲详情
├─ useWizardState() ──→ ExceptionWizard → 5 步骤组件
└─ useRepairTask() ──→ RepairTaskPanel
```
数据通过 props 向下流动,回调通过 props 向上通知。不使用 Context(避免不必要的心智负担)。
## 交互优化
### 平滑过渡
- 步骤切换:CSS transition 淡入淡出(150ms
- 列表项选择:背景色过渡(150ms)
- 弹窗:fade + scale 动画(200ms
### 微交互
- 悬停状态:列表项 hover 时背景微亮(slate-700
- 操作按钮:hover 时颜色加深 10%
- 统计卡片:hover 时轻微上浮 (translateY -2px)
- 加载状态:骨架屏替代纯 spinner
### 键盘导航
- ← → 键切换向导步骤
- ↑ ↓ 键在歌曲队列中导航
- Enter 确认当前操作
- Escape 关闭弹窗
## 5步向导流程(保持现有逻辑)
| 步骤 | 名称 | 功能 | 可操作 |
|------|------|------|--------|
| 1 | 选择歌曲 | 从异常队列选择歌曲 | 点击选中 |
| 2 | 试听确认 | 播放音频确认文件正确 | 播放/暂停 |
| 3 | 推荐匹配 | 查看元数据候选列表 | 选择候选/确认 |
| 4 | 手动编辑 | 编辑元数据字段 | 修改字段值 |
| 5 | 入库确认 | 确认目标路径并入库 | 预览/执行 |
步骤可自由前进后退(已确认的操作不丢失)。
## 兼容性
### 保留功能
- 高级列表视图模式(通过右上角切换入口)
- 批量操作(在高级列表模式下)
- 所有现有 API 端点不变
- 所有现有异常类型和操作动作
### 浏览器支持
- Chrome, Firefox, Safari, Edge 最近 2 个主版本
- 不需要 IE 支持
## 非目标(不在本次范围)
- 后端 API 修改
- 新增异常类型
- 新增修复操作类型
- 国际化(i18n
- 移动端适配(保持桌面端优先,响应式布局兜底)
## 实现顺序
1. **Phase 1**: 提取自定义 hooks(纯逻辑层,不改变 UI)
2. **Phase 2**: 拆分步骤组件(保持原有 5 步逻辑)
3. **Phase 3**: 重构 ExceptionPage 容器(集成 hooks + 组件)
4. **Phase 4**: 应用深色专业主题样式
5. **Phase 5**: 添加过渡动画和微交互
6. **Phase 6**: 更新高级列表视图样式
7. **Phase 7**: 测试与验证
每个 Phase 完成后进行功能验证,确保不引入回归。