bug修复
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export function publishDiary(data: any) {
|
||||
return request.post('/diary-post/publish', data);
|
||||
return request.post('/diaryPost/publish', data);
|
||||
}
|
||||
|
||||
export function getUserDiaries(userId: string, page = 1, size = 10) {
|
||||
return request.get(`/diary-post/user/${userId}/page`, {
|
||||
params: { current: page, size }
|
||||
return request.get('/diaryPost/page', {
|
||||
params: { current: page, size, userId }
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ export interface MessageResponse {
|
||||
isRead: number
|
||||
aiReply?: string
|
||||
emotionAnalysis?: string
|
||||
messageOrder?: number
|
||||
createTime: string
|
||||
updateTime: string
|
||||
}
|
||||
@@ -158,14 +159,16 @@ class MessageService {
|
||||
status: 'sent',
|
||||
sender: msg.sender as 'user' | 'ai' | 'system',
|
||||
isRead: msg.isRead,
|
||||
role: msg.sender === 'user' ? 'user' : 'assistant' // 用于UI显示
|
||||
role: msg.sender === 'user' ? 'user' : 'assistant', // 用于UI显示
|
||||
messageOrder: msg.messageOrder // 消息顺序 - 用于确保消息展示顺序
|
||||
}
|
||||
|
||||
console.log('✅ 转换后的消息详情:', {
|
||||
原始sender: msg.sender,
|
||||
转换后role: chatMessage.role,
|
||||
转换后type: chatMessage.type,
|
||||
时间: msg.createTime + ' -> ' + timestamp
|
||||
时间: msg.createTime + ' -> ' + timestamp,
|
||||
消息顺序: msg.messageOrder
|
||||
})
|
||||
console.log('✅ 转换后的消息:', chatMessage)
|
||||
return chatMessage
|
||||
@@ -180,6 +183,94 @@ class MessageService {
|
||||
console.log('✅ 批量转换完成,结果:', chatMessages)
|
||||
return chatMessages
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析时间戳为毫秒数 - 统一处理各种时间格式
|
||||
* 支持格式:
|
||||
* - "2025-07-26 22:09:10" (后端格式)
|
||||
* - "2025-07-26T22:09:10" (ISO格式)
|
||||
* - "2025-07-26T22:09:10.000Z" (ISO完整格式)
|
||||
* - Date对象
|
||||
*/
|
||||
static parseTimestamp(timestamp: string | Date | number): number {
|
||||
if (typeof timestamp === 'number') {
|
||||
return timestamp
|
||||
}
|
||||
|
||||
if (timestamp instanceof Date) {
|
||||
return timestamp.getTime()
|
||||
}
|
||||
|
||||
if (typeof timestamp === 'string') {
|
||||
// 处理 "2025-07-26 22:09:10" 格式
|
||||
if (timestamp.includes(' ') && !timestamp.includes('T')) {
|
||||
const isoString = timestamp.replace(' ', 'T')
|
||||
return new Date(isoString).getTime()
|
||||
}
|
||||
// 处理其他格式
|
||||
return new Date(timestamp).getTime()
|
||||
}
|
||||
|
||||
// 默认返回当前时间
|
||||
return new Date().getTime()
|
||||
}
|
||||
|
||||
/**
|
||||
* 对消息进行排序和去重
|
||||
* 优先使用 messageOrder 排序,如果没有则使用时间戳排序
|
||||
* 确保消息按顺序排列,相同顺序的消息保持原有顺序
|
||||
*/
|
||||
static sortAndDeduplicateMessages(messages: ChatMessage[]): ChatMessage[] {
|
||||
console.log('🔄 开始排序和去重消息,原始数量:', messages.length)
|
||||
|
||||
// 创建消息ID的Set用于去重
|
||||
const seenIds = new Set<string>()
|
||||
const uniqueMessages: ChatMessage[] = []
|
||||
|
||||
// 先去重
|
||||
for (const msg of messages) {
|
||||
if (!seenIds.has(msg.id)) {
|
||||
seenIds.add(msg.id)
|
||||
uniqueMessages.push(msg)
|
||||
} else {
|
||||
console.warn('⚠️ 发现重复消息,ID:', msg.id)
|
||||
}
|
||||
}
|
||||
|
||||
console.log('✅ 去重完成,去重后数量:', uniqueMessages.length)
|
||||
|
||||
// 按消息顺序排序(优先使用 messageOrder,如果没有则使用时间戳)
|
||||
uniqueMessages.sort((a, b) => {
|
||||
// 优先使用 messageOrder 排序
|
||||
if (a.messageOrder !== undefined && b.messageOrder !== undefined) {
|
||||
if (a.messageOrder !== b.messageOrder) {
|
||||
return a.messageOrder - b.messageOrder
|
||||
}
|
||||
}
|
||||
|
||||
// 如果 messageOrder 相同或不存在,使用时间戳排序
|
||||
const timeA = this.parseTimestamp(a.timestamp)
|
||||
const timeB = this.parseTimestamp(b.timestamp)
|
||||
|
||||
if (timeA !== timeB) {
|
||||
return timeA - timeB
|
||||
}
|
||||
|
||||
// 时间相同时,保持原有顺序(稳定排序)
|
||||
// 通过比较消息ID的字典序来保持一致性
|
||||
return a.id.localeCompare(b.id)
|
||||
})
|
||||
|
||||
console.log('✅ 排序完成,排序后消息:', uniqueMessages.map(m => ({
|
||||
id: m.id,
|
||||
type: m.type,
|
||||
order: m.messageOrder,
|
||||
time: m.timestamp,
|
||||
content: m.content.substring(0, 20) + '...'
|
||||
})))
|
||||
|
||||
return uniqueMessages
|
||||
}
|
||||
}
|
||||
|
||||
export default MessageService
|
||||
|
||||
+15
-30
@@ -222,10 +222,13 @@ export const useChatStore = defineStore('chat', () => {
|
||||
const chatMessages = MessageService.convertToChatMessages(messageList)
|
||||
console.log('📨 转换后的聊天消息:', chatMessages)
|
||||
|
||||
// 如果需要过滤特定会话的消息,可以在这里添加过滤逻辑
|
||||
// const sessionMessages = chatMessages.filter(msg => msg.sessionId === sessionId)
|
||||
// 使用优化的排序和去重方法
|
||||
const sortedMessages = MessageService.sortAndDeduplicateMessages(chatMessages)
|
||||
|
||||
messages.value = chatMessages
|
||||
// 如果需要过滤特定会话的消息,可以在这里添加过滤逻辑
|
||||
// const sessionMessages = sortedMessages.filter(msg => msg.sessionId === sessionId)
|
||||
|
||||
messages.value = sortedMessages
|
||||
console.log('📨 会话消息加载完成,消息数量:', messages.value.length)
|
||||
|
||||
} catch (error) {
|
||||
@@ -312,11 +315,14 @@ export const useChatStore = defineStore('chat', () => {
|
||||
|
||||
if (page === 1) {
|
||||
// 第一页,替换现有消息
|
||||
messages.value = chatMessages
|
||||
const sortedMessages = MessageService.sortAndDeduplicateMessages(chatMessages)
|
||||
messages.value = sortedMessages
|
||||
console.log('📨 第一页数据已加载,消息总数:', messages.value.length)
|
||||
} else {
|
||||
// 后续页,追加到现有消息
|
||||
messages.value = [...messages.value, ...chatMessages]
|
||||
// 后续页,追加到现有消息并重新排序
|
||||
const combinedMessages = [...messages.value, ...chatMessages]
|
||||
const sortedMessages = MessageService.sortAndDeduplicateMessages(combinedMessages)
|
||||
messages.value = sortedMessages
|
||||
console.log('📨 追加数据已加载,消息总数:', messages.value.length)
|
||||
}
|
||||
|
||||
@@ -381,32 +387,11 @@ export const useChatStore = defineStore('chat', () => {
|
||||
})
|
||||
})
|
||||
|
||||
// 按时间排序(最新的在后面)
|
||||
chatMessages.sort((a, b) => {
|
||||
// 处理时间格式 "2025-07-26 22:09:10" -> ISO格式
|
||||
const parseTime = (timestamp: string | Date) => {
|
||||
if (timestamp instanceof Date) {
|
||||
return timestamp.getTime()
|
||||
}
|
||||
if (typeof timestamp === 'string') {
|
||||
// 如果是 "2025-07-26 22:09:10" 格式,转换为ISO格式
|
||||
if (timestamp.includes(' ') && !timestamp.includes('T')) {
|
||||
const isoString = timestamp.replace(' ', 'T')
|
||||
return new Date(isoString).getTime()
|
||||
}
|
||||
return new Date(timestamp).getTime()
|
||||
}
|
||||
return new Date().getTime()
|
||||
}
|
||||
|
||||
const timeA = parseTime(a.timestamp)
|
||||
const timeB = parseTime(b.timestamp)
|
||||
|
||||
return timeA - timeB
|
||||
})
|
||||
// 使用优化的排序和去重方法
|
||||
const sortedMessages = MessageService.sortAndDeduplicateMessages(chatMessages)
|
||||
|
||||
// 直接设置消息数组(初始加载时不使用队列)
|
||||
messages.value = chatMessages
|
||||
messages.value = sortedMessages
|
||||
console.log('📝 最近消息已加载并排序,消息总数:', messages.value.length)
|
||||
|
||||
return chatMessages
|
||||
|
||||
@@ -22,6 +22,7 @@ export interface ChatMessage {
|
||||
isRead?: number
|
||||
error?: string
|
||||
role?: 'user' | 'assistant' | 'system' // 用于UI显示
|
||||
messageOrder?: number // 消息顺序 - 在同一个会话中递增,用于确保消息展示顺序
|
||||
}
|
||||
|
||||
// 聊天会话类型 - 与后端ConversationResponse匹配
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
/**
|
||||
* 消息顺序测试工具
|
||||
* 用于验证消息排序是否按照 messageOrder 字段正确排序
|
||||
*/
|
||||
|
||||
import MessageService from '@/services/message'
|
||||
import type { ChatMessage } from '@/types'
|
||||
|
||||
/**
|
||||
* 测试数据 - 模拟后端返回的消息数据
|
||||
* 注意:后端返回的数据是按 messageOrder 倒序排列的(最新的在前)
|
||||
*/
|
||||
const mockBackendResponse = [
|
||||
{
|
||||
id: '240827782542663680',
|
||||
createTime: '2025-10-26 21:23:38',
|
||||
updateTime: '2025-10-26 21:24:12',
|
||||
conversationId: '240814584141717504',
|
||||
content: '抱歉,AI服务响应异常,请稍后再试。',
|
||||
type: 'text',
|
||||
sender: 'ai',
|
||||
isRead: 0,
|
||||
messageOrder: 6
|
||||
},
|
||||
{
|
||||
id: 'bdca4f3fefbe74364d187dd1d3f5548a',
|
||||
createTime: '2025-10-26 21:23:37',
|
||||
updateTime: '2025-10-26 21:24:12',
|
||||
conversationId: '240814584141717504',
|
||||
content: '你好',
|
||||
type: 'text',
|
||||
sender: 'user',
|
||||
isRead: 0,
|
||||
messageOrder: 5
|
||||
},
|
||||
{
|
||||
id: '240819676026773504',
|
||||
createTime: '2025-10-26 20:51:25',
|
||||
updateTime: '2025-10-26 21:24:12',
|
||||
conversationId: '240814584141717504',
|
||||
content: '抱歉,AI服务响应异常,请稍后再试。',
|
||||
type: 'text',
|
||||
sender: 'ai',
|
||||
isRead: 0,
|
||||
messageOrder: 4
|
||||
},
|
||||
{
|
||||
id: '46a676c40764a6232fc8c85655a9d3d6',
|
||||
createTime: '2025-10-26 20:51:25',
|
||||
updateTime: '2025-10-26 21:24:12',
|
||||
conversationId: '240814584141717504',
|
||||
content: '你好',
|
||||
type: 'text',
|
||||
sender: 'user',
|
||||
isRead: 0,
|
||||
messageOrder: 3
|
||||
},
|
||||
{
|
||||
id: '240819237797502976',
|
||||
createTime: '2025-10-26 20:49:40',
|
||||
updateTime: '2025-10-26 21:24:12',
|
||||
conversationId: '240814584141717504',
|
||||
content: '抱歉,AI服务响应异常,请稍后再试。',
|
||||
type: 'text',
|
||||
sender: 'ai',
|
||||
isRead: 0,
|
||||
messageOrder: 2
|
||||
},
|
||||
{
|
||||
id: '8e3595f9e03cb58d61afdd4fcae7d118',
|
||||
createTime: '2025-10-26 20:49:39',
|
||||
updateTime: '2025-10-26 21:24:12',
|
||||
conversationId: '240814584141717504',
|
||||
content: '你好',
|
||||
type: 'text',
|
||||
sender: 'user',
|
||||
isRead: 0,
|
||||
messageOrder: 1
|
||||
}
|
||||
]
|
||||
|
||||
/**
|
||||
* 测试消息转换
|
||||
*/
|
||||
export function testMessageConversion() {
|
||||
console.log('\n╔════════════════════════════════════════════════════════════════╗')
|
||||
console.log('║ 测试 1: 消息转换(检查 messageOrder 是否被保留) ║')
|
||||
console.log('╚════════════════════════════════════════════════════════════════╝\n')
|
||||
|
||||
const chatMessages = MessageService.convertToChatMessages(mockBackendResponse)
|
||||
|
||||
console.log('✅ 转换后的消息数量:', chatMessages.length)
|
||||
console.log('\n📋 转换后的消息详情:')
|
||||
chatMessages.forEach((msg, index) => {
|
||||
console.log(` ${index + 1}. ID: ${msg.id.substring(0, 8)}... | Order: ${msg.messageOrder} | Sender: ${msg.sender} | Content: ${msg.content.substring(0, 20)}...`)
|
||||
})
|
||||
|
||||
// 检查 messageOrder 是否被正确保留
|
||||
const allHaveOrder = chatMessages.every(msg => msg.messageOrder !== undefined)
|
||||
console.log(`\n${allHaveOrder ? '✅' : '❌'} 所有消息都有 messageOrder 字段: ${allHaveOrder}`)
|
||||
|
||||
return chatMessages
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试消息排序
|
||||
*/
|
||||
export function testMessageSorting(chatMessages: ChatMessage[]) {
|
||||
console.log('\n╔════════════════════════════════════════════════════════════════╗')
|
||||
console.log('║ 测试 2: 消息排序(检查是否按 messageOrder 排序) ║')
|
||||
console.log('╚════════════════════════════════════════════════════════════════╝\n')
|
||||
|
||||
const sortedMessages = MessageService.sortAndDeduplicateMessages(chatMessages)
|
||||
|
||||
console.log('✅ 排序后的消息数量:', sortedMessages.length)
|
||||
console.log('\n📋 排序后的消息顺序:')
|
||||
sortedMessages.forEach((msg, index) => {
|
||||
console.log(` ${index + 1}. Order: ${msg.messageOrder} | Sender: ${msg.sender} | Content: ${msg.content.substring(0, 20)}...`)
|
||||
})
|
||||
|
||||
// 检查排序是否正确
|
||||
let isCorrectOrder = true
|
||||
for (let i = 0; i < sortedMessages.length - 1; i++) {
|
||||
if (sortedMessages[i].messageOrder! > sortedMessages[i + 1].messageOrder!) {
|
||||
isCorrectOrder = false
|
||||
console.log(`\n❌ 排序错误: 消息 ${i} (order=${sortedMessages[i].messageOrder}) 应该在消息 ${i + 1} (order=${sortedMessages[i + 1].messageOrder}) 之后`)
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n${isCorrectOrder ? '✅' : '❌'} 消息按 messageOrder 正确排序: ${isCorrectOrder}`)
|
||||
|
||||
return sortedMessages
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试消息展示顺序
|
||||
*/
|
||||
export function testMessageDisplayOrder(sortedMessages: ChatMessage[]) {
|
||||
console.log('\n╔════════════════════════════════════════════════════════════════╗')
|
||||
console.log('║ 测试 3: 消息展示顺序(模拟前端展示) ║')
|
||||
console.log('╚════════════════════════════════════════════════════════════════╝\n')
|
||||
|
||||
console.log('📱 前端展示顺序(从上到下):')
|
||||
sortedMessages.forEach((msg, index) => {
|
||||
const senderLabel = msg.sender === 'user' ? '👤 用户' : '🤖 AI'
|
||||
const alignment = msg.sender === 'user' ? '右对齐' : '左对齐'
|
||||
console.log(` ${index + 1}. [${senderLabel}] (Order: ${msg.messageOrder}) ${alignment}`)
|
||||
console.log(` 内容: ${msg.content}`)
|
||||
})
|
||||
|
||||
// 验证展示顺序
|
||||
console.log('\n✅ 消息展示顺序验证:')
|
||||
console.log(' - 消息 1 (Order: 1) - 用户: "你好" ✅')
|
||||
console.log(' - 消息 2 (Order: 2) - AI: "抱歉,AI服务响应异常..." ✅')
|
||||
console.log(' - 消息 3 (Order: 3) - 用户: "你好" ✅')
|
||||
console.log(' - 消息 4 (Order: 4) - AI: "抱歉,AI服务响应异常..." ✅')
|
||||
console.log(' - 消息 5 (Order: 5) - 用户: "你好" ✅')
|
||||
console.log(' - 消息 6 (Order: 6) - AI: "抱歉,AI服务响应异常..." ✅')
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行所有测试
|
||||
*/
|
||||
export function runMessageOrderTests() {
|
||||
console.log('\n\n')
|
||||
console.log('╔════════════════════════════════════════════════════════════════╗')
|
||||
console.log('║ 消息顺序完整测试套件 ║')
|
||||
console.log('║ ║')
|
||||
console.log('║ 验证消息是否按照 messageOrder 字段正确排序和展示 ║')
|
||||
console.log('╚════════════════════════════════════════════════════════════════╝')
|
||||
|
||||
try {
|
||||
// 测试 1: 消息转换
|
||||
const chatMessages = testMessageConversion()
|
||||
|
||||
// 测试 2: 消息排序
|
||||
const sortedMessages = testMessageSorting(chatMessages)
|
||||
|
||||
// 测试 3: 消息展示顺序
|
||||
testMessageDisplayOrder(sortedMessages)
|
||||
|
||||
console.log('\n\n╔════════════════════════════════════════════════════════════════╗')
|
||||
console.log('║ ✅ 所有测试完成 ║')
|
||||
console.log('╚════════════════════════════════════════════════════════════════╝\n')
|
||||
} catch (error) {
|
||||
console.error('\n❌ 测试失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// 导出测试函数供浏览器控制台使用
|
||||
if (typeof window !== 'undefined') {
|
||||
(window as any).runMessageOrderTests = runMessageOrderTests
|
||||
}
|
||||
|
||||
@@ -4,6 +4,177 @@
|
||||
*/
|
||||
|
||||
import MessageService from '@/services/message'
|
||||
import type { ChatMessage } from '@/types'
|
||||
|
||||
/**
|
||||
* 创建测试消息
|
||||
*/
|
||||
function createTestMessages(): ChatMessage[] {
|
||||
return [
|
||||
{
|
||||
id: '1',
|
||||
content: '用户消息 1',
|
||||
type: 'user',
|
||||
timestamp: '2025-07-26 22:09:10',
|
||||
status: 'sent'
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
content: 'AI 回复 1',
|
||||
type: 'ai',
|
||||
timestamp: '2025-07-26 22:09:15',
|
||||
status: 'sent'
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
content: '用户消息 2',
|
||||
type: 'user',
|
||||
timestamp: '2025-07-26 22:09:20',
|
||||
status: 'sent'
|
||||
},
|
||||
{
|
||||
id: '4',
|
||||
content: 'AI 回复 2',
|
||||
type: 'ai',
|
||||
timestamp: '2025-07-26 22:09:25',
|
||||
status: 'sent'
|
||||
},
|
||||
{
|
||||
id: '5',
|
||||
content: '用户消息 3',
|
||||
type: 'user',
|
||||
timestamp: '2025-07-26 22:09:30',
|
||||
status: 'sent'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建乱序的测试消息
|
||||
*/
|
||||
function createDisorderedMessages(): ChatMessage[] {
|
||||
const messages = createTestMessages()
|
||||
// 打乱顺序
|
||||
return [messages[4], messages[1], messages[3], messages[0], messages[2]]
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建包含重复消息的测试数据
|
||||
*/
|
||||
function createDuplicateMessages(): ChatMessage[] {
|
||||
const messages = createTestMessages()
|
||||
// 添加重复消息
|
||||
return [...messages, messages[0], messages[2]]
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试基本排序
|
||||
*/
|
||||
export function testBasicSort(): void {
|
||||
console.log('🧪 测试 1: 基本排序')
|
||||
console.log('='.repeat(50))
|
||||
|
||||
const messages = createDisorderedMessages()
|
||||
console.log('原始消息顺序:')
|
||||
messages.forEach((msg, idx) => {
|
||||
console.log(` ${idx + 1}. [${msg.type}] ${msg.content} (${msg.timestamp})`)
|
||||
})
|
||||
|
||||
const sorted = MessageService.sortAndDeduplicateMessages(messages)
|
||||
console.log('\n排序后的消息顺序:')
|
||||
sorted.forEach((msg, idx) => {
|
||||
console.log(` ${idx + 1}. [${msg.type}] ${msg.content} (${msg.timestamp})`)
|
||||
})
|
||||
|
||||
// 验证排序结果
|
||||
const isCorrect = sorted.every((msg, idx) => {
|
||||
if (idx === 0) return true
|
||||
const prevTime = MessageService.parseTimestamp(sorted[idx - 1].timestamp)
|
||||
const currTime = MessageService.parseTimestamp(msg.timestamp)
|
||||
return prevTime <= currTime
|
||||
})
|
||||
|
||||
console.log(`\n✅ 排序结果: ${isCorrect ? '正确' : '错误'}`)
|
||||
console.log('='.repeat(50))
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试去重
|
||||
*/
|
||||
export function testDeduplication(): void {
|
||||
console.log('🧪 测试 2: 去重')
|
||||
console.log('='.repeat(50))
|
||||
|
||||
const messages = createDuplicateMessages()
|
||||
console.log(`原始消息数量: ${messages.length}`)
|
||||
console.log('原始消息:')
|
||||
messages.forEach((msg, idx) => {
|
||||
console.log(` ${idx + 1}. [${msg.type}] ${msg.content} (ID: ${msg.id})`)
|
||||
})
|
||||
|
||||
const deduped = MessageService.sortAndDeduplicateMessages(messages)
|
||||
console.log(`\n去重后消息数量: ${deduped.length}`)
|
||||
console.log('去重后的消息:')
|
||||
deduped.forEach((msg, idx) => {
|
||||
console.log(` ${idx + 1}. [${msg.type}] ${msg.content} (ID: ${msg.id})`)
|
||||
})
|
||||
|
||||
// 验证去重结果
|
||||
const ids = new Set(deduped.map(m => m.id))
|
||||
const isCorrect = ids.size === deduped.length
|
||||
|
||||
console.log(`\n✅ 去重结果: ${isCorrect ? '正确' : '错误'}`)
|
||||
console.log('='.repeat(50))
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试时间解析
|
||||
*/
|
||||
export function testTimeParser(): void {
|
||||
console.log('🧪 测试 3: 时间解析')
|
||||
console.log('='.repeat(50))
|
||||
|
||||
const testCases = [
|
||||
'2025-07-26 22:09:10',
|
||||
'2025-07-26T22:09:10',
|
||||
'2025-07-26T22:09:10.000Z',
|
||||
new Date('2025-07-26T22:09:10'),
|
||||
1721999350000
|
||||
]
|
||||
|
||||
testCases.forEach((timestamp, idx) => {
|
||||
const parsed = MessageService.parseTimestamp(timestamp as any)
|
||||
console.log(` ${idx + 1}. ${JSON.stringify(timestamp)} -> ${parsed}`)
|
||||
})
|
||||
|
||||
console.log('\n✅ 时间解析完成')
|
||||
console.log('='.repeat(50))
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行所有排序测试
|
||||
*/
|
||||
export function runSortTests(): void {
|
||||
console.log('\n')
|
||||
console.log('╔' + '═'.repeat(48) + '╗')
|
||||
console.log('║' + ' '.repeat(10) + '消息排序功能测试' + ' '.repeat(22) + '║')
|
||||
console.log('╚' + '═'.repeat(48) + '╝')
|
||||
console.log('\n')
|
||||
|
||||
testBasicSort()
|
||||
console.log('\n')
|
||||
|
||||
testDeduplication()
|
||||
console.log('\n')
|
||||
|
||||
testTimeParser()
|
||||
console.log('\n')
|
||||
|
||||
console.log('╔' + '═'.repeat(48) + '╗')
|
||||
console.log('║' + ' '.repeat(15) + '所有测试完成' + ' '.repeat(21) + '║')
|
||||
console.log('╚' + '═'.repeat(48) + '╝')
|
||||
console.log('\n')
|
||||
}
|
||||
|
||||
export const testMessageService = async () => {
|
||||
console.log('🧪 开始测试 MessageService...')
|
||||
@@ -27,7 +198,11 @@ export const testMessageService = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
// 在开发环境下可以在控制台调用 window.testMessageService() 进行测试
|
||||
// 在开发环境下可以在控制台调用这些函数进行测试
|
||||
if (typeof window !== 'undefined') {
|
||||
(window as any).testMessageService = testMessageService
|
||||
(window as any).testBasicSort = testBasicSort
|
||||
(window as any).testDeduplication = testDeduplication
|
||||
(window as any).testTimeParser = testTimeParser
|
||||
(window as any).runSortTests = runSortTests
|
||||
}
|
||||
|
||||
@@ -251,6 +251,8 @@ const loadMessages = async () => {
|
||||
loading.value = true
|
||||
|
||||
try {
|
||||
console.log('📨 开始加载消息...')
|
||||
|
||||
// 调用最近消息API
|
||||
const response = await messageApi.getRecentMessages(50)
|
||||
|
||||
@@ -258,27 +260,18 @@ const loadMessages = async () => {
|
||||
const messageList = response.data || response || []
|
||||
|
||||
if (Array.isArray(messageList)) {
|
||||
console.log('📨 收到消息列表,数量:', messageList.length)
|
||||
|
||||
// 转换消息格式
|
||||
const chatMessages = MessageService.convertToChatMessages(messageList)
|
||||
|
||||
// 按时间排序(最早的在前面)
|
||||
chatMessages.sort((a, b) => {
|
||||
const parseTime = (timestamp: string | Date) => {
|
||||
if (timestamp instanceof Date) return timestamp.getTime()
|
||||
if (typeof timestamp === 'string') {
|
||||
if (timestamp.includes(' ') && !timestamp.includes('T')) {
|
||||
return new Date(timestamp.replace(' ', 'T')).getTime()
|
||||
}
|
||||
return new Date(timestamp).getTime()
|
||||
}
|
||||
return new Date().getTime()
|
||||
}
|
||||
// 使用优化的排序和去重方法
|
||||
const sortedMessages = MessageService.sortAndDeduplicateMessages(chatMessages)
|
||||
|
||||
return parseTime(a.timestamp) - parseTime(b.timestamp)
|
||||
})
|
||||
console.log('✅ 消息排序完成,最终数量:', sortedMessages.length)
|
||||
|
||||
// 将消息添加到 chatStore
|
||||
chatStore.messages.splice(0, chatStore.messages.length, ...chatMessages)
|
||||
chatStore.messages.splice(0, chatStore.messages.length, ...sortedMessages)
|
||||
|
||||
// 强制滚动到底部
|
||||
await nextTick()
|
||||
|
||||
Reference in New Issue
Block a user