对话逻辑修复

This commit is contained in:
2025-07-25 17:48:02 +08:00
parent a4c6140ed5
commit f576de68da
31 changed files with 2129 additions and 588 deletions
+27 -8
View File
@@ -35,20 +35,39 @@ api.interceptors.request.use(
api.interceptors.response.use(
(response: AxiosResponse<ApiResponse>) => {
const { data } = response
// 检查业务状态码
if (data.code !== 200) {
console.error('API Error:', data.message)
return Promise.reject(new Error(data.message))
console.error('API Business Error:', {
code: data.code,
message: data.message,
url: response.config.url
})
// 对于认证错误,特殊处理
if (data.code === 401) {
localStorage.removeItem('token')
window.location.href = '/login'
}
const error = new Error(data.message || '请求失败')
error.response = response
return Promise.reject(error)
}
return response
},
(error) => {
// 处理HTTP错误
if (error.response) {
const { status, data } = error.response
console.error('HTTP Error:', {
status,
url: error.config?.url,
message: data?.message || error.message
})
switch (status) {
case 401:
// 未授权,清除token并跳转到登录页
@@ -72,7 +91,7 @@ api.interceptors.response.use(
} else {
console.error('Request setup error:', error.message)
}
return Promise.reject(error)
}
)
@@ -121,11 +140,11 @@ export const messageApi = {
// 搜索用户消息
searchUserMessages: (keyword: string, limit: number = 50) =>
request.get(`/message/user/search`, { params: { keyword, limit } }),
request.post(`/message/user/search`, { keyword, limit }),
// 获取用户最近的聊天记录
getRecentMessages: (limit: number = 10) =>
request.get(`/message/user/recent`, { params: { limit } }),
request.post(`/message/user/recent`, { limit }),
// 获取消息详情
getMessageById: (id: string) =>
+6 -17
View File
@@ -40,7 +40,7 @@ export const useChatStore = defineStore('chat', () => {
}
}
// 发送消息:WebSocket推送+数据库保存
// 发送消息:仅通过WebSocket推送,后端统一处理保存
const sendMessage = async (content: string) => {
if (!wsConnected.value) {
console.error('WebSocket未连接,无法发送消息')
@@ -52,7 +52,7 @@ export const useChatStore = defineStore('chat', () => {
return
}
// 添加用户消息
// 添加用户消息到前端显示
const userMessage = addMessage({
content,
type: 'user',
@@ -60,28 +60,17 @@ export const useChatStore = defineStore('chat', () => {
})
try {
// WebSocket推送
// 仅通过WebSocket推送,后端会统一处理消息保存
webSocketService.sendChatMessage(content, currentSession.value?.id)
// 更新消息状态为已发送
updateMessageStatus(userMessage.id, 'sent')
// 数据库保存
if (currentSession.value?.id && userStore.user?.id) {
await chatApi.createMessage({
conversationId: currentSession.value.id,
userId: userStore.user.id,
content,
contentType: 'TEXT',
senderType: 'USER',
senderId: userStore.user.id
})
// 注意:移除了重复的REST API调用,避免重复保存消息
// 后端WebSocket处理器会统一保存用户消息到数据库
// 更新消息状态为已送达
updateMessageStatus(userMessage.id, 'delivered')
}
} catch (error) {
console.error('消息发送或保存失败:', error)
console.error('消息发送失败:', error)
// 更新消息状态为失败
updateMessageStatus(userMessage.id, 'failed', '发送失败')
+41 -7
View File
@@ -80,7 +80,7 @@
:class="{ 'user-message': message.type === 'user' }"
>
<div class="message-bubble">
<div v-if="message.type === 'ai'" class="message-avatar">
<div v-if="message.type === 'ai' || message.sender === 'ai'" class="message-avatar">
<a-avatar :src="kaikaiAvatar" :size="32" />
</div>
<div class="message-content">
@@ -285,12 +285,13 @@
SearchOutlined,
HeartOutlined,
} from '@ant-design/icons-vue'
import { useChatStore } from '@/stores'
import { useChatStore, useUserStore } from '@/stores'
import { formatTime } from '@/utils'
import { messageApi, emotionSummaryApi } from '@/services/api'
import type { Dayjs } from 'dayjs'
const chatStore = useChatStore()
const userStore = useUserStore()
// 响应式数据
const messageInput = ref('')
@@ -443,9 +444,18 @@
try {
historyLoading.value = true
console.log('开始加载历史记录:', {
page,
pageSize: historyPagination.value.pageSize,
token: !!localStorage.getItem('token'),
userInfo: userStore.userInfo
})
// 调用API获取用户消息(后端会从token中获取用户信息)
const pageData = await messageApi.getUserMessages(page, historyPagination.value.pageSize)
console.log('API返回数据:', pageData)
if (page === 1) {
historyMessages.value = pageData.records || []
} else {
@@ -458,10 +468,20 @@
total: pageData.total || 0
}
console.log('历史记录加载成功:', historyMessages.value.length, '条')
console.log('历史记录加载成功:', {
total: historyMessages.value.length,
pagination: historyPagination.value
})
} catch (error) {
console.error('加载历史记录时发生错误:', error)
// 显示用户友好的错误信息
if (error.response?.status === 401) {
console.log('认证失败,可能需要重新登录')
} else if (error.response?.status === 500) {
console.log('服务器错误,请稍后重试')
}
} finally {
historyLoading.value = false
}
@@ -477,13 +497,27 @@
try {
historyLoading.value = true
console.log('开始搜索历史记录:', {
keyword: searchKeyword.value,
token: !!localStorage.getItem('token')
})
// 调用API搜索用户消息(后端会从token中获取用户信息)
const messages = await messageApi.searchUserMessages(searchKeyword.value, 100)
historyMessages.value = messages || []
console.log('搜索历史记录成功:', historyMessages.value.length, '条')
console.log('搜索历史记录成功:', {
keyword: searchKeyword.value,
total: historyMessages.value.length
})
} catch (error) {
console.error('搜索历史记录时发生错误:', error)
// 显示用户友好的错误信息
if (error.response?.status === 401) {
console.log('认证失败,搜索功能需要登录')
}
} finally {
historyLoading.value = false
}
@@ -509,15 +543,15 @@
id: msg.id,
content: msg.content,
sender: msg.sender === 'user' ? 'user' : 'ai',
timestamp: new Date(msg.createTime).getTime(),
type: 'text'
type: msg.sender === 'user' ? 'user' : 'ai', // 修复:type字段用于CSS类判断
timestamp: new Date(msg.createTime).getTime()
}))
// 按时间顺序排列(最新的在最后)
chatMessages.sort((a, b) => a.timestamp - b.timestamp)
// 添加到消息列表
messages.value.push(...chatMessages)
chatStore.messages.push(...chatMessages)
console.log('加载最近聊天记录成功:', chatMessages.length, '条')
}