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 0dde1fe..5ea3e1f 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 @@ -145,22 +145,22 @@ public class GroupMessageServiceImpl extends ServiceImpl loadOffineMessage(Long minId) { UserSession session = SessionContext.getSession(); + List messages = new ArrayList<>(); // 查询用户加入的群组 List members = groupMemberService.findByUserId(session.getUserId()); Map groupMemberMap = CollStreamUtil.toIdentityMap(members, GroupMember::getGroupId); Set groupIds = groupMemberMap.keySet(); - if (groupIds.isEmpty()) { - return Collections.EMPTY_LIST; - } // 只能拉取最近30天的消息 Date minDate = DateUtils.addDays(new Date(), Math.toIntExact(-Constant.MAX_OFFLINE_MESSAGE_DAYS)); - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.gt(GroupMessage::getId, minId); - wrapper.gt(GroupMessage::getSendTime, minDate); - wrapper.in(GroupMessage::getGroupId, groupIds); - wrapper.orderByDesc(GroupMessage::getId); - wrapper.last("limit 50000"); - List messages = this.list(wrapper); + if(!groupIds.isEmpty()) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.gt(GroupMessage::getId, minId); + wrapper.gt(GroupMessage::getSendTime, minDate); + wrapper.in(GroupMessage::getGroupId, groupIds); + wrapper.orderByDesc(GroupMessage::getId); + wrapper.last("limit 50000"); + messages = this.list(wrapper); + } // 查询退群前的消息 Date minQuitTime = minDate; if (minId > 0) { @@ -172,7 +172,7 @@ public class GroupMessageServiceImpl extends ServiceImpl quitMembers = groupMemberService.findQuitMembers(session.getUserId(), minQuitTime); for (GroupMember quitMember : quitMembers) { - wrapper = Wrappers.lambdaQuery(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.gt(GroupMessage::getId, minId); wrapper.between(GroupMessage::getSendTime, minDate, quitMember.getQuitTime()); wrapper.eq(GroupMessage::getGroupId, quitMember.getGroupId()); diff --git a/im-uniapp/store/chatStore.js b/im-uniapp/store/chatStore.js index 56d8adc..ac47518 100644 --- a/im-uniapp/store/chatStore.js +++ b/im-uniapp/store/chatStore.js @@ -355,14 +355,20 @@ export default defineStore('chatStore', { // 排序 chats.sort((chat1, chat2) => chat2.lastSendTime - chat1.lastSendTime); // #ifndef APP-PLUS - /** - * 由于h5和小程序的stroge只有5m,大约只能存储2w条消息,所以可能需要清理部分历史消息 - */ - this.fliterMessage(chats, 5000, 1000); + // h5和小程序的stroge一般只有5m,大约只能存储1w条消息,所以可能需要清理部分历史消息 + const storageInfo = uni.getStorageInfoSync(); + console.log(`storage缓存: ${storageInfo.currentSize} KB`) + // 空间不足(大于3mb)时,清理这个设备登录过其他账户的消息 + if (storageInfo && storageInfo.currentSize > 3000) { + console.log("storage空间不足,清理其他用户缓存..") + this.cleanOtherUserCache(); + } + // 保证消息总数量不超过3000条,每个会话不超过500条 + this.fliterMessage(chats, 3000, 500); // #endif // 记录热数据索引位置 chats.forEach(chat => { - if(!chat.hotMinIdx || chat.hotMinIdx != chat.messages.length){ + if (!chat.hotMinIdx || chat.hotMinIdx != chat.messages.length) { chat.hotMinIdx = chat.messages.length; chat.stored = false; } @@ -388,6 +394,21 @@ export default defineStore('chatStore', { if (remainTotalSize > maxTotalSize) { this.fliterMessage(chats, maxTotalSize, maxPerChatSize / 2); } + console.log("消息留存总数量:", remainTotalSize) + console.log("单会话消息数量:", maxPerChatSize) + }, + cleanOtherUserCache() { + const userStore = useUserStore(); + const userId = userStore.userInfo.id; + const prefix = "chats-app-" + userId; + const res = uni.getStorageInfoSync(); + res.keys.forEach(key => { + // 清理其他用户的消息 + if (key.startsWith("chats-app") && !key.startsWith(prefix)) { + uni.removeStorageSync(key); + console.log("清理key:", key) + } + }) }, saveToStorage(withColdMessage) { // 加载中不保存,防止卡顿