zhibo/Zhibo/zhibo-h/直播IM系统开发指南.md

67 KiB
Raw Blame History

直播IM系统开发指南

版本: v3.7 | 更新时间: 2024年12月26日 | 维护状态: 🟢 活跃开发中

📋 目录


📖 项目概述

目标

搭建一个支持 1-5万在线用户 的直播+社交IM系统单机部署

技术栈

  • 后端框架: Spring Boot
  • 实时通信: WebSocket (Netty)
  • 数据库: MySQL 8.0
  • 缓存: Redis 6.0
  • 反向代理: Nginx
  • 开发语言: Java 8+

核心场景

  • 直播间实时弹幕(支持千人直播间)
  • 用户一对一私聊
  • 好友关系管理
  • 礼物打赏(直播间+私聊)
  • 多媒体消息(图片、语音、视频)
  • 群组聊天(创建群组、成员管理、权限管理)
  • 消息撤回2分钟内
  • 消息转发(好友、群组、批量转发)
  • 消息搜索(关键词、时间、类型)
  • 消息表情回应(点赞、爱心等)
  • 限流防刷(防止恶意刷屏)
  • 语音/视频通话WebRTC实现新增
  • ⚠️ 社交互动通知(部分完成)
  • ⚠️ 敏感词过滤(后台管理已完成,前端应用待实现)

性能目标(单机)

指标 目标值
WebSocket连接数 5万+
消息吞吐量 5000条/秒
接口响应时间 (P99) <100ms
直播间弹幕延迟 <200ms
系统可用性 99%+

🏗️ 系统架构

整体架构图

客户端 (Android/iOS/Web)
    ↓
Nginx (负载均衡 + WebSocket代理)
    ↓
Spring Boot应用
    ├── WebSocket服务 (Netty)
    ├── HTTP API服务
    ├── 消息路由服务
    └── 业务逻辑服务
    ↓
数据层
    ├── MySQL (持久化存储)
    ├── Redis (缓存 + 在线状态 + 离线消息)
    └── 文件存储 (本地/OSS)

🧩 核心模块

模块1用户认证模块

功能清单

  • 用户注册/登录
  • JWT Token生成与验证
  • Token刷新机制
  • 用户信息管理

核心类

  • LoginController - 认证接口
  • JwtUtil - JWT工具类
  • AuthService - 认证业务逻辑
  • UserService - 用户管理

模块2WebSocket连接管理模块

功能清单

  • WebSocket连接建立
  • 用户在线状态管理
  • 心跳检测30秒间隔
  • 断线重连处理
  • 连接映射维护userId → WebSocket Session

核心类

  • WebSocketConfig - WebSocket配置
  • LiveChatHandler - 直播间消息处理器
  • PrivateChatHandler - 私聊消息处理器
  • HeartbeatScheduler - 心跳检测定时任务
  • OnlineStatusService - 在线状态服务

关键流程

事件 处理逻辑
用户连接 保存连接 → 更新Redis在线状态 → 拉取离线消息
用户断开 移除连接 → 更新Redis状态 → 清理直播间在线列表
心跳超时 自动断开连接90秒超时

模块3消息路由模块

功能清单

  • 单聊消息路由(点对点)
  • 群聊消息广播(直播间)
  • 消息分发逻辑
  • 离线消息处理
  • 登录验证WebSocket连接需要Token验证2024-12-26新增

核心类

  • MessageRouter - 消息路由器内置在Handler中
  • MessageDispatcher - 消息分发器内置在Handler中
  • LiveChatHandler - 广播服务
  • OfflineMessageService - 离线消息服务
  • WebSocketAuthInterceptor - WebSocket登录验证拦截器 2024-12-26新增

登录验证机制 2024-12-26新增

  • 所有WebSocket连接都需要提供有效的Token
  • Token可以通过查询参数传递?token={token}
  • 未登录用户无法建立WebSocket连接
  • 连接建立前会验证Token的有效性
  • 验证失败会直接拒绝连接

路由策略

单聊消息:
  验证用户登录状态 → 查询接收者在线状态
  ├── 在线 → 通过WebSocket直接推送
  └── 离线 → 存入Redis离线消息队列

直播间消息:
  验证用户登录状态 → 获取房间所有在线用户Redis Set
  └── 批量异步推送(线程池处理)

数据库表结构完善 2024-12-26新增

  • LiveChat实体类添加逻辑删除字段is_deleted
  • LiveChat实体类添加更新时间字段update_time
  • LiveChat实体类添加消息类型字段message_type
  • LiveChat实体类添加5个扩展字段ext_field1-5
  • Conversation实体类添加5个扩展字段ext_field1-5
  • PrivateMessage实体类添加更新时间和5个扩展字段
  • GroupMessage实体类添加5个扩展字段
  • GroupMember实体类添加5个扩展字段
  • Group实体类添加5个扩展字段
  • 所有实体类使用@TableLogic实现逻辑删除
  • 所有实体类使用@UpdateTimestamp自动管理更新时间
  • 不创建外键,保持表独立性

扩展字段说明

  • ext_field1: 字符串类型,用于存储标签、分类等信息
  • ext_field2: 字符串或整数类型,用于存储备注、等级等信息
  • ext_field3: 字符串或整数类型,用于存储优先级、标签等信息
  • ext_field4: 长整型用于存储关联数据ID
  • ext_field5: 文本类型用于存储JSON格式的扩展数据

模块4消息存储模块

功能清单

  • 消息持久化MySQL
  • 消息缓存Redis7天TTL
  • 历史消息查询
  • 离线消息队列
  • 消息已读状态

核心类

  • LiveChatService - 消息业务逻辑
  • LiveChatDao - 消息数据访问
  • OfflineMessageService - 消息缓存服务
  • ConversationService - 会话管理

存储策略

存储层 用途 策略
MySQL 持久化存储 所有消息先存MySQL
Redis 热点缓存 7天TTL加速查询
Redis List 离线消息 最多100条7天过期
分页查询 历史消息 按时间倒序20条/页

模块5好友关系模块 (已完成)

功能:

  • 添加好友(发送申请)
  • 处理好友申请(同意/拒绝)
  • 删除好友 使用逻辑删除
  • 好友列表查询
  • 用户搜索
  • 好友在线状态
  • 更新好友备注
  • 获取未读请求数量

登录验证:

  • 所有接口都需要用户登录后才能访问
  • 由FrontTokenInterceptor拦截器统一处理
  • 未登录用户访问会返回401 UNAUTHORIZED错误
  • 所有方法都通过userService.getUserId()获取当前登录用户ID

已实现的类:

  • 实体类Entity

    • Friend - 好友关系实体支持JPA自动建表
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • FriendRequest - 好友请求实体支持JPA自动建表
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
  • DAO层Mapper

    • FriendDao - 好友关系Mapper接口
    • FriendRequestDao - 好友请求Mapper接口
    • FriendDao.xml - MyBatis映射文件
    • FriendRequestDao.xml - MyBatis映射文件
  • Service层

    • FriendService - 好友关系服务接口
    • FriendServiceImpl - 好友关系服务实现
      • 删除好友使用逻辑删除(@TableLogic自动处理
    • FriendRequestService - 好友请求服务接口
    • FriendRequestServiceImpl - 好友请求服务实现
    • FriendNotificationService - 好友通知服务接口
    • FriendNotificationServiceImpl - 好友通知服务实现
  • Controller层

    • FriendController - 好友接口(已重构为标准三层架构)
      • 搜索用户 (GET /api/front/users/search) 需要登录
      • 发送好友请求 (POST /api/front/friends/request) 需要登录
      • 获取好友请求列表 (GET /api/front/friends/requests) 需要登录
      • 处理好友请求 (POST /api/front/friends/requests/{requestId}/handle) 需要登录
      • 获取好友列表 (GET /api/front/friends) 需要登录
      • 删除好友 (DELETE /api/front/friends/{friendId}) 需要登录,使用逻辑删除
      • 更新好友备注 (PUT /api/front/friends/{friendId}/remark) 需要登录
      • 获取未读请求数量 (GET /api/front/friends/requests/unread-count) 需要登录

已完成改进:

  • 创建了完整的Service层FriendService、FriendRequestService、FriendNotificationService
  • 重构Controller移除JdbcTemplate改用Service层
  • 使用MyBatis-Plus进行数据访问
  • 实现标准三层架构Controller → Service → DAO
  • 添加JPA注解支持自动建表
  • 集成WebSocket实时通知功能
  • 完善事务管理
  • 添加详细的日志记录和异常处理
  • 所有接口都需要登录验证FrontTokenInterceptor拦截器
  • 删除功能使用逻辑删除(@TableLogic
  • 添加更新时间字段(@UpdateTimestamp自动管理
  • 预留5个扩展字段ext_field1-5
  • 不创建外键,保持表独立性

扩展字段说明:

Friend实体类扩展字段

  • ext_field1: VARCHAR(100) - 好友来源/标签(如:通过搜索添加、通过推荐添加等)
  • ext_field2: INT - 分组ID/优先级(用于好友分组功能)
  • ext_field3: VARCHAR(50) - 特殊标记/权限(如:特别关注、黑名单等)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

FriendRequest实体类扩展字段

  • ext_field1: VARCHAR(100) - 请求来源/渠道(如:扫码添加、名片分享等)
  • ext_field2: INT - 请求类型/优先级(用于区分不同类型的好友请求)
  • ext_field3: VARCHAR(200) - 拒绝原因/备注(记录拒绝好友请求的原因)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

业务流程:

  • 发送申请 → 保存申请记录 → 推送通知给对方
  • 同意申请 → 双向添加好友关系 → 推送通知 → 创建会话
  • 删除好友 → 逻辑删除好友关系is_deleted=1→ 推送通知 → 保留历史消息

数据库表:

  • eb_friend - 好友关系表 支持JPA自动创建
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_friend_request - 好友申请表 支持JPA自动创建
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

技术亮点:

  • 标准三层架构设计
  • 完整的事务管理
  • WebSocket实时通知
  • 双向好友关系自动维护
  • 支持JPA自动建表ddl-auto: update
  • 使用逻辑删除保护数据安全
  • 预留扩展字段便于功能扩展
  • 所有接口都需要登录验证

相关文档:

  • 详细开发文档:好友关系模块开发文档.md
  • 完善总结:好友模块完善总结.md
  • 快速参考:好友模块快速参考.md
  • 测试清单:好友模块测试清单.md

模块6直播间管理模块 (已完成 - 95%)

功能:

  • 进入直播间
  • 离开直播间
  • 直播间在线用户列表
  • 直播间弹幕发送
  • 直播间人数统计
  • 限流防刷 2024-12-26完成
  • 敏感词过滤 待实现 - 高优先级

已实现的类:

  • LiveRoomController - 直播间接口
  • LiveRoomService - 直播间业务逻辑
  • RoomMemberService - 房间成员管理 (内置在Handler中)
  • BarrageService - 弹幕服务 (LiveChatService)

关键功能:

  • 进入房间加入Redis Set、广播进入消息、返回房间信息
  • 发送弹幕频率限制1秒1条、敏感词过滤 、广播给所有人
  • 离开房间从Redis Set移除、广播离开消息

模块7礼物打赏模块 (已完成 - 2024-12-26)

功能:

  • 礼物列表管理
  • 直播间送礼
  • 私聊送礼
  • 礼物记录查询
  • 余额扣除与收益增加

登录验证:

  • GET /api/front/gift/list - 获取礼物列表(不需要登录)
  • GET /api/front/gift/balance - 获取用户余额(需要登录)
  • POST /api/front/gift/send - 赠送礼物(需要登录)
  • GET /api/front/gift/recharge/options - 获取充值选项(不需要登录)
  • POST /api/front/gift/recharge/create - 创建充值订单(需要登录)
  • 所有需要登录的接口都会检查用户登录状态
  • 未登录用户访问会返回"用户未登录,请先登录"提示

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • Gift - 礼物实体eb_gift
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • GiftRecord - 礼物打赏记录实体eb_gift_reward_record
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • GiftDetail - 送礼物明细实体eb_gift_detail
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • RechargeOption - 充值选项实体eb_gift_quantity
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
  • DAO层Mapper

    • GiftDao - 礼物Mapper接口
    • GiftRecordDao - 礼物记录Mapper接口
    • GiftDetailDao - 礼物明细Mapper接口
    • RechargeOptionDao - 充值选项Mapper接口
  • Service层

    • GiftService - 礼物服务接口
    • GiftServiceImpl - 礼物服务实现
    • GiftRecordService - 礼物记录服务接口
    • GiftRecordServiceImpl - 礼物记录服务实现
    • RechargeOptionService - 充值选项服务接口
    • RechargeOptionServiceImpl - 充值选项服务实现
  • Controller层

    • GiftController - 礼物接口(前端)
      • 添加详细的登录验证说明注释
      • 所有需要登录的接口都检查用户登录状态
      • 未登录返回友好的提示信息

业务流程:

  • 验证余额 → 扣除金币 → 增加收益 → 保存记录 → 生成账单 → 返回结果

数据库表:支持JPA自动创建

  • eb_gift - 礼物表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_gift_reward_record - 礼物打赏记录表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_gift_detail - 送礼物明细表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_gift_quantity - 礼物数量列表(充值选项)
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

API接口

  • GET /api/front/gift/list - 获取礼物列表 (不需要登录)
  • GET /api/front/gift/balance - 获取用户余额 (需要登录)
  • POST /api/front/gift/send - 赠送礼物 (需要登录)
  • GET /api/front/gift/recharge/options - 获取充值选项 (不需要登录)
  • POST /api/front/gift/recharge/create - 创建充值订单 (需要登录)

扩展字段说明:

Gift实体类扩展字段

  • ext_field1: VARCHAR(100) - 礼物分类/标签(如:热门礼物、节日礼物等)
  • ext_field2: INT - 礼物等级/排序(用于礼物排序和分级)
  • ext_field3: VARCHAR(50) - 特殊标记/活动标识(如:限时礼物、活动礼物等)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

GiftRecord实体类扩展字段

  • ext_field1: VARCHAR(100) - 打赏场景/来源(如:直播间打赏、私聊打赏等)
  • ext_field2: INT - 直播间ID/会话ID记录打赏发生的场景
  • ext_field3: VARCHAR(50) - 活动标识/特殊标记(如:活动期间打赏、首次打赏等)
  • ext_field4: BIGINT - 关联订单ID用于关联支付订单
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

GiftDetail实体类扩展字段

  • ext_field1: VARCHAR(100) - 送礼场景/来源(如:直播间、私聊等)
  • ext_field2: INT - 直播间ID/会话ID记录送礼发生的场景
  • ext_field3: VARCHAR(50) - 活动标识/特殊标记(如:活动期间送礼等)
  • ext_field4: BIGINT - 关联订单ID用于关联支付订单
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

RechargeOption实体类扩展字段

  • ext_field1: VARCHAR(100) - 充值类型/分类(如:普通充值、活动充值等)
  • ext_field2: INT - 赠送比例/优惠等级充值100送10
  • ext_field3: VARCHAR(50) - 活动标识/特殊标记(如:限时优惠、首充优惠等)
  • ext_field4: BIGINT - 关联活动ID用于关联营销活动
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用JPA注解支持自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 完整的事务管理(@Transactional
  • 完善的余额和账单管理
  • 支持直播间和私聊场景
  • 使用逻辑删除保护数据安全
  • 预留扩展字段便于功能扩展
  • 所有需要登录的接口都有验证机制

已完成改进2024-12-26

  • 为所有实体类添加JPA注解@Entity、@Table、@Column等
  • 添加数据库索引定义(@Index
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 完善字段注释columnDefinition
  • 确保所有数据访问通过MyBatis-Plus完成无SQL语句
  • 验证代码无编译错误
  • 为所有实体类添加逻辑删除字段is_deleted
  • 为所有实体类添加更新时间字段update_time
  • 为所有实体类添加5个扩展字段ext_field1-5
  • 使用@TableLogic实现逻辑删除
  • 不创建外键,保持表独立性
  • 为Controller添加详细的登录验证说明
  • 检查并标注哪些接口需要登录
  • 优化未登录提示信息

文档:

  • 详细开发文档:Zhibo/zhibo-h/礼物打赏模块开发说明.md
  • 快速开始指南:Zhibo/zhibo-h/礼物打赏模块快速开始.md
  • 部署清单:Zhibo/礼物打赏模块部署清单.md

模块8多媒体消息模块 (已完成)

功能:

  • 图片上传与发送
  • 语音上传与发送
  • 视频上传与发送
  • 文件存储(本地/OSS
  • 缩略图生成

已实现的类:

  • UploadController - 文件上传接口 (UserUploadController)
  • FileStorageService - 文件存储服务
  • ImageService - 图片处理(压缩、缩略图)
  • MediaMessageService - 多媒体消息服务

处理流程:

  • 客户端先上传文件 → 返回URL → 发送消息时带上URL和元信息

模块9消息已读回执模块 (已完成 - 2024-12-26)

功能:

  • 标记消息已读
  • 未读消息统计
  • 已读状态推送
  • 会话未读数更新

登录验证:

  • 所有接口都需要用户登录后才能访问
  • 由FrontTokenInterceptor拦截器统一处理
  • 未登录用户访问会返回401 UNAUTHORIZED错误
  • 所有方法都通过userService.getUserIdException()获取当前登录用户ID
  • 自动验证用户是否有权限操作会话和消息

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • Conversation - 会话实体eb_conversation
      • 添加逻辑删除字段user1_deleted、user2_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
      • 支持双向软删除用户1和用户2可分别删除
    • PrivateMessage - 私信消息实体eb_private_message
      • 添加逻辑删除字段sender_deleted、receiver_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
      • 支持双向软删除(发送者和接收者可分别删除)
  • Service层

    • ConversationService - 会话服务接口
    • ConversationServiceImpl - 会话服务实现(包含已读回执逻辑)
      • 删除会话使用逻辑删除(双向软删除)
      • 删除消息使用逻辑删除(双向软删除)
  • Controller层

    • ConversationController - 会话接口
      • 标记会话已读 (POST /api/front/conversations/{id}/read) 需要登录
      • 获取会话列表 (GET /api/front/conversations) 需要登录
      • 搜索会话 (GET /api/front/conversations/search) 需要登录
      • 获取或创建会话 (POST /api/front/conversations/with/{otherUserId}) 需要登录
      • 获取消息列表 (GET /api/front/conversations/{id}/messages) 需要登录
      • 发送消息 (POST /api/front/conversations/{id}/messages) 需要登录
      • 删除会话 (DELETE /api/front/conversations/{id}) 需要登录,使用逻辑删除
      • 删除消息 (DELETE /api/front/conversations/messages/{messageId}) 需要登录,使用逻辑删除
  • WebSocket处理器

    • PrivateChatHandler - 私聊WebSocket处理器
      • 实时推送已读回执
      • 连接时自动标记已读

实现逻辑:

  • 用户查看消息 → 批量更新已读状态 → 推送已读回执给发送方 → 更新会话未读数

数据库表:支持JPA自动创建

  • eb_conversation - 会话表
    • 包含逻辑删除字段user1_deleted、user2_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_private_message - 私信消息表
    • 包含逻辑删除字段sender_deleted、receiver_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

扩展字段说明:

Conversation实体类扩展字段

  • ext_field1: VARCHAR(100) - 会话标签(如:重要、工作、朋友等)
  • ext_field2: VARCHAR(200) - 会话备注
  • ext_field3: INT - 会话置顶优先级(用于会话排序)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

PrivateMessage实体类扩展字段

  • ext_field1: VARCHAR(50) - 消息来源mobile、web、desktop
  • ext_field2: BIGINT - 引用消息ID用于消息回复功能
  • ext_field3: VARCHAR(100) - 消息标签或分类
  • ext_field4: BIGINT - 附件大小(字节)
  • ext_field5: TEXT - JSON扩展数据图片尺寸、视频时长等

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用JPA注解支持自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 完整的事务管理(@Transactional
  • 添加数据库索引定义(提升查询性能)
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • WebSocket实时推送已读回执
  • 支持双向软删除用户1和用户2可分别删除会话发送者和接收者可分别删除消息
  • 支持静音功能
  • 所有接口都需要登录验证
  • 自动验证用户权限(只能操作自己的会话和消息)
  • 预留扩展字段便于功能扩展

已完成改进2024-12-26

  • 为Conversation实体类添加完整的JPA注解
  • 为PrivateMessage实体类添加完整的JPA注解
  • 添加数据库索引定义idx_user1_id、idx_user2_id、idx_conversation_id等
  • 添加唯一索引idx_user1_user2防止重复会话
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 完善字段注释和约束columnDefinition
  • 验证代码无编译错误
  • 确认所有数据访问通过MyBatis-Plus完成无SQL语句
  • 所有接口都需要登录验证
  • 删除功能使用逻辑删除(双向软删除)
  • 添加更新时间字段(@UpdateTimestamp自动管理
  • 预留5个扩展字段ext_field1-5
  • 不创建外键,保持表独立性

模块10好友私聊消息模块 (已实现)

功能:

  • 好友之间发送文本消息
  • 好友之间发送图片消息
  • 好友之间发送语音消息
  • 好友之间发送视频消息
  • 消息已读状态
  • 正在输入提示
  • 离线消息推送

已实现的类:

  • PrivateChatHandler - 私聊WebSocket处理器
  • ConversationService - 会话服务
  • ConversationController - 会话接口
  • OfflineMessageService - 离线消息服务

核心功能:

  • 通过WebSocket实现实时消息推送
  • 支持多设备同时在线
  • 自动保存离线消息
  • 消息已读回执
  • 正在输入状态同步

WebSocket路径 /ws/chat/{conversationId}?userId={userId}

消息类型:

  • chat - 聊天消息
  • read - 已读通知
  • typing - 正在输入
  • new_message - 新消息通知

模块11群组聊天模块 (已完成 - 2024-12-26)

功能:

  • 创建群组
  • 邀请成员加入群组
  • 群组消息发送
  • 群组消息广播
  • 群组成员管理
  • 群主/管理员权限
  • 群公告
  • @提醒功能

登录验证:

  • 所有接口都需要用户登录后才能访问
  • 由FrontTokenInterceptor拦截器统一处理
  • 未登录用户访问会返回401 UNAUTHORIZED错误
  • 所有方法都通过userService.getUserId()获取当前登录用户ID
  • 自动验证用户是否有权限操作群组(群主、管理员权限)

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • Group - 群组实体eb_group
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • GroupMember - 群组成员实体eb_group_member
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • GroupMessage - 群组消息实体eb_group_message
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
  • DAO层Mapper

    • GroupDao - 群组Mapper接口
    • GroupMemberDao - 群组成员Mapper接口
    • GroupMessageDao - 群组消息Mapper接口
  • Service层

    • GroupService - 群组服务接口
    • GroupServiceImpl - 群组服务实现
      • 解散群组使用逻辑删除(@TableLogic自动处理
    • GroupMemberService - 群组成员服务接口
    • GroupMemberServiceImpl - 群组成员服务实现
      • 移除成员使用逻辑删除(@TableLogic自动处理
      • 退出群组使用逻辑删除(@TableLogic自动处理
    • GroupMessageService - 群组消息服务接口
    • GroupMessageServiceImpl - 群组消息服务实现
      • 删除消息使用逻辑删除(@TableLogic自动处理
  • Controller层

    • GroupController - 群组接口
      • 创建群组 (POST /api/front/groups/create) 需要登录
      • 更新群组信息 (PUT /api/front/groups/{groupId}) 需要登录 + 群主/管理员权限
      • 解散群组 (DELETE /api/front/groups/{groupId}) 需要登录 + 群主权限,使用逻辑删除
      • 获取用户的群组列表 (GET /api/front/groups/list) 需要登录
      • 获取群组详情 (GET /api/front/groups/{groupId}) 需要登录 + 成员权限
      • 更新群公告 (PUT /api/front/groups/{groupId}/announcement) 需要登录 + 群主/管理员权限
      • 设置全员禁言 (PUT /api/front/groups/{groupId}/mute-all) 需要登录 + 群主/管理员权限
      • 邀请成员加入群组 (POST /api/front/groups/{groupId}/members/invite) 需要登录 + 成员权限
      • 移除群成员 (DELETE /api/front/groups/{groupId}/members/{userId}) 需要登录 + 群主/管理员权限,使用逻辑删除
      • 退出群组 (POST /api/front/groups/{groupId}/quit) 需要登录,使用逻辑删除
      • 获取群成员列表 (GET /api/front/groups/{groupId}/members) 需要登录 + 成员权限
      • 设置管理员 (PUT /api/front/groups/{groupId}/members/{userId}/admin) 需要登录 + 群主权限
      • 禁言成员 (PUT /api/front/groups/{groupId}/members/{userId}/mute) 需要登录 + 群主/管理员权限
      • 取消禁言 (PUT /api/front/groups/{groupId}/members/{userId}/unmute) 需要登录 + 群主/管理员权限
      • 更新群昵称 (PUT /api/front/groups/{groupId}/members/nickname) 需要登录
    • GroupMessageController - 群组消息接口
      • 发送群组消息 (POST /api/front/groups/{groupId}/messages) 需要登录 + 成员权限
      • 获取群组消息列表 (GET /api/front/groups/{groupId}/messages) 需要登录 + 成员权限
      • 撤回群组消息 (POST /api/front/groups/messages/{messageId}/recall) 需要登录 + 发送者权限
      • 删除群组消息 (DELETE /api/front/groups/messages/{messageId}) 需要登录 + 发送者权限,使用逻辑删除

业务流程:

  • 创建群组 → 添加群主为成员 → 邀请其他成员
  • 发送消息 → 检查权限和禁言状态 → 保存消息 → 广播给所有成员
  • 管理员权限 → 设置管理员、禁言成员、修改群公告

数据库表:支持JPA自动创建

  • eb_group - 群组表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_group_member - 群成员表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_group_message - 群消息表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

扩展字段说明:

Group实体类扩展字段

  • ext_field1: VARCHAR(50) - 群组分类(如:工作、学习、娱乐等)
  • ext_field2: VARCHAR(200) - 群组标签
  • ext_field3: INT - 群组等级或积分
  • ext_field4: BIGINT - 关联数据ID关联的直播间ID
  • ext_field5: TEXT - JSON扩展数据群规则、入群问题等

GroupMember实体类扩展字段

  • ext_field1: VARCHAR(100) - 成员标签(如:活跃、潜水等)
  • ext_field2: INT - 成员等级或积分
  • ext_field3: VARCHAR(200) - 自定义备注
  • ext_field4: BIGINT - 关联数据ID
  • ext_field5: TEXT - JSON扩展数据

GroupMessage实体类扩展字段

  • ext_field1: VARCHAR(50) - 消息来源mobile、web、desktop
  • ext_field2: BIGINT - 引用消息ID用于消息回复功能
  • ext_field3: VARCHAR(100) - 消息优先级或标签
  • ext_field4: BIGINT - 附件大小(字节)
  • ext_field5: TEXT - JSON扩展数据

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用JPA注解支持自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 完整的事务管理(@Transactional
  • 支持逻辑删除(@TableLogic
  • 完善的权限管理(群主、管理员、普通成员)
  • 支持@提醒功能和全员禁言
  • 所有接口都需要登录验证
  • 所有删除操作都使用逻辑删除
  • 预留扩展字段便于功能扩展

已完成改进2024-12-26

  • 创建完整的实体类Group、GroupMember、GroupMessage
  • 添加JPA注解支持自动建表
  • 添加数据库索引定义(提升查询性能)
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 完善字段注释和约束columnDefinition
  • 实现完整的Service层业务逻辑
  • 实现Controller层接口
  • 验证代码无编译错误
  • 所有接口都需要登录验证
  • 所有删除操作都使用逻辑删除(@TableLogic自动处理
  • 添加更新时间字段(@UpdateTimestamp自动管理
  • 预留5个扩展字段ext_field1-5
  • 不创建外键,保持表独立性
  • 为Controller添加详细的登录验证说明注释

模块12消息撤回模块 (已完成 - 2024-12-26)

功能:

  • 撤回私聊消息2分钟内
  • 撤回群组消息2分钟内
  • 推送撤回通知
  • 更新消息状态
  • 检查撤回权限

已实现的类:

  • 实体类扩展

    • PrivateMessage - 添加撤回相关字段is_recalled、recall_time
    • GroupMessage - 包含撤回相关字段
  • Service层

    • MessageRecallService - 消息撤回服务接口
    • MessageRecallServiceImpl - 消息撤回服务实现
  • Controller层

    • MessageRecallController - 消息撤回接口

撤回逻辑:

  • 验证权限(只能撤回自己的消息)
  • 验证时间2分钟内
  • 更新消息状态is_recalled = true
  • 记录撤回时间recall_time
  • 推送撤回通知待WebSocket集成⚠️

API接口

  • POST /api/front/messages/private/{messageId}/recall - 撤回私聊消息
  • POST /api/front/messages/group/{messageId}/recall - 撤回群组消息
  • GET /api/front/messages/{messageId}/can-recall - 检查是否可以撤回

技术亮点:

  • 标准三层架构设计
  • 完整的权限验证
  • 时间限制检查2分钟
  • 支持私聊和群聊消息撤回
  • 完善的异常处理

已完成改进2024-12-26

  • 为PrivateMessage添加撤回相关字段
  • 实现MessageRecallService服务层
  • 实现MessageRecallController接口层
  • 完善权限和时间验证逻辑
  • 验证代码无编译错误

优先级: 低 - 非核心功能 完成时间: 2024-12-26


模块13消息转发模块 (已完成 - 2024-12-26)

功能:

  • 转发消息给好友
  • 转发消息到群组
  • 批量转发
  • 转发历史记录

登录验证:

  • 所有接口都需要用户登录后才能访问
  • 由FrontTokenInterceptor拦截器统一处理
  • 未登录用户访问会返回401 UNAUTHORIZED错误
  • 所有方法都通过userService.getUserId()获取当前登录用户ID
  • 自动验证用户是否有权限转发消息(必须是消息的发送者或接收者)

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • MessageForward - 消息转发记录实体eb_message_forward
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
  • DAO层Mapper

    • MessageForwardDao - 消息转发Mapper接口
  • Service层

    • MessageForwardService - 消息转发服务接口
    • MessageForwardServiceImpl - 消息转发服务实现
      • 删除转发记录使用逻辑删除(@TableLogic自动处理
  • Controller层

    • MessageForwardController - 消息转发接口
      • 转发消息给好友 (POST /api/front/messages/forward/friend) 需要登录
      • 转发消息到群组 (POST /api/front/messages/forward/group) 需要登录
      • 批量转发消息 (POST /api/front/messages/forward/batch) 需要登录
      • 获取转发历史记录 (GET /api/front/messages/forward/history) 需要登录
      • 删除转发记录 (DELETE /api/front/messages/forward/{forwardId}) 需要登录,使用逻辑删除

业务流程:

  • 验证权限(必须是消息的发送者或接收者)
  • 验证好友关系或群组成员关系
  • 获取原始消息内容
  • 创建新消息(带转发标记)
  • 保存转发记录
  • 支持批量转发

数据库表:支持JPA自动创建

  • eb_message_forward - 消息转发记录表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

API接口

  • POST /api/front/messages/forward/friend - 转发消息给好友 需要登录
  • POST /api/front/messages/forward/group - 转发消息到群组 需要登录
  • POST /api/front/messages/forward/batch - 批量转发消息 需要登录
  • GET /api/front/messages/forward/history - 获取转发历史记录 需要登录
  • DELETE /api/front/messages/forward/{forwardId} - 删除转发记录 需要登录,使用逻辑删除

扩展字段说明:

MessageForward实体类扩展字段

  • ext_field1: VARCHAR(100) - 转发来源/渠道(如:从私聊转发、从群聊转发等)
  • ext_field2: INT - 转发优先级/标记(用于区分不同类型的转发)
  • ext_field3: VARCHAR(50) - 转发状态/类型(如:普通转发、紧急转发等)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用JPA注解支持自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 完整的事务管理(@Transactional
  • 支持逻辑删除(@TableLogic
  • 完善的权限验证(好友关系、群组成员)
  • 支持批量转发,提升用户体验
  • 添加数据库索引定义(提升查询性能)
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 所有接口都需要登录验证
  • 所有删除操作都使用逻辑删除
  • 预留5个扩展字段便于功能扩展

已完成改进2024-12-26

  • 创建MessageForward实体类支持JPA自动建表
  • 添加数据库索引定义idx_user_id、idx_original_message_id等
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 完善字段注释和约束columnDefinition
  • 实现完整的Service层业务逻辑
  • 实现Controller层接口
  • 验证代码无编译错误
  • 扩展ConversationService添加getPrivateMessageById和sendMessage方法
  • 为MessageForward实体类添加更新时间字段update_time
  • 为MessageForward实体类添加5个扩展字段ext_field1-5
  • 使用@TableLogic实现逻辑删除
  • 不创建外键,保持表独立性
  • 为Controller添加详细的登录验证说明注释
  • 所有接口都需要登录验证
  • 所有删除操作都使用逻辑删除

优先级: 低 - 辅助功能 完成时间: 2024-12-26


模块14语音/视频通话模块 (已完成 - WebRTC实现 - 2024-12-26完善)

功能:

  • 一对一语音通话
  • 一对一视频通话
  • 通话邀请/接听/拒绝/取消
  • 通话记录管理
  • 通话状态管理
  • 超时检测60秒
  • 忙线检测

登录验证:

  • 所有接口都需要用户登录后才能访问
  • 通过 userService.getInfo() 获取当前登录用户
  • 未登录用户访问会返回"用户未登录,请先登录"提示
  • 所有方法都自动验证用户权限(只能操作自己的通话)
  • 发起通话、接听、拒绝、取消、结束通话都需要登录验证
  • 查看通话记录、通话详情都需要登录验证

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • CallRecord - 通话记录实体eb_call_record
      • 包含完整的通话信息(通话双方、类型、状态、时长等)
      • 支持双向软删除caller_deleted、callee_deleted
      • 添加更新时间字段update_time@UpdateTimestamp自动管理
      • 添加5个扩展字段ext_field1-5
      • 添加数据库索引caller_id、callee_id、call_time、status
      • 不创建外键,保持表独立性
  • DAO层Mapper

    • CallRecordDao - 通话记录Mapper接口
  • Service层

    • CallService - 通话服务接口
    • CallServiceImpl - 通话服务实现
      • 创建通话、接听、拒绝、取消、结束通话
      • 通话状态管理calling、ringing、connected、ended等
      • 通话时长统计
      • 忙线检测
      • 超时处理
      • 删除通话记录使用逻辑删除(双向软删除)
  • WebSocket处理器

    • CallSignalingHandler - WebRTC信令处理器
      • 处理WebSocket连接管理
      • 转发SDP Offer/Answer
      • 转发ICE Candidate
      • 通话状态同步
      • 超时自动挂断60秒
  • Controller层

    • CallController - 通话接口
      • 发起通话 (POST /api/front/call/initiate) 需要登录
      • 接听通话 (POST /api/front/call/accept/{callId}) 需要登录
      • 拒绝通话 (POST /api/front/call/reject/{callId}) 需要登录
      • 取消通话 (POST /api/front/call/cancel/{callId}) 需要登录
      • 结束通话 (POST /api/front/call/end/{callId}) 需要登录
      • 获取通话记录 (GET /api/front/call/history) 需要登录
      • 删除通话记录 (DELETE /api/front/call/record/{recordId}) 需要登录,使用逻辑删除
      • 获取未接来电数量 (GET /api/front/call/missed/count) 需要登录
      • 检查通话状态 (GET /api/front/call/status) 需要登录
      • 获取通话详情 (GET /api/front/call/detail/{callId}) 需要登录

技术方案:

  • 使用WebRTC实现音视频通话
  • 使用WebSocket传输信令Offer、Answer、ICE Candidate
  • 令牌桶算法防止频繁呼叫
  • 完整的状态机管理

通话状态:

  • calling - 呼叫中
  • ringing - 响铃中
  • connected - 通话中
  • ended - 已结束
  • missed - 未接
  • rejected - 已拒绝
  • cancelled - 已取消
  • busy - 忙线

WebSocket信令协议

  • 连接地址:ws://your-domain/ws/call
  • 支持消息类型:
    • register - 注册用户
    • call_request - 发起通话
    • call_accept - 接听通话
    • call_reject - 拒绝通话
    • call_cancel - 取消通话
    • call_end - 结束通话
    • offer - WebRTC Offer
    • answer - WebRTC Answer
    • ice-candidate - ICE Candidate

数据库表:支持JPA自动创建

  • eb_call_record - 通话记录表
    • 包含双向软删除字段caller_deleted、callee_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 包含完整的通话信息和时长统计
    • 添加数据库索引提升查询性能
    • 不创建外键

扩展字段说明:

CallRecord实体类扩展字段

  • ext_field1: VARCHAR(100) - 通话质量评分/标签(如:优秀、良好、一般、较差等)
  • ext_field2: INT - 网络质量/延迟(毫秒,用于记录通话质量)
  • ext_field3: VARCHAR(50) - 特殊标记/类型(如:紧急通话、会议通话、客服通话等)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据如关联订单、工单等
  • ext_field5: TEXT - JSON扩展数据存储通话录音URL、截图、通话设备信息等

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用JPA注解支持自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问
  • WebRTC P2P通话服务器仅转发信令
  • 完整的状态机管理
  • 超时自动挂断机制
  • 忙线检测防止重复呼叫
  • 支持双向软删除(主叫和被叫可分别删除记录)
  • 完善的权限验证(只能操作自己的通话)
  • 所有接口都需要登录验证
  • 预留扩展字段便于功能扩展

已完成改进2024-12-26

  • 创建CallRecord实体类支持JPA自动建表
  • 实现CallService服务层完整的通话业务逻辑
  • 实现CallSignalingHandlerWebRTC信令处理
  • 实现CallController接口层10个接口
  • 添加数据库索引定义(提升查询性能)
  • 实现超时检测和自动挂断
  • 实现忙线检测
  • 验证代码无编译错误
  • 为CallRecord实体类添加更新时间字段update_time
  • 为CallRecord实体类添加5个扩展字段ext_field1-5
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 删除通话记录使用逻辑删除(双向软删除)
  • 不创建外键,保持表独立性
  • 为Controller添加详细的登录验证说明注释
  • 所有接口都需要登录验证
  • 优化未登录提示信息

优先级: 低 - 高级功能 完成时间: 已实现2024-12-26完善

相关文档:

  • 详细说明:语音视频通话模块说明.md

模块15消息搜索模块 (已完成 - 2024-12-26)

功能:

  • 搜索聊天记录
  • 按时间范围搜索
  • 按消息类型搜索
  • 搜索结果高亮 ⚠️ (前端实现)

登录验证:

  • 所有接口都需要用户登录后才能访问
  • 由FrontTokenInterceptor拦截器统一处理
  • 未登录用户访问会返回401 UNAUTHORIZED错误
  • 所有方法都通过userService.getUserId()获取当前登录用户ID
  • 自动验证用户是否有权限搜索消息(只能搜索自己相关的消息)

已实现的类:

  • Service层

    • MessageSearchService - 消息搜索服务接口
    • MessageSearchServiceImpl - 消息搜索服务实现
  • Controller层

    • MessageSearchController - 消息搜索接口
      • 搜索私聊消息 (GET /api/front/messages/search/private) 需要登录
      • 搜索群组消息 (GET /api/front/messages/search/group) 需要登录
      • 在指定会话中搜索 (GET /api/front/messages/search/conversation/{conversationId}) 需要登录
      • 在指定群组中搜索 (GET /api/front/messages/search/group/{groupId}) 需要登录
      • 获取搜索历史 (GET /api/front/messages/search/history) 需要登录
      • 清除搜索历史 (DELETE /api/front/messages/search/history) 需要登录

业务流程:

  • 搜索私聊消息 → 验证用户权限 → 关键词模糊查询 → 按时间和类型过滤 → 返回分页结果
  • 搜索群组消息 → 获取用户所在群组 → 关键词模糊查询 → 按时间和类型过滤 → 返回分页结果
  • 在指定会话/群组中搜索 → 验证权限 → 精确搜索 → 返回结果
  • 搜索历史管理 → Redis存储 → 自动过期 → 支持清除

数据库表:

  • 使用现有的 eb_private_messageeb_group_message
  • 两个表都已包含逻辑删除字段sender_deleted、receiver_deleted 或 is_deleted
  • 两个表都已包含更新时间字段update_time
  • 两个表都已包含5个扩展字段ext_field1-5
  • 不创建外键,保持表独立性

API接口

  • GET /api/front/messages/search/private - 搜索私聊消息 需要登录
  • GET /api/front/messages/search/group - 搜索群组消息 需要登录
  • GET /api/front/messages/search/conversation/{conversationId} - 在指定会话中搜索 需要登录
  • GET /api/front/messages/search/group/{groupId} - 在指定群组中搜索 需要登录
  • GET /api/front/messages/search/history - 获取搜索历史 需要登录
  • DELETE /api/front/messages/search/history - 清除搜索历史 需要登录

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 使用LIKE模糊查询实现关键词搜索
  • 支持按时间范围和消息类型过滤
  • 使用Redis ZSet存储搜索历史按时间排序
  • 自动保存搜索历史30天过期
  • 完善的权限验证(只能搜索自己相关的消息)
  • 排除已删除和已撤回的消息
  • 支持分页查询,提升性能
  • 支持逻辑删除,保护数据安全
  • 所有接口都需要登录验证

已完成改进2024-12-26

  • 创建MessageSearchService服务接口
  • 实现MessageSearchServiceImpl服务实现
  • 实现MessageSearchController接口层
  • 支持搜索私聊消息(全局搜索)
  • 支持搜索群组消息(全局搜索)
  • 支持在指定会话中搜索
  • 支持在指定群组中搜索
  • 支持按时间范围过滤
  • 支持按消息类型过滤
  • 实现搜索历史管理Redis存储
  • 扩展GroupMemberService添加getUserGroupIds和isMember方法
  • 验证所有代码无编译错误
  • 完善权限验证和异常处理
  • 排除已删除和已撤回的消息
  • 为Controller添加详细的登录验证说明注释
  • 确认所有接口都需要登录验证
  • 确认使用现有实体类的逻辑删除和扩展字段
  • 确认PrivateMessage和GroupMessage实体类包含完整的JPA注解
  • 确认逻辑删除功能正常工作(双向软删除和单一软删除)
  • 确认更新时间字段使用@UpdateTimestamp自动管理
  • 确认预留5个扩展字段ext_field1-5
  • 确认不创建外键,保持表独立性
  • 更新开发指南文档,添加完整的登录验证和数据库说明

技术方案:

  • 使用MySQL LIKE模糊查询适合单机部署
  • 未来可升级为Elasticsearch全文搜索支持更大规模

优先级: 中 - 提升用户体验 完成时间: 2024-12-26

相关文档:

  • 完成总结:消息搜索模块完成总结.md
  • 快速参考:消息搜索模块快速参考.md

模块16消息引用/回复模块 ⚠️ (数据库字段已预留)

功能:

  • 引用消息回复 ⚠️ (数据库字段已预留)
  • 显示被引用的消息 (前端功能待实现)
  • 点击引用跳转到原消息 (前端功能待实现)

数据库支持:

  • PrivateMessage.extField2 - 引用消息ID用于私聊消息回复
  • GroupMessage.extField2 - 引用消息ID用于群组消息回复

需要实现的功能:

  • 发送消息时支持传入引用消息ID
  • 查询消息时返回被引用的消息内容
  • 前端显示引用消息样式
  • 点击引用跳转到原消息位置

实现建议:

  • 在发送消息接口中添加 replyToMessageId 参数
  • 保存到 extField2 字段
  • 查询消息时关联查询被引用的消息
  • 前端渲染引用消息卡片

优先级: 低 - 辅助功能 预计工作量: 1-2天仅需实现业务逻辑和前端功能


模块17消息表情回应模块 (已完成 - 2024-12-26)

功能:

  • 对消息添加表情回应
  • 查看谁回应了表情
  • 取消表情回应
  • 表情回应统计
  • 切换表情回应

登录验证:

  • POST /api/front/messages/reactions/add - 添加表情回应(需要登录)
  • DELETE /api/front/messages/reactions/remove - 取消表情回应(需要登录)
  • GET /api/front/messages/reactions/list - 获取表情回应列表(不需要登录)
  • GET /api/front/messages/reactions/statistics - 获取表情回应统计(不需要登录)
  • GET /api/front/messages/reactions/users - 获取回应用户列表(不需要登录)
  • GET /api/front/messages/reactions/check - 检查回应状态(需要登录)
  • POST /api/front/messages/reactions/toggle - 切换表情回应(需要登录)
  • 所有需要登录的接口都会检查用户登录状态
  • 未登录用户访问会返回"用户未登录,请先登录"提示

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • MessageReaction - 消息表情回应实体eb_message_reaction
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
  • DAO层Mapper

    • MessageReactionDao - 消息表情回应Mapper接口
  • Service层

    • MessageReactionService - 消息表情回应服务接口
    • MessageReactionServiceImpl - 消息表情回应服务实现
      • 取消回应使用逻辑删除(@TableLogic自动处理
  • Controller层

    • MessageReactionController - 消息表情回应接口
      • 添加详细的登录验证说明注释
      • 所有需要登录的接口都检查用户登录状态
      • 未登录返回友好的提示信息

业务流程:

  • 添加表情回应 → 验证登录 → 验证参数 → 检查是否已回应 → 保存记录
  • 取消表情回应 → 验证登录 → 验证参数 → 逻辑删除记录
  • 查看回应列表 → 按表情类型分组统计 → 返回用户列表
  • 切换回应 → 验证登录 → 检查状态 → 添加或取消

数据库表:支持JPA自动创建

  • eb_message_reaction - 消息回应表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

API接口

  • POST /api/front/messages/reactions/add - 添加表情回应 (需要登录)
  • DELETE /api/front/messages/reactions/remove - 取消表情回应 (需要登录)
  • GET /api/front/messages/reactions/list - 获取消息的所有表情回应 (不需要登录)
  • GET /api/front/messages/reactions/statistics - 获取表情回应统计 (不需要登录)
  • GET /api/front/messages/reactions/users - 获取指定表情的回应用户列表 (不需要登录)
  • GET /api/front/messages/reactions/check - 检查用户是否已回应 (需要登录)
  • POST /api/front/messages/reactions/toggle - 切换表情回应 (需要登录)

支持的表情类型:

  • like - 点赞 👍
  • love - 爱心 ❤️
  • haha - 哈哈 😄
  • wow - 惊讶 😮
  • sad - 难过 😢
  • angry - 生气 😠

扩展字段说明:

MessageReaction实体类扩展字段

  • ext_field1: VARCHAR(100) - 回应来源/渠道mobile、web、desktop
  • ext_field2: INT - 回应优先级/权重(用于排序显示)
  • ext_field3: VARCHAR(50) - 特殊标记/类型(如:精选回应、热门回应等)
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义信息

技术亮点:

  • 标准三层架构设计Controller → Service → DAO
  • 使用JPA注解支持自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 完整的事务管理(@Transactional
  • 支持逻辑删除(@TableLogic
  • 添加唯一索引防止重复回应(同一用户对同一消息的同一表情只能回应一次)
  • 添加数据库索引定义(提升查询性能)
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 完善的参数验证和异常处理
  • 支持私聊消息和群组消息
  • 提供切换回应功能(一键添加/取消)
  • 所有需要登录的接口都有验证机制
  • 预留扩展字段便于功能扩展

已完成改进2024-12-26

  • 创建MessageReaction实体类支持JPA自动建表
  • 创建MessageReactionDao接口
  • 实现MessageReactionService服务层
  • 实现MessageReactionServiceImpl服务实现
  • 实现MessageReactionController接口层
  • 支持添加表情回应
  • 支持取消表情回应
  • 支持查看回应列表
  • 支持表情回应统计
  • 支持查看回应用户列表
  • 支持检查回应状态
  • 支持切换回应功能
  • 添加唯一索引防止重复回应
  • 验证所有代码无编译错误
  • 为MessageReaction实体类添加更新时间字段update_time
  • 为MessageReaction实体类添加5个扩展字段ext_field1-5
  • 使用@TableLogic实现逻辑删除
  • 使用@UpdateTimestamp自动管理更新时间
  • 不创建外键,保持表独立性
  • 为Controller添加详细的登录验证说明
  • 检查并标注哪些接口需要登录
  • 优化未登录提示信息

优先级: 低 - 增强互动 完成时间: 2024-12-26


模块18敏感词过滤模块 ⚠️ (部分实现 - 高优先级)

功能:

  • 敏感词库管理 (后台管理已实现 - SensitiveWordController)
  • DFA算法过滤 (Service层待实现)
  • 消息内容检测 (待应用到弹幕和消息发送)

已实现的类:

  • SensitiveWordController - 敏感词管理(后台)

需要实现的类:

  • SensitiveWordFilter - 敏感词过滤器DFA算法
  • SensitiveWordService - 敏感词管理Service
  • LiveChatHandlerPrivateChatHandler中应用过滤

过滤策略:

  • 使用DFA算法构建敏感词树
  • 消息发送前过滤
  • 替换为***或直接拒绝

数据库表:

  • eb_sensitive_word - 敏感词表 (已存在)

API接口后台管理

  • GET /api/admin/sensitive/word/list - 敏感词列表
  • POST /api/admin/sensitive/word/add - 添加敏感词
  • POST /api/admin/sensitive/word/update - 更新敏感词
  • POST /api/admin/sensitive/word/delete/{id} - 删除敏感词
  • POST /api/admin/sensitive/word/status/{id} - 切换状态

优先级: 🔴 高 - 内容安全必需 建议: 可先使用第三方内容审核API (如阿里云、腾讯云) 预计工作量: 1-2天 (DFA算法实现和应用)


模块19限流防刷模块 (已完成 - 2024-12-26)

功能:

  • 消息发送频率限制
  • 接口调用限流
  • 基于用户ID的限流
  • 基于IP地址的限流
  • 全局限流
  • 限流配置管理
  • 限流记录日志

登录验证:

  • 所有管理接口都需要管理员登录后才能访问
  • 由AdminTokenInterceptor拦截器统一处理
  • 未登录管理员访问会返回401 UNAUTHORIZED错误
  • 只有管理员才能管理限流配置
  • 限流切面通过SecurityUtil.getLoginUserVo()自动获取当前登录用户信息
  • 对于需要限流的业务接口,会自动检测用户登录状态(按用户维度限流时)

已实现的类:

  • 实体类Entity - 支持JPA自动建表

    • RateLimitConfig - 限流配置实体eb_rate_limit_config
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
    • RateLimitRecord - 限流记录实体eb_rate_limit_record
      • 添加逻辑删除字段is_deleted
      • 添加更新时间字段update_time
      • 添加5个扩展字段ext_field1-5
      • 使用@TableLogic实现逻辑删除
      • 使用@UpdateTimestamp自动管理更新时间
      • 不创建外键,保持表独立性
  • 注解Annotation

    • RateLimit - 限流注解
  • DAO层Mapper

    • RateLimitConfigDao - 限流配置Mapper接口
    • RateLimitRecordDao - 限流记录Mapper接口
  • Service层

    • RateLimitService - 限流服务接口
    • RateLimitServiceImpl - 限流服务实现
      • 删除配置使用逻辑删除(@TableLogic自动处理
  • AOP切面

    • RateLimitAspect - 限流切面
      • 自动获取当前登录用户信息SecurityUtil.getLoginUserVo()
      • 支持按用户、IP、全局三种限流维度
      • 异常情况自动降级(放行),避免影响正常业务
  • Controller层

    • RateLimitController - 限流管理接口(后台管理)
      • 获取限流配置 (GET /api/admin/rate-limit/config/{limitType}) 需要管理员登录
      • 保存限流配置 (POST /api/admin/rate-limit/config) 需要管理员登录
      • 更新限流配置 (PUT /api/admin/rate-limit/config) 需要管理员登录
      • 删除限流配置 (DELETE /api/admin/rate-limit/config/{id}) 需要管理员登录,使用逻辑删除
      • 初始化默认配置 (POST /api/admin/rate-limit/config/init) 需要管理员登录

限流策略:

  • 使用Redis + 令牌桶算法
  • 弹幕1秒1条
  • 私聊1秒3条
  • 图片1分钟10张
  • 接口调用1秒10次

实现方案:

  • 使用Redis + 令牌桶算法实现
  • 支持按用户、IP、全局三种限流维度
  • AOP切面实现无侵入式限流
  • 支持动态配置限流规则

数据库表:支持JPA自动创建

  • eb_rate_limit_config - 限流配置表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键
  • eb_rate_limit_record - 限流记录表
    • 包含逻辑删除字段is_deleted
    • 包含更新时间字段update_time
    • 包含5个扩展字段ext_field1-5
    • 不创建外键

API接口

  • GET /api/admin/rate-limit/config/{limitType} - 获取限流配置 需要管理员登录
  • POST /api/admin/rate-limit/config - 保存限流配置 需要管理员登录
  • PUT /api/admin/rate-limit/config - 更新限流配置 需要管理员登录
  • DELETE /api/admin/rate-limit/config/{id} - 删除限流配置 需要管理员登录,使用逻辑删除
  • POST /api/admin/rate-limit/config/init - 初始化默认配置 需要管理员登录

扩展字段说明:

RateLimitConfig实体类扩展字段

  • ext_field1: VARCHAR(100) - 限流策略标签(如:严格、宽松、自定义等)
  • ext_field2: INT - 优先级或等级(用于多级限流策略)
  • ext_field3: VARCHAR(50) - 特殊标记VIP用户豁免、测试环境等
  • ext_field4: BIGINT - 关联数据ID用于关联其他业务数据
  • ext_field5: TEXT - JSON扩展数据存储其他自定义配置信息

RateLimitRecord实体类扩展字段

  • ext_field1: VARCHAR(100) - 触发来源/渠道mobile、web、desktop
  • ext_field2: INT - 风险等级1-低风险2-中风险3-高风险)
  • ext_field3: VARCHAR(50) - 处理状态(如:已处理、待处理、已忽略等)
  • ext_field4: BIGINT - 关联事件ID用于关联其他安全事件
  • ext_field5: TEXT - JSON扩展数据存储详细的请求信息、设备指纹等

技术亮点:

  • 使用Redis实现分布式限流
  • 令牌桶算法保证流量平滑
  • AOP切面实现无侵入式限流
  • 支持动态配置限流规则
  • 完整的限流日志记录
  • 异常情况自动降级(放行)
  • 支持JPA自动建表ddl-auto: update
  • 使用MyBatis-Plus进行数据访问无SQL语句
  • 使用逻辑删除保护数据安全
  • 预留扩展字段便于功能扩展
  • 所有管理接口都需要管理员登录验证
  • 自动获取当前登录用户信息进行限流控制

已完成改进2024-12-26

  • 创建RateLimitConfig和RateLimitRecord实体类支持JPA自动建表
  • 创建@RateLimit注解支持声明式限流
  • 实现RateLimitService服务层使用Redis + 令牌桶算法
  • 实现RateLimitAspect切面拦截带有@RateLimit注解的方法
  • 实现RateLimitController管理接口
  • 支持按用户ID、IP地址、全局三种限流维度
  • 添加数据库索引定义(提升查询性能)
  • 使用@CreationTimestamp和@UpdateTimestamp自动管理时间
  • 完善字段注释和约束columnDefinition
  • 验证代码无编译错误
  • 初始化默认限流配置(弹幕、私聊、图片上传、接口调用)
  • 为RateLimitConfig实体类添加更新时间字段update_time
  • 为RateLimitConfig实体类添加5个扩展字段ext_field1-5
  • 为RateLimitRecord实体类添加更新时间字段update_time
  • 为RateLimitRecord实体类添加5个扩展字段ext_field1-5
  • 使用@TableLogic实现逻辑删除
  • 不创建外键,保持表独立性
  • 为Controller添加详细的登录验证说明注释
  • 检查并标注哪些接口需要管理员登录
  • 优化删除操作说明(使用逻辑删除)

使用示例:

// 弹幕限流
@RateLimit(type = "barrage", dimension = "user", message = "弹幕发送过于频繁")
@PostMapping("/barrage")
public CommonResult<String> sendBarrage() {
    return CommonResult.success("发送成功");
}

// 私聊消息限流
@RateLimit(type = "private_message", dimension = "user")
@PostMapping("/message")
public CommonResult<String> sendMessage() {
    return CommonResult.success("发送成功");
}

// 图片上传限流
@RateLimit(type = "image_upload", dimension = "user")
@PostMapping("/upload")
public CommonResult<String> uploadImage() {
    return CommonResult.success("上传成功");
}

// 接口调用限流按IP
@RateLimit(type = "api_call", dimension = "ip")
@GetMapping("/list")
public CommonResult<List> getList() {
    return CommonResult.success(list);
}

优先级: 🔴 高 - 防止恶意刷屏和攻击 完成时间: 2024-12-26

相关文档:

  • 完成总结:限流防刷模块完成总结.md
  • 快速参考:限流防刷模块快速参考.md