本文引用的文件
本文件为评论系统的开发文档,面向后端工程师与产品/测试同学,系统性阐述评论模块的架构设计、数据模型、业务流程、API 接口、安全机制与性能优化策略。当前仓库中评论模块已具备基础能力:按章节获取评论列表、发布评论;尚未包含子评论/回复、评论树结构、内容审核、举报处理等高级能力。本文在现有实现基础上,给出扩展建议与最佳实践,帮助团队在不破坏现有架构的前提下逐步完善评论系统。
评论模块位于后端服务的模块化目录下,采用“控制器-服务-数据层”的分层设计,配合全局中间件实现安全与性能保障。
graph TB
subgraph "应用入口"
APP["app.ts<br/>注册路由/中间件"]
end
subgraph "评论模块"
CTRL["comments.controller.ts<br/>路由定义"]
SVC["comments.service.ts<br/>业务逻辑"]
PRISMA["prisma/schema.prisma<br/>数据模型"]
MODELS["models/index.ts<br/>Prisma 客户端"]
end
subgraph "安全与性能"
SEC["middleware/security.ts<br/>XSS/SQL注入防护"]
RL["middleware/rate-limiter.ts<br/>限流中间件"]
end
APP --> CTRL
CTRL --> SVC
SVC --> MODELS
MODELS --> PRISMA
APP --> SEC
APP --> RL
图表来源
章节来源
章节来源
评论系统采用典型的三层架构:HTTP 层(Koa 路由)、业务层(服务类)、数据层(Prisma)。请求从控制器进入,经服务层处理后访问数据库,返回统一格式的响应。
sequenceDiagram
participant C as "客户端"
participant R as "路由控制器<br/>comments.controller.ts"
participant S as "服务层<br/>comments.service.ts"
participant M as "Prisma 客户端<br/>models/index.ts"
participant D as "数据库"
C->>R : "GET /api/comments/ : chapterId"
R->>S : "getCommentsByChapterId(chapterId)"
S->>M : "comment.findMany(where, orderBy)"
M->>D : "执行查询"
D-->>M : "返回结果"
M-->>S : "评论列表"
S-->>R : "评论列表"
R-->>C : "统一响应"
Note over C,R : "POST /api/comments 发布评论流程类似"
图表来源
评论模型与用户、章节存在明确的一对多关系,索引覆盖了常用查询维度,便于后续扩展。
erDiagram
USER {
int id PK
string phone
string openid
string nickname
string avatar
int memberLevel
datetime createdAt
datetime updatedAt
}
BOOKCHAPTER {
int id PK
int bookId
int parentId
int level
int number
string title
int estimatedWords
int audioDuration
boolean isPublic
string genStage
datetime createdAt
datetime updatedAt
}
COMMENT {
int id PK
int userId
int chapterId
text content
int rating
datetime createdAt
}
USER ||--o{ COMMENT : "发表"
BOOKCHAPTER ||--o{ COMMENT : "承载"
图表来源
章节来源
服务层:封装评论查询与新增逻辑,直接使用 Prisma 客户端。
classDiagram
class CommentsController {
+GET /api/comments/ : chapterId
+POST /api/comments
}
class CommentsService {
+getCommentsByChapterId(chapterId)
+addComment(userId, chapterId, content, rating)
}
class PrismaClient {
+comment.findMany()
+comment.create()
}
CommentsController --> CommentsService : "调用"
CommentsService --> PrismaClient : "使用"
图表来源
章节来源
注:当前实现中,发布评论使用固定测试用户 ID,实际部署需结合鉴权中间件替换为真实用户上下文。
章节来源
限流策略:提供内存/Redis 双栈限流器,支持全局 API、登录、短信、TTS、上传等场景。
flowchart TD
Start(["请求进入"]) --> XSS["XSS 防护<br/>sanitizeObject()"]
XSS --> SQL["SQL 注入检测<br/>detectSQLInjection()"]
SQL --> OK{"是否通过校验"}
OK --> |否| Reject["返回 400 非法字符"]
OK --> |是| Rate["限流检查<br/>createRateLimiter()"]
Rate --> Pass["继续处理业务"]
Reject --> End(["结束"])
Pass --> End
图表来源
章节来源
章节来源
限流中间件可选择 Redis 或内存实现,自动降级。
graph LR
CTRL["comments.controller.ts"] --> SVC["comments.service.ts"]
SVC --> MODELS["models/index.ts"]
MODELS --> PRISMA["prisma/schema.prisma"]
APP["app.ts"] --> CTRL
APP --> SEC["middleware/security.ts"]
APP --> RL["middleware/rate-limiter.ts"]
图表来源
章节来源
[本节为通用性能建议,无需特定文件引用]
章节来源
当前评论模块已完成基础能力:按章节获取评论与发布评论。建议在下一阶段引入子评论/回复、内容审核、举报处理与统计排序等功能,同时完善鉴权与限流策略,确保系统在高并发与复杂业务下的稳定性与安全性。
[本节为总结性内容,无需特定文件引用]
章节来源
章节来源