# 核心模块
**本文引用的文件**
- [auth.controller.ts](file://server/src/modules/auth/auth.controller.ts)
- [auth.service.ts](file://server/src/modules/auth/auth.service.ts)
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [player.controller.ts](file://server/src/modules/player/player.controller.ts)
- [player.service.ts](file://server/src/modules/player/player.service.ts)
- [member.controller.ts](file://server/src/modules/member/member.controller.ts)
- [member.service.ts](file://server/src/modules/member/member.service.ts)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的核心模块,系统性梳理并解释以下关键模块的功能职责、实现原理与使用方式:
- 用户认证模块:手机号登录、验证码机制、JWT令牌签发与校验
- TTS语音合成模块:多音色提供商集成(阿里云、MiniMax、Mock)、参数调节、异步生成与状态查询
- 音频处理模块:本地与云端音频文件的合并、时长与大小统计、统一上传至存储服务
- 播放器模块:播放进度持久化、章节合并播放、公开状态管理
- 会员系统模块:会员权益与配额、订单创建与模拟支付、会员状态查询
文档同时阐述模块间的依赖关系与数据交互模式,并提供扩展与自定义的指导原则、配置要点、性能优化建议与常见问题排查方法。
## 项目结构
后端采用模块化组织,核心模块位于 server/src/modules 下,控制器负责HTTP路由与请求参数解析,服务层封装业务逻辑与第三方集成,类型与配置位于 server/src/types 与 server/src/config。
```mermaid
graph TB
subgraph "认证模块"
AC["auth.controller.ts"]
AS["auth.service.ts"]
end
subgraph "TTS模块"
TC["tts.controller.ts"]
TS["tts.service.ts"]
end
subgraph "播放器模块"
PC["player.controller.ts"]
PS["player.service.ts"]
end
subgraph "会员模块"
MC["member.controller.ts"]
MS["member.service.ts"]
end
AC --> AS
TC --> TS
PC --> PS
MC --> MS
TS --> PS
PC --> TS
AC --> TC
AC --> PC
AC --> MC
```
图表来源
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
- [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274)
- [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715)
- [player.controller.ts:1-344](file://server/src/modules/player/player.controller.ts#L1-L344)
- [player.service.ts:1-280](file://server/src/modules/player/player.service.ts#L1-L280)
- [member.controller.ts:1-90](file://server/src/modules/member/member.controller.ts#L1-L90)
- [member.service.ts:1-183](file://server/src/modules/member/member.service.ts#L1-L183)
章节来源
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
- [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274)
- [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715)
- [player.controller.ts:1-344](file://server/src/modules/player/player.controller.ts#L1-L344)
- [player.service.ts:1-280](file://server/src/modules/player/player.service.ts#L1-L280)
- [member.controller.ts:1-90](file://server/src/modules/member/member.controller.ts#L1-L90)
- [member.service.ts:1-183](file://server/src/modules/member/member.service.ts#L1-L183)
## 核心组件
- 认证模块:提供手机号登录、验证码生成与校验、用户信息查询与更新、JWT签发与中间件校验
- TTS模块:提供音色与提供商查询、文本转音频的异步生成、状态查询、预览音频、批量下载
- 播放器模块:提供播放进度的增删改查、最近播放记录、章节音频合并、公开状态管理
- 会员模块:提供会员权益与配额、订单创建、模拟支付、订单列表与会员状态查询
章节来源
- [auth.controller.ts:10-94](file://server/src/modules/auth/auth.controller.ts#L10-L94)
- [auth.service.ts:11-115](file://server/src/modules/auth/auth.service.ts#L11-L115)
- [tts.controller.ts:13-274](file://server/src/modules/tts/tts.controller.ts#L13-L274)
- [tts.service.ts:24-715](file://server/src/modules/tts/tts.service.ts#L24-L715)
- [player.controller.ts:14-344](file://server/src/modules/player/player.controller.ts#L14-L344)
- [player.service.ts:10-280](file://server/src/modules/player/player.service.ts#L10-L280)
- [member.controller.ts:10-90](file://server/src/modules/member/member.controller.ts#L10-L90)
- [member.service.ts:11-183](file://server/src/modules/member/member.service.ts#L11-L183)
## 架构总览
整体采用“控制器-服务”分层,控制器负责参数校验与响应封装,服务层负责业务流程与外部集成。TTS服务与播放器服务之间通过章节与音频记录进行数据关联;认证服务贯穿各模块用于身份校验与用户信息获取;会员服务为TTS生成提供配额与权限控制。
```mermaid
graph TB
Client["客户端"] --> AuthC["认证控制器
auth.controller.ts"]
Client --> TTSC["TTS控制器
tts.controller.ts"]
Client --> PlayerC["播放器控制器
player.controller.ts"]
Client --> MemberC["会员控制器
member.controller.ts"]
AuthC --> AuthService["认证服务
auth.service.ts"]
TTSC --> TTSService["TTS服务
tts.service.ts"]
PlayerC --> PlayerService["播放器服务
player.service.ts"]
MemberC --> MemberService["会员服务
member.service.ts"]
TTSService --> Storage["存储服务
storage.service.ts"]
TTSService --> Merger["音频合并器
audio-merger.ts"]
TTSService --> WS["WebSocket服务
websocket.service.js"]
PlayerService --> Merger
PlayerService --> DB["Prisma 数据库"]
TTSService --> DB
AuthC --> DB
MemberC --> DB
MemberService --> DB
```
图表来源
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [auth.service.ts:1-115](file://server/src/modules/auth/auth.service.ts#L1-L115)
- [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274)
- [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715)
- [player.controller.ts:1-344](file://server/src/modules/player/player.controller.ts#L1-L344)
- [player.service.ts:1-280](file://server/src/modules/player/player.service.ts#L1-L280)
- [member.controller.ts:1-90](file://server/src/modules/member/member.controller.ts#L1-L90)
- [member.service.ts:1-183](file://server/src/modules/member/member.service.ts#L1-L183)
## 详细组件分析
### 认证模块
- 职责
- 发送验证码(开发环境直接返回验证码)
- 手机号登录(支持免验证码直登)
- 用户信息查询与更新
- JWT令牌签发与中间件校验
- 实现要点
- 验证码存储使用内存Map(生产建议Redis)
- 登录流程:查重/创建用户 → 生成JWT → 返回用户信息与令牌
- 控制器对手机号格式与验证码进行前置校验
- 使用方式
- 前端先调用发送验证码接口,再提交手机号+验证码登录
- 后续接口通过认证中间件携带用户ID
```mermaid
sequenceDiagram
participant C as "客户端"
participant Ctrl as "认证控制器"
participant Svc as "认证服务"
participant DB as "数据库"
C->>Ctrl : POST /auth/send-code
Ctrl->>Svc : generateSmsCode(phone)
Svc-->>Ctrl : 返回验证码
Ctrl-->>C : {code,message,data : {phone,code}}
C->>Ctrl : POST /auth/login
Ctrl->>Svc : loginWithPhone(phone, code)
Svc->>DB : 查询/创建用户
Svc-->>Ctrl : {token,user}
Ctrl-->>C : {code,message,data}
```
图表来源
- [auth.controller.ts:11-52](file://server/src/modules/auth/auth.controller.ts#L11-L52)
- [auth.service.ts:44-97](file://server/src/modules/auth/auth.service.ts#L44-L97)
章节来源
- [auth.controller.ts:11-92](file://server/src/modules/auth/auth.controller.ts#L11-L92)
- [auth.service.ts:11-97](file://server/src/modules/auth/auth.service.ts#L11-L97)
### TTS语音合成模块
- 职责
- 提供可用音色与提供商列表
- 异步生成音频(立即返回任务ID)
- 查询生成状态(processing/completed/failed)
- 预览音色(短文本)
- 批量下载音频
- 实现要点
- Provider工厂:优先级选择(MiniMax > 阿里云 > Mock),支持强制指定
- 文本分段策略:阿里云HTTP模式按段落与句子切分,MiniMax支持长文本
- 并发控制:MiniMax串行,其他并发2段
- 合并与上传:本地分段音频合并,统一通过存储服务上传
- 配额与用量:结合会员配额与字数估算进行消费
- 使用方式
- 调用生成接口传入文本、音色、参数与可选书籍/章节信息
- 轮询状态接口直至完成
- 完成后通过下载接口获取URL
```mermaid
sequenceDiagram
participant C as "客户端"
participant Ctrl as "TTS控制器"
participant Svc as "TTS服务"
participant Prov as "TTS提供商"
participant Merge as "音频合并器"
participant Store as "存储服务"
participant DB as "数据库"
C->>Ctrl : POST /tts/generate
Ctrl->>Ctrl : 参数校验/配额检查
Ctrl->>Svc : generateAudio(userId,text,voiceId,params,options)
Svc->>DB : 创建AudioRecord(processing)
Svc->>Prov : synthesize(分段)
Prov-->>Svc : 本地分段音频/云端URL
alt 云端URL
Svc->>Store : uploadAudio(临时文件)
Store-->>Svc : 返回统一URL
else 本地分段
Svc->>Merge : merge(分段->output.mp3)
Merge-->>Svc : 合并文件
Svc->>Store : uploadAudio(合并文件)
Store-->>Svc : 返回统一URL
end
Svc->>DB : 更新AudioRecord(completed,audioUrl,duration,size,title)
Svc-->>Ctrl : {audioId,audioUrl,bookId}
Ctrl-->>C : {code,message,data}
```
图表来源
- [tts.controller.ts:53-127](file://server/src/modules/tts/tts.controller.ts#L53-L127)
- [tts.service.ts:201-542](file://server/src/modules/tts/tts.service.ts#L201-L542)
章节来源
- [tts.controller.ts:13-274](file://server/src/modules/tts/tts.controller.ts#L13-L274)
- [tts.service.ts:24-715](file://server/src/modules/tts/tts.service.ts#L24-L715)
### 播放器模块
- 职责
- 播放进度的增删改查与最近播放记录
- 章节音频合并(章级别自动聚合小节音频)
- 章节公开状态管理
- 实现要点
- 进度持久化使用upsert语义,避免重复记录
- 合并逻辑:仅对章(level=1)聚合其下所有小节(level=3)音频
- 公开状态校验:仅章节所属用户可修改
- 使用方式
- 播放过程中定时上报进度
- 播放章时自动合并小节音频,提升体验
```mermaid
flowchart TD
Start(["进入播放器"]) --> CheckType["判断是否为章(level=1)"]
CheckType --> |否| PlayDirect["直接播放当前音频"]
CheckType --> |是| HasMerged{"已有合并音频?"}
HasMerged --> |是| PlayMerged["播放合并音频"]
HasMerged --> |否| FetchSub["获取所有小节音频URL"]
FetchSub --> Merge["合并音频并写入数据库"]
Merge --> PlayMerged
PlayMerged --> SaveProgress["保存播放进度"]
SaveProgress --> End(["结束"])
```
图表来源
- [player.controller.ts:136-227](file://server/src/modules/player/player.controller.ts#L136-L227)
- [player.service.ts:147-242](file://server/src/modules/player/player.service.ts#L147-L242)
章节来源
- [player.controller.ts:14-344](file://server/src/modules/player/player.controller.ts#L14-L344)
- [player.service.ts:10-280](file://server/src/modules/player/player.service.ts#L10-L280)
### 会员系统模块
- 职责
- 会员权益与配额展示
- 订单创建与模拟支付
- 会员状态查询与订单列表
- 实现要点
- 权益与配额:免费版/月度会员/年度会员三档
- 配额:每日生成次数与字数限制,支持无限额度
- 订单:生成唯一订单号,模拟支付后更新用户会员等级与到期时间
- 使用方式
- 用户下单后进入支付流程,开发环境可模拟支付成功
```mermaid
sequenceDiagram
participant C as "客户端"
participant Ctrl as "会员控制器"
participant Svc as "会员服务"
participant DB as "数据库"
C->>Ctrl : GET /member/benefits
Ctrl-->>C : 权益与配额信息
C->>Ctrl : POST /member/order
Ctrl->>Svc : createOrder(userId, productType)
Svc->>DB : 创建订单(pending)
Svc-->>Ctrl : {orderNo,amount}
Ctrl-->>C : {code,message,data}
C->>Ctrl : POST /member/pay/mock
Ctrl->>Svc : mockPaymentSuccess(orderNo,userId)
Svc->>DB : 更新订单为paid
Svc->>DB : 更新用户会员等级与到期时间
Svc-->>Ctrl : {success,memberLevel,expireAt}
Ctrl-->>C : {code,message,data}
```
图表来源
- [member.controller.ts:9-90](file://server/src/modules/member/member.controller.ts#L9-L90)
- [member.service.ts:11-183](file://server/src/modules/member/member.service.ts#L11-L183)
章节来源
- [member.controller.ts:9-90](file://server/src/modules/member/member.controller.ts#L9-L90)
- [member.service.ts:11-183](file://server/src/modules/member/member.service.ts#L11-L183)
## 依赖分析
- 认证模块
- 依赖:JWT签名、手机号格式校验、数据库用户表
- 与其他模块:为TTS、播放器、会员模块提供用户身份
- TTS模块
- 依赖:Provider(阿里云、MiniMax、Mock)、音频合并器、存储服务、WebSocket推送
- 与播放器:章节音频完成后回写章节记录
- 与会员:生成前检查配额,生成后消耗分钟数
- 播放器模块
- 依赖:音频合并器、数据库章节与播放记录
- 与TTS:读取章节音频URL,必要时合并
- 会员模块
- 依赖:数据库用户与订单表
- 与TTS:提供配额与优先级能力
```mermaid
graph LR
Auth["认证模块"] --> TTS["TTS模块"]
Auth --> Player["播放器模块"]
Auth --> Member["会员模块"]
TTS --> Player
TTS --> Storage["存储服务"]
TTS --> Merger["音频合并器"]
Player --> Merger
Member --> TTS
```
图表来源
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715)
- [player.service.ts:1-280](file://server/src/modules/player/player.service.ts#L1-L280)
- [member.service.ts:1-183](file://server/src/modules/member/member.service.ts#L1-L183)
章节来源
- [auth.controller.ts:1-94](file://server/src/modules/auth/auth.controller.ts#L1-L94)
- [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715)
- [player.service.ts:1-280](file://server/src/modules/player/player.service.ts#L1-L280)
- [member.service.ts:1-183](file://server/src/modules/member/member.service.ts#L1-L183)
## 性能考量
- Provider选择与并发
- MiniMax串行以降低轮询开销;阿里云/模拟并发2段,提升吞吐
- 文本分段
- 阿里云HTTP模式按段落与句子切分,避免超限;长文本模式暂时禁用实时流
- 存储与合并
- 合并后统一上传,减少跨域与CDN分发复杂度
- 配额与限流
- 生成前检查配额,失败快速返回,避免无效资源消耗
- 缓存与索引
- 播放进度按用户+章节组合键查询,建议确保索引完善
## 故障排查指南
- TTS生成失败
- 检查Provider额度限制(如触发usage limit/rate limit/quota exceeded),服务会自动切换下一Provider
- 查看任务目录下的失败标记文件,定位具体错误
- 确认存储服务可用与网络可达
- 状态查询异常
- 若目录存在但长时间无文件,视为僵尸任务,数据库会被标记为失败
- 播放进度丢失
- 确认upsert逻辑是否正常,检查用户ID与章节ID是否匹配
- 会员配额不足
- 检查用户当日使用次数与字数是否超出限额,或会员等级是否生效
章节来源
- [tts.service.ts:518-542](file://server/src/modules/tts/tts.service.ts#L518-L542)
- [tts.service.ts:547-597](file://server/src/modules/tts/tts.service.ts#L547-L597)
- [player.service.ts:46-81](file://server/src/modules/player/player.service.ts#L46-L81)
- [member.service.ts:40-73](file://server/src/modules/member/member.service.ts#L40-L73)
## 结论
本平台围绕“认证—TTS—播放—会员”形成闭环:认证提供身份,TTS产出内容,播放器承载体验,会员体系保障可持续使用。模块间通过清晰的控制器与服务边界协作,配合Provider工厂与存储抽象,具备良好的扩展性与可维护性。建议在生产环境中替换内存验证码为Redis、完善监控与告警,并持续评估Provider性能与成本。
## 附录
- 扩展与自定义指导
- 新增Provider:实现synthesize接口,加入Provider工厂优先级
- 自定义音色映射:在音色列表与映射表中新增条目
- 自定义存储:实现storage service接口,替换上传行为
- 自定义播放器合并策略:调整章节层级与合并条件
- 配置项参考
- JWT密钥与过期时间
- Provider API Key与模型列表
- 上传目录与存储类型
- 会员配额与价格
- 最佳实践
- 严格参数校验与错误分类
- 异步生成与状态轮询分离
- 合并前检查与幂等更新
- 生产环境禁用免验证码登录