diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java index e70a32f7be..bef578afe7 100644 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java +++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/conversation/ImConversationTypeEnum.java @@ -12,6 +12,7 @@ import lombok.Getter; @AllArgsConstructor public enum ImConversationTypeEnum { + // TODO @hao:单聊,我们使用 SINGLE,主要 private 这个单词在 java 里太特殊了; PRIVATE(1, "单聊"), GROUP(2, "群聊"), NOTICE(4, "通知会话"); diff --git a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java index 2333a42c44..d2ce4e461d 100644 --- a/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java +++ b/yudao-module-im/yudao-module-im-api/src/main/java/cn/iocoder/yudao/module/im/enums/message/ImMessageStatusEnum.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import java.util.Arrays; +// TODO @hao:注释哈; @RequiredArgsConstructor @Getter public enum ImMessageStatusEnum implements IntArrayValuable { @@ -16,7 +17,9 @@ public enum ImMessageStatusEnum implements IntArrayValuable { DELETED(4, "已删除"), RECALL(5, "已撤回"); + // TODO @hao:静态变量,和普通变量,最好空一行; public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ImMessageStatusEnum::getStatus).toArray(); + // TODO @hao:注释哈; private final Integer status; private final String name; diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java index edd77c9384..2fd371e4b9 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxPageReqVO.java @@ -11,6 +11,7 @@ import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +// TODO @hao:这个是不是删除掉,应该不会有这个 VO 哈 @Schema(description = "管理后台 - 收件箱分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java index e2a4243325..eec1242c70 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxRespVO.java @@ -7,6 +7,7 @@ import lombok.Data; import java.time.LocalDateTime; +// TODO @hao:这个是不是删除掉,应该不会有这个 VO 哈;应该给前端的,是要屏蔽掉这个表,最终返回的都是 Message 哈;说白了,这个 inbox 是后端的内部实现 @Schema(description = "管理后台 - 收件箱 Response VO") @Data @ExcelIgnoreUnannotated diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java index 37504919ee..678be51982 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/inbox/vo/ImInboxSaveReqVO.java @@ -6,6 +6,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +// TODO @hao:这个是不是删除掉,应该不会有这个 VO 哈 @Schema(description = "管理后台 - 收件箱新增/修改 Request VO") @Data @AllArgsConstructor diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java index b23c238a4c..91026f8687 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/controller/admin/message/ImMessageController.java @@ -24,7 +24,7 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -@Tag(name = "管理后台 - 消息") +@Tag(name = "管理后台 - IM 消息") @RestController @RequestMapping("/im/message") @Validated @@ -33,19 +33,20 @@ public class ImMessageController { @Resource private ImMessageService imMessageService; - @GetMapping("/get-message-by-sequence") - @Operation(summary = "拉取消息-增量拉取大于 seq 的消息") + @GetMapping("/get-message-by-sequence") // TODO @hao:list-by-sequence + @Operation(summary = "拉取消息-增量拉取大于 seq 的消息") // TODO @hao:可以改成 拉取大于 sequence 的消息列表 @Parameter(name = "sequence", description = "序号", required = true, example = "1") @Parameter(name = "size", description = "条数", required = true, example = "10") - @PreAuthorize("@ss.hasPermission('im:message:query')") - public CommonResult> loadMessage( - @RequestParam("sequence") Long sequence, - @RequestParam("size") Integer size) { + @PreAuthorize("@ss.hasPermission('im:message:query')") // TODO @hao:权限可以删除哈; + public CommonResult> loadMessage(@RequestParam("sequence") Long sequence, + @RequestParam("size") Integer size) { + // TODO @hao:方法名,可以改成 getMessageListBySequence + // TODO @hao:如果是返回列表,变量要用 messages, 或者 messageList,体现出是复数 List message = imMessageService.loadMessage(getLoginUserId(), sequence, size); return success(BeanUtils.toBean(message, ImMessageRespVO.class)); } - + // TODO @hao:这个接口的使用场景是哪个哈? @GetMapping("/get-all-message") @Operation(summary = "拉取全部消息") @Parameter(name = "size", description = "条数", required = true, example = "10") @@ -55,14 +56,13 @@ public class ImMessageController { return success(BeanUtils.toBean(message, ImMessageRespVO.class)); } - + // TODO @hao:是不是分页参数不太对哈?应该只有 conversationNo,sendTime 字段;然后,做链式分页的查询,不太适合传统的 pageSize + number 查询; @GetMapping("/page") @Operation(summary = "查询聊天记录-分页") - @PreAuthorize("@ss.hasPermission('im:message:query')") + @PreAuthorize("@ss.hasPermission('im:message:query')") // TODO @hao:权限可以删除哈; public CommonResult> getMessagePage(@Valid ImMessagePageReqVO pageReqVO) { PageResult messagePage = imMessageService.getMessagePage(pageReqVO); return success(BeanUtils.toBean(messagePage, ImMessageRespVO.class)); } - } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ImConversationMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ImConversationMapper.java index 1b24c861f9..d4bfb0c7ab 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ImConversationMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/conversation/ImConversationMapper.java @@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper; import java.util.Optional; /** - * 会话 Mapper + * IM 会话 Mapper * * @author 芋道源码 */ @@ -29,6 +29,7 @@ public interface ImConversationMapper extends BaseMapperX { .orderByDesc(ImConversationDO::getId)); } + // TODO @hao:1)no) {,要有空格哈;2)可以直接 selectOne(ImConversationDO::getNo, no) 父类做了封装 default ImConversationDO selectByNo(String no){ return selectOne(new LambdaQueryWrapperX().eq(ImConversationDO::getNo, no)); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java index 05bf95593e..aae03ba1b8 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/inbox/ImInboxMapper.java @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import org.apache.ibatis.annotations.Mapper; /** - * 收件箱 Mapper + * IM 收件箱 Mapper * * @author 芋道源码 */ diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java index 712b12d12d..54d53b9326 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImMessageMapper.java @@ -36,6 +36,7 @@ public interface ImMessageMapper extends BaseMapperX { .orderByDesc(ImMessageDO::getId)); } + // TODO @hao:不链表哈;先从 ImInboxDO 查询出 messageId,然后再到 ImMessageDO 里 IN default List getGreaterThanSequenceMessage(Long userId, Long sequence, Integer size) { //查询 inbox 表中,大于 sequence 的消息,关联 message 表,按照 inbox 表 sequence 升序 return selectJoinList(ImMessageDO.class, new MPJLambdaWrapper() @@ -47,6 +48,7 @@ public interface ImMessageMapper extends BaseMapperX { .last("limit 0," + size)); } + // TODO @hao:在 dao 里,使用 selectListByUserId,查询用 select,条件用 by,这个算是 spring data 的 method dsl default List getAllMessage(Long userId, Integer size) { //查询 inbox 表中,100条消息,关联 message 表,按照 inbox 表 sequence 降序 return selectJoinList(ImMessageDO.class, new MPJLambdaWrapper() @@ -56,4 +58,5 @@ public interface ImMessageMapper extends BaseMapperX { .orderByDesc(ImInboxDO::getSequence) .last("limit 0," + size)); } + } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java index ff6dd71ba8..d1ceec7778 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/dal/redis/inbox/SequenceGeneratorRedisDao.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Repository; import static cn.iocoder.yudao.module.im.dal.redis.RedisKeyConstants.INBOX_SEQUENCE; +// TODO @芋艿:这个名字,需要在考虑下; /** * 序号生成器 Redis DAO * diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java index a95ca6f10a..d235a7eeeb 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationService.java @@ -9,7 +9,7 @@ import jakarta.validation.Valid; import java.util.List; /** - * 会话 Service 接口 + * IM 会话 Service 接口 * * @author 芋道源码 */ @@ -74,4 +74,5 @@ public interface ImConversationService { * @param updateReqVO 更新信息 */ void updateLastReadTime(ImConversationSaveReqVO updateReqVO); + } \ No newline at end of file diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java index f1d4d7250d..a14a31be3d 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/conversation/ImConversationServiceImpl.java @@ -18,7 +18,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.CONVERSATION_NOT_EXISTS; /** - * 会话 Service 实现类 + * IM 会话 Service 实现类 * * @author 芋道源码 */ @@ -26,18 +26,19 @@ import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.CONVERSATION_N @Validated public class ImConversationServiceImpl implements ImConversationService { + // TODO @hao: 自己模块的注入,不用带 im 前缀哈; @Resource private ImConversationMapper imConversationMapper; + // TODO @hao: 这个方法,是不是不需要哈 @Override public Long createConversation(ImConversationSaveReqVO createReqVO) { - // 插入 ImConversationDO conversation = BeanUtils.toBean(createReqVO, ImConversationDO.class); imConversationMapper.insert(conversation); - // 返回 return conversation.getId(); } + // TODO @hao: 这个方法,是不是不需要哈 @Override public void updateConversation(ImConversationSaveReqVO updateReqVO) { // 校验存在 @@ -47,6 +48,7 @@ public class ImConversationServiceImpl implements ImConversationService { imConversationMapper.updateById(updateObj); } + // TODO @hao: 考虑到可能和端上不同步,可以不校验是不是存储。另外,不基于 id 删除。要基于 no + userId 删除哈。说白了,对端上要屏蔽 id 字段 @Override public void deleteConversation(Long id) { // 校验存在 @@ -86,6 +88,11 @@ public class ImConversationServiceImpl implements ImConversationService { createOrUpdateConversation(updateReqVO); } + // TODO @hao:updateTop 和 updateLastReadTime 使用独立的逻辑实现,不使用统一的 ImConversationSaveReqVO; + // TODO 大体步骤建议: + // 1. 先 getOrderCreateConversation,查询会话,不存在则插入; + // 2. 更新对应的字段 + // 3. 做对应更新的 notify 推送 private void createOrUpdateConversation(ImConversationSaveReqVO updateReqVO) { // 操作会话(已读、置顶)时,才会延迟创建,要先判断是否存在,根据 no 查询是否存在,不存在则新增 ImConversationDO conversation = imConversationMapper.selectByNo(updateReqVO.getNo()); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java index 45fc80dd05..98c164a37f 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxService.java @@ -6,8 +6,9 @@ import cn.iocoder.yudao.module.im.controller.admin.inbox.vo.ImInboxSaveReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.inbox.ImInboxDO; import jakarta.validation.Valid; +// TODO @hao:不用的方法,删除下哈; /** - * 收件箱 Service 接口 + * IM 收件箱 Service 接口 * * @author 芋道源码 */ diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java index dd5f67531c..2168fde0d0 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/inbox/ImInboxServiceImpl.java @@ -27,10 +27,8 @@ public class ImInboxServiceImpl implements ImInboxService { @Override public Long createInbox(ImInboxSaveReqVO createReqVO) { - // 插入 ImInboxDO inbox = BeanUtils.toBean(createReqVO, ImInboxDO.class); imInboxMapper.insert(inbox); - // 返回 return inbox.getId(); } diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java index 1e9781ac37..061e1d7ba3 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageService.java @@ -91,6 +91,7 @@ public interface ImMessageService { */ List loadMessage(Long userId, Long sequence, Integer size); + // TODO @hao;这种接口,项目里叫 getMessageListByUserId,尽量保持 getList 获取列表哈; /** * 拉取全部消息 * diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java index b7af4a704e..6c5a98f91f 100755 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/service/message/ImMessageServiceImpl.java @@ -84,26 +84,31 @@ public class ImMessageServiceImpl implements ImMessageService { } private ImMessageDO saveImMessageDO(ImSendMessage message, Long fromUserId) { + // TODO @hao:可以搞成 messageDO + // TODO @hao:链式调用 ImMessageDO imMessageDO = new ImMessageDO(); imMessageDO.setClientMessageId(message.getClientMessageId()); imMessageDO.setSenderId(fromUserId); imMessageDO.setReceiverId(message.getReceiverId()); - //查询发送人昵称和发送人头像 + // 查询发送人昵称和发送人头像 AdminUserRespDTO user = adminUserApi.getUser(fromUserId); imMessageDO.setSenderNickname(user.getNickname()); imMessageDO.setSenderAvatar(user.getAvatar()); imMessageDO.setConversationType(message.getConversationType()); imMessageDO.setContentType(message.getContentType()); - //单聊:s_{userId}_{targetId} 群聊:群聊:g_{groupId} + // 单聊:s_{userId}_{targetId} 群聊:群聊:g_{groupId} + // TODO @hao:这里的 conversationNo 的生成,可以写到工具类里,或者干脆放到 ImConversationTypeEnum 里; if (message.getConversationType().equals(ImConversationTypeEnum.PRIVATE.getType())) { imMessageDO.setConversationNo("s_" + fromUserId + "_" + message.getReceiverId()); } else if (message.getConversationType().equals(ImConversationTypeEnum.GROUP.getType())) { imMessageDO.setConversationNo("g_" + message.getReceiverId()); } imMessageDO.setContent(message.getContent()); - //消息来源 100-用户发送;200-系统发送(一般是通知);不能为空 + // TODO @hao:枚举哈; + // 消息来源 100-用户发送;200-系统发送(一般是通知);不能为空 imMessageDO.setSendFrom(100); imMessageDO.setSendTime(TimeUtil.now()); + // TODO @hao:服务端的消息,就是默认生成哈; imMessageDO.setMessageStatus(ImMessageStatusEnum.SENDING.getStatus()); imMessageMapper.insert(imMessageDO); return imMessageDO; @@ -111,7 +116,7 @@ public class ImMessageServiceImpl implements ImMessageService { @Override public void updateMessageStatus(Long messageId, Integer messageStatus) { - //校验 id 是否存在 + // 校验 id 是否存在 validateMessageExists(messageId); //更新消息状态 ImMessageDO imMessageDO = new ImMessageDO(); diff --git a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java index 7e39e61c02..be816f7db0 100644 --- a/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java +++ b/yudao-module-im/yudao-module-im-biz/src/main/java/cn/iocoder/yudao/module/im/websocket/ImWebSocketMessageListener.java @@ -23,6 +23,7 @@ import org.springframework.web.socket.WebSocketSession; import java.util.List; +// TODO @hao:消息发送,使用 http 上行。因为在 cloud 框架下,我们比较难去 Listener。因为 im-server 不会自己启动 websocket 路径 /** * WebSocket im * @@ -60,9 +61,10 @@ public class ImWebSocketMessageListener implements WebSocketMessageListener groupMemberDOList = imGroupMemberService.selectByGroupId(groupId); groupMemberDOList.forEach(groupMemberDO -> { - //过滤掉自己 + // 过滤掉自己 + // TODO @hao:98 到 99 的代码,是不是可以融合到这里来; if (groupMemberDO.getUserId().equals(fromUserId)) { return; } @@ -106,11 +112,14 @@ public class ImWebSocketMessageListener implements WebSocketMessageListener +