be3c086975
- 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>
5.1 KiB
5.1 KiB
SettingsPage 重构 — 设计规格
创建日期: 2026-05-08 状态: 设计中
概述
将 SettingsPage.jsx 从 ~700 行单体组件重构为 8 个聚焦组件 + 1 个自定义 hook 的模块化架构,继承深色专业主题风格。
核心痛点
- 所有配置节(路径/调度/通知/元数据服务)内联渲染
- 导出/导入对话框逻辑(~150 行)耦合在页面组件中
- 调度 cron 解析逻辑(~140 行工具函数)占据文件头部
- Toast 通知、元数据连通性检测、网络状态管理混杂在一处
设计决策
| 维度 | 决策 |
|---|---|
| 视觉风格 | 继承深色专业主题(indigo/slate) |
| 组件拆分 | 5 个配置节组件 + 2 个对话框组件 + 1 个服务状态组件 |
| 状态管理 | useSettingsForm hook 封装 localConfig、调度更新逻辑 |
| 后端改动 | 无需改动 |
组件架构
src/
├── pages/
│ └── SettingsPage.jsx # ~100行容器
├── components/settings/
│ ├── CorePathsSection.jsx # 核心目录配置(输入/输出/回收站)
│ ├── ScheduleSection.jsx # 定时调度配置(每日/每周/Cron)
│ ├── AdvancedStrategySection.jsx # 高级策略(元数据回退、素材下载等)
│ ├── NotificationSection.jsx # 通知配置(钉钉/Telegram/邮件)
│ ├── MetadataServicesSection.jsx # 元数据服务配置(8个provider)
│ ├── ConfigExportDialog.jsx # 配置导出对话框
│ ├── ConfigImportDialog.jsx # 配置导入对话框
│ └── ServiceStatusBadge.jsx # 服务连通性状态徽章
├── hooks/
│ └── useSettingsForm.js # 配置表单状态 + 调度更新 + 导出/导入
└── utils/
└── schedule.js # 调度工具函数(从 SettingsPage 头部抽取)
组件职责
SettingsPage — 页面容器(~100行)
- 通过 useSettingsForm hook 管理配置状态
- 渲染 5 个配置节组件 + 2 个对话框
- 不包含任何配置渲染细节
CorePathsSection — 核心目录配置
- Props: input, output, trash, onUpdate
- 三个文本输入字段(输入目录/输出目录/回收站)
ScheduleSection — 定时调度配置
- Props: schedule, onUpdate
- 三种调度类型选择(每日/每周/Cron)+ 时间选择 + 星期选择
AdvancedStrategySection — 高级策略配置
- Props: advancedStrategy, onUpdate
- 元数据回退、素材下载等开关
NotificationSection — 通知配置
- Props: notifications, onUpdate
- 钉钉 Webhook/Secret、Telegram Bot Token/ChatID、Email SMTP 配置
MetadataServicesSection — 元数据服务配置
- Props: metadata, netStatus, onUpdate
- 8 个元数据 provider 的 URL/Key 配置 + 连通性状态徽章
ConfigExportDialog — 导出对话框
- Props: isOpen, isExporting, password, passwordConfirm, onClose, onExport, onPasswordChange
- 密码确认 + 导出按钮
ConfigImportDialog — 导入对话框(多阶段:解密密码 → 确认 → 保存)
- Props: importDialog state, onClose, onDecrypt, onConfirm
- 文件选择 → 密码输入 → 配置预览确认
ServiceStatusBadge — 服务状态徽章
- Props: status, latencyMs, message
- 探测中/在线/警告/离线/未检测 五种状态
自定义 Hook
useSettingsForm
- 封装 localConfig 状态管理
- 调度类型/时间/日期/Cron 更新函数
- 保存/导出/导入/网络检测逻辑
- Toast 通知状态
- 返回 { localConfig, netStatus, toast, isSaving, updateField, updateSchedule, handleSave, handleExport, handleImport, ... }
数据流
SettingsPage (顶层 ~100行)
│
├─ useSettingsForm() ──→ localConfig, updateField, updateSchedule, handleSave...
│
├─ CorePathsSection ← config.input/output/trash
├─ ScheduleSection ← config.schedule
├─ AdvancedStrategySection ← config.advancedStrategy
├─ NotificationSection ← config.notifications
├─ MetadataServicesSection ← config.metadata + netStatus
├─ ConfigExportDialog ← exportState, onClose, onExport
└─ ConfigImportDialog ← importState, onDecrypt, onConfirm
工具函数抽取
scheduler.js 从 SettingsPage 头部(1-142 行)抽取:
normalizeSchedule,getScheduleSummarybuildDailyCron,buildWeeklyCronformatTimeFromCron,padCronSegmentformatBackupTimestamp
兼容性
- 保留所有现有功能不变
saveConfigAPI 调用格式不变fetchMetadataStatusAPI 调用不变handleSave同时更新父组件 config 和 taskState
非目标(不在本次范围)
- 后端 API 修改
- 新增配置项
- LibraryPage / HistoryPage / MissingTagsInlinePanel 优化(后续单独处理)
实现顺序
- Phase 1: 抽取调度工具函数到
utils/schedule.js - Phase 2: 创建
useSettingsFormhook - Phase 3: 创建 5 个配置节组件
- Phase 4: 创建 2 个对话框组件 + ServiceStatusBadge
- Phase 5: 重写 SettingsPage 为轻量容器
- Phase 6: 构建验证