# 消息功能实现说明 ## 功能概述 实现了消息记录功能,当用户点赞评论或发表评论时,会自动创建消息记录,用户可以在消息页面查看相关的点赞和评论消息。 ## 数据库设计 ### 消息表 (messages) 创建数据库表: ```bash # 执行数据库脚本 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`: 更新时间 ## 后端实现 ### 1. 实体类 - `Message.java` - 消息实体类 ### 2. Mapper - `MessageMapper.java` - Mapper接口 - `MessageMapper.xml` - MyBatis映射文件 ### 3. Service - `MessageService.java` - 消息服务类 - `CommentService.java` - 已修改,在点赞时创建消息 ### 4. Controller - `MessageController.java` - 消息控制器 ## API接口 ### 1. 获取消息列表 **接口地址**:`GET /api/message/list` **请求参数**: - `userId`: 用户ID(必填) - `isRead`: 是否已读(0-未读,1-已读,不传则查询全部) - `type`: 消息类型(like/comment/reply,不传则查询全部) - `page`: 页码(默认1) - `size`: 每页数量(默认20) **响应示例**: ```json { "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 } } ``` ### 2. 获取未读消息数量 **接口地址**:`GET /api/message/unread-count` **请求参数**: - `userId`: 用户ID(必填) **响应示例**: ```json { "code": 200, "data": 5 } ``` ### 3. 标记消息为已读 **接口地址**:`PUT /api/message/read/{id}` **响应示例**: ```json { "code": 200, "message": "标记成功" } ``` ### 4. 批量标记所有消息为已读 **接口地址**:`PUT /api/message/read-all` **请求参数**: - `userId`: 用户ID(必填) **响应示例**: ```json { "code": 200, "message": "全部标记成功" } ``` ## 前端实现 ### 1. API函数 在 `books/utils/api.js` 中添加了以下函数: - `getMessages(userId, isRead, type, page, size)` - 获取消息列表 - `getUnreadMessageCount(userId)` - 获取未读消息数量 - `markMessageAsRead(id)` - 标记消息为已读 - `markAllMessagesAsRead(userId)` - 批量标记所有消息为已读 ### 2. 页面 `books/pages/messages/messages.vue` - 消息页面 **功能特性**: - 从后端API加载消息列表 - 显示发送者头像、昵称、操作类型、评论内容、时间 - 支持下拉刷新和上拉加载更多 - 点击消息标记为已读 - 根据消息类型显示不同的操作图标和文本 ## 消息类型说明 ### 1. 点赞消息 (like) - **触发时机**:用户点赞评论时 - **接收者**:被点赞的评论作者 - **显示文本**:"赞了你的评论" - **图标**:👍 ### 2. 评论消息 (comment) - **触发时机**:用户评论书籍时(可扩展) - **接收者**:书籍作者(可扩展) - **显示文本**:"评论了你的书籍" - **图标**:💬 ### 3. 回复消息 (reply) - **触发时机**:用户回复评论时(可扩展) - **接收者**:被回复的评论作者(可扩展) - **显示文本**:"回复了你的评论" - **图标**:💬 ## 自动创建消息 ### 点赞时自动创建消息 当用户点赞评论时,系统会自动: 1. 查找被点赞的评论 2. 获取评论的作者ID 3. 创建点赞消息给评论作者 4. 消息包含评论内容,方便查看上下文 **代码位置**:`CommentService.toggleLike()` 方法 ## 使用说明 ### 用户端 1. 打开消息页面 2. 查看收到的点赞和评论消息 3. 点击消息可以标记为已读 4. 下拉刷新获取最新消息 5. 上拉加载更多历史消息 ### 测试步骤 1. **创建数据库表**: ```bash mysql -u root -p books_db < book/src/main/resources/db/messages_schema.sql ``` 2. **启动后端服务** 3. **测试点赞功能**: - 用户A评论某本书 - 用户B点赞用户A的评论 - 用户A的消息页面应该显示用户B点赞的消息 4. **测试消息查询**: - 在小程序中打开消息页面 - 应该能看到相关的点赞和评论消息 ## 注意事项 1. **自动创建消息**: - 点赞时会自动创建消息 - 如果发送者和接收者是同一人,不会创建消息 - 消息创建失败不会影响点赞功能 2. **消息去重**: - 当前版本同一个操作会创建多条消息 - 如果多次点赞同一条评论,会创建多条消息(这是正常行为) 3. **评论消息**: - 当前版本评论书籍时不会创建消息 - 如果需要,可以在 `CommentService.addComment()` 方法中添加消息创建逻辑 4. **回复功能**: - 当前版本没有回复功能 - 如果将来实现回复功能,可以在回复时创建消息 ## 后续扩展 ### 1. 评论时创建消息(可选) 在 `CommentService.addComment()` 方法中添加: ```java // 创建评论消息:给书籍作者发送消息 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(); } } ``` ### 2. 回复功能(可选) 如果实现回复功能,可以在回复时创建消息: ```java messageService.createMessage( targetCommentUserId, // 接收消息的用户(被回复的评论作者) userId, // 发送消息的用户(回复者) "reply", // 消息类型:回复 commentId, // 关联ID:评论ID "comment", // 关联类型:评论 replyContent // 消息内容:回复内容 ); ``` ### 3. 消息跳转功能 当前消息点击后只显示提示,可以扩展为: - 点赞消息:跳转到书籍详情页,定位到对应评论 - 评论消息:跳转到书籍详情页 - 回复消息:跳转到书籍详情页,定位到对应评论 ## 常见问题 ### Q: 为什么点赞后没有收到消息? A: 检查以下几点: 1. 数据库表是否已创建 2. 后端服务是否正常运行 3. 是否是自己给自己点赞(自己给自己点赞不会创建消息) 4. 查看后端日志是否有错误信息 ### Q: 如何清除所有消息? A: 可以通过数据库直接删除: ```sql DELETE FROM messages WHERE user_id = ?; ``` 或者扩展API接口实现清除功能。 ### Q: 消息太多会影响性能吗? A: 建议: 1. 定期清理旧消息(如保留最近30天) 2. 使用分页加载 3. 添加消息归档功能