# 使用统计 **本文引用的文件** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [server/prisma/migrations/20260422105352_add_content_status/migration.sql](file://server/prisma/migrations/20260422105352_add_content_status/migration.sql) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向“使用统计系统”的数据文档,聚焦以下目标: - 使用量统计机制:Token消耗记录、音频生成时长统计、功能使用频率分析 - 数据收集与存储策略:实时更新、批量处理、历史归档 - 统计报表能力:日/周/月趋势、用户行为分析、收入统计 - 指标计算方法:平均使用量、峰值分析、预测模型 - 统计查询接口:时间范围筛选、用户维度分析、导出功能 - 统计数据的API与可视化展示方案 在当前代码库中,统计相关的关键实现集中在订阅与用量模块、Token使用记录表、TTS生成流程以及性能监控中间件等位置。 ## 项目结构 围绕使用统计的核心文件分布如下: - 订阅与用量服务:负责音频时长配额、费用计算、用量扣减与记录 - 数据模型:TokenUsage 表用于记录各类使用明细 - 中间件:使用限制中间件与性能监控中间件 - TTS 服务:音频生成流程中的时长与状态记录 - 前端日志页面:展示请求统计与错误分析 ```mermaid graph TB subgraph "后端" A["订阅与用量服务
subscription.service.ts"] B["中间件
usageLimit.ts / performance.ts"] C["数据模型
schema.prisma / migration.sql"] D["TTS 服务
tts.service.ts"] end subgraph "前端" E["日志与统计页面
logs/index.vue"] end E --> |"API 调用"| A A --> |"读写"| C D --> |"生成完成更新状态/时长"| C B --> |"限流/配额校验"| A ``` **图表来源** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [server/prisma/migrations/20260422105352_add_content_status/migration.sql](file://server/prisma/migrations/20260422105352_add_content_status/migration.sql) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) **章节来源** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [server/prisma/migrations/20260422105352_add_content_status/migration.sql](file://server/prisma/migrations/20260422105352_add_content_status/migration.sql) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) ## 核心组件 - Token 使用记录与余额管理 - TokenUsage 表记录每次使用类型、数量、内容长度、关联订单与创建时间 - 提供消费与查询接口,支持分页与排序 - 音频生成时长统计与配额 - 基于文本长度估算音频时长,结合会员等级与月度配额进行扣减与记录 - 支持预估生成费用、检查配额、动态重置配额 - 使用限制中间件 - 按用户每日使用次数与字数限制进行校验,支持免费/付费会员差异化配额 - 性能监控中间件 - 统计总请求、平均响应时间、慢请求、错误数及端点级指标 - TTS 生成流程 - 生成完成后回写音频时长、状态,并触发后续业务动作 - 前端日志与统计页面 - 展示请求总量、错误数、警告数、平均响应时间等基础统计 **章节来源** - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [server/prisma/migrations/20260422105352_add_content_status/migration.sql](file://server/prisma/migrations/20260422105352_add_content_status/migration.sql) - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) ## 架构总览 使用统计系统的整体交互流程如下: ```mermaid sequenceDiagram participant Client as "客户端" participant Logs as "日志统计页面
logs/index.vue" participant API as "订阅服务
subscription.service.ts" participant DB as "数据库
TokenUsage/用户表" participant Perf as "性能中间件
performance.ts" Client->>Logs : 打开日志统计页 Logs->>API : GET /api/logs/stats API->>DB : 查询统计聚合 DB-->>API : 返回统计结果 API-->>Logs : 返回统计数据 Logs-->>Client : 展示统计卡片 Client->>API : POST /api/tts/generate API->>Perf : 记录请求开始 API->>DB : 写入TokenUsage/更新用户用量 API-->>Client : 返回生成任务信息 API->>DB : 生成完成后更新音频时长/状态 ``` **图表来源** - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) ## 详细组件分析 ### 组件A:Token 使用记录与余额管理 - 数据模型 - TokenUsage 表包含用户ID、类型、数量、内容长度、订单关联、创建时间等字段,并建立索引以支持按用户与时间检索 - 主要功能 - 消耗Token:校验余额、更新余额、记录使用明细 - 查询Token使用列表:分页、排序、总数统计 - 关键实现位置 - Token 使用记录与查询接口 - Token 余额与消费逻辑 ```mermaid erDiagram TOKEN_USAGE { int id PK int userId string type int amount int contentLength int orderId datetime createdAt } USER { int id PK int usedAudioMinutes datetime subscriptionResetDate } ORDER { int id PK } USER ||--o{ TOKEN_USAGE : "拥有" ORDER ||--o{ TOKEN_USAGE : "关联" ``` **图表来源** - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [server/prisma/migrations/20260422105352_add_content_status/migration.sql](file://server/prisma/migrations/20260422105352_add_content_status/migration.sql) **章节来源** - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [server/prisma/migrations/20260422105352_add_content_status/migration.sql](file://server/prisma/migrations/20260422105352_add_content_status/migration.sql) - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) ### 组件B:音频生成时长统计与配额 - 时长估算与费用计算 - 基于文本长度估算音频时长,结合会员等级与月度配额计算配额内/超额分钟数与价格 - 支持预估生成费用、检查配额、动态重置配额(每月1日) - 用量扣减与记录 - 生成完成后更新用户已用时长,并记录一条类型为“audio_generation”的Token使用记录 - 关键实现位置 - 音频时长估算与费用计算 - 配额检查与用量扣减 - Token 使用记录创建 ```mermaid flowchart TD Start(["开始:收到生成请求"]) --> Estimate["估算音频时长"] Estimate --> CheckQuota["检查月度配额与超额策略"] CheckQuota --> |不足且不允许超额| Deny["拒绝生成并返回原因"] CheckQuota --> |允许或在配额内| Consume["扣除音频时长并记录Token使用"] Consume --> UpdateUser["更新用户usedAudioMinutes"] UpdateUser --> Log["写入TokenUsage记录"] Log --> End(["结束"]) ``` **图表来源** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) **章节来源** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) ### 组件C:使用限制中间件 - 功能概述 - 根据用户会员等级设置每日使用次数与字数限制 - 自动重置每日使用次数,防止超限 - 关键实现位置 - 使用次数与字数限制检查 - 每日重置逻辑 ```mermaid flowchart TD Enter(["进入请求"]) --> GetUserId["获取用户ID"] GetUserId --> |未登录| Allow["允许访问无限制"] GetUserId --> |已登录| LoadUser["加载用户信息"] LoadUser --> Reset["若日期变更则重置dailyUsage"] Reset --> CheckDaily["检查每日使用次数"] CheckDaily --> |超限| Reject["抛出配额超限错误"] CheckDaily --> |未超限| Allow ``` **图表来源** - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) **章节来源** - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) ### 组件D:性能监控中间件 - 功能概述 - 统计总请求、平均响应时间、慢请求、错误数 - 聚合端点级指标(请求次数、平均/最大响应时间、错误数) - 关键实现位置 - 性能指标结构与更新逻辑 ```mermaid flowchart TD ReqStart(["请求开始"]) --> Exec["执行业务逻辑"] Exec --> Resp["计算响应时长"] Resp --> Update["更新全局与端点级指标"] Update --> Done(["请求结束"]) ``` **图表来源** - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) **章节来源** - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) ### 组件E:TTS 生成流程与时长回写 - 功能概述 - 生成音频时创建处理中记录,完成后回写音频URL、时长、状态等 - 生成过程中可能因额度限制切换不同供应商 - 关键实现位置 - 生成主流程与状态回写 - 额度限制判断与供应商切换 ```mermaid sequenceDiagram participant Caller as "调用方" participant TTS as "TTS服务" participant DB as "数据库" participant WS as "WebSocket" Caller->>TTS : 调用生成接口 TTS->>DB : 创建处理中记录 TTS->>TTS : 分段/并行合成 TTS->>DB : 完成后更新音频URL/时长/状态 TTS-->>Caller : 返回结果 TTS->>WS : 推送生成完成事件 ``` **图表来源** - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) **章节来源** - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) ### 组件F:前端日志与统计页面 - 功能概述 - 展示总请求、错误、警告、平均响应时间等统计卡片 - 支持切换“请求日志”“错误分析”“自动修复”等标签页 - 关键实现位置 - 统计卡片渲染与数据拉取 - 错误分析与自动修复入口 ```mermaid sequenceDiagram participant Page as "日志页面" participant API as "后端API" participant Store as "页面状态" Page->>API : GET /api/logs?limit=50 API-->>Page : 返回日志列表 Page->>API : GET /api/logs/stats API-->>Page : 返回统计聚合 Page->>Store : 更新统计卡片与日志列表 ``` **图表来源** - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) **章节来源** - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) ## 依赖关系分析 - 订阅与用量服务依赖数据库模型与中间件 - TTS 服务依赖存储服务与WebSocket推送 - 前端日志页面依赖后端统计接口 ```mermaid graph LR Logs["日志页面
logs/index.vue"] --> SubSvc["订阅服务
subscription.service.ts"] SubSvc --> Prisma["Prisma 模型
schema.prisma"] TTS["TTS 服务
tts.service.ts"] --> Prisma Perf["性能中间件
performance.ts"] --> SubSvc Usage["使用限制中间件
usageLimit.ts"] --> SubSvc ``` **图表来源** - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) **章节来源** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/middleware/usageLimit.ts](file://server/src/middleware/usageLimit.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [server/prisma/schema.prisma](file://server/prisma/schema.prisma) - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) ## 性能考量 - 实时更新 - Token 使用记录与用户用量在关键操作(如音频生成完成)时实时写入 - 批量处理 - 建议对高频统计场景采用定时任务批量汇总(例如每小时/每天),降低在线写入压力 - 历史归档 - 对历史TokenUsage可按月/季度归档至冷存储,保留最近N个月热数据 - 查询优化 - 为TokenUsage建立复合索引(用户+时间、用户+类型),提升统计查询效率 ## 故障排查指南 - 配额不足 - 现象:生成被拒绝,提示“本月配额已用完” - 处理:检查用户会员等级与usedAudioMinutes,确认是否需要升级或等待重置 - 额度受限切换 - 现象:生成过程中因额度限制切换供应商 - 处理:查看日志中“RATE_LIMIT”提示,调整供应商优先级或等待额度恢复 - 统计异常 - 现象:前端统计卡片数值异常 - 处理:检查后端性能中间件指标与数据库查询,确认统计接口返回正确 **章节来源** - [server/src/modules/subscription/subscription.service.ts](file://server/src/modules/subscription/subscription.service.ts) - [server/src/middleware/performance.ts](file://server/src/middleware/performance.ts) - [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts) - [my-uniapp-vue3/src/pages/logs/index.vue](file://my-uniapp-vue3/src/pages/logs/index.vue) ## 结论 本使用统计系统以TokenUsage为核心载体,结合订阅与用量服务、中间件与TTS流程,实现了音频生成时长统计、配额控制与基础性能监控。建议在此基础上扩展: - 增设统计报表API(日/周/月趋势、用户维度、导出) - 引入批量统计与历史归档策略 - 完善预测模型与峰值分析能力 ## 附录 ### 统计查询接口设计建议 - 时间范围筛选 - 参数:startTime、endTime - 实现:按TokenUsage.createdAt范围过滤 - 用户维度分析 - 参数:userId、memberLevel - 实现:按用户ID或会员等级聚合 - 导出功能 - 参数:format(csv/json)、filters - 实现:后端生成文件并提供下载链接 ### 统计指标计算方法 - 平均使用量 - 计算公式:总用量 / 统计周期天数 - 峰值分析 - 方法:按小时/日聚合,取最大值 - 预测模型 - 方法:基于历史趋势(线性回归/指数平滑)预测未来用量