本文引用的文件
本设计文档面向AI有声书生成平台,聚焦MySQL数据库(Prisma ORM)的数据模型与索引设计,覆盖用户、音频、TTS记录、会员与订阅等核心实体。文档同时给出实体关系映射、查询优化策略、生命周期管理、迁移与版本演进建议,并补充数据安全、备份恢复与性能监控的实施要点。
配置层在index.ts中集中管理数据库连接、JWT、模型供应商与TTS参数等。
graph TB
subgraph "应用层"
C1["tts.controller.ts"]
S1["tts.service.ts"]
S2["member.service.ts"]
A1["auth.service.ts"]
end
subgraph "数据访问层"
M1["models/index.ts<br/>PrismaClient"]
end
subgraph "数据库层"
P1["schema.prisma<br/>MySQL"]
end
C1 --> S1
C1 --> S2
A1 --> M1
S1 --> M1
S2 --> M1
M1 --> P1
图表来源
章节来源
本节对关键数据模型进行逐项说明,包括字段含义、取值范围、约束与典型查询。
用户(User)
订单(Order)
订阅(Subscription)与套餐(SubscriptionPlan)
音频记录(AudioRecord)
书籍(Book)与章节(BookChapter)
播放记录(PlayRecord)、收藏(Favorite)、评论(Comment)、播放列表(Playlist/PlaylistItem)、草稿(Draft)、Token余额(TokenBalance)/使用(TokenUsage)、发布任务(PublishTask)、平台账号(PlatformAccount)等。
章节来源
下图展示数据库层的核心实体与关系,突出“书籍体系”与“学习路径体系”的并行结构,以及TTS生成链路中的关键关联。
erDiagram
USER ||--o{ ORDER : "拥有"
USER ||--o{ SUBSCRIPTION : "拥有"
USER ||--o{ AUDIO_RECORD : "生成"
USER ||--o{ PLAY_RECORD : "播放"
USER ||--o{ FAVORITE : "收藏"
USER ||--o{ COMMENT : "评论"
USER ||--o{ DRAFT : "草稿"
BOOK ||--o{ BOOK_CHAPTER : "包含"
BOOK_CHAPTER ||--o{ PLAY_RECORD : "被播放"
BOOK_CHAPTER ||--o{ COMMENT : "被评论"
BOOK_CHAPTER ||--o{ VIDEO_PROJECT : "生成视频"
AUDIO_RECORD }o--|| BOOK : "可选绑定"
BOOK_CHAPTER }o--|| AUDIO_RECORD : "章节音频"
PLAYLIST }o--o{ PLAYLIST_ITEM : "包含"
PLAYLIST_ITEM }o--|| BOOK_CHAPTER : "章节项"
PLAYLIST_ITEM }o--|| AUDIO_RECORD : "音频项"
SUBSCRIPTION }o--|| SUBSCRIPTION_PLAN : "订阅"
ORDER }o--|| SUBSCRIPTION_PLAN : "购买"
ORDER }o--|| USER : "由用户创建"
TOKEN_USAGE }o--|| USER : "记录"
TOKEN_BALANCE }o--|| USER : "对应"
图表来源
章节来源
订单(Order):记录购买行为,支持月卡/年卡两种产品类型,状态涵盖pending/paid/failed/refunded。
classDiagram
class User {
+int id
+string phone
+string openid
+string nickname
+string avatar
+int memberLevel
+datetime memberExpireAt
+int dailyUsage
+string lastUsageDate
+int usedAudioMinutes
+datetime subscriptionResetDate
}
class SubscriptionPlan {
+int id
+string name
+int level
+decimal priceMonthly
+decimal priceYearly
+int dailyGenerations
+int perGenerationLimit
+int monthlyTokens
+int monthlyMinutes
+string features
}
class Subscription {
+int id
+int userId
+int planId
+datetime startDate
+datetime endDate
+string status
+bool autoRenew
}
class Order {
+int id
+int userId
+string orderNo
+int planId
+string productType
+decimal amount
+string status
+datetime paidAt
}
User ||--o{ Subscription : "拥有"
SubscriptionPlan ||--o{ Subscription : "被订阅"
SubscriptionPlan ||--o{ Order : "被购买"
User ||--o{ Order : "创建"
图表来源
章节来源
TTS服务链路:tts.controller.ts接收请求,调用tts.service.ts执行文本分段、并发合成、合并与上传、AI标题摘要标签生成、LRC歌词生成、章节与记录更新、WebSocket通知等。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "tts.controller.ts"
participant Svc as "tts.service.ts"
participant DB as "Prisma(schema.prisma)"
participant Storage as "存储服务"
Client->>Ctrl : POST /tts/generate
Ctrl->>Svc : generateAudio(userId,text,voiceId,voiceParams,options)
Svc->>DB : 创建AudioRecord(processing)
Svc->>Svc : 文本分段/并发合成/合并
Svc->>Storage : 上传音频
Storage-->>Svc : 返回URL
Svc->>DB : 更新AudioRecord(completed)
Svc->>DB : 更新BookChapter(可选)
Svc-->>Ctrl : 返回{audioId,audioUrl,bookId}
Ctrl-->>Client : 任务已创建
图表来源
章节来源
三级目录:Book → BookChapter(章)→ keyPoints(小节,JSON数组)。
erDiagram
BOOK {
int id PK
int userId
string title
string subtitle
text description
string targetAudience
string style
string bookScale
int totalChapters
int estimatedWords
int progress
bool isPublished
longtext outlineJson
text foreword
text afterword
string status
string genStage
string failedStage
}
BOOK_CHAPTER {
int id PK
int bookId FK
int parentId
int level
int number
string title
text summary
text keyPoints
int estimatedWords
longtext content
int wordCount
string contentError
datetime generatedAt
text audioUrl
int audioDuration
text videoUrl
int videoDuration
bool isPublic
string genStage
text lrcLyrics
string status
}
BOOK ||--o{ BOOK_CHAPTER : "包含"
图表来源
章节来源
订单(Order):购买订阅的流水记录。
classDiagram
class SubscriptionPlan {
+int id
+string name
+int level
+decimal priceMonthly
+decimal priceYearly
+int dailyGenerations
+int perGenerationLimit
+int monthlyTokens
+int monthlyMinutes
+bool isRecommended
+bool isActive
+int sortOrder
+string features
}
class Subscription {
+int id
+int userId
+int planId
+datetime startDate
+datetime endDate
+string status
+bool autoRenew
}
class Order {
+int id
+int userId
+string orderNo
+int planId
+string productType
+decimal amount
+string status
+datetime paidAt
}
class TokenBalance {
+int id
+int userId
+int totalTokens
+int usedTokens
+datetime resetDate
}
class TokenUsage {
+int id
+int userId
+string type
+int amount
+int contentLength
+int orderId
}
SubscriptionPlan ||--o{ Subscription : "被订阅"
SubscriptionPlan ||--o{ Order : "被购买"
Order ||--|| Subscription : "关联"
User ||--o{ Order : "创建"
User ||--|| TokenBalance : "拥有"
TokenBalance ||--o{ TokenUsage : "产生"
图表来源
章节来源
配置到模型:index.ts中加载models.json,统一管理供应商与默认模型,供TTS服务选择与降级策略使用。
graph LR
TTS_C["tts.controller.ts"] --> TTS_S["tts.service.ts"]
MEM_C["member.controller.ts"] --> MEM_S["member.service.ts"]
AUTH_S["auth.service.ts"] --> MODELS["models/index.ts"]
TTS_S --> MODELS
MEM_S --> MODELS
MODELS --> PRISMA["schema.prisma"]
图表来源
章节来源
章节来源
章节来源
本设计以Prisma ORM为核心,围绕用户、音频、TTS记录、会员与订阅构建了清晰的数据模型与索引策略。通过控制器-服务-数据层的分层架构,实现了异步TTS生成、配额控制、状态追踪与播放列表等核心能力。建议在生产环境中强化备份与监控、完善灰度与回滚机制,并持续优化索引与查询路径以应对业务增长。
章节来源
章节来源