本文引用的文件
本文件面向AI有声书生成平台的“使用统计模型”,聚焦以下三类用户行为数据模型与其实现:
本文将从数据模型设计、后端服务与控制器实现、前端调用与展示、以及业务场景(播放统计分析、用户行为画像、内容推荐)等方面进行系统化说明,并提供API使用示例与可视化思路。
围绕使用统计的核心文件分布如下:
前端搜索页:my-uniapp-vue3/src/pages/search/index.vue(演示搜索历史与热门词的调用)
graph TB
subgraph "前端"
FE_Search["搜索页<br/>index.vue"]
end
subgraph "后端"
PCtrl["播放控制器<br/>player.controller.ts"]
PService["播放服务<br/>player.service.ts"]
SCtrl["搜索控制器<br/>search.controller.ts"]
SService["搜索服务<br/>search.service.ts"]
Models["Prisma 模型<br/>schema.prisma"]
DB["MySQL 数据库"]
end
FE_Search --> PCtrl
FE_Search --> SCtrl
PCtrl --> PService
SCtrl --> SService
PService --> Models
SService --> Models
Models --> DB
图表来源
章节来源
本节概述三大使用统计模型及其职责与关键字段。
PlayRecord 播放记录
SearchHistory 搜索历史
HotSearch 热门搜索
UserPreference 用户偏好
章节来源
播放与搜索统计的端到端流程如下:
sequenceDiagram
participant FE as "前端应用"
participant PC as "播放控制器"
participant PS as "播放服务"
participant SC as "搜索控制器"
participant SS as "搜索服务"
participant PRISMA as "Prisma 客户端"
participant DB as "MySQL"
FE->>PC : "POST /api/player/progress"
PC->>PS : "保存播放进度"
PS->>PRISMA : "upsert PlayRecord"
PRISMA->>DB : "写入/更新记录"
DB-->>PRISMA : "确认"
PRISMA-->>PS : "返回记录"
PS-->>PC : "返回记录"
PC-->>FE : "保存成功"
FE->>SC : "GET /api/search/hot"
SC->>SS : "获取热门搜索"
SS->>PRISMA : "查询 HotSearch"
PRISMA->>DB : "读取热门词"
DB-->>PRISMA : "返回结果"
PRISMA-->>SS : "返回热门词"
SS-->>SC : "返回热门词"
SC-->>FE : "返回热门词"
图表来源
继续播放与播放时长分析
结合 BookChapter 的音频时长,可做章节完成度与整体阅读进度画像
classDiagram
class PlayRecord {
+int id
+int userId
+int chapterId
+float progress
+float duration
+datetime createdAt
+datetime updatedAt
}
class User {
+int id
+string phone
+string openid
+int memberLevel
+int dailyUsage
+string lastUsageDate
+int usedAudioMinutes
}
class BookChapter {
+int id
+int bookId
+int parentId
+int level
+int number
+string title
+string audioUrl
+int audioDuration
}
PlayRecord --> User : "属于用户"
PlayRecord --> BookChapter : "属于章节"
图表来源
章节来源
搜索统计实现
获取热门搜索与用户历史接口分别提供排行榜与个性化建议
flowchart TD
Start(["开始搜索"]) --> SaveHistory["保存搜索历史"]
SaveHistory --> Dedup["删除同用户同关键词旧记录"]
Dedup --> InsertNew["插入新历史记录"]
InsertNew --> LimitCheck{"历史数量是否超过上限?"}
LimitCheck --> |是| TrimOld["删除最旧的历史记录"]
LimitCheck --> |否| UpdateHot["更新热门搜索计数"]
TrimOld --> UpdateHot
UpdateHot --> GetHot["获取热门搜索排行"]
GetHot --> ReturnHot["返回热门搜索列表"]
图表来源
章节来源
章节来源
外部依赖
前端通过 HTTP 请求调用后端 API,实现搜索与播放统计的前后端联动
graph LR
FE["前端搜索页<br/>index.vue"] --> API_Search["搜索API<br/>GET /api/search/*"]
FE --> API_Player["播放API<br/>GET/POST /api/player/*"]
API_Search --> SCtrl["search.controller.ts"]
API_Player --> PCtrl["player.controller.ts"]
SCtrl --> SService["search.service.ts"]
PCtrl --> PService["player.service.ts"]
SService --> Prisma["models/index.ts"]
PService --> Prisma
Prisma --> DB["MySQL"]
图表来源
章节来源
[本节为通用性能建议,不直接分析具体文件]
章节来源
本项目通过 PlayRecord、SearchHistory、HotSearch、UserPreference 四个核心模型,构建了完整的使用统计体系:
配合清晰的控制器与服务层分离、完善的索引策略与前端缓存机制,能够满足高并发下的统计需求,并为后续的用户行为画像与内容推荐打下坚实基础。
[本节为总结性内容,不直接分析具体文件]
章节来源
章节来源
章节来源
[本节为概念性建议,不直接分析具体文件]