# Day 17 - 前端重构与体验优化

## 🧩 前端 UI 拆分 (09:10)

### 内容
- 首页 `page.tsx` 拆分为独立 UI 组件，状态与逻辑仍集中在页面
- 新增首页组件目录 `frontend/src/features/home/ui/`

### 组件列表
- `HomeHeader`
- `MaterialSelector`
- `ScriptEditor`
- `TitleSubtitlePanel`
- `VoiceSelector`
- `RefAudioPanel`
- `BgmPanel`
- `GenerateActionBar`
- `PreviewPanel`
- `HistoryList`

---

## 🧰 前端通用工具抽取 (09:30)

### 内容
- 抽取 API Base / 资源 URL / 日期格式化等通用工具
- 首页与发布页统一调用，消除重复逻辑

### 涉及文件
- `frontend/src/shared/lib/media.ts`
- `frontend/src/app/page.tsx`
- `frontend/src/app/publish/page.tsx`

---

## 📝 前端规范更新 (09:40)

### 内容
- 更新 `FRONTEND_DEV.md` 以匹配最新目录结构
- 新增 `media.ts` 使用规范与示例
- 增加组件拆分规范与页面 checklist

### 涉及文件
- `Docs/FRONTEND_DEV.md`

---

## 🎨 交互体验与视图优化 (10:00)

### 标题/字幕预览
- 标题/字幕预览按素材分辨率缩放，字号更接近成片
- 标题/字幕样式选择持久化，刷新不回默认
- 默认样式更新：标题 90px 站酷快乐体，字幕 60px 经典黄字 + DingTalkJinBuTi

### 发布页优化
- 选择作品改为卡片列表 + 搜索 + 预览弹窗

---

## ⚡ 性能微优化 (10:30)

### 内容
- 列表渲染启用 `content-visibility`（素材/历史/参考音频/发布作品），BGM 列表保留滚动定位
- 首屏数据请求并行化（`Promise.allSettled`）
- localStorage 写入防抖（文本/标题/BGM 音量/发布表单）

---

## 🖼️ 预览弹窗增强 (11:10)

### 内容
- 预览弹窗统一为可复用组件，支持标题与提示
- 发布页预览与素材预览共享弹窗样式
- 弹窗头部样式统一（图标 + 标题 + 关闭按钮）

### 涉及文件
- `frontend/src/components/VideoPreviewModal.tsx`
- `frontend/src/app/page.tsx`
- `frontend/src/app/publish/page.tsx`

---

## 🧭 术语统一 (11:20)

### 内容
- “视频预览” → “作品预览”
- “历史视频” → “历史作品”
- “选择要发布的视频” → “选择要发布的作品”
- “选择素材视频” → “视频素材”
- “选择配音方式” → “配音方式”

---

## 🧱 Phase 2 Hook 抽取 (11:45)

### 内容
- `useTitleSubtitleStyles`：标题/字幕样式获取与默认选择逻辑
- `useMaterials`：素材列表/上传/删除逻辑抽取
- `useRefAudios`：参考音频列表/上传/删除逻辑抽取
- `useBgm`：背景音乐列表与加载状态抽取
- `useMediaPlayers`：音频试听逻辑集中管理（参考音频/背景音乐）
- `useGeneratedVideos`：历史作品列表获取 + 选择逻辑抽取

### 涉及文件
- `frontend/src/features/home/model/useTitleSubtitleStyles.ts`
- `frontend/src/features/home/model/useMaterials.ts`
- `frontend/src/features/home/model/useRefAudios.ts`
- `frontend/src/features/home/model/useBgm.ts`
- `frontend/src/features/home/model/useMediaPlayers.ts`
- `frontend/src/features/home/model/useGeneratedVideos.ts`
- `frontend/src/app/page.tsx`

---

## 🧩 首页持久化修复 (12:20)

### 内容
- 接入 `useHomePersistence`，补齐 `isRestored` 恢复/保存逻辑
- 修复首页刷新后选择项恢复链路，`npm run build` 通过

### 涉及文件
- `frontend/src/app/page.tsx`
- `frontend/src/features/home/model/useHomePersistence.ts`

---

## 🧩 发布预览与播放修复 (14:10)

### 内容
- 发布页作品预览兼容签名 URL 与相对路径
- 参考音频试听统一走 `resolveMediaUrl`
- 素材/BGM 选择在列表变化时自动回退有效项
- 录音预览 URL 回收、预览弹窗滚动状态恢复、全局任务提示挂载

### 涉及文件
- `frontend/src/app/publish/page.tsx`
- `frontend/src/features/home/model/useMediaPlayers.ts`
- `frontend/src/features/home/model/useBgm.ts`
- `frontend/src/features/home/model/useMaterials.ts`
- `frontend/src/features/home/ui/RefAudioPanel.tsx`
- `frontend/src/components/VideoPreviewModal.tsx`
- `frontend/src/app/layout.tsx`

---

## 🧩 标题同步与长度限制 (15:30)

### 内容
- 片头标题修改同步写入发布信息标题
- 标题输入兼容中文输入法，限制 15 字（发布信息同规则）

### 涉及文件
- `frontend/src/features/home/model/useHomeController.ts`
- `frontend/src/features/home/ui/TitleSubtitlePanel.tsx`
- `frontend/src/features/publish/model/usePublishController.ts`

---

## 🧱 轻量 FSD 迁移 (16:20)

### 内容
- 页面瘦身：`app` 仅保留入口组件，业务逻辑集中到 Controller Hook
- 引入 `features/*` 分层：UI 与 model 分离，Home/Publish 按功能聚合
- 通用能力下沉到 `shared/*`（lib/hooks/api）

### 涉及文件
- `frontend/src/features/home/ui/HomePage.tsx`
- `frontend/src/features/home/model/useHomeController.ts`
- `frontend/src/features/publish/ui/PublishPage.tsx`
- `frontend/src/features/publish/model/usePublishController.ts`
- `frontend/src/shared/lib/media.ts`
- `frontend/src/shared/lib/title.ts`
- `frontend/src/shared/api/axios.ts`
- `frontend/src/shared/hooks/useTitleInput.ts`
- `frontend/src/app/page.tsx`
- `frontend/src/app/publish/page.tsx`
