fix: 消息中心首次打开时SSE与数据库消息重复显示

SSE消息只有date字段、note为null,数据库消息只有reg_time、note为{},
原getMessageKey将reg_time和date作为两个独立字段拼接签名导致同一条消息签名不同。
归一化时间字段(reg_time||date)和note字段后去重恢复正常。
This commit is contained in:
jxxghp
2026-05-30 19:18:55 +08:00
parent 9aa0a5e1b7
commit b93f8f2bff
+16 -8
View File
@@ -15,7 +15,7 @@ const messages = ref<Message[]>([])
const currData = ref<Message[]>([]) const currData = ref<Message[]>([])
// 已加载消息的签名集合 // 已加载消息的签名集合
// 使用消息内容签名去重,避免仅按秒级时间戳判断时误吞同一秒内的不同消息 // SSE 消息与数据库消息的字段来源不同(date vs reg_time, null vs {}),签名已归一化处理
const messageKeys = new Set<string>() const messageKeys = new Set<string>()
// 是否完成加载 // 是否完成加载
@@ -42,26 +42,34 @@ const MESSAGE_AUTO_SCROLL_THRESHOLD = 64
let scrollTimer: number | undefined let scrollTimer: number | undefined
let scrollReleaseTimer: number | undefined let scrollReleaseTimer: number | undefined
// 获取消息时间 // 生成消息去重签名
function getMessageTime(message: Message) { // SSE 消息只有 date 没有 reg_time,数据库消息只有 reg_time 没有 date
return message.reg_time || message.date || '' // note 在 SSE 侧为 null,数据库侧为 {},需要归一化。
function normalizeNote(note: Message['note']): string {
if (note == null) return ''
if (typeof note === 'string') return note
if (typeof note === 'object' && !Array.isArray(note) && Object.keys(note).length === 0) return ''
return JSON.stringify(note)
} }
// 生成消息签名
function getMessageKey(message: Message) { function getMessageKey(message: Message) {
return [ return [
message.action ?? '', message.action ?? '',
message.userid ?? '', message.userid ?? '',
message.reg_time ?? '', message.reg_time || message.date || '',
message.date ?? '',
message.title ?? '', message.title ?? '',
message.text ?? '', message.text ?? '',
message.image ?? '', message.image ?? '',
message.link ?? '', message.link ?? '',
message.note ?? '', normalizeNote(message.note),
].join('::') ].join('::')
} }
// 获取消息时间
function getMessageTime(message: Message) {
return message.reg_time || message.date || ''
}
// 排序消息列表,确保最新消息始终位于底部 // 排序消息列表,确保最新消息始终位于底部
function sortMessages(items: Message[]) { function sortMessages(items: Message[]) {
return [...items].sort((a, b) => compareTime(getMessageTime(a), getMessageTime(b))) return [...items].sort((a, b) => compareTime(getMessageTime(a), getMessageTime(b)))