本文引用的文件
本文件面向“AI有声书生成平台”的前端组件开发,聚焦于通用组件的设计与实现,包括迷你播放器、懒加载图片、骨架屏与骨架屏列表、音频下载按钮等。文档系统性阐述组件属性传递、事件处理与插槽使用最佳实践,给出组件复用策略、性能优化技巧与跨平台兼容性处理方案,并提供UI组件库集成思路、样式管理与主题定制方法,以及组件测试、文档与版本管理策略。
项目采用基于页面与功能模块的组织方式,组件集中放置在 src/components 目录,页面位于 src/pages,状态管理使用 Pinia,网络请求封装在 src/utils/request.ts,类型定义位于 src/types/index.ts,全局样式与主题变量位于 src/App.vue。
graph TB
subgraph "组件层"
MP["MiniPlayer.vue"]
LI["LazyImage.vue"]
SK["Skeleton.vue"]
SL["SkeletonList.vue"]
AD["AudioDownload.vue"]
end
subgraph "页面层"
PLY["pages/player/index.vue"]
ALB["pages/albums/index.vue"]
SEA["pages/search/index.vue"]
end
subgraph "状态与工具"
ASTORE["store/audio.ts"]
REQ["utils/request.ts"]
CFG["utils/config.ts"]
TYPES["types/index.ts"]
end
subgraph "应用入口与构建"
APP["App.vue"]
PKG["package.json"]
VITE["vite.config.ts"]
end
PLY --> MP
PLY --> AD
ALB --> SL
SEA --> SL
MP --> ASTORE
AD --> REQ
PLY --> REQ
ALB --> REQ
SEA --> REQ
REQ --> CFG
APP --> ASTORE
APP --> TYPES
PKG --> VITE
图表来源
章节来源
本节对通用组件进行要点梳理,便于快速理解与复用。
迷你播放器(MiniPlayer)
懒加载图片(LazyImage)
骨架屏(Skeleton)
骨架屏列表(SkeletonList)
音频下载(AudioDownload)
章节来源
组件与页面、状态管理、网络请求之间的交互关系如下:
sequenceDiagram
participant Page as "页面"
participant Comp as "组件"
participant Store as "音频Store"
participant Net as "网络请求"
participant API as "后端API"
Page->>Comp : 传递属性/绑定事件
Comp->>Store : 调用播放/切歌/设置播放列表
Store->>Net : 发起请求如获取专辑/播放列表
Net->>API : 发送HTTP请求
API-->>Net : 返回数据
Net-->>Store : 解析响应
Store-->>Page : 更新状态播放状态/时长/列表
Page-->>Comp : 响应状态变化计算属性
图表来源
性能与兼容
在各平台路由 API 下保持兼容。
flowchart TD
Start(["进入页面"]) --> GetRoute["获取当前路由"]
GetRoute --> IsPlayer{"是否在播放页?"}
IsPlayer --> |是| Hide["不显示迷你播放器"]
IsPlayer --> |否| HasAudio{"是否有当前音频?"}
HasAudio --> |否| Hide
HasAudio --> |是| Show["显示迷你播放器"]
Show --> ClickCover["点击封面跳转播放页"]
Show --> ClickPlay["点击播放/暂停"]
Show --> ClickNext["点击下一首"]
图表来源
章节来源
性能与兼容
在各平台 uni.image 下保持兼容。
flowchart TD
Init["初始化 props"] --> WatchSrc["监听 src 变化"]
WatchSrc --> Lazy{"lazyLoad 为真?"}
Lazy --> |是| SetReal["设置 realSrc 以触发懒加载"]
Lazy --> |否| SetDirect["直接设置 realSrc"]
SetReal --> OnLoad["图片加载完成"]
SetDirect --> OnLoad
OnLoad --> EmitLoad["触发 load 事件"]
OnLoad --> FadeIn["淡入显示"]
OnError["加载失败"] --> EmitError["触发 error 事件"]
OnClick["点击"] --> EmitClick["触发 click 事件"]
图表来源
章节来源
章节来源
章节来源
性能与兼容
在各平台 uni.downloadFile/uni.saveFile 下保持兼容。
sequenceDiagram
participant User as "用户"
participant Btn as "AudioDownload"
participant Uni as "uni.downloadFile"
participant Save as "uni.saveFile"
User->>Btn : 点击下载
Btn->>Btn : 标记下载中/重置进度
Btn->>Uni : 发起下载
Uni-->>Btn : onProgressUpdate(进度)
Btn->>Btn : 更新进度
Uni-->>Btn : 成功/失败回调
alt 成功
Btn->>Save : 保存到本地
Save-->>Btn : 保存成功
Btn-->>User : 提示成功
else 失败
Btn-->>User : 提示失败
end
图表来源
章节来源
构建与运行
Vite 代理配置支持本地联调;多平台脚本由 package.json 统一管理。
graph LR
PLY["pages/player/index.vue"] --> MP["MiniPlayer.vue"]
PLY --> AD["AudioDownload.vue"]
ALB["pages/albums/index.vue"] --> SL["SkeletonList.vue"]
SEA["pages/search/index.vue"] --> SL
MP --> ASTORE["store/audio.ts"]
PLY --> ASTORE
PLY --> REQ["utils/request.ts"]
ALB --> REQ
SEA --> REQ
REQ --> CFG["utils/config.ts"]
APP["App.vue"] --> ASTORE
APP --> TYPES["types/index.ts"]
图表来源
章节来源
章节来源
章节来源
本组件库围绕“可复用、低耦合、高性能”展开,通过统一的状态与网络层抽象,使页面与组件职责清晰。建议在后续迭代中:
章节来源
章节来源
章节来源
章节来源