# IM 即时通讯模块解锁指南 ## 一、模块概述 IM(Instant Messaging)即时通讯模块提供企业内部的即时通讯能力,支持私聊、群聊、好友管理等核心功能。 ### 1.1 功能清单 | 功能 | 说明 | |------|------| | 好友管理 | 添加好友、删除好友、好友申请审核 | | 私聊消息 | 一对一聊天、消息撤回、已读回执 | | 群聊管理 | 创建群、解散群、群成员管理、群公告 | | 群聊消息 | 群内聊天、消息撤回、回执确认 | | 会话管理 | 会话列表、未读计数、历史消息 | | 在线状态 | 用户在线/离线状态显示 | ### 1.2 数据库表清单 | 表名 | 说明 | |------|------| | im_friend | 好友关系表 | | im_friend_request | 好友申请表 | | im_group | 群组表 | | im_group_member | 群成员表 | | im_private_message | 私聊消息表 | | im_group_message | 群聊消息表 | | im_group_message_receipt | 群消息回执表 | | im_conversation | 会话表 | | im_user_online | 用户在线状态表 | | im_group_request | 群申请表 | | im_message_file | 消息文件表 | --- ## 二、解锁步骤 ### 2.1 创建模块目录结构 ```bash mkdir -p yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/api mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/{controller,service,dal} mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/{friend,group,message} mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/{friend,group,message} mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/{dataobject,mysql} mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/dataobject/{friend,group,message} mkdir -p yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/{friend,group,message} ``` ### 2.2 创建 pom.xml **yudao-module-im-api/pom.xml:** ```xml cn.iocoder.boot yudao-module-im ${revision} 4.0.0 yudao-module-im-api jar ${project.artifactId} IM 即时通讯模块 API cn.iocoder.boot yudao-framework-common ``` **yudao-module-im-biz/pom.xml:** ```xml cn.iocoder.boot yudao-module-im ${revision} 4.0.0 yudao-module-im-biz jar ${project.artifactId} IM 即时通讯模块业务实现 cn.iocoder.boot yudao-module-im-api ${revision} cn.iocoder.boot yudao-module-system-api ${revision} cn.iocoder.boot yudao-spring-boot-starter-web cn.iocoder.boot yudao-spring-boot-starter-security cn.iocoder.boot yudao-spring-boot-starter-mybatis cn.iocoder.boot yudao-spring-boot-starter-redis org.springframework.boot spring-boot-starter-websocket cn.iocoder.boot yudao-spring-boot-starter-test ``` ### 2.3 执行数据库 SQL ```bash # 执行 IM 模块表结构 SQL mysql -u root -p mom_pro < docs/im_module.sql ``` ### 2.4 在 yudao-server/pom.xml 中添加依赖 ```xml cn.iocoder.boot yudao-module-im-biz ${revision} ``` --- ## 三、核心实体类示例 ### 3.1 ImFriendDO.java ```java package cn.iocoder.yudao.module.im.dal.dataobject.friend; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; /** * 好友关系 DO */ @TableName("im_friend") @KeySequence("im_friend_seq") @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor public class ImFriendDO extends BaseDO { @TableId private Long id; /** 用户编号 */ private Long userId; /** 好友用户编号 */ private Long friendUserId; /** 好友备注 */ private String remark; /** 好友状态(0正常 1已删除) */ private Integer status; } ``` ### 3.2 ImGroupDO.java ```java package cn.iocoder.yudao.module.im.dal.dataobject.group; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; /** * 群组 DO */ @TableName("im_group") @KeySequence("im_group_seq") @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor public class ImGroupDO extends BaseDO { @TableId private Long id; /** 群名称 */ private String name; /** 群头像 */ private String avatar; /** 群主用户编号 */ private Long ownerUserId; /** 群公告 */ private String notice; /** 群状态(0正常 1已解散) */ private Integer status; } ``` ### 3.3 ImPrivateMessageDO.java ```java package cn.iocoder.yudao.module.im.dal.dataobject.message; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; /** * 私聊消息 DO */ @TableName("im_private_message") @KeySequence("im_private_message_seq") @Data @EqualsAndHashCode(callSuper = true) @Builder @NoArgsConstructor @AllArgsConstructor public class ImPrivateMessageDO extends BaseDO { @TableId private Long id; /** 发送人编号 */ private Long fromUserId; /** 接收人编号 */ private Long toUserId; /** 消息内容 */ private String content; /** 消息类型 */ private Integer messageType; /** 消息状态(0未读 2已撤回 3已读) */ private Integer status; /** 发送时间 */ private LocalDateTime sendTime; /** 已读时间 */ private LocalDateTime readTime; } ``` --- ## 四、业务流程说明 ### 4.1 好友添加流程 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 发送好友 │ -> │ 对方收到 │ -> │ 同意/拒绝 │ -> │ 建立好友 │ │ 申请 │ │ 申请通知 │ │ 申请 │ │ 关系 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ v v v ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ im_friend_ │ │ WebSocket │ │ im_friend │ │ request │ │ 推送通知 │ │ 表新增 │ │ 表新增 │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ ``` ### 4.2 私聊消息流程 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 发送消息 │ -> │ WebSocket │ -> │ 接收消息 │ -> │ 已读回执 │ │ │ │ 推送 │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ v v v v ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ im_private_ │ │ 实时推送 │ │ 消息入库 │ │ 更新已读 │ │ message │ │ 给接收人 │ │ 状态未读 │ │ 状态 │ │ 入库 │ │ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ``` ### 4.3 群聊管理流程 ``` ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 创建群聊 │ -> │ 添加成员 │ -> │ 群内聊天 │ -> │ 解散群聊 │ │ │ │ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ v v v v ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ im_group │ │ im_group_ │ │ im_group_ │ │ 更新群状态 │ │ 表新增 │ │ member │ │ message │ │ 为已解散 │ │ │ │ 表新增 │ │ 入库 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ ``` --- ## 五、菜单配置 需要在 system_menu 表中添加 IM 模块的菜单: ```sql -- IM 模块一级菜单 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2100, '即时通讯', '', 1, 30, 0, '/im', 'message', NULL, 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); -- 好友管理 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2101, '好友管理', '', 2, 1, 2100, 'friend', '', 'im/friend/index', 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); -- 群聊管理 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2102, '群聊管理', '', 2, 2, 2100, 'group', '', 'im/group/index', 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); -- 消息管理 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2103, '消息管理', '', 2, 3, 2100, 'message', '', 'im/message/index', 0, b'1', 'admin', NOW(), 'admin', NOW(), b'0'); ``` --- ## 六、注意事项 1. **WebSocket 配置**: IM 模块依赖 WebSocket 实现实时通讯,需要配置 WebSocket 端点 2. **Redis 消息队列**: 建议使用 Redis Pub/Sub 实现消息广播 3. **离线消息存储**: 用户离线时的消息需要持久化,上线后推送 4. **消息安全**: 消息内容需要考虑敏感词过滤、 XSS 防护 5. **性能优化**: 高并发场景建议使用消息队列削峰填谷 --- **文档版本**: v1.0 **创建日期**: 2026-06-29 **适用项目**: mom-pro2-after **表数量**: 11 张