# AI有声书 v2 - 用户体验优化开发计划
> 基于 2026-05-07 全面页面审查制定
> 当前状态:feature_list.json 中 38 个功能已全部完成
---
## 一、优化原则
1. **不改动核心业务逻辑**:不重构已完成的 38 个功能
2. **前端优先**:多数优化集中在前端代码修改
3. **增量实施**:每次只改 1 个页面/模块,不改总体结构
4. **极简改动**:优先用 CSS/交互优化,避免大改 Vue 组件
---
## 二、优化项目总览
| 优先级 | 编号 | 名称 | 涉及页面 | 预估工时 |
|--------|------|------|----------|---------|
| **P0** | OPT-01 | 书籍列表操作按钮合并 → 下拉菜单 | book-generator/index.vue | 3h |
| **P0** | OPT-02 | 音频/视频生成轮询超时修复(30s→无超时) | book-generator/index.vue, chapter-detail.vue | 2h |
| **P0** | OPT-03 | 首页增加"最近收听"模块 | index/index.vue | 3h |
| **P1** | OPT-04 | 创建书籍增加"简洁模式" | book-generator/create.vue | 4h |
| **P1** | OPT-05 | 播放器增加睡眠定时器 | player/index.vue | 2h |
| **P1** | OPT-06 | 全局骨架屏覆盖 | 所有列表页 | 3h |
| **P1** | OPT-07 | 生成按钮固定底部(减少滚动) | create/index.vue | 1h |
| **P1** | OPT-08 | 书籍一键"完整生成"流程 | book-generator/detail.vue | 4h |
| **P2** | OPT-09 | 首页卡片封面升级(文字海报) | index/index.vue | 2h |
| **P2** | OPT-10 | 章节详情页手势滑动切换 | chapter-detail.vue | 2h |
| **P2** | OPT-11 | "我的"页面增加动态内容卡片 | mine/index.vue | 2h |
| **P2** | OPT-12 | "意见反馈"独立页面 | mine/index.vue + 新页面 | 2h |
| **P2** | OPT-13 | 会员中心套餐选中态动画 | member/index.vue | 1h |
| **P2** | OPT-14 | 加载状态过渡动画(全局) | 全局 CSS 微调 | 1.5h |
| **P3** | OPT-15 | 搜索页增加热门搜索词缓存 | search/index.vue | 1h |
| **P3** | OPT-16 | Tab 页面返回按钮修复 | book-generator/index.vue | 0.5h |
| **P3** | OPT-17 | 播放器歌词时间轴真实化 | player/index.vue + 后端 | 3h |
| **P3** | OPT-18 | 操作确认弹窗(防误触) | book-generator/detail.vue + chapter-detail.vue | 1.5h |
---
## 三、详细实施方案
### P0 - 必须优化(核心体验问题)
---
#### OPT-01:书籍列表操作按钮合并
**问题**:每本书下方 5 个操作按钮(生成全部音频/合并音频/合并视频/生成全部视频/公开),信息过载,视觉压力大。
**方案**:
1. 将 5 个按钮合并为 2 个主要按钮 + 1 个"更多"下拉菜单
2. 主按钮:`生成内容`(根据状态自动显示:生成音频/继续生成/已完成),`公开/取消公开`
3. 更多菜单:合并音频、合并视频、生成全部视频
4. 根据状态动态显隐:音频未完成时不显示视频相关按钮
**修改文件**:`my-uniapp-vue3/src/pages/book-generator/index.vue`
**核心修改**:
```html
```
---
#### OPT-02:轮询超时修复
**问题**:音频/视频生成轮询有 30 秒超时,长音频生成远超 30 秒。
**方案**:
1. 移除 `setTimeout` 超时逻辑
2. 改为 **WebSocket 推送**(推荐)或背靠背轮询(无超时限制)
3. 用户离开页面后自动停止轮询
**后端新增**:WebSocket 事件 `audio_generation_complete`、`video_generation_complete`
**修改文件**:
- `my-uniapp-vue3/src/pages/book-generator/index.vue`
- `my-uniapp-vue3/src/pages/book-generator/chapter-detail.vue`
- `server/src/modules/book-generator/book-generator.store.ts`
```typescript
// 旧代码(有30s超时):
setTimeout(() => { clearAudioPollTimer(book.id); ... }, 30000);
// 新代码(无超时,页面卸载时清理):
onUnmounted(() => { clearAudioPollTimer(book.id); });
```
---
#### OPT-03:首页增加"最近收听"模块
**问题**:首页仅展示公开书籍,新用户看不到自己的内容,没有个性化。
**方案**:
1. 页面分为两部分:上部分"最近收听"(水平滚动卡片),下部分"热门推荐"(现有公开书籍列表)
2. "最近收听"数据来源:从 `player/progress` API 获取用户最近的播放记录
3. 未登录时只显示"热门推荐"
**修改文件**:`my-uniapp-vue3/src/pages/index/index.vue`
```html
最近收听
...
{{ item.title }}
{{ formatProgress(item.progress) }}
```
---
### P1 - 重要优化
---
#### OPT-04:创建书籍简洁模式
**问题**:创建表单有 12+ 参数(书名/副标题/描述/6 个模板/难度/人群/风格/领域/特殊要求/规模),对新手不友好。
**方案**:
1. 增加"随填写随推断"机制:填写书名+描述后,AI 自动推荐难度/人群/风格/领域
2. 表单默认只显示:书名、描述、规模、难度(4 个必填项)
3. 其他参数折叠到"高级选项",点击展开
4. 模板选择改为"智能推荐"按钮:点击后 AI 根据书名+描述推荐最适合的模板
**修改文件**:`my-uniapp-vue3/src/pages/book-generator/create.vue`
---
#### OPT-05:睡眠定时器
**问题**:播放器缺少睡眠定时功能,这是所有音频类 App 的标配。
**方案**:
1. 播放器页面增加睡眠定时按钮(闹钟图标)
2. 选项:15分钟 / 30分钟 / 60分钟 / 当前播放结束
3. 倒计时显示在播放器顶部
4. 时间到自动暂停播放 + 保存当前进度
**修改文件**:`my-uniapp-vue3/src/pages/player/index.vue`(后端无需修改)
```typescript
const sleepTimer = ref<{ remaining: number; total: number } | null>(null);
let sleepTimerInterval: ReturnType | null = null;
function startSleepTimer(minutes: number) {
sleepTimer.value = { remaining: minutes * 60, total: minutes * 60 };
sleepTimerInterval = setInterval(() => {
if (sleepTimer.value) {
sleepTimer.value.remaining--;
if (sleepTimer.value.remaining <= 0) {
clearInterval(sleepTimerInterval!);
audioStore.pause();
sleepTimer.value = null;
uni.showToast({ title: '睡眠定时已到,自动暂停', icon: 'none' });
}
}
}, 1000);
}
```
---
#### OPT-06:全局骨架屏覆盖
**问题**:目前仅首页有骨架屏,其他列表页(历史记录、书籍列表、专辑列表等)是空白→内容的突变。
**方案**:
1. 创建通用骨架屏组件 `SkeletonList.vue`:支持行数/列数/卡片类型配置
2. 在以下页面集成:history/index.vue,album/index.vue,albums/index.vue,search/index.vue
3. 使用现有 Skeleton.vue 组件扩展
**修改文件**:
- `my-uniapp-vue3/src/components/Skeleton.vue`(增强)
- `my-uniapp-vue3/src/pages/history/index.vue`
- `my-uniapp-vue3/src/pages/album/index.vue`
- `my-uniapp-vue3/src/pages/albums/index.vue`
---
#### OPT-07:生成按钮固定底部
**问题**:create 页面很长,用户输入文本后要滚动到底部再点生成,体验差。
**方案**:
1. 将"生成音频"按钮改为 `position: fixed; bottom: 0;` 固定定位
2. 内容区增加对应的底部 padding 避免被遮挡
3. 生成按钮增加不透明度过渡(没文本时半透明不可点,有文本时完全显示)
**修改文件**:`my-uniapp-vue3/src/pages/create/index.vue`
---
#### OPT-08:书籍一键"完整生成"
**问题**:当前流程:创建→开始生成→生成全部音频→合并音频→生成全部视频→合并视频→公开,需要用户手动操作 6 步。
**方案**:
1. 在书籍详情页增加"一键完整生成"按钮
2. 点击后自动按序执行:内容生成 → 等待完成 → 生成全部音频 → 等待完成 → 合并音频 → 生成全部视频 → 等待完成 → 合并视频
3. 进度通过 WebSocket/轮询实时展示
4. 用户可随时取消,已完成的步骤保留
**后端新增**:`POST /api/book-generator/batch-generate`(编排整个流程)
**修改文件**:
- `my-uniapp-vue3/src/pages/book-generator/detail.vue`
- `my-uniapp-vue3/src/utils/book-generator-api.ts`
- `server/src/modules/book-generator/book-generator.controller.ts`
---
### P2 - 体验提升
---
#### OPT-09:首页卡片封面升级
**问题**:当前封面是纯色渐变色 + 📖 emoji,视觉单调。
**方案**:
1. 利用书籍标题首字母/关键词生成文字海报(类似 Apple Books 风格)
2. 文字海报:标题首字母特大+半透明,书名小字,渐变色背景
3. 纯 CSS 实现(文字渲染 + 渐变背景),无需额外资源
**修改文件**:`my-uniapp-vue3/src/pages/index/index.vue`
---
#### OPT-10:章节详情页手势切换
**问题**:阅读章节内容后,需要点击"下一章"按钮才能继续,不够流畅。
**方案**:
1. 在章节详情页增加左滑/右滑手势事件
2. 左滑 → 下一章,右滑 → 上一章
3. 切换时增加横向滑动动画过渡
4. 利用 `@touchstart` / `@touchmove` / `@touchend` 事件
**修改文件**:`my-uniapp-vue3/src/pages/book-generator/chapter-detail.vue`
---
#### OPT-11:"我的"页面增加动态内容
**问题**:当前是纯静态菜单列表,缺乏活力和个性化。
**方案**:
1. 在菜单上方增加"今日创作概况"卡片:今日生成音频数/书籍数/使用额度
2. 增加"最近的创作":最近 3 条生成记录预览(可点击跳转)
3. 非会员用户显示"升级会员"推广卡片
**修改文件**:`my-uniapp-vue3/src/pages/mine/index.vue`
---
#### OPT-12:意见反馈独立页面
**问题**:当前用 `uni.showModal` 显示反馈联系方式,交互简陋。
**方案**:
1. 新建 `pages/feedback/index.vue` 页面
2. 表单字段:反馈类型(功能建议/Bug 报告/其他)、标题、详细描述、联系方式
3. 支持截图上传
4. 提交后保存到服务器
**新增文件**:
- `my-uniapp-vue3/src/pages/feedback/index.vue`
- `my-uniapp-vue3/src/pages.json`(添加路由)
- 后端 `/api/feedback` API
---
#### OPT-13:会员套餐选中态动画
**问题**:套餐选中后仅有边框颜色变化,视觉反馈不够明显。
**方案**:
1. 选中时增加缩放(scale: 1.02)和阴影增强动画
2. 选中标记(✓)从中心放大出现的动画
3. CSS transition 即可实现,无需 JS
**修改文件**:`my-uniapp-vue3/src/pages/member/index.vue`
---
#### OPT-14:全局过渡动画
**问题**:页面切换、列表项加载、状态变化缺少微动效。
**方案**:
1. 页面切换:增加 `uni.navigateTo` 的默认滑动动画
2. 列表项:使用 `transition-group` 或 CSS animation 实现列表项逐行入场
3. 按钮:增加 `:active` 缩放到 0.96 的反馈
**修改文件**:`my-uniapp-vue3/src/App.vue`(全局 CSS)+ 各组件
---
### P3 - 锦上添花
| 编号 | 名称 | 说明 | 工时 |
|------|------|------|------|
| OPT-15 | 搜索热词缓存 | 搜索结果展示同时,本地缓存热门搜索词提升性能 | 1h |
| OPT-16 | Tab 页面返回按钮修复 | book-generator/index.vue 作为 Tab 页不应显示返回按钮 | 0.5h |
| OPT-17 | 歌词时间轴真实化 | 后端在生成音频时返回真实时间戳,替代前端字数估算 | 3h |
| OPT-18 | 操作确认弹窗 | 批量删除、生成全部等操作前弹出确认 | 1.5h |
---
## 四、实施路线图
### 第一阶段:P0 紧急修复(预计 8h)
```
Day 1: OPT-02(轮询超时修复,2h)
Day 2: OPT-01(操作按钮合并,3h)
Day 3: OPT-03(首页最近收听,3h)
```
### 第二阶段:P1 重要优化(预计 14h)
```
Day 4-5: OPT-04(创建书籍简洁模式,4h)
Day 5: OPT-05(睡眠定时器,2h)
Day 6: OPT-06(全局骨架屏,3h)
Day 6: OPT-07(生成按钮固定,1h)
Day 7-8: OPT-08(一键完整生成,4h)
```
### 第三阶段:P2 体验提升(预计 8.5h)
```
Day 9: OPT-09(封面升级,2h)+ OPT-14(全局动画,1.5h)
Day 9-10: OPT-10(手势切换,2h)+ OPT-13(套餐动画,1h)
Day 10: OPT-11(我的页面动态卡片,2h)+ OPT-12(反馈页面,2h)
```
### 第四阶段:P3 锦上添花(预计 6h)
```
Day 11: OPT-15(热词缓存)+ OPT-16(返回按钮)+ OPT-17(歌词)+ OPT-18(确认弹窗)
```
---
## 五、后端配套变更摘要
| 优化项 | 后端变更 |
|--------|---------|
| OPT-02 | WebSocket 推送生成完成事件 |
| OPT-03 | 提供用户最近播放记录 API |
| OPT-08 | `POST /api/book-generator/batch-generate` 编排接口 |
| OPT-12 | `POST /api/feedback` 反馈提交接口 |
| OPT-17 | TTS 生成时返回 LRC 格式时间戳 |
---
## 六、不涉及的范围(本次优化不做)
1. 数据库表结构重构
2. 整套 UI 框架替换(如升级到 uni-ui 新版)
3. 后端微服务化/架构改造
4. 用户权限/认证体系改动
5. 国际化/多语言支持
6. 性能压测/CDN 部署
---
## 七、验收标准
每个优化完成后,确认:
- [ ] 页面正常加载无报错
- [ ] 原有功能不受影响
- [ ] 优化项按预期生效
- [ ] 新元素适配夜间模式(如适用)
- [ ] H5 + 小程序两端兼容