# 会员订阅系统 **本文引用的文件** - [订阅系统使用说明.md](file://docs/订阅系统使用说明.md) - [支付集成指南.md](file://docs/支付集成指南.md) - [subscription.controller.ts](file://server/src/modules/subscription/subscription.controller.ts) - [subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [payment.controller.ts](file://server/src/modules/payment/payment.controller.ts) - [payment.service.ts](file://server/src/modules/payment/payment.service.ts) - [index.ts](file://server/src/types/index.ts) - [schema.prisma](file://server/prisma/schema.prisma) - [index.vue](file://my-uniapp-vue3/src/pages/member/index.vue) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向会员订阅系统,系统化阐述会员体系设计理念、分级策略、订阅管理机制、使用配额系统、支付集成架构、会员权益管理以及API接口与集成指南。系统采用“包月配额+按量超支”的双轨计费策略,结合Token与音频时长两种配额维度,覆盖从免费体验到企业级的多层级套餐,并提供支付宝、微信支付的集成与回调处理能力。 ## 项目结构 订阅系统由后端服务与前端页面协同构成: - 后端模块 - 订阅模块:提供套餐查询、余额查询、Token使用记录、音频时长配额检查与消费等接口 - 支付模块:负责订单创建、支付渠道对接、回调处理与订阅激活 - 类型定义:统一用户、订单、状态等类型 - 数据模型:Prisma Schema 定义用户、订单、订阅、Token余额与使用记录等 - 前端页面 - 订阅套餐页面:展示套餐列表、选择套餐、支付方式与应付金额 - 支付确认与结果页面:跳转支付、轮询订单状态、展示支付结果 ```mermaid graph TB subgraph "前端" FE_Member["订阅页面
pages/member/index.vue"] end subgraph "后端" C_Sub["订阅控制器
subscription.controller.ts"] S_Sub["订阅服务
subscription.service.ts"] C_Pay["支付控制器
payment.controller.ts"] S_Pay["支付服务
payment.service.ts"] Types["类型定义
types/index.ts"] Prisma["数据模型
prisma/schema.prisma"] end FE_Member --> C_Sub FE_Member --> C_Pay C_Sub --> S_Sub C_Pay --> S_Pay S_Sub --> Prisma S_Pay --> Prisma S_Sub --> Types S_Pay --> Types ``` 图表来源 - [subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [subscription.service.ts:1-938](file://server/src/modules/subscription/subscription.service.ts#L1-L938) - [payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [index.ts:1-124](file://server/src/types/index.ts#L1-L124) - [schema.prisma:1-200](file://server/prisma/schema.prisma#L1-L200) 章节来源 - [subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [index.ts:1-124](file://server/src/types/index.ts#L1-L124) - [schema.prisma:1-200](file://server/prisma/schema.prisma#L1-L200) ## 核心组件 - 套餐与定价 - 默认包含免费版、入门版、专业版、旗舰版、企业版五档,支持月付与年付 - 配额维度:Token配额、音频时长配额、每日生成次数、单次生成上限、音色数量、音质等级、API访问、批量处理、团队管理等 - 订阅管理 - 订单创建、状态流转、订阅激活与续期、自动续费开关 - 支付集成 - 支付宝、微信支付(含沙箱/模拟)、回调签名验证、订单状态查询 - 使用配额系统 - Token余额与使用记录;音频时长配额(包月+按量超支) - 会员权益 - 功能解锁、优先级提升、专属音色、批量处理、团队管理等 章节来源 - [subscription.service.ts:158-296](file://server/src/modules/subscription/subscription.service.ts#L158-L296) - [payment.service.ts:122-191](file://server/src/modules/payment/payment.service.ts#L122-L191) - [subscription.service.ts:519-649](file://server/src/modules/subscription/subscription.service.ts#L519-L649) - [index.vue:1-253](file://my-uniapp-vue3/src/pages/member/index.vue#L1-L253) ## 架构总览 订阅系统采用前后端分离架构,前端通过HTTP接口与后端交互,后端通过Prisma访问MySQL数据库。支付模块支持支付宝与微信支付,回调处理确保订单状态一致性。 ```mermaid sequenceDiagram participant U as "用户" participant FE as "前端页面" participant PC as "支付控制器" participant PS as "支付服务" participant SC as "订阅控制器" participant SS as "订阅服务" participant DB as "数据库" U->>FE : 选择套餐与支付方式 FE->>PC : POST /api/payment/create PC->>PS : 创建支付订单 PS->>DB : 写入订单记录 PS-->>FE : 返回支付链接/二维码 FE->>U : 跳转支付 U-->>PS : 支付完成异步回调 PS->>PS : 验证签名 PS->>DB : 更新订单状态 PS->>SS : 激活订阅 SS->>DB : 创建/续期订阅、更新用户等级 SS->>DB : 初始化/更新Token余额 PS-->>FE : 订单状态轮询 FE-->>U : 展示支付结果 ``` 图表来源 - [payment.controller.ts:10-33](file://server/src/modules/payment/payment.controller.ts#L10-L33) - [payment.service.ts:122-191](file://server/src/modules/payment/payment.service.ts#L122-L191) - [subscription.service.ts:409-509](file://server/src/modules/subscription/subscription.service.ts#L409-L509) - [schema.prisma:40-61](file://server/prisma/schema.prisma#L40-L61) ## 详细组件分析 ### 套餐与定价策略 - 套餐等级与功能 - 免费版:基础音色、标准音质、有限时长配额 - 入门版:高清音质、全部音色、超出按量计费 - 专业版:无损音质、API访问、批量处理(部分场景) - 旗舰版:VIP优先队列、专属技术支持、批量处理、团队管理 - 企业版:最高配额与权限,支持大量并发与团队协作 - 定价与配额 - 月付/年付价格与Token配额对应,超出部分按零售价计费 - 音频时长配额采用“包月批发价+按量零售价”策略,降低大用户成本 章节来源 - [subscription.service.ts:158-296](file://server/src/modules/subscription/subscription.service.ts#L158-L296) - [订阅系统使用说明.md:16-63](file://docs/订阅系统使用说明.md#L16-L63) ### 订阅管理机制 - 订单生命周期 - 创建:生成唯一订单号、记录套餐与金额、状态为“待支付” - 支付:支付宝/微信回调验证签名后更新状态为“已支付” - 激活:创建或续期订阅,更新用户会员等级与到期时间 - 续费:现有有效期内的订阅到期后自动延长30天 - 订阅状态与有效期 - 状态:active/expired/cancelled - 有效期:按30天周期递增或首次创建 章节来源 - [payment.service.ts:359-406](file://server/src/modules/payment/payment.service.ts#L359-L406) - [payment.service.ts:409-509](file://server/src/modules/payment/payment.service.ts#L409-L509) - [subscription.controller.ts:32-42](file://server/src/modules/subscription/subscription.controller.ts#L32-L42) ### 使用配额系统 - Token配额 - 用户Token余额与使用记录,支持无限额度(-1)与按月重置 - 消耗逻辑:生成请求时检查余额,余额不足则拒绝 - 音频时长配额(新增) - 按“包月批发价”与“按量零售价”计算,支持月度重置 - 免费版不支持超出,其他等级支持超出并按分钟计费 - 提供预估接口,前端展示生成费用与可用时长 ```mermaid flowchart TD Start(["开始"]) --> CheckQuota["检查用户音频时长配额"] CheckQuota --> Enough{"剩余时长足够?"} Enough --> |否| Overage{"是否支持超出?"} Overage --> |否| Deny["拒绝生成"] Overage --> |是| Charge["按量计费零售价"] Enough --> |是| Allow["允许生成"] Charge --> Consume["生成完成后扣除时长并记录使用"] Allow --> Consume Consume --> End(["结束"]) Deny --> End ``` 图表来源 - [subscription.service.ts:651-724](file://server/src/modules/subscription/subscription.service.ts#L651-L724) 章节来源 - [subscription.service.ts:519-724](file://server/src/modules/subscription/subscription.service.ts#L519-L724) - [subscription.controller.ts:160-188](file://server/src/modules/subscription/subscription.controller.ts#L160-L188) ### 支付集成架构 - 支付宝 - 电脑网站支付/当面付(预下单)两种方式 - 异步回调与同步返回均进行签名验证 - 沙箱环境支持,开发阶段可使用模拟支付 - 微信支付 - Native支付(扫码)生成二维码 - 异步回调与订单查询接口 - 证书与密钥配置要求严格 - 回调处理 - 验证签名后更新订单状态 - 成功后激活订阅并初始化/更新Token余额 ```mermaid sequenceDiagram participant FE as "前端" participant PC as "支付控制器" participant PS as "支付服务" participant ALI as "支付宝网关" participant WX as "微信支付网关" participant DB as "数据库" FE->>PC : POST /api/payment/create alt 支付宝 PC->>PS : 生成支付宝支付链接 PS->>ALI : 发起支付 ALI-->>PS : 返回支付链接/二维码 else 微信支付 PC->>PS : 生成微信支付二维码 PS->>WX : 发起支付 WX-->>PS : 返回二维码 end PS-->>PC : 返回支付信息 PC-->>FE : 返回支付链接/二维码 ALI-->>PS : 异步回调 WX-->>PS : 异步回调 PS->>PS : 验证签名 PS->>DB : 更新订单状态 PS->>DB : 激活订阅/更新Token余额 ``` 图表来源 - [payment.controller.ts:58-149](file://server/src/modules/payment/payment.controller.ts#L58-L149) - [payment.service.ts:194-295](file://server/src/modules/payment/payment.service.ts#L194-L295) - [payment.service.ts:359-406](file://server/src/modules/payment/payment.service.ts#L359-L406) 章节来源 - [payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [支付集成指南.md:28-208](file://docs/支付集成指南.md#L28-L208) ### 会员权益管理 - 权益映射 - 音色数量、音质等级、API访问、批量处理、团队管理等 - 免费版限制较多,其他等级逐步解锁 - 优先级与专属服务 - VIP优先队列、专属技术支持等权益随等级提升 - 等级与到期 - 用户memberLevel与memberExpireAt字段决定当前权益与有效期 章节来源 - [subscription.service.ts:158-296](file://server/src/modules/subscription/subscription.service.ts#L158-L296) - [index.ts:18-124](file://server/src/types/index.ts#L18-L124) ### 前端集成与页面 - 订阅页面 - 展示套餐列表、特性对比、推荐标识与价格 - 选择支付方式(支付宝/微信),点击“立即订阅”跳转支付确认页 - 支付流程 - 前端创建订单后跳转支付,轮询订单状态,支付成功后刷新用户状态与余额 章节来源 - [index.vue:1-253](file://my-uniapp-vue3/src/pages/member/index.vue#L1-L253) ## 依赖关系分析 ```mermaid classDiagram class SubscriptionController { +GET /subscription/plans +GET /subscription/balance +GET /subscription/usage +POST /subscription/check-quota +GET /subscription/audio-balance +GET /subscription/audio-estimate } class SubscriptionService { +getPlans() +getUserTokenBalance() +getTokenUsageList() +checkQuota() +getUserAudioBalance() +getAudioEstimate() } class PaymentController { +POST /payment/create +POST /payment/mock +POST /payment/alipay/notify +POST /payment/wechat/notify +GET /payment/orders } class PaymentService { +createPaymentOrder() +generateAlipayPayment() +generateWechatPayment() +handlePaymentCallback() +activateSubscription() } class PrismaSchema { +User +Order +Subscription +TokenBalance +TokenUsage +SubscriptionPlan } class Types { +MemberLevel +OrderStatus +ProductType } SubscriptionController --> SubscriptionService PaymentController --> PaymentService SubscriptionService --> PrismaSchema PaymentService --> PrismaSchema SubscriptionService --> Types PaymentService --> Types ``` 图表来源 - [subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [subscription.service.ts:1-938](file://server/src/modules/subscription/subscription.service.ts#L1-L938) - [payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [payment.service.ts:1-578](file://server/src/modules/payment/payment.service.ts#L1-L578) - [schema.prisma:1-200](file://server/prisma/schema.prisma#L1-L200) - [index.ts:1-124](file://server/src/types/index.ts#L1-L124) 章节来源 - [subscription.controller.ts:1-191](file://server/src/modules/subscription/subscription.controller.ts#L1-L191) - [payment.controller.ts:1-258](file://server/src/modules/payment/payment.controller.ts#L1-L258) - [schema.prisma:1-200](file://server/prisma/schema.prisma#L1-L200) ## 性能考量 - 订单与订阅状态查询 - 使用索引优化:用户ID、订单号、状态、套餐ID等 - 配额检查 - 音频时长配额计算为O(1),Token余额检查为O(1) - 支付回调 - 异步回调避免阻塞主流程,回调中仅做状态更新与订阅激活 - 重置策略 - Token与音频时长按月重置,避免长期累积导致查询压力 [本节为通用指导,不涉及具体文件分析] ## 故障排查指南 - 支付宝/微信支付未配置 - 现象:返回模拟支付链接或提示支付不可用 - 处理:检查环境变量与证书文件,确保SDK初始化成功 - 回调签名验证失败 - 现象:回调被拒绝或订单状态未更新 - 处理:核对回调URL、签名算法与密钥配置 - 订单重复处理 - 现象:同一订单多次回调导致重复激活 - 处理:回调中先检查订单状态,若已支付则直接返回成功 - 配额不足 - 现象:生成请求被拒绝 - 处理:引导用户升级套餐或减少生成规模 章节来源 - [payment.service.ts:340-356](file://server/src/modules/payment/payment.service.ts#L340-L356) - [payment.service.ts:359-406](file://server/src/modules/payment/payment.service.ts#L359-L406) - [subscription.service.ts:651-683](file://server/src/modules/subscription/subscription.service.ts#L651-L683) ## 结论 会员订阅系统通过清晰的分级策略与灵活的计费模型,满足从个人用户到企业用户的多样化需求。系统在支付集成、配额管理与权益解锁方面具备良好的扩展性与稳定性,建议后续完善自动续费、退款与数据分析等功能,持续优化用户体验与运营效率。 [本节为总结性内容,不涉及具体文件分析] ## 附录 ### API 接口清单与说明 - 订阅相关 - GET /api/subscription/plans:获取套餐列表 - GET /api/subscription/balance:获取Token余额 - GET /api/subscription/usage:获取Token使用记录 - POST /api/subscription/check-quota:检查Token配额 - GET /api/subscription/audio-balance:获取音频时长余额 - GET /api/subscription/audio-estimate:获取音频生成预估 - 支付相关 - POST /api/payment/create:创建支付订单 - POST /api/payment/mock:模拟支付(开发环境) - POST /api/payment/alipay/notify:支付宝异步回调 - POST /api/payment/wechat/notify:微信支付异步回调 - GET /api/payment/orders:获取订单列表 - GET /api/payment/orders/:orderNo:获取订单详情 章节来源 - [订阅系统使用说明.md:183-351](file://docs/订阅系统使用说明.md#L183-L351) - [subscription.controller.ts:9-188](file://server/src/modules/subscription/subscription.controller.ts#L9-L188) - [payment.controller.ts:9-203](file://server/src/modules/payment/payment.controller.ts#L9-L203) ### 数据库模型概览 - User:用户基本信息、会员等级、到期时间、音频时长与重置时间等 - Order:订单信息、支付方式、状态、金额与关联套餐 - SubscriptionPlan:套餐配置、价格、配额与功能特性 - TokenBalance:Token总配额、已用、重置时间 - TokenUsage:Token使用记录、类型、内容长度与描述 章节来源 - [schema.prisma:10-61](file://server/prisma/schema.prisma#L10-L61)