diff --git a/db/im-platform.sql b/db/im-platform.sql index d90976f..ea7bc6a 100644 --- a/db/im-platform.sql +++ b/db/im-platform.sql @@ -35,7 +35,8 @@ create table `im_private_message`( `type` tinyint(1) NOT NULL comment '消息类型 0:文字 1:图片 2:文件 3:语音 4:视频 21:提示', `status` tinyint(1) NOT NULL comment '状态 0:未读 1:已读 2:撤回 3:已读', `send_time` datetime DEFAULT CURRENT_TIMESTAMP comment '发送时间', - key `idx_send_recv_id` (`send_id`,`recv_id`) + key `idx_send_id` (`send_id`), + key `idx_recv_id` (`recv_id`) )ENGINE=InnoDB CHARSET=utf8mb4 comment '私聊消息'; diff --git a/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java b/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java index 38a8e07..415eb83 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/GroupMember.java @@ -74,7 +74,7 @@ public class GroupMember extends Model { private Date quitTime; public String getShowNickName() { - return StrUtil.isEmpty(remarkNickName) ? userNickName : remarkNickName; + return StrUtil.blankToDefault(remarkNickName, userNickName); } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java index 7ae8b42..25c1e56 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java @@ -72,9 +72,7 @@ public class GroupMessageServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); wrapper.gt(GroupMessage::getId, minId) .gt(GroupMessage::getSendTime, minDate) .in(GroupMessage::getGroupId, groupIds) .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()) - .orderByDesc(GroupMessage::getId).last("limit 3000"); + .orderByAsc(GroupMessage::getId); List messages = this.list(wrapper); // 通过群聊对消息进行分组 Map> messageGroupMap = messages.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId)); @@ -178,8 +177,7 @@ public class GroupMessageServiceImpl extends ServiceImpl groupMessages = this.list(wrapper); messageGroupMap.put(quitMember.getGroupId(),groupMessages); groupMemberMap.put(quitMember.getGroupId(),quitMember); @@ -187,8 +185,6 @@ public class GroupMessageServiceImpl extends ServiceImpl { - // id从小到大排序 - CollectionUtil.reverse(groupMessages); // 填充消息状态 String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); Object o = redisTemplate.opsForHash().get(key, session.getUserId().toString()); @@ -208,10 +204,8 @@ public class GroupMessageServiceImpl extends ServiceImpl atIds = Splitter.on(",").trimResults().splitToList(m.getAtUserIds()); - vo.setAtUserIds(atIds.stream().map(Long::parseLong).collect(Collectors.toList())); - } + List atIds = CommaTextUtils.asList(m.getAtUserIds()); + vo.setAtUserIds(atIds.stream().map(Long::parseLong).collect(Collectors.toList())); // 填充状态 vo.setStatus(readedMaxId >= m.getId() ? MessageStatus.READED.code() : MessageStatus.UNSEND.code()); // 针对回执消息填充已读人数 diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java index 955ab54..579fd69 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java @@ -70,8 +70,8 @@ public class GroupServiceImpl extends ServiceImpl implements groupMemberService.save(member); // 返回 vo.setId(group.getId()); - vo.setShowNickName(StrUtil.isEmpty(vo.getRemarkNickName()) ? member.getUserNickName() : vo.getRemarkNickName()); - vo.setShowGroupName(StrUtil.isEmpty(vo.getRemarkGroupName()) ? group.getName() : vo.getRemarkGroupName()); + vo.setShowNickName(member.getShowNickName()); + vo.setShowGroupName(StrUtil.blankToDefault(member.getRemarkGroupName(), group.getName())); log.info("创建群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); return vo; } @@ -96,8 +96,8 @@ public class GroupServiceImpl extends ServiceImpl implements group = BeanUtils.copyProperties(vo, Group.class); this.updateById(group); } - vo.setShowNickName(StrUtil.isEmpty(vo.getRemarkNickName()) ? member.getUserNickName() : vo.getRemarkNickName()); - vo.setShowGroupName(StrUtil.isEmpty(vo.getRemarkGroupName()) ? group.getName() : vo.getRemarkGroupName()); + vo.setShowNickName(member.getShowNickName()); + vo.setShowGroupName(StrUtil.blankToDefault(member.getRemarkGroupName(), group.getName())); log.info("修改群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); return vo; } @@ -139,7 +139,7 @@ public class GroupServiceImpl extends ServiceImpl implements String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); redisTemplate.opsForHash().delete(key, userId.toString()); // 推送退出群聊提示 - this.sendTipMessage(groupId, Arrays.asList(userId), "您已退出群聊"); + this.sendTipMessage(groupId, List.of(userId), "您已退出群聊"); log.info("退出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), userId); } @@ -159,7 +159,7 @@ public class GroupServiceImpl extends ServiceImpl implements String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); redisTemplate.opsForHash().delete(key, userId.toString()); // 推送踢出群聊提示 - this.sendTipMessage(groupId, Arrays.asList(userId), "您已被移出群聊"); + this.sendTipMessage(groupId, List.of(userId), "您已被移出群聊"); log.info("踢出群聊,群聊id:{},群聊名称:{},用户id:{}", group.getId(), group.getName(), userId); } @@ -178,7 +178,7 @@ public class GroupServiceImpl extends ServiceImpl implements vo.setRemarkGroupName(member.getRemarkGroupName()); vo.setRemarkNickName(member.getRemarkNickName()); vo.setShowNickName(member.getShowNickName()); - vo.setShowGroupName(StrUtil.isEmpty(vo.getRemarkGroupName()) ? group.getName() : vo.getRemarkGroupName()); + vo.setShowGroupName(StrUtil.blankToDefault(member.getRemarkGroupName(), group.getName())); vo.setQuit(member.getQuit()); return vo; } @@ -215,12 +215,12 @@ public class GroupServiceImpl extends ServiceImpl implements groupWrapper.in(Group::getId, ids); List groups = this.list(groupWrapper); // 转vo - return groups.stream().map(g -> { - GroupVO vo = BeanUtils.copyProperties(g, GroupVO.class); - GroupMember member = groupMembers.stream().filter(m -> g.getId().equals(m.getGroupId())).findFirst().get(); - vo.setShowNickName( - StrUtil.isEmpty(vo.getRemarkNickName()) ? session.getNickName() : vo.getRemarkNickName()); - vo.setShowGroupName(StrUtil.isEmpty(vo.getRemarkGroupName()) ? g.getName() : vo.getRemarkGroupName()); + return groups.stream().map(group -> { + GroupVO vo = BeanUtils.copyProperties(group, GroupVO.class); + GroupMember member = + groupMembers.stream().filter(m -> group.getId().equals(m.getGroupId())).findFirst().get(); + vo.setShowNickName(StrUtil.blankToDefault(member.getRemarkNickName(), session.getNickName())); + vo.setShowGroupName(StrUtil.blankToDefault(member.getRemarkGroupName(), group.getName())); vo.setQuit(member.getQuit()); return vo; }).collect(Collectors.toList()); @@ -244,7 +244,7 @@ public class GroupServiceImpl extends ServiceImpl implements List friends = friendsService.findFriendByUserId(session.getUserId()); List friendsList = vo.getFriendIds().stream() .map(id -> friends.stream().filter(f -> f.getFriendId().equals(id)).findFirst().get()) - .collect(Collectors.toList()); + .toList(); if (friendsList.size() != vo.getFriendIds().size()) { throw new GlobalException("部分用户不是您的好友,邀请失败"); } @@ -282,7 +282,7 @@ public class GroupServiceImpl extends ServiceImpl implements return members.stream().map(m -> { GroupMemberVO vo = BeanUtils.copyProperties(m, GroupMemberVO.class); vo.setShowNickName(m.getShowNickName()); - vo.setShowGroupName(StrUtil.isEmpty(m.getRemarkGroupName()) ? group.getName() : m.getRemarkGroupName()); + vo.setShowGroupName(StrUtil.blankToDefault(m.getRemarkGroupName(), group.getName())); vo.setOnline(onlineUserIds.contains(m.getUserId())); return vo; }).sorted((m1, m2) -> m2.getOnline().compareTo(m1.getOnline())).collect(Collectors.toList()); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index 213c809..a1185b4 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -37,8 +37,8 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class PrivateMessageServiceImpl extends ServiceImpl implements - PrivateMessageService { +public class PrivateMessageServiceImpl extends ServiceImpl + implements PrivateMessageService { private final FriendService friendService; private final IMClient imClient; @@ -58,7 +58,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl findHistoryMessage(Long friendId, Long page, Long size) { page = page > 0 ? page : 1; @@ -120,17 +119,16 @@ public class PrivateMessageServiceImpl extends ServiceImpl wrapper = new QueryWrapper<>(); - wrapper.lambda().and(wrap -> wrap.and( - wp -> wp.eq(PrivateMessage::getSendId, userId) - .eq(PrivateMessage::getRecvId, friendId)) - .or(wp -> wp.eq(PrivateMessage::getRecvId, userId) - .eq(PrivateMessage::getSendId, friendId))) - .ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()) - .orderByDesc(PrivateMessage::getId) + wrapper.lambda().and( + wrap -> wrap.and(wp -> wp.eq(PrivateMessage::getSendId, userId).eq(PrivateMessage::getRecvId, friendId)) + .or(wp -> wp.eq(PrivateMessage::getRecvId, userId).eq(PrivateMessage::getSendId, friendId))) + .ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()).orderByDesc(PrivateMessage::getId) .last("limit " + stIdx + "," + size); List messages = this.list(wrapper); - List messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)).collect(Collectors.toList()); + List messageInfos = + messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)) + .collect(Collectors.toList()); log.info("拉取聊天记录,用户id:{},好友id:{},数量:{}", userId, friendId, messageInfos.size()); return messageInfos; } @@ -138,7 +136,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl friendIds = friends.stream().map(Friend::getFriendId).collect(Collectors.toList()); // 获取当前用户的消息 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - // 只能拉取最近3个月的3000条消息 - Date minDate = DateUtils.addMonths(new Date(), -3); - queryWrapper.gt(PrivateMessage::getId, minId) - .ge(PrivateMessage::getSendTime, minDate) - .ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()) - .and(wrap -> wrap.and( - wp -> wp.eq(PrivateMessage::getSendId, session.getUserId()) - .in(PrivateMessage::getRecvId, friendIds)) - .or(wp -> wp.eq(PrivateMessage::getRecvId, session.getUserId()) - .in(PrivateMessage::getSendId, friendIds))) - .orderByDesc(PrivateMessage::getId) - .last("limit 3000"); + // 只能拉取最近3个月的消息,移动端只拉取一个月消息 + int months = session.getTerminal().equals(IMTerminalType.APP.code()) ? 1 : 3; + Date minDate = DateUtils.addMonths(new Date(), -months); + queryWrapper.gt(PrivateMessage::getId, minId).ge(PrivateMessage::getSendTime, minDate) + .ne(PrivateMessage::getStatus, MessageStatus.RECALL.code()).and(wrap -> wrap.and( + wp -> wp.eq(PrivateMessage::getSendId, session.getUserId()).in(PrivateMessage::getRecvId, friendIds)) + .or(wp -> wp.eq(PrivateMessage::getRecvId, session.getUserId()).in(PrivateMessage::getSendId, friendIds))) + .orderByAsc(PrivateMessage::getId); List messages = this.list(queryWrapper); - // 消息顺序从小到大 - CollectionUtil.reverse(messages); // 推送消息 - for(PrivateMessage m:messages ){ + for (PrivateMessage m : messages) { PrivateMessageVO vo = BeanUtils.copyProperties(m, PrivateMessageVO.class); IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(m.getSendId(), IMTerminalType.WEB.code())); sendMessage.setRecvId(session.getUserId()); - sendMessage.setRecvTerminals(Arrays.asList(session.getTerminal())); + sendMessage.setRecvTerminals(List.of(session.getTerminal())); sendMessage.setSendToSelf(false); sendMessage.setData(vo); sendMessage.setSendResult(true); @@ -214,42 +206,36 @@ public class PrivateMessageServiceImpl extends ServiceImpl updateWrapper = Wrappers.lambdaUpdate(); - updateWrapper.eq(PrivateMessage::getSendId, friendId) - .eq(PrivateMessage::getRecvId, session.getUserId()) + updateWrapper.eq(PrivateMessage::getSendId, friendId).eq(PrivateMessage::getRecvId, session.getUserId()) .eq(PrivateMessage::getStatus, MessageStatus.SENDED.code()) .set(PrivateMessage::getStatus, MessageStatus.READED.code()); this.update(updateWrapper); log.info("消息已读,接收方id:{},发送方id:{}", session.getUserId(), friendId); } - @Override public Long getMaxReadedId(Long friendId) { UserSession session = SessionContext.getSession(); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(PrivateMessage::getSendId, session.getUserId()) - .eq(PrivateMessage::getRecvId, friendId) - .eq(PrivateMessage::getStatus, MessageStatus.READED.code()) - .orderByDesc(PrivateMessage::getId) - .select(PrivateMessage::getId) - .last("limit 1"); + wrapper.eq(PrivateMessage::getSendId, session.getUserId()).eq(PrivateMessage::getRecvId, friendId) + .eq(PrivateMessage::getStatus, MessageStatus.READED.code()).orderByDesc(PrivateMessage::getId) + .select(PrivateMessage::getId).last("limit 1"); PrivateMessage message = this.getOne(wrapper); - if(Objects.isNull(message)){ + if (Objects.isNull(message)) { return -1L; } return message.getId(); } - - private void sendLoadingMessage(Boolean isLoadding){ + private void sendLoadingMessage(Boolean isLoadding) { UserSession session = SessionContext.getSession(); PrivateMessageVO msgInfo = new PrivateMessageVO(); msgInfo.setType(MessageType.LOADING.code()); msgInfo.setContent(isLoadding.toString()); - IMPrivateMessage sendMessage = new IMPrivateMessage<>(); + IMPrivateMessage sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(session.getUserId(), session.getTerminal())); sendMessage.setRecvId(session.getUserId()); - sendMessage.setRecvTerminals(Arrays.asList(session.getTerminal())); + sendMessage.setRecvTerminals(List.of(session.getTerminal())); sendMessage.setData(msgInfo); sendMessage.setSendToSelf(false); sendMessage.setSendResult(false); diff --git a/im-uniapp/App.vue b/im-uniapp/App.vue index 98a8802..a30cd85 100644 --- a/im-uniapp/App.vue +++ b/im-uniapp/App.vue @@ -1,5 +1,5 @@