mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 23:56:42 +08:00
fix: 消息中心首次打开时SSE与数据库消息重复显示
SSE消息只有date字段、note为null,数据库消息只有reg_time、note为{},
原getMessageKey将reg_time和date作为两个独立字段拼接签名导致同一条消息签名不同。
归一化时间字段(reg_time||date)和note字段后去重恢复正常。
This commit is contained in:
@@ -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)))
|
||||||
|
|||||||
Reference in New Issue
Block a user