本文引用的文件
本文件面向“AI有声书生成平台”的前端团队,系统性梳理基于 uniapp + Vue3 + TypeScript 的前端架构设计与实现要点。内容覆盖页面路由配置、组件层次结构、状态管理模式(Pinia)、跨平台适配策略(H5 与微信小程序)、UI 组件库与样式管理、构建与调试工具、性能优化、API 交互与错误处理、以及用户体验优化策略。目标是帮助开发者快速理解并高效迭代前端能力。
前端工程位于 my-uniapp-vue3 目录,采用 uniapp 多端统一框架,结合 Vite 构建与 TypeScript 类型约束,配合 Pinia 实现状态管理,并通过自研工具链实现跨平台适配与调试。
关键目录与文件
tsconfig.json:TypeScript 编译配置
graph TB
A["应用入口<br/>src/main.ts"] --> B["状态管理<br/>Pinia"]
B --> C["用户状态<br/>src/store/user.ts"]
B --> D["音频播放状态<br/>src/store/audio.ts"]
A --> E["页面路由<br/>src/pages.json"]
A --> F["全局样式与生命周期<br/>src/App.vue"]
A --> G["工具库<br/>src/utils/*"]
G --> H["请求封装<br/>src/utils/request.ts"]
G --> I["平台配置<br/>src/utils/config.ts"]
G --> J["本地存储<br/>src/utils/storage.ts"]
G --> K["调试工具<br/>src/utils/debug.ts"]
A --> L["组件库<br/>src/components/*"]
L --> M["迷你播放器<br/>src/components/MiniPlayer.vue"]
L --> N["懒加载图片<br/>src/components/LazyImage.vue"]
O["构建配置<br/>vite.config.ts"] --> A
P["依赖与脚本<br/>package.json"] --> A
Q["类型定义<br/>src/types/index.ts"] --> H
Q --> C
Q --> D
图表来源
章节来源
章节来源
整体采用“入口初始化 + 路由配置 + 状态管理 + 工具库 + 组件库”的分层架构。多端统一通过 uniapp 抽象,平台差异通过条件编译与运行时判断实现。
graph TB
subgraph "入口与配置"
M1["src/main.ts"]
M2["src/pages.json"]
M3["vite.config.ts"]
M4["package.json"]
M5["tsconfig.json"]
end
subgraph "状态管理"
S1["src/store/user.ts"]
S2["src/store/audio.ts"]
end
subgraph "工具库"
U1["src/utils/request.ts"]
U2["src/utils/config.ts"]
U3["src/utils/storage.ts"]
U4["src/utils/debug.ts"]
end
subgraph "UI 组件"
C1["src/components/MiniPlayer.vue"]
C2["src/components/LazyImage.vue"]
end
subgraph "全局样式与生命周期"
G1["src/App.vue"]
end
M1 --> S1
M1 --> S2
M1 --> U1
M1 --> U2
M1 --> U3
M1 --> U4
M1 --> C1
M1 --> C2
M1 --> G1
M2 --> M1
M3 --> M1
M4 --> M1
M5 --> U1
图表来源
章节来源
音频播放模块
方法:初始化音频上下文、获取音色、生成音频、播放/暂停/切换、上一首/下一首、处理播放模式、跳转、设置播放速率、设置播放列表、销毁上下文
classDiagram
class UserStore {
+token
+userInfo
+memberStatus
+isLoggedIn
+isMember
+initUser()
+login(phone, code)
+sendCode(phone)
+fetchUserInfo()
+fetchMemberStatus()
+logout()
+updateUserInfo(info)
}
class AudioStore {
+voices
+currentAudio
+playlist
+currentIndex
+isPlaying
+currentTime
+duration
+playRate
+playMode
+hasPlaylist
+hasNext
+hasPrev
+initAudioContext()
+fetchVoices()
+generateAudio(text, voiceId, voiceParams)
+play(audio)
+pause()
+resume()
+togglePlay()
+playPrev()
+playNext()
+handlePlayMode()
+togglePlayMode()
+seek(time)
+setPlayRate(rate)
+setPlaylist(list, index, autoPlay)
+destroy()
}
图表来源
章节来源
调试工具
H5 条件引入 vConsole(默认禁用),按需开启
flowchart TD
Start(["进入应用"]) --> Detect["检测运行平台"]
Detect --> IsH5{"是否 H5?"}
IsH5 --> |是| EnvCheck["检查是否为微信小程序模拟器"]
EnvCheck --> |是| UseWeb["使用 Web 域名"]
EnvCheck --> |否| UseH5["使用 H5 相对路径"]
IsH5 --> |否| UseNative["使用原生平台配置"]
UseWeb --> SetBase["设置 API 基础地址"]
UseH5 --> SetBase
UseNative --> SetBase
SetBase --> End(["完成"])
图表来源
章节来源
章节来源
章节来源
完整 URL 拼接
对静态资源(如音频文件)使用后端服务器地址拼接
sequenceDiagram
participant Page as "页面组件"
participant Store as "Pinia Store"
participant Req as "请求封装<br/>request.ts"
participant API as "后端 API"
participant Auth as "鉴权与错误处理"
Page->>Store : 调用方法如 login/generateAudio
Store->>Req : 发起请求(url, options)
Req->>API : uni.request(...)
API-->>Req : 返回 {code|success, data|message}
Req->>Auth : 校验登录态/错误码
alt 登录失效
Auth->>Req : 清理本地存储
Auth->>Page : 跳转登录页
else 正常
Req-->>Store : 返回 data
Store-->>Page : 更新状态
end
图表来源
章节来源
章节来源
组件依赖
LazyImage 为通用展示组件
graph LR
Main["src/main.ts"] --> Pinia["Pinia"]
Main --> User["store/user.ts"]
Main --> Audio["store/audio.ts"]
Main --> Utils["utils/*"]
User --> Req["utils/request.ts"]
User --> Stor["utils/storage.ts"]
Audio --> Req
Audio --> Types["types/index.ts"]
Utils --> Debug["utils/debug.ts"]
Utils --> Cfg["utils/config.ts"]
Mini["components/MiniPlayer.vue"] --> Audio
Lazy["components/LazyImage.vue"] --> Types
图表来源
章节来源
[本节为通用指导,无需列出具体文件来源]
章节来源
该前端架构以 uniapp 为核心,结合 Vue3 + TypeScript + Pinia,形成高内聚、低耦合的多端统一方案。通过完善的工具库(请求、配置、存储、调试)与可复用组件,显著提升了开发效率与用户体验。建议在后续迭代中持续完善错误监控与埋点体系,进一步优化播放性能与弱网体验。
[本节为总结性内容,无需列出具体文件来源]
章节来源