前端概览.md 18 KB

前端概览

本文引用的文件

  • package.json
  • vite.config.ts
  • tsconfig.json
  • main.ts
  • App.vue
  • pages.json
  • manifest.json
  • config.ts
  • request.ts
  • storage.ts
  • user.ts
  • audio.ts
  • MiniPlayer.vue
  • debug.ts
  • README.md

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

引言

本文件为“AI有声书生成平台”前端概览文档,聚焦于基于 uniapp + Vue 3 + TypeScript 的跨平台前端架构与实现要点。文档围绕项目初始化配置、依赖管理策略、开发环境搭建、跨平台兼容性(H5 与微信小程序)、项目结构总览、核心配置文件说明、开发工具链介绍以及版本信息、构建脚本与部署准备等基础信息进行系统化梳理,帮助开发者快速理解并高效参与开发。

项目结构

前端工程位于 my-uniapp-vue3 目录,采用 uniapp 的标准目录组织方式,结合 Vue 3 + TypeScript 的现代化开发体验。核心目录与职责如下:

  • src/pages:页面级路由与视图,统一在 pages.json 中声明
  • src/store:状态管理(Pinia)
  • src/utils:通用工具(请求、存储、配置、调试)
  • src/components:可复用组件(如迷你播放器)
  • src/types:类型定义
  • src/static:静态资源(如 tabbar 图标)
  • 构建与配置:package.json、vite.config.ts、tsconfig.json、manifest.json、pages.json、App.vue、main.ts

    graph TB
    subgraph "前端工程(my-uniapp-vue3)"
    PAGES["pages 目录<br/>页面与路由"]
    STORE["store 目录<br/>Pinia 状态"]
    UTILS["utils 目录<br/>请求/存储/配置/调试"]
    COMPONENTS["components 目录<br/>UI 组件"]
    TYPES["types 目录<br/>类型定义"]
    STATIC["static 目录<br/>静态资源"]
    CONFIGS["配置文件<br/>package.json/tsconfig.json/vite.config.ts/manifest.json/pages.json/App.vue/main.ts"]
    end
    PAGES --> CONFIGS
    STORE --> UTILS
    COMPONENTS --> UTILS
    TYPES --> UTILS
    STATIC --> CONFIGS
    

图表来源

  • package.json:1-65
  • vite.config.ts:1-24
  • tsconfig.json:1-14
  • manifest.json:1-52
  • pages.json:1-211
  • App.vue:1-134
  • main.ts:1-32

章节来源

  • package.json:1-65
  • vite.config.ts:1-24
  • tsconfig.json:1-14
  • manifest.json:1-52
  • pages.json:1-211
  • App.vue:1-134
  • main.ts:1-32

核心组件

  • 应用入口与初始化:main.ts 负责创建 SSR 应用、挂载 Pinia、初始化用户状态,并按平台条件引入调试工具。
  • 应用根组件:App.vue 负责应用生命周期钩子、全局样式与主题(含夜间模式)、全局调试初始化。
  • 页面与路由:pages.json 统一声明页面路径、导航栏与 tabBar。
  • 应用清单:manifest.json 定义应用名、版本、平台能力与权限。
  • 状态管理:user.ts 与 audio.ts 提供用户态与音频播放态的集中管理。
  • 通用工具:config.ts(环境与 API 域名解析)、request.ts(统一请求封装与错误处理)、storage.ts(跨端存储)、debug.ts(全局调试与导航拦截)。
  • 可视化组件:MiniPlayer.vue 提供悬浮迷你播放器,按当前页面与播放状态动态显示。

章节来源

  • main.ts:1-32
  • App.vue:1-134
  • pages.json:1-211
  • manifest.json:1-52
  • user.ts:1-107
  • audio.ts:1-297
  • config.ts:1-80
  • request.ts:1-207
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166

架构总览

前端采用“配置驱动 + 统一请求 + 状态管理 + 跨端适配”的架构设计,核心流程如下:

  • 开发/生产环境通过 vite.config.ts 的代理与 config.ts 的环境判断,自动选择 API 域名。
  • 请求层 request.ts 统一封装 uni.request,内置重试、超时、缓存、鉴权头注入与错误处理。
  • 状态层使用 Pinia Store(user.ts、audio.ts),集中管理用户态与播放态。
  • UI 层通过 components 与 pages 的组合实现页面与组件解耦;MiniPlayer.vue 作为横幅播放器贯穿多页面。
  • App.vue 与 main.ts 负责应用生命周期与全局初始化。

    graph TB
    A["main.ts<br/>应用入口"] --> B["App.vue<br/>根组件"]
    B --> C["pages.json<br/>页面路由"]
    B --> D["manifest.json<br/>应用清单"]
    A --> E["Pinia Store<br/>user.ts / audio.ts"]
    E --> F["utils/request.ts<br/>统一请求封装"]
    F --> G["utils/config.ts<br/>API 域名解析"]
    F --> H["utils/storage.ts<br/>跨端存储"]
    A --> I["utils/debug.ts<br/>全局调试"]
    J["components/MiniPlayer.vue<br/>迷你播放器"] --> E
    

图表来源

  • main.ts:1-32
  • App.vue:1-134
  • pages.json:1-211
  • manifest.json:1-52
  • user.ts:1-107
  • audio.ts:1-297
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • debug.ts:1-305
  • MiniPlayer.vue:1-166

详细组件分析

应用入口与初始化(main.ts)

  • 创建 SSR 应用与 Pinia 实例,挂载至应用实例。
  • 初始化用户状态,确保应用启动即具备可用的登录态。
  • H5 平台下保留 vConsole 条件引入(注释占位),便于开发调试。

章节来源

  • main.ts:1-32

根组件与全局样式(App.vue)

  • 生命周期钩子:onLaunch、onShow、onHide,负责应用初始化与日志记录。
  • 夜间模式:读取本地存储并应用暗色主题。
  • 全局样式:页面基础样式、动画与交互反馈(触摸反馈、按钮点击反馈)。
  • 全局调试:初始化调试工具,输出页面与 API 调试信息。

章节来源

  • App.vue:1-134
  • debug.ts:1-305

页面与路由(pages.json)

  • 统一声明页面路径与导航样式,包含自定义导航栏与 tabBar。
  • 页面标题、导航背景色、背景色等全局样式集中配置。

章节来源

  • pages.json:1-211

应用清单与平台能力(manifest.json)

  • 应用名、版本、平台标识与 Vue 版本。
  • app-plus 模块与权限配置(相机、SQLite、支付等)。
  • 微信小程序 appid 与安全设置(urlCheck)。
  • 分发配置(Android/iOS 权限、支付 SDK 配置等)。

章节来源

  • manifest.json:1-52

状态管理(Pinia)

  • 用户状态(user.ts):token、用户信息、会员状态、登录/登出、发送验证码、获取用户信息与会员状态。
  • 音频播放(audio.ts):音色列表、播放列表、播放上下文、播放控制(播放/暂停/切歌/倍速/seek)、播放模式切换与错误处理。

    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()
    }
    UserStore <.. AudioStore : "协作"
    

图表来源

  • user.ts:1-107
  • audio.ts:1-297

章节来源

  • user.ts:1-107
  • audio.ts:1-297

通用工具链

API 配置与环境解析(config.ts)

  • 生产/开发环境的 API 域名映射。
  • H5、APP-PLUS、微信小程序等平台识别与域名选择。
  • 小程序模拟器环境下回退到 web 域名的兼容逻辑。
  • 提供 getServerBaseUrl 与 getLocalIP 等辅助方法。

章节来源

  • config.ts:1-80

统一请求封装(request.ts)

  • 基于 uni.request 的封装,支持 GET/POST/PUT/DELETE。
  • 鉴权头注入(Authorization Bearer token)。
  • 重试机制、超时控制、请求缓存(GET)。
  • 统一错误处理:401 跳转登录、429 频控提示、5xx 服务器错误提示。
  • 调试日志:请求/响应/错误三类日志输出。

    sequenceDiagram
    participant Page as "页面组件"
    participant Store as "Pinia Store"
    participant Req as "request.ts"
    participant Cfg as "config.ts"
    participant Srv as "后端服务"
    Page->>Store : 调用接口方法
    Store->>Req : request(url, options)
    Req->>Cfg : getApiBaseUrl()
    Cfg-->>Req : 返回 API 域名
    Req->>Req : 注入 Authorization 头/缓存/重试
    Req->>Srv : uni.request 发起请求
    Srv-->>Req : 返回 {code/data/message}
    Req->>Req : 校验响应/错误处理
    Req-->>Store : 返回数据或抛出错误
    Store-->>Page : 更新状态/提示
    

图表来源

  • request.ts:1-207
  • config.ts:1-80

章节来源

  • request.ts:1-207
  • config.ts:1-80

跨端存储(storage.ts)

  • 统一 token 与用户信息的读写,H5 使用 localStorage,非 H5 使用 uni 存储。
  • 提供 clearAuth 清理登录态。

章节来源

  • storage.ts:1-63

全局调试(debug.ts)

  • 页面生命周期与导航拦截(navigateTo/redirectTo/switchTab/reLaunch/navigateBack)。
  • 全局错误捕获(Promise 拒绝、window.error、uni.onError)。
  • API 请求/响应/错误日志输出,带时间戳与页面上下文。
  • 平台名称识别与 App 前后台切换日志。

章节来源

  • debug.ts:1-305

可视化组件(MiniPlayer.vue)

  • 动态显示:不在播放器页且存在当前音频时显示。
  • 封面渐变色:根据音色 ID 映射不同渐变色。
  • 控制:播放/暂停、下一首、跳转播放器页。
  • 时间格式化:分钟:秒格式展示当前时长/总时长。

章节来源

  • MiniPlayer.vue:1-166

依赖关系分析

  • 构建与脚手架:Vite + @dcloudio/vite-plugin-uni 提供 uniapp 构建支持。
  • 运行时框架:Vue 3 + @dcloudio/uni-app,组件生态由 @dcloudio/uni-components 提供。
  • 状态管理:Pinia。
  • 类型与校验:TypeScript + vue-tsc。
  • 开发代理:vite.config.ts 的 /api、/uploads、/videos 代理至本地后端。
  • 依赖脚本:package.json 提供 dev/build 多平台脚本,覆盖 H5 与多小程序平台。

    graph LR
    VITE["vite.config.ts"] --> UNI["@dcloudio/vite-plugin-uni"]
    PKG["package.json"] --> VUE["vue"]
    PKG --> PINIA["pinia"]
    PKG --> TS["typescript/vue-tsc"]
    PKG --> UNI
    MAIN["main.ts"] --> PINIA
    MAIN --> VUE
    REQ["request.ts"] --> CFG["config.ts"]
    REQ --> STRG["storage.ts"]
    AUDIO["audio.ts"] --> REQ
    USER["user.ts"] --> REQ
    MINI["MiniPlayer.vue"] --> AUDIO
    

图表来源

  • vite.config.ts:1-24
  • package.json:1-65
  • main.ts:1-32
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • audio.ts:1-297
  • user.ts:1-107
  • MiniPlayer.vue:1-166

章节来源

  • vite.config.ts:1-24
  • package.json:1-65
  • main.ts:1-32
  • request.ts:1-207
  • config.ts:1-80
  • storage.ts:1-63
  • audio.ts:1-297
  • user.ts:1-107
  • MiniPlayer.vue:1-166

性能考虑

  • 请求缓存:GET 请求支持内存缓存,减少重复请求与网络开销。
  • 播放优化:音频上下文复用,避免频繁创建销毁;优先使用接口返回的时长,降低 metadata 不一致带来的闪烁。
  • 轻量化组件:MiniPlayer 条件渲染,仅在满足条件时显示,降低页面层级与重绘。
  • 调试开关:调试日志默认开启,可在生产环境关闭以减少控制台输出与性能损耗。
  • 构建代理:开发阶段通过代理转发 API 请求,避免跨域与本地联调复杂度。

故障排查指南

  • 登录态失效:请求返回 401 时自动清理本地 token 并跳转登录页。
  • 请求过于频繁:返回 429 时提示用户等待后再试。
  • 服务器错误:返回 5xx 时弹出提示并记录错误日志。
  • 网络异常:请求失败统一提示“网络请求失败”,并输出调试日志。
  • 调试定位:启用全局调试后,页面切换、导航拦截、API 请求/响应/错误均会输出彩色日志,便于问题定位。
  • H5 与小程序差异:H5 环境在微信小程序模拟器中回退到 web 域名,避免域名不一致导致的跨域问题。

章节来源

  • request.ts:1-207
  • debug.ts:1-305
  • config.ts:1-80

结论

本前端工程以 uniapp + Vue 3 + TypeScript 为核心技术栈,结合 Pinia 状态管理与统一请求封装,形成“配置驱动 + 跨端适配 + 可观测性”的开发范式。通过 pages.json 与 manifest.json 的集中配置,配合 vite.config.ts 的开发代理与 TypeScript 的类型保障,实现了 H5 与微信小程序的高兼容性与良好的开发体验。建议在后续迭代中持续完善调试日志与错误上报、优化播放器性能与缓存策略,并加强跨端组件的可测试性与可维护性。

附录

版本信息与构建脚本

  • 项目版本:见 package.json 的 version 字段。
  • 构建脚本:dev/build 多平台脚本覆盖 H5 与多小程序平台(如 mp-weixin、mp-alipay 等)。
  • 类型检查:type-check 使用 vue-tsc 进行类型校验。

章节来源

  • package.json:1-65

开发环境搭建与启动

  • 后端:参考 README 的后端启动步骤(安装依赖、复制环境配置、启动开发服务)。
  • 前端:在 client 目录下安装依赖后,使用 npm run dev:h5 启动 H5 开发服务;使用 npm run build:mp-weixin 编译微信小程序。

章节来源

  • README.md:62-90

跨平台兼容性说明

  • H5 与小程序域名差异:config.ts 根据平台与环境自动选择 API 域名;H5 在小程序模拟器中回退到 web 域名。
  • App 端能力:manifest.json 声明相机、SQLite、支付等模块与权限。
  • 导航拦截:debug.ts 对 uni 的导航 API 进行拦截与日志输出,便于调试与问题定位。

章节来源

  • config.ts:1-80
  • manifest.json:1-52
  • debug.ts:1-305