bug修复

This commit is contained in:
2025-10-26 23:26:30 +08:00
parent 85e910fac9
commit df818578e5
20 changed files with 2008 additions and 98 deletions
+194
View File
@@ -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
}
+176 -1
View File
@@ -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
}