前端:

1、更新界面图标
2、修改消息缓存逻辑
3、新增清空未读消息数
后端:
1、修复不同时区导致的时间显示问题
2、新增清空未读消息数接口
This commit is contained in:
2026-01-21 18:48:05 +08:00
parent bedcf97c9d
commit 77744015de
21 changed files with 943 additions and 42 deletions
+16 -4
View File
@@ -10,8 +10,20 @@ export const useChatStore = defineStore('chat', {
pageSize: 20
}),
actions: {
// 抽取统一的排序去重方法
pushAndSortMessages(newMsgs) {
const combined = [...this.messages, ...newMsgs];
// 1. 根据 msgId 或唯一 key 去重
const uniqueMap = new Map();
combined.forEach(m => uniqueMap.set(m.msgId || m.id, m));
// 2. 转换为数组并按时间戳升序排序 (旧的在前,新的在后)
this.messages = Array.from(uniqueMap.values()).sort((a, b) => {
return new Date(a.timeStamp).getTime() - new Date(b.timeStamp).getTime();
});
},
async addMessage(msg, sessionId) {
await messagesDb.save({ ...msg, sessionId });
await messagesDb.save({ ...msg, sessionId, isLoading: false });
this.messages.push({ ...msg, sessionId })
},
/**
@@ -32,13 +44,13 @@ export const useChatStore = defineStore('chat', {
const serverHistoryMsg = await this.fetchHistoryFromServer(this.activeConversationId, conversation.lastReadMessageId);
//对消息进行过滤,防止重复消息
const filterMsg = serverHistoryMsg.filter(m => !this.messages.find(exist => exist.msgId === m.msgId));
this.messages = [...filterMsg, ...this.messages]
this.pushAndSortMessages([...filterMsg, ...this.messages]);
}
//拉取新消息
this.fetchNewMsgFromServier(this.activeConversationId).then((newMsg) => {
//去重
const filterNewMsg = newMsg.filter(m => !this.messages.find(exist => exist.msgId === m.msgId));
this.messages = [...filterNewMsg, ...this.messages]
this.pushAndSortMessages([...filterNewMsg, ...this.messages])
});
},
/**
@@ -88,7 +100,7 @@ export const useChatStore = defineStore('chat', {
} else {
const fetchMsg = await this.fetchHistoryFromServer(this.conversationId, this.messages[0].msgId);
const newMsgs = fetchMsg.filter(m => !this.messages.find(exist => exist.msgId === m.msgId));
this.messages = [...newMsgs, ...this.messages]
this.pushAndSortMessages([...newMsgs, ...this.messages])
}
}
}
+9
View File
@@ -9,6 +9,15 @@ export const useConversationStore = defineStore('conversation', {
state: () => ({
conversations: []
}),
// stores/conversation.js
getters: {
// 始终根据时间戳倒序排列
sortedConversations: (state) => {
return [...state.conversations].sort((a, b) =>
new Date(b.dateTime) - new Date(a.dateTime)
);
}
},
actions: {
async addConversation(conversation) {
await conversationDb.save(conversation);
+21 -2
View File
@@ -4,6 +4,8 @@ import { useMessage } from "@/components/messages/useAlert";
import { useAuthStore } from "./auth";
import { useChatStore } from "./chat";
import { authService } from "@/services/auth";
import { generateSessionId } from "@/utils/sessionIdTools";
import { messageHandler } from "@/handler/messageHandler";
export const useSignalRStore = defineStore('signalr', {
state: () => ({
@@ -39,6 +41,7 @@ export const useSignalRStore = defineStore('signalr', {
registerHandlers() {
const chatStore = useChatStore()
this.connection.on('ReceiveMessage', (msg) => {
messageHandler(msg);
chatStore.addMessage(msg);
});
@@ -46,6 +49,11 @@ export const useSignalRStore = defineStore('signalr', {
this.connection.onreconnected(() => { this.isConnected = true });
},
/**
* 通过signalr发送消息
* @param {*} msg
* @returns
*/
async sendMsg(msg) {
const message = useMessage()
const chatStore = useChatStore()
@@ -59,13 +67,24 @@ export const useSignalRStore = defineStore('signalr', {
if (msg.msgId == null) {
msg.msgId = self.crypto.randomUUID();
}
await this.connection.invoke("SendMessage", msg);
chatStore.addMessage(msg);
const sessionId = generateSessionId(msg.senderId, msg.receiverId);
this.connection.invoke("SendMessage", msg).then(() => {
const msga = chatStore.messages.find(x => x.msgId == msg.msgId)
if (msga.isLoading) {
msga.isLoading = false;
}
})
;
chatStore.addMessage({ ...msg, isLoading: true }, sessionId);
messageHandler(msg);
console.log("消息发送成功!");
} catch (err) {
console.error("消息发送失败:", err);
message.error("消息发送失败");
}
},
async clearUnreadCount(conversationId) {
await this.connection.invoke("ClearUnreadCount", conversationId)
}
}
})