Selaa lähdekoodia

离线消息web端拉取3个月内的消息,移动端拉取1个月,不再限制数量

xsx 1 vuosi sitten
vanhempi
commit
e0b2a0474f

+ 3 - 2
im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java

@@ -160,13 +160,14 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
         // 开启加载中标志
         this.sendLoadingMessage(true);
         // 只能拉取最近3个月的,最多拉取3000条
-        Date minDate = DateUtils.addMonths(new Date(), -3);
+        int months = session.getTerminal().equals(IMTerminalType.APP.code()) ? 1 : 3;
+        Date minDate = DateUtils.addMonths(new Date(), -months);
         LambdaQueryWrapper<GroupMessage> 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");
+            .orderByDesc(GroupMessage::getId);
         List<GroupMessage> messages = this.list(wrapper);
         // 通过群聊对消息进行分组
         Map<Long, List<GroupMessage>> messageGroupMap = messages.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId));

+ 26 - 38
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<PrivateMessageMapper, PrivateMessage> implements
-    PrivateMessageService {
+public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper, PrivateMessage>
+    implements PrivateMessageService {
 
     private final FriendService friendService;
     private final IMClient imClient;
@@ -58,7 +58,7 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
         msg.setSendTime(new Date());
         this.save(msg);
         // 过滤内容中的敏感词
-        if(MessageType.TEXT.code().equals(dto.getType())){
+        if (MessageType.TEXT.code().equals(dto.getType())) {
             msg.setContent(sensitiveFilterUtil.filter(dto.getContent()));
         }
         // 推送消息
@@ -112,7 +112,6 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
         log.info("撤回私聊消息,发送id:{},接收id:{},内容:{}", msg.getSendId(), msg.getRecvId(), msg.getContent());
     }
 
-
     @Override
     public List<PrivateMessageVO> findHistoryMessage(Long friendId, Long page, Long size) {
         page = page > 0 ? page : 1;
@@ -120,17 +119,16 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
         Long userId = SessionContext.getSession().getUserId();
         long stIdx = (page - 1) * size;
         QueryWrapper<PrivateMessage> 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<PrivateMessage> messages = this.list(wrapper);
-        List<PrivateMessageVO> messageInfos = messages.stream().map(m -> BeanUtils.copyProperties(m, PrivateMessageVO.class)).collect(Collectors.toList());
+        List<PrivateMessageVO> 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<PrivateMessageMapper,
     @Override
     public void pullOfflineMessage(Long minId) {
         UserSession session = SessionContext.getSession();
-        if(!imClient.isOnline(session.getUserId())){
+        if (!imClient.isOnline(session.getUserId())) {
             throw new GlobalException("网络连接失败,无法拉取离线消息");
         }
         // 查询用户好友列表
@@ -153,23 +151,19 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
         List<Long> friendIds = friends.stream().map(Friend::getFriendId).collect(Collectors.toList());
         // 获取当前用户的消息
         LambdaQueryWrapper<PrivateMessage> 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)))
+            .orderByDesc(PrivateMessage::getId);
         List<PrivateMessage> messages = this.list(queryWrapper);
         // 消息顺序从小到大
         CollectionUtil.reverse(messages);
         // 推送消息
-        for(PrivateMessage m:messages ){
+        for (PrivateMessage m : messages) {
             PrivateMessageVO vo = BeanUtils.copyProperties(m, PrivateMessageVO.class);
             IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();
             sendMessage.setSender(new IMUserInfo(m.getSendId(), IMTerminalType.WEB.code()));
@@ -214,34 +208,28 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
         imClient.sendPrivateMessage(sendMessage);
         // 修改消息状态为已读
         LambdaUpdateWrapper<PrivateMessage> 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<PrivateMessage> 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());

+ 1 - 1
im-uniapp/store/chatStore.js

@@ -20,7 +20,7 @@ export default defineStore('chatStore', {
 			for (let chat of chatsData.chats) {
 				// 暂存至缓冲区
 				chat.stored = false;
-				cacheChats.push(chat);
+				cacheChats.push(JSON.parse(JSON.stringify(chat)));
 				// 加载期间显示只前15个会话做做样子,一切都为了加快初始化时间
 				if (this.chats.length < 15) {
 					chat.messages = [];