# 系统架构
**本文引用的文件**
- [README.md](file://README.md)
- [my-uniapp-vue3/package.json](file://my-uniapp-vue3/package.json)
- [server/package.json](file://server/package.json)
- [server/src/app.ts](file://server/src/app.ts)
- [deploy-package/server/app.js](file://deploy-package/server/app.js)
- [server/src/modules/auth/auth.controller.ts](file://server/src/modules/auth/auth.controller.ts)
- [server/src/modules/tts/tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [server/src/modules/member/member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [server/src/modules/book-generator/book-generator.controller.ts](file://server/src/modules/book-generator/book-generator.controller.ts)
- [server/src/modules/video-generator/video-generator.controller.ts](file://server/src/modules/video-generator/video-generator.controller.ts)
- [server/src/services/ffmpeg.processor.ts](file://server/src/services/ffmpeg.processor.ts)
- [server/src/config/index.ts](file://server/src/config/index.ts)
- [server/prisma/schema.prisma](file://server/prisma/schema.prisma)
- [my-uniapp-vue3/src/main.ts](file://my-uniapp-vue3/src/main.ts)
- [my-uniapp-vue3/src/utils/request.ts](file://my-uniapp-vue3/src/utils/request.ts)
- [docker-nginx/docker-compose.yml](file://docker-nginx/docker-compose.yml)
- [docker-nginx/bookapi.conf](file://docker-nginx/bookapi.conf)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 引言
本系统是一个“AI有声书生成平台”,采用前后端分离架构:前端基于 uniapp + Vue 3 + TypeScript,后端基于 Koa.js,数据库采用 Prisma + MySQL,音频处理通过 FFmpeg 与对象存储结合。系统支持 TTS 文本转音频、会员体系、书籍批量生成(内容-音频-视频)、视频生成与合并、播放器与播放列表、搜索与偏好设置等能力。
## 项目结构
- 前端(uniapp + Vue 3 + TypeScript)
- 应用入口与状态管理:src/main.ts、store/
- 页面与组件:src/pages、src/components
- 工具与网络请求:src/utils/request.ts、config.ts 等
- 构建脚本:my-uniapp-vue3/package.json
- 后端(Koa.js + TypeScript)
- 应用入口与中间件:server/src/app.ts
- 模块化路由:server/src/modules/*/*.controller.ts
- 服务层与工具:server/src/services/*
- 配置与模型:server/src/config、server/prisma/schema.prisma
- 构建脚本:server/package.json
- 部署与反向代理
- Nginx 反代:docker-nginx/bookapi.conf、docker-compose.yml
- 文档与说明
- README.md 展示技术栈、API 与快速开始
```mermaid
graph TB
subgraph "前端(uniapp)"
FE_App["应用入口
src/main.ts"]
FE_Utils["网络请求
src/utils/request.ts"]
FE_Router["页面与组件
src/pages/*, src/components/*"]
end
subgraph "后端(Koa.js)"
BE_App["应用入口
server/src/app.ts"]
BE_Modules["业务模块路由
modules/*/*.controller.ts"]
BE_Services["服务与工具
services/*"]
BE_DB["数据模型
prisma/schema.prisma"]
BE_Config["配置
src/config/index.ts"]
end
subgraph "基础设施"
Nginx["Nginx 反向代理
docker-nginx/bookapi.conf"]
Docker["Docker Compose
docker-compose.yml"]
Storage["对象存储/本地存储"]
FFmpeg["FFmpeg 处理器
services/ffmpeg.processor.ts"]
end
FE_App --> FE_Utils
FE_Router --> FE_Utils
FE_Utils --> Nginx
Nginx --> BE_App
BE_App --> BE_Modules
BE_Modules --> BE_Services
BE_Services --> BE_DB
BE_Services --> Storage
BE_Services --> FFmpeg
Docker --> Nginx
```
图表来源
- [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130)
- [my-uniapp-vue3/src/main.ts:10-31](file://my-uniapp-vue3/src/main.ts#L10-L31)
- [my-uniapp-vue3/src/utils/request.ts:35-99](file://my-uniapp-vue3/src/utils/request.ts#L35-L99)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
章节来源
- [README.md:18-52](file://README.md#L18-L52)
- [my-uniapp-vue3/package.json:1-65](file://my-uniapp-vue3/package.json#L1-L65)
- [server/package.json:1-60](file://server/package.json#L1-L60)
## 核心组件
- 前端应用(uniapp + Vue 3 + TypeScript)
- 使用 Pinia 管理状态,提供 H5 与微信小程序等多端运行
- 通过统一请求封装与调试日志,支持重试、缓存与错误提示
- 后端服务(Koa.js)
- 中间件链路:错误处理、CORS、日志、安全防护、限流、性能监控
- 路由按模块划分:认证、TTS、会员、播放器、收藏、偏好、搜索、分类、评论、通知、模板、BGM、音频编辑、书籍生成、视频生成等
- 配置集中管理:端口、JWT、DashScope TTS、模型列表、上传目录等
- 数据持久化:Prisma + MySQL,模型覆盖用户、书籍、章节、音频、视频、订单、订阅等
- 音频处理(FFmpeg)
- 支持远程 URL 下载、合并、格式转换、裁剪、音量调整、音视频合并等
- 自动上传至对象存储或本地存储
- 部署与反向代理
- Nginx 反向代理到后端 3000 端口,便于域名访问与 HTTPS 协议透传
章节来源
- [my-uniapp-vue3/src/main.ts:10-31](file://my-uniapp-vue3/src/main.ts#L10-L31)
- [my-uniapp-vue3/src/utils/request.ts:35-99](file://my-uniapp-vue3/src/utils/request.ts#L35-L99)
- [server/src/app.ts:64-130](file://server/src/app.ts#L64-L130)
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [server/prisma/schema.prisma:10-472](file://server/prisma/schema.prisma#L10-L472)
- [server/src/services/ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
## 架构总览
系统采用“前端 uniapp + 后端 Koa + 数据库 MySQL + 第三方服务/工具”的分层架构。前端通过 HTTP/HTTPS 与后端交互;后端通过 Prisma 访问 MySQL;音频处理通过 FFmpeg 与对象存储协同;Nginx 作为反向代理统一入口。
```mermaid
graph TB
Client["客户端(H5/小程序)"]
FE["前端 uniapp 应用"]
API["Koa 后端服务"]
DB["MySQL 数据库"]
OSS["对象存储(本地/阿里云OSS)"]
FFMPEG["FFmpeg 处理器"]
Nginx["Nginx 反向代理"]
Client --> FE
FE --> Nginx
Nginx --> API
API --> DB
API --> OSS
API --> FFMPEG
FFMPEG --> OSS
```
图表来源
- [server/src/app.ts:133-194](file://server/src/app.ts#L133-L194)
- [server/src/services/ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
## 详细组件分析
### 前端组件分析(uniapp + Vue 3 + TypeScript)
- 应用入口与状态
- 创建 SSR App、注册 Pinia,初始化用户状态
- 网络请求封装
- 统一基地址、Token 注入、重试、缓存、超时、错误处理与登录态失效跳转
- 页面与组件
- 页面路由、播放器、骨架屏、下载组件等
```mermaid
sequenceDiagram
participant U as "用户"
participant P as "前端页面"
participant R as "请求封装"
participant N as "Nginx 反代"
participant S as "Koa 后端"
U->>P : 触发操作
P->>R : request(url, options)
R->>R : 注入 Authorization/缓存/重试
R->>N : HTTP 请求
N->>S : 反向代理转发
S-->>R : 返回 {code,data}
R-->>P : 成功/失败处理与提示
P-->>U : 更新界面
```
图表来源
- [my-uniapp-vue3/src/utils/request.ts:35-99](file://my-uniapp-vue3/src/utils/request.ts#L35-L99)
- [docker-nginx/bookapi.conf:6-13](file://docker-nginx/bookapi.conf#L6-L13)
- [server/src/app.ts:92-130](file://server/src/app.ts#L92-L130)
章节来源
- [my-uniapp-vue3/src/main.ts:10-31](file://my-uniapp-vue3/src/main.ts#L10-L31)
- [my-uniapp-vue3/src/utils/request.ts:35-99](file://my-uniapp-vue3/src/utils/request.ts#L35-L99)
### 后端组件分析(Koa.js + 模块化路由)
- 应用入口与中间件
- 错误处理、Sentry、性能监控、Winston 日志、CORS、安全防护、限流、BodyParser、静态文件挂载
- 路由模块
- 认证、TTS、会员、播放器、收藏、偏好、搜索、分类、评论、通知、模板、BGM、音频编辑、书籍生成、视频生成等
- 配置与模型
- 端口、JWT、DashScope TTS、模型列表、上传目录等
- Prisma 模型覆盖用户、书籍、章节、音频、视频、订单、订阅等
```mermaid
classDiagram
class KoaApp {
+中间件链
+路由注册
+静态文件
}
class AuthController {
+发送验证码
+手机号登录
+获取/更新用户信息
}
class TTSController {
+获取音色/服务商
+异步生成音频
+预览音色
+下载信息/批量下载
}
class MemberController {
+权益信息
+会员状态
+创建订单
+模拟支付
+订单列表
}
class BookGenController {
+批量生成书籍
+取消任务
+查询状态
}
class VideoGenController {
+项目管理
+生成视频
+素材管理
+从书籍生成项目
}
KoaApp --> AuthController : "注册路由"
KoaApp --> TTSController : "注册路由"
KoaApp --> MemberController : "注册路由"
KoaApp --> BookGenController : "注册路由"
KoaApp --> VideoGenController : "注册路由"
```
图表来源
- [server/src/app.ts:64-130](file://server/src/app.ts#L64-L130)
- [server/src/modules/auth/auth.controller.ts:10-94](file://server/src/modules/auth/auth.controller.ts#L10-L94)
- [server/src/modules/tts/tts.controller.ts:12-274](file://server/src/modules/tts/tts.controller.ts#L12-L274)
- [server/src/modules/member/member.controller.ts:9-90](file://server/src/modules/member/member.controller.ts#L9-L90)
- [server/src/modules/book-generator/book-generator.controller.ts:24-199](file://server/src/modules/book-generator/book-generator.controller.ts#L24-L199)
- [server/src/modules/video-generator/video-generator.controller.ts:28-244](file://server/src/modules/video-generator/video-generator.controller.ts#L28-L244)
章节来源
- [server/src/app.ts:64-130](file://server/src/app.ts#L64-L130)
- [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [server/prisma/schema.prisma:10-472](file://server/prisma/schema.prisma#L10-L472)
### 音频处理流程(FFmpeg)
- 支持的功能
- 下载远程文件、合并音频、音视频合并、获取时长、格式转换、裁剪、音量调整
- 自动清理临时文件,上传至对象存储
- 流程示意
```mermaid
flowchart TD
Start(["进入处理"]) --> CheckURL["校验输入URL/本地路径"]
CheckURL --> Download["下载到本地临时目录"]
Download --> DecideOp{"操作类型?"}
DecideOp --> |合并音频| Merge["构建文件列表并执行合并"]
DecideOp --> |音视频合并| MergeAV["合并音视频(可选BGM混音)"]
DecideOp --> |获取时长| Probe["ffprobe 获取时长"]
DecideOp --> |格式转换| Convert["按目标格式转换"]
DecideOp --> |裁剪| Trim["按时间段裁剪"]
DecideOp --> |音量调整| Volume["按倍数调整音量"]
Merge & MergeAV & Probe & Convert & Trim & Volume --> Upload["上传至对象存储"]
Upload --> Cleanup["清理临时文件"]
Cleanup --> End(["结束"])
```
图表来源
- [server/src/services/ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379)
章节来源
- [server/src/services/ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379)
### 微服务化模块划分策略
- 认证模块:手机号登录、验证码、用户信息维护
- TTS 模块:音色/服务商查询、异步生成、预览、下载与批量下载
- 会员模块:权益、状态、订单、模拟支付、订单列表
- 书籍生成模块:内容生成、音频生成、音频合并、视频生成、视频合并、批量任务与取消
- 视频生成模块:项目管理、素材管理、从书籍生成项目
- 其他模块:播放器、收藏、偏好、搜索、分类、评论、通知、模板、BGM、音频编辑、历史、草稿、发布、签到、订阅、支付、反馈等
章节来源
- [server/src/modules/auth/auth.controller.ts:10-94](file://server/src/modules/auth/auth.controller.ts#L10-L94)
- [server/src/modules/tts/tts.controller.ts:12-274](file://server/src/modules/tts/tts.controller.ts#L12-L274)
- [server/src/modules/member/member.controller.ts:9-90](file://server/src/modules/member/member.controller.ts#L9-L90)
- [server/src/modules/book-generator/book-generator.controller.ts:24-199](file://server/src/modules/book-generator/book-generator.controller.ts#L24-L199)
- [server/src/modules/video-generator/video-generator.controller.ts:28-244](file://server/src/modules/video-generator/video-generator.controller.ts#L28-L244)
### 部署架构(Docker + Nginx 反向代理)
- Docker Compose 启动 Nginx,监听 80 端口,将请求代理到 host.docker.internal:3000
- 后端服务监听 3000 端口,提供健康检查与静态资源服务
- 建议在生产环境增加 HTTPS、负载均衡与多实例部署
```mermaid
graph TB
subgraph "容器编排"
D["docker-compose.yml"]
N["Nginx 容器"]
S["后端服务容器"]
end
D --> N
D --> S
N --> S
```
图表来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [docker-nginx/bookapi.conf:6-13](file://docker-nginx/bookapi.conf#L6-L13)
- [deploy-package/server/app.js:82-97](file://deploy-package/server/app.js#L82-L97)
章节来源
- [docker-nginx/docker-compose.yml:1-12](file://docker-nginx/docker-compose.yml#L1-L12)
- [docker-nginx/bookapi.conf:1-15](file://docker-nginx/bookapi.conf#L1-L15)
- [deploy-package/server/app.js:82-97](file://deploy-package/server/app.js#L82-L97)
## 依赖分析
- 前端依赖
- uni-app 生态、Vue 3、Pinia、vconsole、marked、katex 等
- 后端依赖
- Koa 生态、@koa/router、@koa/bodyparser、@koa/cors、Prisma、LangChain、Sentry、Bull 队列、Redis、OpenAI、阿里云 OSS、FFmpeg 等
- 数据模型
- 用户、书籍、章节、音频、视频、订单、订阅、播放记录、收藏、评论、通知、搜索历史、签到、播放列表、草稿、发布任务、素材、反馈等
```mermaid
graph LR
FE["前端 uniapp"] --> API["Koa 后端"]
API --> PRISMA["Prisma"]
PRISMA --> MYSQL["MySQL"]
API --> REDIS["Redis"]
API --> OSS["对象存储"]
API --> FFMPEG["FFmpeg"]
API --> LLM["LangChain/LangGraph"]
```
图表来源
- [server/package.json:11-44](file://server/package.json#L11-L44)
- [server/prisma/schema.prisma:10-472](file://server/prisma/schema.prisma#L10-L472)
- [server/src/services/ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379)
章节来源
- [server/package.json:11-44](file://server/package.json#L11-L44)
- [server/prisma/schema.prisma:10-472](file://server/prisma/schema.prisma#L10-L472)
## 性能考虑
- 前端
- 使用请求缓存与重试,减少重复请求与网络波动影响
- 在 H5 环境可按需开启 vConsole 调试
- 后端
- 中间件包含性能监控与日志,建议启用限流与安全防护
- 音频/视频处理为 CPU 密集型,建议配合队列与异步处理
- 对象存储与本地存储可按需切换,注意带宽与成本
- 部署
- Nginx 反代简化部署与域名管理,建议横向扩展与负载均衡
## 故障排查指南
- 常见问题定位
- 健康检查:访问 /health 确认服务可用
- 日志:查看后端启动日志与错误日志
- 前端网络:检查请求封装中的错误提示与重试逻辑
- 常见错误与处理
- 登录态失效:前端检测到 401 自动清空 token 并跳转登录
- 请求过于频繁:后端返回 429,前端提示稍后再试
- 服务器错误:后端返回 5xx,前端提示服务器错误
- FFmpeg 处理
- 检查临时目录权限与磁盘空间
- 确认远程 URL 可访问与超时设置合理
章节来源
- [server/src/app.ts:92-98](file://server/src/app.ts#L92-L98)
- [my-uniapp-vue3/src/utils/request.ts:135-159](file://my-uniapp-vue3/src/utils/request.ts#L135-L159)
- [server/src/services/ffmpeg.processor.ts:346-375](file://server/src/services/ffmpeg.processor.ts#L346-L375)
## 结论
该系统以 uniapp 实现跨端一致性体验,以 Koa.js 提供轻量且模块化的后端服务,以 Prisma + MySQL 保障数据结构清晰与扩展性,以 FFmpeg 与对象存储支撑音频/视频处理与分发。通过 Nginx 反向代理与容器化部署,具备良好的可运维性与扩展性。后续可在生产环境引入负载均衡、CDN、更完善的限流与监控体系,并持续优化音频/视频处理的并发与成本。
## 附录
- 快速开始与环境要求
- Node.js >= 18、MySQL >= 6.0、FFmpeg(用于音频处理)
- API 示例(节选)
- 认证:发送验证码、手机号登录、获取用户信息
- TTS:音色列表、生成音频、预览音色、下载信息与批量下载
- 会员:权益信息、会员状态、创建订单、模拟支付、订单列表
- 书籍生成:批量生成、取消任务、查询状态
- 视频生成:项目管理、生成视频、素材管理、从书籍生成项目
章节来源
- [README.md:56-113](file://README.md#L56-L113)
- [server/src/modules/auth/auth.controller.ts:10-94](file://server/src/modules/auth/auth.controller.ts#L10-L94)
- [server/src/modules/tts/tts.controller.ts:12-274](file://server/src/modules/tts/tts.controller.ts#L12-L274)
- [server/src/modules/member/member.controller.ts:9-90](file://server/src/modules/member/member.controller.ts#L9-L90)
- [server/src/modules/book-generator/book-generator.controller.ts:24-199](file://server/src/modules/book-generator/book-generator.controller.ts#L24-L199)
- [server/src/modules/video-generator/video-generator.controller.ts:28-244](file://server/src/modules/video-generator/video-generator.controller.ts#L28-L244)