# 评论数据模型 **本文引用的文件** - [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) - [app.ts](file://server/src/app.ts) - [index.ts](file://server/src/models/index.ts) - [security.ts](file://server/src/middleware/security.ts) - [API.md](file://docs/API.md) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 引言 本文件面向AI有声书生成平台的评论功能,提供评论数据模型的权威说明。重点涵盖Comment模型字段定义、与User和BookChapter的多对一关系、当前实现的评论读取与发表能力、以及在内容发现与质量评估中的作用。由于当前仓库中未实现评论删除、回复、审核与评分统计等高级功能,本文将基于现有代码进行准确描述,并在“概念性概述”部分给出扩展建议。 ## 项目结构 评论功能位于后端服务的独立模块中,采用Koa路由+Prisma ORM的典型分层结构: - 控制器层:负责HTTP路由与请求响应包装 - 服务层:封装业务逻辑与数据访问 - 数据模型:基于Prisma Schema定义实体关系 - 应用入口:注册路由并启动服务 ```mermaid graph TB subgraph "应用入口" APP["app.ts
注册路由与中间件"] end subgraph "评论模块" CTRL["comments.controller.ts
路由与控制器"] SVC["comments.service.ts
业务与数据访问"] PRISMA["schema.prisma
Comment/User/BookChapter 关系"] end APP --> CTRL CTRL --> SVC SVC --> PRISMA ``` 图表来源 - [app.ts:99-129](file://server/src/app.ts#L99-L129) - [comments.controller.ts:1-59](file://server/src/modules/comments/comments.controller.ts#L1-L59) - [comments.service.ts:1-33](file://server/src/modules/comments/comments.service.ts#L1-L33) - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) 章节来源 - [app.ts:99-129](file://server/src/app.ts#L99-L129) - [comments.controller.ts:1-59](file://server/src/modules/comments/comments.controller.ts#L1-L59) - [comments.service.ts:1-33](file://server/src/modules/comments/comments.service.ts#L1-L33) - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) ## 核心组件 - Comment模型:承载章节评论的文本内容、评分、创建时间,并与User和BookChapter建立多对一关系 - CommentsService:提供按章节查询评论列表、新增评论的业务方法 - CommentsController:提供HTTP接口,封装请求参数校验与响应格式 章节来源 - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) - [comments.service.ts:6-30](file://server/src/modules/comments/comments.service.ts#L6-L30) - [comments.controller.ts:13-56](file://server/src/modules/comments/comments.controller.ts#L13-L56) ## 架构总览 评论功能的调用链路如下: ```mermaid sequenceDiagram participant Client as "客户端" participant Router as "CommentsController" participant Service as "CommentsService" participant DB as "Prisma Client" Client->>Router : "GET /api/comments/ : chapterId" Router->>Service : "getCommentsByChapterId(chapterId)" Service->>DB : "findMany(where : { chapterId }, orderBy : { createdAt : desc })" DB-->>Service : "评论数组" Service-->>Router : "评论数组" Router-->>Client : "{ code : 0, data : comments }" Client->>Router : "POST /api/comments { chapterId, content, rating }" Router->>Service : "addComment(userId, chapterId, content, rating)" Service->>DB : "create({ userId, chapterId, content, rating })" DB-->>Service : "新建评论" Service-->>Router : "新建评论" Router-->>Client : "{ code : 0, data : comment }" ``` 图表来源 - [comments.controller.ts:13-56](file://server/src/modules/comments/comments.controller.ts#L13-L56) - [comments.service.ts:10-29](file://server/src/modules/comments/comments.service.ts#L10-L29) - [index.ts:1-15](file://server/src/models/index.ts#L1-L15) ## 详细组件分析 ### Comment模型字段定义与关系 - 字段说明 - id:自增主键 - userId:外键,关联User.id - chapterId:外键,关联BookChapter.id - content:文本内容,支持长文本 - rating:整型评分 - createdAt:创建时间,默认当前时间 - 关系 - belongsTo User:每个评论属于一个用户 - belongsTo BookChapter:每个评论属于一个章节 - 索引 - 在chapterId与userId上建立索引,以提升查询与关联性能 ```mermaid erDiagram USER { int id PK string phone string openid string nickname string avatar } BOOKCHAPTER { int id PK int bookId int parentId int level int number string title } COMMENT { int id PK int userId FK int chapterId FK text content int rating datetime createdAt } USER ||--o{ COMMENT : "拥有" BOOKCHAPTER ||--o{ COMMENT : "被评论" ``` 图表来源 - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) - [schema.prisma:10-38](file://server/prisma/schema.prisma#L10-L38) - [schema.prisma:161-192](file://server/prisma/schema.prisma#L161-L192) 章节来源 - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) ### CommentsService:数据访问与业务逻辑 - 查询章节评论 - 输入:chapterId - 行为:按创建时间倒序返回该章节的所有评论 - 新增评论 - 输入:userId、chapterId、content、rating - 行为:创建一条新的评论记录 ```mermaid classDiagram class CommentsService { +getCommentsByChapterId(chapterId) Promise~Comment[]~ +addComment(userId, chapterId, content, rating) Promise~Comment~ } class PrismaClient { +comment } CommentsService --> PrismaClient : "使用" ``` 图表来源 - [comments.service.ts:6-30](file://server/src/modules/comments/comments.service.ts#L6-L30) - [index.ts:1-15](file://server/src/models/index.ts#L1-L15) 章节来源 - [comments.service.ts:6-30](file://server/src/modules/comments/comments.service.ts#L6-L30) ### CommentsController:HTTP接口与响应包装 - GET /api/comments/:chapterId - 功能:按章节ID获取评论列表 - 响应:统一格式,data为评论数组 - POST /api/comments - 功能:发表评论 - 请求体:chapterId、content、rating - 响应:统一格式,data为新建评论 ```mermaid flowchart TD Start(["请求进入"]) --> Parse["解析路径参数/请求体"] Parse --> Validate{"参数有效?"} Validate --> |否| ErrorResp["返回错误响应"] Validate --> |是| CallSvc["调用 CommentsService"] CallSvc --> OkResp["返回成功响应"] ErrorResp --> End(["结束"]) OkResp --> End ``` 图表来源 - [comments.controller.ts:13-56](file://server/src/modules/comments/comments.controller.ts#L13-L56) 章节来源 - [comments.controller.ts:13-56](file://server/src/modules/comments/comments.controller.ts#L13-L56) ### 安全与输入净化 - XSS防护与SQL注入防护中间件会对请求体与查询参数进行净化与校验,降低恶意输入风险 - 敏感数据脱敏中间件会在响应阶段对敏感字段进行脱敏处理 章节来源 - [security.ts:6-102](file://server/src/middleware/security.ts#L6-L102) ### API使用示例(基于现有实现) 以下示例展示如何使用现有接口进行评论相关操作。请根据实际部署地址替换域名与端口。 - 获取章节评论 - 方法与路径:GET /api/comments/{chapterId} - 示例请求:curl -X GET http://localhost:3000/api/comments/123 - 响应结构:见统一响应格式 - 参考实现路径:[comments.controller.ts:13-29](file://server/src/modules/comments/comments.controller.ts#L13-L29) - 发表评论 - 方法与路径:POST /api/comments - 请求体字段:chapterId、content、rating - 示例请求:curl -X POST http://localhost:3000/api/comments -H "Content-Type: application/json" -d '{"chapterId":123,"content":"好内容","rating":5}' - 响应结构:见统一响应格式 - 参考实现路径:[comments.controller.ts:35-56](file://server/src/modules/comments/comments.controller.ts#L35-L56) - 统一响应格式 - 所有接口遵循统一响应格式:code、message、data - 参考文档:[API.md:488-498](file://docs/API.md#L488-L498) 章节来源 - [comments.controller.ts:13-56](file://server/src/modules/comments/comments.controller.ts#L13-L56) - [API.md:488-498](file://docs/API.md#L488-L498) ### 评论层级结构与回复机制 - 当前实现 - Comment模型未包含parentCommentId或replyTo等字段,不支持直接的回复嵌套 - 评论列表按创建时间倒序展示 - 扩展建议(概念性) - 新增字段:parentCommentId、rootCommentId、level、threadId等,以支持树形回复 - 新增接口:按threadId查询回复树、按rootCommentId分页查询 - 新增权限控制:仅作者可删除自己的评论;管理员可删除违规评论 [本节为概念性扩展说明,不对应具体源码,故无章节来源] ### 评论审核流程、内容过滤与评分统计 - 当前实现 - 未实现评论审核流程、内容过滤与评分统计 - 扩展建议(概念性) - 审核流程:新增status字段(如pending、approved、rejected),配合后台审核接口 - 内容过滤:集成敏感词检测服务,在新增评论时进行拦截或标记 - 评分统计:为BookChapter维护avgRating与ratingCount,按章节聚合统计 [本节为概念性扩展说明,不对应具体源码,故无章节来源] ## 依赖分析 - 控制器依赖服务:CommentsController依赖CommentsService执行业务逻辑 - 服务依赖ORM:CommentsService通过Prisma Client访问数据库 - 应用入口依赖控制器:app.ts注册评论路由 ```mermaid graph LR CTRL["comments.controller.ts"] --> SVC["comments.service.ts"] SVC --> PRISMA["schema.prisma"] APP["app.ts"] --> CTRL ``` 图表来源 - [app.ts:99-129](file://server/src/app.ts#L99-L129) - [comments.controller.ts:1-59](file://server/src/modules/comments/comments.controller.ts#L1-L59) - [comments.service.ts:1-33](file://server/src/modules/comments/comments.service.ts#L1-L33) - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) 章节来源 - [app.ts:99-129](file://server/src/app.ts#L99-L129) - [comments.controller.ts:1-59](file://server/src/modules/comments/comments.controller.ts#L1-L59) - [comments.service.ts:1-33](file://server/src/modules/comments/comments.service.ts#L1-L33) - [schema.prisma:107-119](file://server/prisma/schema.prisma#L107-L119) ## 性能考量 - 查询性能 - 在Comment的chapterId与userId上已建立索引,有利于按章节查询与用户评论聚合 - 写入性能 - 新增评论为单条写入,开销较小 - 缓存策略(概念性) - 章节评论列表可按章节ID进行缓存,设置合理TTL - 评论总数与平均评分可缓存,异步更新 - 安全前置 - XSS与SQL注入防护中间件在进入业务逻辑前进行净化,降低数据库压力与风险 章节来源 - [schema.prisma:117-118](file://server/prisma/schema.prisma#L117-L118) - [security.ts:6-102](file://server/src/middleware/security.ts#L6-L102) ## 故障排查指南 - 常见错误 - 参数错误:请求体或路径参数缺失导致400错误 - 数据库连接失败:Prisma初始化异常 - 排查步骤 - 检查路由注册是否正确:确认/app/comments路由已挂载 - 检查数据库连接:确认Prisma连接成功 - 检查请求格式:确保Content-Type为application/json且字段齐全 - 相关实现参考 - 路由注册:[app.ts:109](file://server/src/app.ts#L109) - 数据库连接:[index.ts:5-13](file://server/src/models/index.ts#L5-L13) - 控制器错误处理:[comments.controller.ts:23-28](file://server/src/modules/comments/comments.controller.ts#L23-L28) 章节来源 - [app.ts:109](file://server/src/app.ts#L109) - [index.ts:5-13](file://server/src/models/index.ts#L5-L13) - [comments.controller.ts:23-28](file://server/src/modules/comments/comments.controller.ts#L23-L28) ## 结论 当前评论功能实现了基础的“按章节读取评论列表”和“发表评论”能力,具备清晰的数据模型与安全前置防护。若需支持回复、审核、内容过滤与评分统计等高级特性,可在现有基础上扩展模型字段与服务方法,并完善前端交互与后台管理界面。 ## 附录 - 统一响应格式 - 所有接口遵循统一响应格式:code、message、data - 参考文档:[API.md:488-498](file://docs/API.md#L488-L498)