diff --git a/src/api/websocket/index.ts b/src/api/websocket/index.ts index 054e4ea..720ec03 100644 --- a/src/api/websocket/index.ts +++ b/src/api/websocket/index.ts @@ -21,6 +21,9 @@ class WebSocketManager { private reconnectAttempts = 0 private maxReconnectAttempts = 5 private reconnectDelay = 3000 + // 用于通知去重的缓存(存储最近处理过的通知ID) + private recentMomentNotifs: Set = new Set() + private notifCacheTimeout = 5000 // 5秒内相同通知视为重复 /** * 连接WebSocket @@ -119,7 +122,10 @@ class WebSocketManager { * 添加普通消息处理器 */ onMessage(handler: MessageHandler) { - this.messageHandlers.push(handler) + // 防止重复注册 + if (!this.messageHandlers.includes(handler)) { + this.messageHandlers.push(handler) + } } /** @@ -136,7 +142,10 @@ class WebSocketManager { * 添加信令处理器 (WebRTC用) */ onSignal(handler: SignalHandler) { - this.signalHandlers.push(handler) + // 防止重复注册 + if (!this.signalHandlers.includes(handler)) { + this.signalHandlers.push(handler) + } } /** @@ -153,7 +162,10 @@ class WebSocketManager { * 添加朋友圈通知处理器 */ onMomentNotification(handler: MomentNotifHandler) { - this.momentNotifHandlers.push(handler) + // 防止重复注册 + if (!this.momentNotifHandlers.includes(handler)) { + this.momentNotifHandlers.push(handler) + } } /** @@ -167,9 +179,27 @@ class WebSocketManager { } /** - * 内部处理朋友圈通知 + * 内部处理朋友圈通知(带去重) */ private handleMomentNotification(payload: MomentNotifPayload) { + // 生成通知唯一标识(基于 moment_id + type + from_user_id) + const notifKey = `${payload.moment_id}_${payload.type}_${payload.from_user?.id || ''}_${payload.comment_id || ''}` + + // 检查是否为重复通知 + if (this.recentMomentNotifs.has(notifKey)) { + console.log('🔄 跳过重复朋友圈通知:', notifKey) + return + } + + // 添加到缓存 + this.recentMomentNotifs.add(notifKey) + + // 设置定时器清除缓存 + setTimeout(() => { + this.recentMomentNotifs.delete(notifKey) + }, this.notifCacheTimeout) + + // 分发给所有处理器 this.momentNotifHandlers.forEach(handler => handler(payload)) } diff --git a/src/components/chat/bubble/Image.vue b/src/components/chat/bubble/Image.vue index 777cb57..a666b84 100644 --- a/src/components/chat/bubble/Image.vue +++ b/src/components/chat/bubble/Image.vue @@ -1,9 +1,9 @@ diff --git a/src/components/moment/MomentPanel.vue b/src/components/moment/MomentPanel.vue index 28007b0..7338ae7 100644 --- a/src/components/moment/MomentPanel.vue +++ b/src/components/moment/MomentPanel.vue @@ -64,7 +64,8 @@ :name="moment.user?.name || ''" :avatar="moment.user?.avatar" size="xl" - class="shrink-0" + class="shrink-0 cursor-pointer hover:opacity-80 transition" + @click="showUserInfo(moment.user)" />
@@ -142,8 +143,9 @@ :name="like.user?.name || ''" :avatar="like.user?.avatar" size="sm" - class="shrink-0" + class="shrink-0 cursor-pointer hover:opacity-80 transition" :title="like.user?.name" + @click="showUserInfo(like.user)" /> @@ -158,21 +160,35 @@
- {{ comment.user?.name }} + {{ comment.user?.name }} - 回复 {{ comment.reply_to_user.name }} + 回复 {{ comment.reply_to_user.name }} : {{ comment.content }} + +
@@ -254,29 +270,48 @@ :initial-index="previewIndex" @close="showImagePreview = false" /> + + +