# 交互数据模型 **本文档引用的文件** - [schema.prisma](file://server/prisma/schema.prisma) - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [favorites.service.ts](file://server/src/modules/favorites/favorites.service.ts) - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [comments.service.ts](file://server/src/modules/comments/comments.service.ts) - [player.service.ts](file://server/src/modules/player/player.service.ts) - [search.controller.ts](file://server/src/modules/search/search.controller.ts) - [search.service.ts](file://server/src/modules/search/search.service.ts) - [history.controller.ts](file://server/src/modules/history/history.controller.ts) - [index.vue(收藏页面)](file://my-uniapp-vue3/src/pages/favorites/index.vue) - [index.vue(历史页面)](file://my-uniapp-vue3/src/pages/history/index.vue) - [index.vue(搜索页面)](file://my-uniapp-vue3/src/pages/search/index.vue) - [6个新功能最终完成包.md](file://6个新功能最终完成包.md) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) ## 引言 本文件面向AI有声书生成平台的交互数据模型,聚焦用户行为数据的设计与实现,包括收藏管理、评论系统、播放记录、搜索历史等关键功能。文档从数据库模型出发,结合控制器与服务层实现,梳理前后端交互流程,并给出API使用示例与最佳实践,帮助开发者快速理解与扩展相关能力。 ## 项目结构 围绕交互数据模型的关键目录与文件如下: - 数据库模型定义:server/prisma/schema.prisma - 控制器层:server/src/modules/{favorites,comments,player,search,history}/ - 服务层:对应模块的service.ts - 前端页面:my-uniapp-vue3/src/pages/{favorites,history,search}/index.vue - 批量删除功能补充:6个新功能最终完成包.md ```mermaid graph TB subgraph "前端" FE_Fav["收藏页面
favorites/index.vue"] FE_Hist["历史页面
history/index.vue"] FE_Search["搜索页面
search/index.vue"] end subgraph "后端" C_Fav["收藏控制器
favorites.controller.ts"] S_Fav["收藏服务
favorites.service.ts"] C_Com["评论控制器
comments.controller.ts"] S_Com["评论服务
comments.service.ts"] S_Player["播放服务
player.service.ts"] C_Search["搜索控制器
search.controller.ts"] S_Search["搜索服务
search.service.ts"] C_Hist["历史控制器
history.controller.ts"] end DB["数据库模型
schema.prisma"] FE_Fav --> C_Fav --> S_Fav --> DB FE_Hist --> C_Hist --> DB FE_Search --> C_Search --> S_Search --> DB FE_Fav -.-> C_Com --> S_Com --> DB FE_Fav -.-> S_Player --> DB FE_Search -.-> S_Player --> DB ``` **图表来源** - [schema.prisma](file://server/prisma/schema.prisma) - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [favorites.service.ts](file://server/src/modules/favorites/favorites.service.ts) - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [comments.service.ts](file://server/src/modules/comments/comments.service.ts) - [player.service.ts](file://server/src/modules/player/player.service.ts) - [search.controller.ts](file://server/src/modules/search/search.controller.ts) - [search.service.ts](file://server/src/modules/search/search.service.ts) - [history.controller.ts](file://server/src/modules/history/history.controller.ts) **章节来源** - [schema.prisma](file://server/prisma/schema.prisma) - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [favorites.service.ts](file://server/src/modules/favorites/favorites.service.ts) - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [comments.service.ts](file://server/src/modules/comments/comments.service.ts) - [player.service.ts](file://server/src/modules/player/player.service.ts) - [search.controller.ts](file://server/src/modules/search/search.controller.ts) - [search.service.ts](file://server/src/modules/search/search.service.ts) - [history.controller.ts](file://server/src/modules/history/history.controller.ts) ## 核心组件 本节概述与交互数据模型直接相关的数据表与业务组件,以及它们在系统中的职责。 - 收藏表(Favorite) - 关联用户与书籍,支持唯一索引约束防止重复收藏,便于快速查询某用户的收藏列表与检查收藏状态。 - 评论表(Comment) - 关联用户与章节,支持按章节查询评论列表,便于在播放器或章节详情页展示用户反馈。 - 播放记录表(PlayRecord) - 记录用户对章节的播放进度与总时长,支持续播与最近播放记录展示;包含唯一索引保证同一用户对同一章节的记录唯一性。 - 搜索历史表(SearchHistory) - 记录用户搜索关键词,支持去重与上限控制,同时维护热门搜索词统计。 - 用户偏好表(UserPreference) - 存储播放速度、音质、主题、默认音色、默认音量等偏好配置,支持个性化体验。 - 历史记录表(AudioRecord) - 记录音频生成的历史,包含标题、文本、字数、语音参数、时长、大小、状态等字段,支持分页与筛选。 **章节来源** - [schema.prisma](file://server/prisma/schema.prisma) ## 架构总览 交互数据模型的架构由“前端页面 → 控制器 → 服务层 → 数据库模型”构成,各模块职责清晰、耦合度低,便于扩展与维护。 ```mermaid sequenceDiagram participant FE as "前端页面" participant CTRL as "控制器" participant SVC as "服务层" participant DB as "数据库模型" FE->>CTRL : 触发交互请求如收藏/评论/播放/搜索 CTRL->>SVC : 解析参数并调用业务方法 SVC->>DB : 查询/插入/更新/删除数据 DB-->>SVC : 返回数据结果 SVC-->>CTRL : 格式化响应数据 CTRL-->>FE : 返回JSON响应code/message/data ``` **图表来源** - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [favorites.service.ts](file://server/src/modules/favorites/favorites.service.ts) - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [comments.service.ts](file://server/src/modules/comments/comments.service.ts) - [player.service.ts](file://server/src/modules/player/player.service.ts) - [search.controller.ts](file://server/src/modules/search/search.controller.ts) - [search.service.ts](file://server/src/modules/search/search.service.ts) - [history.controller.ts](file://server/src/modules/history/history.controller.ts) ## 详细组件分析 ### 收藏模型(Favorite) - 数据结构要点 - 唯一索引:用户ID与书籍ID组合唯一,避免重复收藏。 - 关系:与User、Book双向关联,便于查询用户收藏列表与书籍详情。 - 业务流程 - 添加收藏:若不存在则创建,存在则返回现有记录。 - 取消收藏:根据唯一键删除。 - 检查收藏:查询唯一键是否存在。 - 前端交互 - 收藏页面展示收藏列表,支持取消收藏并实时更新UI。 - 播放器页面可显示收藏状态并提供收藏/取消操作入口。 ```mermaid sequenceDiagram participant FE as "前端收藏页面" participant CTRL as "收藏控制器" participant SVC as "收藏服务" participant DB as "数据库(Favorite)" FE->>CTRL : POST /api/favorites传入audioId CTRL->>SVC : addFavorite(userId, audioId) SVC->>DB : upsert唯一键:userId+bookId DB-->>SVC : 返回收藏记录 SVC-->>CTRL : 格式化数据 CTRL-->>FE : {code,message,data} ``` **图表来源** - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [favorites.service.ts](file://server/src/modules/favorites/favorites.service.ts) **章节来源** - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [favorites.service.ts](file://server/src/modules/favorites/favorites.service.ts) - [schema.prisma](file://server/prisma/schema.prisma) - [index.vue(收藏页面)](file://my-uniapp-vue3/src/pages/favorites/index.vue) ### 评论模型(Comment) - 数据结构要点 - 关联章节与用户,支持按章节ID查询评论列表。 - 评分字段用于展示星级评价。 - 业务流程 - 获取评论:按章节ID降序返回评论列表。 - 发表评论:校验参数后创建评论记录。 ```mermaid sequenceDiagram participant FE as "前端播放器/章节详情" participant CTRL as "评论控制器" participant SVC as "评论服务" participant DB as "数据库(Comment)" FE->>CTRL : GET /api/comments/ : chapterId CTRL->>SVC : getCommentsByChapterId(chapterId) SVC->>DB : findMany(where : { chapterId }) DB-->>SVC : 返回评论列表 SVC-->>CTRL : 格式化数据 CTRL-->>FE : {code,message,data} FE->>CTRL : POST /api/commentscontent,rating CTRL->>SVC : addComment(userId, chapterId, content, rating) SVC->>DB : create(comment) DB-->>SVC : 返回新建评论 SVC-->>CTRL : 格式化数据 CTRL-->>FE : {code,message,data} ``` **图表来源** - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [comments.service.ts](file://server/src/modules/comments/comments.service.ts) **章节来源** - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [comments.service.ts](file://server/src/modules/comments/comments.service.ts) - [schema.prisma](file://server/prisma/schema.prisma) ### 播放记录模型(PlayRecord) - 数据结构要点 - 唯一索引:用户ID与章节ID组合唯一,确保同一用户对同一章节的播放记录唯一。 - 字段:progress(播放进度)、duration(章节总时长)。 - 业务流程 - 保存进度:使用upsert语义,不存在则创建,存在则更新。 - 获取进度:支持按用户或按章节查询。 - 最近播放:按更新时间倒序返回最近播放记录,计算播放进度百分比。 - 前端交互 - 播放器定时上报进度,页面切换时保存最新进度,续播时读取上次进度。 ```mermaid sequenceDiagram participant FE as "前端播放器" participant SVC as "播放服务" participant DB as "数据库(PlayRecord)" FE->>SVC : savePlayProgress(userId, chapterId, progress, duration) SVC->>DB : upsert唯一键:userId+chapterId DB-->>SVC : 返回记录 SVC-->>FE : 成功 FE->>SVC : getRecentPlayRecords(userId, limit) SVC->>DB : findMany(include chapter.book, orderBy updatedAt desc) DB-->>SVC : 返回记录列表 SVC-->>FE : 格式化进度百分比 ``` **图表来源** - [player.service.ts](file://server/src/modules/player/player.service.ts) **章节来源** - [player.service.ts](file://server/src/modules/player/player.service.ts) - [schema.prisma](file://server/prisma/schema.prisma) ### 搜索历史模型(SearchHistory) - 数据结构要点 - 用户ID与关键词组合,支持去重与上限控制(最多20条)。 - 热门搜索词表(HotSearch)用于统计搜索热度。 - 业务流程 - 保存历史:删除同用户同关键词旧记录,插入新记录,并维护热门搜索词计数。 - 获取历史:按用户ID与时间倒序返回,去重保留最新一条。 - 删除历史:支持单条删除与清空。 ```mermaid flowchart TD Start(["保存搜索历史"]) --> Trim["去除空白字符"] Trim --> Exists{"是否存在同用户同关键词记录?"} Exists --> |是| DeleteOld["删除旧记录"] Exists --> |否| SkipDelete["跳过删除"] DeleteOld --> InsertNew["插入新记录"] SkipDelete --> InsertNew InsertNew --> LimitCheck{"历史总数是否超过20条?"} LimitCheck --> |是| DeleteExtra["删除最旧记录"] LimitCheck --> |否| KeepAll["保留全部"] DeleteExtra --> UpdateHot["更新热门搜索词计数"] KeepAll --> UpdateHot UpdateHot --> End(["完成"]) ``` **图表来源** - [search.service.ts](file://server/src/modules/search/search.service.ts) **章节来源** - [search.controller.ts](file://server/src/modules/search/search.controller.ts) - [search.service.ts](file://server/src/modules/search/search.service.ts) - [schema.prisma](file://server/prisma/schema.prisma) - [index.vue(搜索页面)](file://my-uniapp-vue3/src/pages/search/index.vue) ### 历史记录模型(AudioRecord) - 数据结构要点 - 记录音频生成的元数据:标题、文本、字数、语音参数、时长、大小、状态等。 - 支持按用户、按时间段筛选与分页。 - 业务流程 - 获取历史:支持按起始日期筛选,返回分页数据。 - 批量删除:新增批量删除接口,支持按ID集合删除。 ```mermaid sequenceDiagram participant FE as "前端历史页面" participant CTRL as "历史控制器" participant DB as "数据库(AudioRecord)" FE->>CTRL : GET /api/history?page&pageSize&startDate CTRL->>DB : findMany(where : { createdAt >= startDate }, orderBy : createdAt desc) DB-->>CTRL : 返回记录与总数 CTRL-->>FE : {code,message,{list,total,page,pageSize,totalPages}} ``` **图表来源** - [history.controller.ts](file://server/src/modules/history/history.controller.ts) **章节来源** - [history.controller.ts](file://server/src/modules/history/history.controller.ts) - [6个新功能最终完成包.md](file://6个新功能最终完成包.md) - [schema.prisma](file://server/prisma/schema.prisma) - [index.vue(历史页面)](file://my-uniapp-vue3/src/pages/history/index.vue) ## 依赖分析 - 表间关系 - User ↔ Favorite/Comment/PlayRecord:一对多关系,用户通过外键关联各类交互记录。 - Book ↔ Favorite:书籍与收藏的多对一关系,收藏指向具体书籍。 - BookChapter ↔ Comment/PlayRecord:章节与评论、播放记录的多对一关系。 - SearchHistory/HotSearch:独立表,分别记录用户搜索历史与热门搜索词。 - 前后端依赖 - 前端页面通过HTTP请求与后端控制器交互,控制器调用服务层,服务层访问数据库模型。 - 播放服务与搜索服务在多个页面中被复用,体现良好的模块化设计。 ```mermaid erDiagram USER ||--o{ FAVORITE : "收藏" USER ||--o{ COMMENT : "发表评论" USER ||--o{ PLAY_RECORD : "播放记录" BOOK ||--o{ FAVORITE : "被收藏" BOOKCHAPTER ||--o{ COMMENT : "被评论" BOOKCHAPTER ||--o{ PLAY_RECORD : "被播放" SEARCHHISTORY ||--|| USER : "属于" HOTSEARCH ||--|| SEARCHHISTORY : "统计" ``` **图表来源** - [schema.prisma](file://server/prisma/schema.prisma) **章节来源** - [schema.prisma](file://server/prisma/schema.prisma) ## 性能考虑 - 索引设计 - PlayRecord/Favorite/SearchHistory等高频查询字段建立索引,提升查询效率。 - 唯一索引保证数据一致性,避免重复记录。 - 分页与去重 - 历史列表与搜索历史采用分页与去重策略,降低前端渲染压力与数据库负载。 - 缓存策略 - 前端对热门搜索词进行本地缓存,减少重复请求与网络开销。 - 批量操作 - 历史记录新增批量删除接口,支持前端多选后一次性清理,提升用户体验。 **章节来源** - [search.service.ts](file://server/src/modules/search/search.service.ts) - [history.controller.ts](file://server/src/modules/history/history.controller.ts) - [6个新功能最终完成包.md](file://6个新功能最终完成包.md) - [index.vue(搜索页面)](file://my-uniapp-vue3/src/pages/search/index.vue) ## 故障排除指南 - 常见错误与处理 - 收藏/评论接口参数校验失败:控制器抛出错误并返回错误码与消息,前端需提示用户修正输入。 - 播放进度保存失败:检查用户ID与章节ID是否正确,确认唯一键约束是否冲突。 - 搜索历史为空:确认关键词非空且去除空白字符,检查去重与上限逻辑。 - 历史记录分页异常:核对分页参数与时间筛选条件,确保数据库索引有效。 - 日志与监控 - 服务层与控制器均返回统一格式的响应体,便于前端统一处理与后端日志追踪。 - 对关键操作(如收藏、评论、播放进度保存、搜索历史更新)建议增加埋点与告警。 **章节来源** - [favorites.controller.ts](file://server/src/modules/favorites/favorites.controller.ts) - [comments.controller.ts](file://server/src/modules/comments/comments.controller.ts) - [player.service.ts](file://server/src/modules/player/player.service.ts) - [search.controller.ts](file://server/src/modules/search/search.controller.ts) - [search.service.ts](file://server/src/modules/search/search.service.ts) - [history.controller.ts](file://server/src/modules/history/history.controller.ts) ## 结论 本交互数据模型围绕收藏、评论、播放记录与搜索历史四大核心功能构建,通过清晰的数据库模型、模块化的控制器与服务层以及友好的前端交互,实现了用户行为数据的采集、存储与分析。后续可在现有基础上扩展更多个性化功能(如评分反馈、搜索偏好分析、播放统计报表等),持续优化用户体验与平台运营效率。