fix: 修复提交冲突引发的问题

This commit is contained in:
Ray.Hao
2026-03-24 08:18:40 +08:00
parent 4eea3ed6cb
commit dd52225378
25 changed files with 573 additions and 1199 deletions

View File

@@ -4,13 +4,15 @@
import { ref, onMounted, onBeforeUnmount } from "vue";
import type { NoticeItem, NoticeDetail, NoticeQueryParams } from "@/types/api";
import NoticeAPI from "@/api/system/notice";
import { useStomp } from "@/composables";
import { useSse } from "@/composables";
import router from "@/router";
const PAGE_SIZE = 5;
const NOTICE_EVENT = "notice";
export function useNotice() {
const { subscribe, unsubscribe, isConnected } = useStomp();
const { on } = useSse();
// 状态
const list = ref<NoticeItem[]>([]);
@@ -18,7 +20,7 @@ export function useNotice() {
const detail = ref<NoticeDetail | null>(null);
const dialogVisible = ref(false);
let subscribed = false;
let unsubscribe: (() => void) | null = null;
// ============================================
// 数据获取
@@ -40,7 +42,6 @@ export function useNotice() {
detail.value = await NoticeAPI.getDetail(id);
dialogVisible.value = true;
// 从列表中移除已读项
const idx = list.value.findIndex((item: NoticeItem) => item.id === id);
if (idx >= 0) list.value.splice(idx, 1);
if (unreadTotal.value > 0) unreadTotal.value -= 1;
@@ -60,18 +61,16 @@ export function useNotice() {
}
// ============================================
// WebSocket 订阅
// SSE 订阅
// ============================================
function setupSubscription() {
if (subscribed || !isConnected.value) return;
if (unsubscribe) return;
subscribe("/user/queue/message", (message: any) => {
unsubscribe = on(NOTICE_EVENT, (data: any) => {
try {
const data = JSON.parse(message.body || "{}");
if (!data.id) return;
// 避免重复
if (list.value.some((item: NoticeItem) => item.id === data.id)) return;
unreadTotal.value += 1;
@@ -98,7 +97,19 @@ export function useNotice() {
}
});
subscribed = true;
on("notice-revoke", (data: any) => {
try {
if (!data.id) return;
const idx = list.value.findIndex((item: NoticeItem) => item.id === data.id);
if (idx >= 0) {
list.value.splice(idx, 1);
if (unreadTotal.value > 0) unreadTotal.value -= 1;
}
} catch (e) {
console.error("处理撤回通知失败", e);
}
});
}
// ============================================
@@ -111,8 +122,10 @@ export function useNotice() {
});
onBeforeUnmount(() => {
unsubscribe("/user/queue/message");
subscribed = false;
if (unsubscribe) {
unsubscribe();
unsubscribe = null;
}
});
return {