update 完成消息盒子功能前后端联动(已读未读在前端浏览器存储)

This commit is contained in:
疯狂的狮子Li
2026-03-27 14:34:38 +08:00
parent 5907e4778b
commit ebc7760de2
10 changed files with 200 additions and 30 deletions
+43 -2
View File
@@ -1,17 +1,28 @@
import { getMessageBox } from '@/api/system/message';
import type { MessageVO } from '@/api/system/message/types';
import { useUserStore } from '@/store/modules/user';
import { getToken } from '@/utils/auth';
import { ElNotification } from 'element-plus';
import { useNoticeStore } from '@/store/modules/notice';
import { isMessageRead } from '@/utils/message-read';
import { parsePushMessage, resolveNoticeGroup, resolveNoticeTitle, shouldAppendNotice } from '@/utils/push-message';
let closePushConnection: (() => void) | undefined;
const formatNoticeTime = (timestamp?: number | string) => {
const time = timestamp ? new Date(timestamp) : new Date();
return time.toLocaleString();
};
const appendNotice = (raw: string) => {
const payload = parsePushMessage(raw);
if (!shouldAppendNotice(payload)) {
return;
}
const userId = useUserStore().userId;
const title = resolveNoticeTitle(payload);
useNoticeStore().addNotice({
messageId: payload.messageId,
title,
category: resolveNoticeGroup(payload),
type: payload.type,
@@ -20,8 +31,9 @@ const appendNotice = (raw: string) => {
content: payload.data?.noticeContent,
data: payload.data,
path: payload.path,
read: false,
time: new Date(payload.timestamp ?? Date.now()).toLocaleString()
read: isMessageRead(userId, payload.messageId),
timestamp: payload.timestamp ?? Date.now(),
time: formatNoticeTime(payload.timestamp)
});
ElNotification({
title,
@@ -31,6 +43,25 @@ const appendNotice = (raw: string) => {
});
};
const toNoticeItem = (item: MessageVO) => {
const userId = useUserStore().userId;
const timestamp = item.createTime ? new Date(item.createTime).getTime() : Date.now();
return {
messageId: item.messageId,
title: item.title,
category: resolveNoticeGroup(item),
type: item.type,
source: item.source,
message: item.message ?? '',
content: item.content,
data: item.data ?? null,
path: item.path,
read: isMessageRead(userId, item.messageId),
timestamp,
time: formatNoticeTime(timestamp)
};
};
const buildSseUrl = (path: string) => {
return `${import.meta.env.VITE_APP_BASE_API}${path}?Authorization=Bearer ${getToken()}&clientid=${import.meta.env.VITE_APP_CLIENT_ID}`;
};
@@ -108,6 +139,16 @@ export const initPush = () => {
initSsePush(buildSseUrl(path));
};
export const initMessageBox = async () => {
if (import.meta.env.VITE_APP_MESSAGE_ENABLED === 'false') {
useNoticeStore().clearNotice();
return;
}
const { data } = await getMessageBox();
const notices = [...(data?.systemList ?? []), ...(data?.noticeList ?? []), ...(data?.workflowList ?? [])].map(toNoticeItem);
useNoticeStore().setNotices(notices);
};
export const closePush = () => {
closePushConnection?.();
closePushConnection = undefined;