优化开发计划.md 14 KB

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

核心修改

<!-- 旧:5个独立按钮 -->
<!-- 新:2个主导按钮 + 1个ActionSheet -->
<view class="book-actions">
  <button class="primary-btn" @click="handlePrimaryAction(book)">
    {{ getPrimaryActionText(book) }}
  </button>
  <button class="publish-btn" @click="handleTogglePublish(book)">
    {{ book.isPublished ? '🔒 已公开' : '🌐 公开' }}
  </button>
  <button class="more-btn" @click="showMoreActions(book)">···</button>
</view>
<!-- 更多操作 ActionSheet -->
<uni-action-sheet v-if="showSheet" :visible="showSheet" @click="handleSheetAction" />

OPT-02:轮询超时修复

问题:音频/视频生成轮询有 30 秒超时,长音频生成远超 30 秒。

方案

  1. 移除 setTimeout 超时逻辑
  2. 改为 WebSocket 推送(推荐)或背靠背轮询(无超时限制)
  3. 用户离开页面后自动停止轮询

后端新增:WebSocket 事件 audio_generation_completevideo_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

    // 旧代码(有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

<!-- 新增最近收听区域 -->
<view v-if="isLoggedIn && recentAudios.length > 0" class="recent-section">
  <text class="section-title">最近收听</text>
  <scroll-view scroll-x class="recent-scroll">
    <view v-for="item in recentAudios" :key="item.id" class="recent-card">
      <view class="recent-cover">...</view>
      <text class="recent-title">{{ item.title }}</text>
      <text class="recent-progress">{{ formatProgress(item.progress) }}</text>
    </view>
  </scroll-view>
</view>

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(后端无需修改)

const sleepTimer = ref<{ remaining: number; total: number } | null>(null);
let sleepTimerInterval: ReturnType<typeof setInterval> | 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 + 小程序两端兼容