本文引用的文件
本文件面向“音频播放器”功能,系统性梳理前端播放器组件设计、状态管理、与后端服务的交互机制,以及播放控制、播放列表管理、状态同步与持久化、性能优化与集成 API。目标是帮助开发者快速理解并扩展播放器能力,覆盖播放/暂停、进度拖拽、倍速播放、循环播放、章节导航、历史记录、断点续播等关键特性。
播放器相关的核心代码分布在前端 uni-app 项目与后端 Koa 服务之间:
后端
应用入口:注册路由与静态资源服务
graph TB
subgraph "前端 uni-app"
P["播放器页面<br/>pages/player/index.vue"]
S["播放器状态仓库<br/>store/audio.ts"]
M["迷你播放器<br/>components/MiniPlayer.vue"]
T["类型定义<br/>types/index.ts"]
end
subgraph "后端 Koa"
PC["播放器控制器<br/>modules/player/player.controller.ts"]
PS["播放器服务<br/>modules/player/player.service.ts"]
HC["历史控制器<br/>modules/history/history.controller.ts"]
HBC["历史批量控制器<br/>modules/history/history-batch.controller.ts"]
APP["应用入口<br/>app.ts"]
end
P --> |"调用/读取"| S
P --> |"调用"| PC
S --> |"调用"| PS
P --> |"读取"| T
M --> |"读取"| S
PC --> |"读取/写入"| PS
HC --> |"读取/写入"| PS
HBC --> |"读取/写入"| PS
APP --> |"注册路由"| PC
APP --> |"注册路由"| HC
APP --> |"注册路由"| HBC
图表来源
章节来源
章节来源
播放器采用“前端状态仓库 + 后端播放器服务”的分层架构:
应用入口统一注册路由,静态资源服务暴露上传目录
sequenceDiagram
participant UI as "播放器页面"
participant Store as "状态仓库"
participant Ctrl as "播放器控制器"
participant Svc as "播放器服务"
participant DB as "数据库"
UI->>Store : "播放/暂停/跳转/倍速/列表设置"
Store->>Ctrl : "保存/查询播放进度"
Ctrl->>Svc : "savePlayProgress/getPlayProgress"
Svc->>DB : "upsert/update/findMany"
DB-->>Svc : "记录"
Svc-->>Ctrl : "记录"
Ctrl-->>Store : "响应"
Store-->>UI : "状态更新"
图表来源
列表与章节
若无专辑信息,回退到通用播放列表
flowchart TD
Start(["进入播放页"]) --> LoadAudio["获取音频详情"]
LoadAudio --> HasURL{"有音频URL?"}
HasURL --> |否| Empty["提示未生成音频"]
HasURL --> |是| FetchList["获取播放列表"]
FetchList --> BuildList["构建章节播放列表"]
BuildList --> Lyrics["解析/生成歌词时间轴"]
Lyrics --> Play["初始化音频上下文并播放"]
Play --> UI["渲染UI与交互"]
UI --> Controls{"用户操作"}
Controls --> |播放/暂停| Toggle["切换播放状态"]
Controls --> |进度拖拽| Seek["seek() 更新时间"]
Controls --> |倍速| Rate["setPlayRate()"]
Controls --> |模式| Mode["togglePlayMode()"]
Controls --> |收藏/分享| Fav["PUT /audio/:id/favorite / 分享"]
Controls --> |下一首| Next["playNext()"]
Controls --> |上一首| Prev["playPrev()"]
Controls --> |睡眠定时| Sleep["定时暂停"]
Toggle --> UI
Seek --> UI
Rate --> UI
Mode --> UI
Fav --> UI
Next --> UI
Prev --> UI
Sleep --> UI
图表来源
章节来源
循环播放
顺序/列表循环/单曲循环/随机播放模式切换与处理逻辑
sequenceDiagram
participant Page as "播放器页面"
participant Store as "状态仓库"
participant Ctx as "音频上下文"
Page->>Store : "togglePlay()"
alt 当前播放
Store->>Ctx : "pause()"
else 当前暂停
Store->>Ctx : "play()"
end
Store-->>Page : "isPlaying 更新"
图表来源
章节来源
播放顺序控制
顺序、列表循环、单曲循环、随机播放四种模式
sequenceDiagram
participant Page as "播放器页面"
participant Store as "状态仓库"
participant Ctrl as "播放器控制器"
participant Svc as "播放器服务"
participant DB as "数据库"
Page->>Ctrl : "POST /api/player/progress {audioId, progress, duration}"
Ctrl->>Svc : "savePlayProgress(userId, audioId, progress, duration)"
Svc->>DB : "upsert playRecord"
DB-->>Svc : "记录"
Svc-->>Ctrl : "记录"
Ctrl-->>Page : "保存成功"
图表来源
章节来源
播放进度持久化
前端定时上报进度,后端 upsert 存储,避免丢失
sequenceDiagram
participant Page as "播放器页面"
participant Store as "状态仓库"
participant Ctrl as "播放器控制器"
participant Svc as "播放器服务"
participant DB as "数据库"
loop 播放中
Page->>Store : "onTimeUpdate -> currentTime"
Store->>Ctrl : "上报进度"
Ctrl->>Svc : "updatePlayProgress(userId, audioId, progress, duration?)"
Svc->>DB : "update playRecord"
end
Page->>Ctrl : "GET /api/player/recent"
Ctrl->>Svc : "getRecentPlayRecords(userId, limit)"
Svc->>DB : "findMany playRecord"
DB-->>Svc : "记录列表"
Svc-->>Ctrl : "记录列表"
Ctrl-->>Page : "最近播放"
图表来源
章节来源
章节来源
以上接口由后端控制器与服务实现,前端通过封装的请求工具调用。
章节来源
后端依赖
应用入口统一注册路由与静态资源
graph LR
UI["播放器页面"] --> Store["状态仓库"]
UI --> Types["类型定义"]
Store --> Types
Store --> Svc["播放器服务"]
Svc --> DB["数据库"]
Ctrl["播放器控制器"] --> Svc
Ctrl --> DB
App["应用入口"] --> Ctrl
App --> Static["静态资源 /uploads"]
图表来源
章节来源
[本节为通用指导,无需特定文件引用]
章节来源
本播放器以“前端状态仓库 + 后端播放器服务”为核心,实现了播放控制、播放列表、歌词同步、睡眠定时、收藏分享与进度持久化等关键能力。通过清晰的前后端职责划分与标准 API,具备良好的扩展性与可维护性。建议后续完善多设备状态同步、离线缓存与断点续播体验,并持续优化性能与稳定性。
[本节为总结,无需特定文件引用]
章节来源