消息功能实现说明.md 7.6 KB

消息功能实现说明

功能概述

实现了消息记录功能,当用户点赞评论或发表评论时,会自动创建消息记录,用户可以在消息页面查看相关的点赞和评论消息。

数据库设计

消息表 (messages)

创建数据库表:

# 执行数据库脚本
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)

响应示例

{
  "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(必填)

响应示例

{
  "code": 200,
  "data": 5
}

3. 标记消息为已读

接口地址PUT /api/message/read/{id}

响应示例

{
  "code": 200,
  "message": "标记成功"
}

4. 批量标记所有消息为已读

接口地址PUT /api/message/read-all

请求参数

  • userId: 用户ID(必填)

响应示例

{
  "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. 创建数据库表

    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() 方法中添加:

// 创建评论消息:给书籍作者发送消息
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. 回复功能(可选)

如果实现回复功能,可以在回复时创建消息:

messageService.createMessage(
    targetCommentUserId,  // 接收消息的用户(被回复的评论作者)
    userId,               // 发送消息的用户(回复者)
    "reply",              // 消息类型:回复
    commentId,            // 关联ID:评论ID
    "comment",            // 关联类型:评论
    replyContent          // 消息内容:回复内容
);

3. 消息跳转功能

当前消息点击后只显示提示,可以扩展为:

  • 点赞消息:跳转到书籍详情页,定位到对应评论
  • 评论消息:跳转到书籍详情页
  • 回复消息:跳转到书籍详情页,定位到对应评论

常见问题

Q: 为什么点赞后没有收到消息?

A: 检查以下几点:

  1. 数据库表是否已创建
  2. 后端服务是否正常运行
  3. 是否是自己给自己点赞(自己给自己点赞不会创建消息)
  4. 查看后端日志是否有错误信息

Q: 如何清除所有消息?

A: 可以通过数据库直接删除:

DELETE FROM messages WHERE user_id = ?;

或者扩展API接口实现清除功能。

Q: 消息太多会影响性能吗?

A: 建议:

  1. 定期清理旧消息(如保留最近30天)
  2. 使用分页加载
  3. 添加消息归档功能