Browse Source

1.修复新用户无法拉取到被移除群的消息

2.h5和小程序在storage缓存不足时,自动清除其他用户的缓存
master
xsx 2 months ago
parent
commit
9067a11e18
  1. 10
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java
  2. 29
      im-uniapp/store/chatStore.js

10
im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java

@ -145,22 +145,22 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
@Override
public List<GroupMessageVO> loadOffineMessage(Long minId) {
UserSession session = SessionContext.getSession();
List<GroupMessage> messages = new ArrayList<>();
// 查询用户加入的群组
List<GroupMember> members = groupMemberService.findByUserId(session.getUserId());
Map<Long, GroupMember> groupMemberMap = CollStreamUtil.toIdentityMap(members, GroupMember::getGroupId);
Set<Long> groupIds = groupMemberMap.keySet();
if (groupIds.isEmpty()) {
return Collections.EMPTY_LIST;
}
// 只能拉取最近30天的消息
Date minDate = DateUtils.addDays(new Date(), Math.toIntExact(-Constant.MAX_OFFLINE_MESSAGE_DAYS));
if(!groupIds.isEmpty()) {
LambdaQueryWrapper<GroupMessage> 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<GroupMessage> messages = this.list(wrapper);
messages = this.list(wrapper);
}
// 查询退群前的消息
Date minQuitTime = minDate;
if (minId > 0) {
@ -172,7 +172,7 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
}
List<GroupMember> quitMembers = groupMemberService.findQuitMembers(session.getUserId(), minQuitTime);
for (GroupMember quitMember : quitMembers) {
wrapper = Wrappers.lambdaQuery();
LambdaQueryWrapper<GroupMessage> wrapper = Wrappers.lambdaQuery();
wrapper.gt(GroupMessage::getId, minId);
wrapper.between(GroupMessage::getSendTime, minDate, quitMember.getQuitTime());
wrapper.eq(GroupMessage::getGroupId, quitMember.getGroupId());

29
im-uniapp/store/chatStore.js

@ -355,10 +355,16 @@ 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 => {
@ -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) {
// 加载中不保存,防止卡顿

Loading…
Cancel
Save