实现了消息记录功能,当用户点赞评论或发表评论时,会自动创建消息记录,用户可以在消息页面查看相关的点赞和评论消息。
创建数据库表:
# 执行数据库脚本
mysql -u root -p books_db < book/src/main/resources/db/messages_schema.sql
表结构说明:
id: 消息ID(主键)user_id: 接收消息的用户ID(被点赞或评论的用户)from_user_id: 发送消息的用户ID(点赞或评论的用户)type: 消息类型(like-点赞评论,comment-评论书籍,reply-回复评论)related_id: 关联ID(评论ID或书籍ID)related_type: 关联类型(comment-评论,book-书籍)content: 消息内容(评论内容或回复内容)is_read: 是否已读(0-未读,1-已读)created_at: 创建时间updated_at: 更新时间Message.java - 消息实体类MessageMapper.java - Mapper接口MessageMapper.xml - MyBatis映射文件MessageService.java - 消息服务类CommentService.java - 已修改,在点赞时创建消息MessageController.java - 消息控制器接口地址:GET /api/message/list
请求参数:
userId: 用户ID(必填)isRead: 是否已读(0-未读,1-已读,不传则查询全部)type: 消息类型(like/comment/reply,不传则查询全部)page: 页码(默认1)size: 每页数量(默认20)响应示例:
{
"code": 200,
"data": {
"list": [
{
"id": 1,
"sender": "用户名",
"avatar": "头像URL",
"time": "08-13 10:30",
"actionIcon": "👍",
"actionText": "赞了你的评论",
"comment": "评论内容",
"type": "like",
"relatedId": 1,
"relatedType": "comment",
"isRead": 0
}
],
"total": 10,
"page": 1,
"size": 20
}
}
接口地址:GET /api/message/unread-count
请求参数:
userId: 用户ID(必填)响应示例:
{
"code": 200,
"data": 5
}
接口地址:PUT /api/message/read/{id}
响应示例:
{
"code": 200,
"message": "标记成功"
}
接口地址:PUT /api/message/read-all
请求参数:
userId: 用户ID(必填)响应示例:
{
"code": 200,
"message": "全部标记成功"
}
在 books/utils/api.js 中添加了以下函数:
getMessages(userId, isRead, type, page, size) - 获取消息列表getUnreadMessageCount(userId) - 获取未读消息数量markMessageAsRead(id) - 标记消息为已读markAllMessagesAsRead(userId) - 批量标记所有消息为已读books/pages/messages/messages.vue - 消息页面
功能特性:
当用户点赞评论时,系统会自动:
代码位置:CommentService.toggleLike() 方法
创建数据库表:
mysql -u root -p books_db < book/src/main/resources/db/messages_schema.sql
启动后端服务
测试点赞功能:
测试消息查询:
自动创建消息:
消息去重:
评论消息:
CommentService.addComment() 方法中添加消息创建逻辑回复功能:
在 CommentService.addComment() 方法中添加:
// 创建评论消息:给书籍作者发送消息
Book book = bookMapper.selectById(bookId);
if (book != null && book.getAuthorId() != null) {
try {
messageService.createMessage(
book.getAuthorId(), // 接收消息的用户(书籍作者)
userId, // 发送消息的用户(评论者)
"comment", // 消息类型:评论
bookId, // 关联ID:书籍ID
"book", // 关联类型:书籍
content // 消息内容:评论内容
);
} catch (Exception e) {
e.printStackTrace();
}
}
如果实现回复功能,可以在回复时创建消息:
messageService.createMessage(
targetCommentUserId, // 接收消息的用户(被回复的评论作者)
userId, // 发送消息的用户(回复者)
"reply", // 消息类型:回复
commentId, // 关联ID:评论ID
"comment", // 关联类型:评论
replyContent // 消息内容:回复内容
);
当前消息点击后只显示提示,可以扩展为:
A: 检查以下几点:
A: 可以通过数据库直接删除:
DELETE FROM messages WHERE user_id = ?;
或者扩展API接口实现清除功能。
A: 建议: