本文引用的文件
本文件面向“AI有声书生成平台”的功能定制与扩展需求,围绕业务逻辑扩展、UI组件定制、API接口扩展、类型定义与配置选项、扩展点设计原则、自定义工作流与业务规则、功能开关与A/B测试、渐进式发布策略以及向后兼容与版本管理最佳实践进行系统化说明。目标是帮助开发者在不破坏现有稳定性的前提下,安全、可控地引入新功能与变更。
该平台采用前后端分离架构:
服务层抽象了队列、存储、日志、WebSocket 等横切能力。
graph TB
subgraph "前端(uniapp)"
FE_Main["应用入口<br/>main.ts"]
FE_Store["状态管理<br/>store/user.ts"]
FE_Comps["UI组件<br/>components/AudioDownload.vue"]
FE_Types["类型定义<br/>types/index.ts"]
end
subgraph "后端(Koa)"
BE_App["应用入口<br/>app.ts"]
BE_Router["路由注册<br/>app.ts"]
BE_Modules["业务模块<br/>modules/*"]
BE_Services["服务层<br/>services/*"]
BE_Middleware["中间件<br/>middleware/*"]
BE_Config["配置中心<br/>config/index.ts"]
end
FE_Main --> FE_Store
FE_Store --> FE_Comps
FE_Main --> FE_Types
BE_App --> BE_Router
BE_Router --> BE_Modules
BE_App --> BE_Services
BE_App --> BE_Middleware
BE_App --> BE_Config
图表来源
章节来源
章节来源
后端以模块化控制器为核心,结合中间件与服务层,形成清晰的职责边界;前端通过 Pinia 管理用户状态,组件封装常用交互。整体通过配置中心与限流策略保障稳定性与可扩展性。
graph TB
Client["客户端(H5/小程序)"] --> FE["前端应用"]
FE --> API["后端API"]
API --> C_Auth["认证模块"]
API --> C_TTS["TTS模块"]
API --> C_Book["书籍生成模块"]
API --> C_Sub["订阅模块"]
API --> S_Q["队列服务"]
API --> S_Rate["限流中间件"]
API --> S_Cfg["配置中心"]
API --> S_WS["WebSocket推送"]
图表来源
工作流与队列:结合 queue.service.ts 的任务队列,可将复杂生成流程拆分为多个子任务,实现可观察、可重试、可暂停/恢复的工作流。
sequenceDiagram
participant U as "用户"
participant FE as "前端"
participant API as "书籍生成控制器"
participant SVC as "队列服务"
participant WS as "WebSocket"
U->>FE : 触发批量生成
FE->>API : POST /api/book-generator/books/ : id/batch-generate
API->>SVC : 添加生成任务
SVC-->>API : 返回任务ID
API-->>FE : 返回任务ID
loop 后台执行
SVC->>WS : 推送进度
WS-->>FE : 进度事件
end
SVC-->>API : 任务完成
API-->>FE : 完成通知
图表来源
章节来源
错误处理:通过统一的错误处理中间件与业务异常,保证对外一致的错误响应格式。
flowchart TD
Start(["接收生成请求"]) --> Validate["参数校验<br/>文本/音色/书籍ID"]
Validate --> Quota["配额检查(订阅/字数)"]
Quota --> Allowed{"允许生成?"}
Allowed -- 否 --> Reject["返回配额不足错误"]
Allowed -- 是 --> Enqueue["加入队列/异步处理"]
Enqueue --> Consume["生成后消耗配额(可选)"]
Consume --> Done(["返回任务ID/状态"])
Reject --> Done
图表来源
章节来源
章节来源
类型定义:index.ts 提供用户、音频、音色、会员状态等类型,便于在组件与服务间传递数据时保持一致性。
classDiagram
class UserStore {
+token
+userInfo
+memberStatus
+isLoggedIn
+isMember
+initUser()
+login(phone, code)
+logout()
+fetchUserInfo()
+fetchMemberStatus()
+updateUserInfo(info)
}
class AudioDownload {
+url
+filename
+audioId
+handleDownload()
+downloadWithRetry()
+executeDownload()
}
UserStore --> AudioDownload : "触发下载/状态联动"
图表来源
章节来源
前后端契约:控制器定义明确的请求/响应结构,前端组件与状态管理严格遵循类型定义,减少对接风险。
graph LR
App["app.ts"] --> Routers["各模块控制器"]
Routers --> Services["服务层(队列/存储/日志)"]
Routers --> Middleware["中间件(限流/安全/性能)"]
FE["前端"] --> API["后端API"]
API --> Routers
图表来源
章节来源
章节来源
章节来源
通过模块化控制器、集中式配置、服务层抽象与严格的类型定义,平台具备良好的扩展性与可维护性。在进行功能定制时,建议遵循“职责单一、契约稳定、可观测、可回滚”的原则,配合限流与队列机制,确保变更的安全与可控。
章节来源
章节来源
章节来源
章节来源
章节来源