功能定制.md 16 KB

功能定制

本文引用的文件

  • README.md
  • app.ts
  • index.ts
  • book-generator.types.ts
  • book-generator.controller.ts
  • tts.controller.ts
  • auth.controller.ts
  • subscription.controller.ts
  • rate-limiter.ts
  • queue.service.ts
  • main.ts
  • index.ts
  • user.ts
  • AudioDownload.vue

目录

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

引言

本文件面向“AI有声书生成平台”的功能定制与扩展需求,围绕业务逻辑扩展、UI组件定制、API接口扩展、类型定义与配置选项、扩展点设计原则、自定义工作流与业务规则、功能开关与A/B测试、渐进式发布策略以及向后兼容与版本管理最佳实践进行系统化说明。目标是帮助开发者在不破坏现有稳定性的前提下,安全、可控地引入新功能与变更。

项目结构

该平台采用前后端分离架构:

  • 后端基于 Koa 2.x,模块化组织业务功能(认证、TTS、书籍生成、订阅等),通过路由集中注册。
  • 前端基于 uniapp + Vue 3 + TypeScript,使用 Pinia 管理状态,页面与组件按功能划分。
  • 配置集中于后端 config 模块,统一管理模型、JWT、上传、限流等参数。
  • 服务层抽象了队列、存储、日志、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
    

图表来源

  • app.ts:57-130
  • main.ts:10-31
  • index.ts:69-117

章节来源

  • README.md:31-52
  • app.ts:57-130
  • index.ts:69-117

核心组件

  • 应用入口与路由注册:后端通过 app.ts 统一挂载中间件、静态资源、健康检查、指标接口,并注册各模块路由。
  • 配置中心:集中管理端口、JWT、DashScope/TTS模型、上传大小等,支持模型自动切换与默认值。
  • 业务模块控制器:如书籍生成、TTS、认证、订阅等,提供标准化的请求校验、权限控制、配额检查与错误处理。
  • 服务层:队列服务、存储服务、日志与监控、WebSocket 推送等,支撑高并发与可观测性。
  • 前端状态与组件:用户状态、类型定义、下载组件等,提供可复用的UI与交互能力。

章节来源

  • app.ts:57-130
  • index.ts:69-117
  • tts.controller.ts:12-127
  • auth.controller.ts:10-52
  • subscription.controller.ts:9-191
  • queue.service.ts:48-347
  • user.ts:7-107
  • AudioDownload.vue:34-129

架构总览

后端以模块化控制器为核心,结合中间件与服务层,形成清晰的职责边界;前端通过 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推送"]

图表来源

  • app.ts:99-128
  • rate-limiter.ts:49-120
  • queue.service.ts:48-347
  • index.ts:69-117

详细组件分析

书籍生成模块定制

  • 类型与状态:通过 book-generator.types.ts 定义书籍、章节、大纲、任务、阶段与配置等强类型,便于扩展与约束。
  • 控制器扩展点:book-generator.controller.ts 提供批量生成、取消、状态查询等接口,适合在此基础上增加步骤编排、条件分支与回滚策略。
  • 工作流与队列:结合 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 : 完成通知
    

图表来源

  • book-generator.controller.ts:24-119
  • queue.service.ts:131-190

章节来源

  • book-generator.types.ts:8-232
  • book-generator.controller.ts:24-119
  • queue.service.ts:131-190

TTS 模块定制

  • 音色与提供商:tts.controller.ts 提供音色列表、提供商列表、预览、状态查询与下载等接口,适合扩展新的TTS提供商或音色参数。
  • 配额与限流:结合订阅模块与限流中间件,可在生成前进行配额检查与速率控制,避免资源滥用。
  • 错误处理:通过统一的错误处理中间件与业务异常,保证对外一致的错误响应格式。

    flowchart TD
    Start(["接收生成请求"]) --> Validate["参数校验<br/>文本/音色/书籍ID"]
    Validate --> Quota["配额检查(订阅/字数)"]
    Quota --> Allowed{"允许生成?"}
    Allowed -- 否 --> Reject["返回配额不足错误"]
    Allowed -- 是 --> Enqueue["加入队列/异步处理"]
    Enqueue --> Consume["生成后消耗配额(可选)"]
    Consume --> Done(["返回任务ID/状态"])
    Reject --> Done
    

图表来源

  • tts.controller.ts:52-127
  • subscription.controller.ts:86-158
  • rate-limiter.ts:105-110

章节来源

  • tts.controller.ts:12-274
  • subscription.controller.ts:86-158
  • rate-limiter.ts:105-110

认证与订阅模块定制

  • 认证:auth.controller.ts 提供短信验证码发送、手机号登录、用户信息读取与更新等接口,适合扩展第三方登录或二次验证。
  • 订阅:subscription.controller.ts 提供套餐、余额、使用记录、配额检查等接口,适合新增计费维度或折扣策略。

章节来源

  • auth.controller.ts:10-94
  • subscription.controller.ts:9-191

前端组件与状态定制

  • 用户状态:user.ts 通过 Pinia 管理 token、用户信息与会员状态,支持登录、登出、信息更新等。
  • UI组件:AudioDownload.vue 封装下载与重试逻辑,支持进度展示,适合扩展批量下载、断点续传等能力。
  • 类型定义: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 : "触发下载/状态联动"
    

图表来源

  • user.ts:7-107
  • AudioDownload.vue:18-129

章节来源

  • user.ts:7-107
  • AudioDownload.vue:34-129
  • index.ts:9-89

依赖关系分析

  • 后端模块间解耦:app.ts 仅负责路由注册与中间件装配,具体业务由各模块控制器实现,降低耦合度。
  • 服务层横切:队列、存储、日志、监控等服务通过依赖注入方式被控制器调用,便于替换与扩展。
  • 前后端契约:控制器定义明确的请求/响应结构,前端组件与状态管理严格遵循类型定义,减少对接风险。

    graph LR
    App["app.ts"] --> Routers["各模块控制器"]
    Routers --> Services["服务层(队列/存储/日志)"]
    Routers --> Middleware["中间件(限流/安全/性能)"]
    FE["前端"] --> API["后端API"]
    API --> Routers
    

图表来源

  • app.ts:99-128
  • rate-limiter.ts:1-120
  • queue.service.ts:1-347

章节来源

  • app.ts:99-128
  • rate-limiter.ts:1-120
  • queue.service.ts:1-347

性能考量

  • 限流策略:提供全局限流、登录限流、短信限流、TTS限流、上传限流等,可根据用户等级动态调整阈值。
  • 队列与并发:队列服务统一处理排队与并发,失败重试与超时管理交由容错层与AI服务层处理,避免队列承担过多职责。
  • 配置中心:集中管理模型、默认参数与阈值,便于灰度与A/B测试期间快速切换。

章节来源

  • rate-limiter.ts:77-120
  • queue.service.ts:11-16
  • index.ts:69-117

故障排查指南

  • 健康检查与指标:后端提供 /health 与 /api/metrics 接口,便于快速定位服务状态与性能瓶颈。
  • 错误处理:统一的错误处理中间件与业务异常,确保错误信息结构化输出,便于前端提示与日志追踪。
  • 限流告警:当达到限流阈值时,返回 Retry-After 与友好提示,前端可据此进行退避重试。
  • 队列可用性:若 Redis 不可用,队列会降级为内存队列,需关注任务丢失风险并及时恢复基础设施。

章节来源

  • app.ts:92-98
  • rate-limiter.ts:52-71
  • queue.service.ts:53-75

结论

通过模块化控制器、集中式配置、服务层抽象与严格的类型定义,平台具备良好的扩展性与可维护性。在进行功能定制时,建议遵循“职责单一、契约稳定、可观测、可回滚”的原则,配合限流与队列机制,确保变更的安全与可控。

附录

类型定义与配置选项设计原则

  • 类型优先:在 TypeScript 层定义强类型,覆盖请求/响应、状态、配置与数据模型,减少运行时错误。
  • 配置集中:将可变参数(端口、模型、阈值、开关)收敛至配置中心,支持热切换与灰度发布。
  • 向后兼容:新增字段采用可选,避免破坏既有接口;对枚举与状态机扩展时保留历史值。

章节来源

  • book-generator.types.ts:148-232
  • index.ts:69-117
  • index.ts:9-89

API 接口扩展方法

  • 新增控制器:在 modules 目录下创建控制器文件,定义路由与处理逻辑。
  • 注册路由:在 app.ts 的路由注册处挂载新模块路由。
  • 中间件接入:按需引入鉴权、限流、安全等中间件,确保一致性。
  • 前端对接:在前端 types 与 store 中补充对应类型与状态,组件按契约消费数据。

章节来源

  • app.ts:99-128
  • tts.controller.ts:12-274
  • index.ts:9-89

自定义工作流与业务规则

  • 工作流拆分:将复杂流程拆分为多个子任务,利用队列服务实现排队与并发控制。
  • 条件与回滚:在控制器中增加步骤校验与取消标志,结合 WebSocket 推送进度,支持用户中断与重试。
  • 配额与限流:在生成前进行配额检查与速率限制,避免资源耗尽。

章节来源

  • book-generator.controller.ts:24-119
  • queue.service.ts:131-190
  • subscription.controller.ts:86-158
  • rate-limiter.ts:105-110

功能开关、A/B测试与渐进式发布

  • 功能开关:在配置中心新增布尔开关,控制器按开关分支执行不同逻辑,前端按开关渲染或隐藏入口。
  • A/B测试:通过配置中心的模型切换、阈值调整与行为分流,实现灰度流量分配与效果评估。
  • 渐进式发布:先开启小部分用户,观察指标与日志,再逐步扩大比例,必要时可快速回滚。

章节来源

  • index.ts:46-67
  • rate-limiter.ts:1-120

向后兼容性与版本管理最佳实践

  • 接口版本:在路由前缀中体现版本号(如 /api/v1),保留旧版本接口一段时间。
  • 字段演进:新增字段设为可选,避免破坏既有客户端;对必填字段变更时提供迁移脚本。
  • 配置兼容:新增配置项提供默认值,确保未升级环境仍可正常运行。
  • 文档同步:每次变更同步更新 API 文档与类型定义,保持前后端契约一致。

章节来源

  • README.md:114-135
  • book-generator.types.ts:148-232
  • index.ts:69-117