From a06ee95482d42acf7698bc2cbc623e4374047ec4 Mon Sep 17 00:00:00 2001 From: jinhhanhan <1683105490@qq.com> Date: Fri, 12 Dec 2025 16:41:54 +0800 Subject: [PATCH] =?UTF-8?q?chore=EF=BC=9A=E5=8F=AF=E4=BB=A5=E7=9C=8B?= =?UTF-8?q?=E8=A7=81=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai-chat-message/ai-chat-message.vue | 110 +++++++++--------- 1 file changed, 58 insertions(+), 52 deletions(-) diff --git a/components/ai-chat-message/ai-chat-message.vue b/components/ai-chat-message/ai-chat-message.vue index c067645..e1e5895 100644 --- a/components/ai-chat-message/ai-chat-message.vue +++ b/components/ai-chat-message/ai-chat-message.vue @@ -837,58 +837,64 @@ export default { }, // 加载更多历史消息 - async loadMoreHistory() { - if (!this.showLoadMore || !this.currentConversationId) { - this.hasMoreHistory = false - return - } - - this.hasMoreHistory = true - this.loadingText = '加载历史消息中...' - - try { - const res = await aiService.getConversationHistory({ - conversation_id: this.currentConversationId, - limit: 20, - offset: this.messages.length // 简单分页:已加载多少条,就跳过多少 - }) - - if (res.success && Array.isArray(res.messages)) { - // 转换后端消息格式 → 前端组件格式 - const historyMessages = res.messages.map(msg => ({ - id: msg.id, // 直接用后端的字符串 ID(比自增数字更可靠) - role: msg.role === 'user' ? 'user' : 'ai', // 关键:'assistant' → 'ai' - type: 'text', - content: msg.content, - timestamp: msg.create_time * 1000 // 秒 → 毫秒 - })).reverse() // 后端按时间正序(旧→新),但我们要插到顶部,所以 reverse 成 新→旧?不! - - // ⚠️ 注意:getHistory 返回的是从旧到新(offset=0 是最早的消息) - // 而 this.messages 是 [旧, ..., 新] - // 所以新加载的历史应该放在现有消息的前面,且保持“旧→新”顺序 - // 因此 **不要 reverse**!直接拼接即可(但确保 offset 正确) - - // 更安全的做法:按时间排序(可选) - // historyMessages.sort((a, b) => a.timestamp - b.timestamp) - - // 插入到顶部(历史在上,最新在下) - this.messages = [...historyMessages, ...this.messages] - - // 判断是否还有更多历史 - this.hasMoreHistory = res.total > this.messages.length - this.showLoadMore = res.total > this.messages.length - } else { - this.hasMoreHistory = false - this.showLoadMore = false - } - } catch (error) { - console.error('加载历史失败:', error) - uni.showToast({ title: '加载历史失败', icon: 'none' }) - this.hasMoreHistory = false - this.showLoadMore = false - } - }, - + async loadMoreHistory() { + if (!this.showLoadMore || !this.currentConversationId || this.isLoadingHistory) { + return + } + + this.isLoadingHistory = true + this.loadingText = '加载历史消息中...' + this.hasMoreHistory = true + + try { + const response = await aiService.getConversationHistory({ + conversation_id: this.currentConversationId, + limit: 20, + offset: this.messages.length + }) + + if (response.success && Array.isArray(response.messages)) { + const historyMessages = response.messages.map(msg => ({ + id: msg.id, + role: msg.role === 'user' ? 'user' : 'ai', + type: 'text', + content: msg.content, + timestamp: msg.create_time * 1000 + })) + + if (historyMessages.length > 0) { + this.messages = [...historyMessages, ...this.messages] + + // 👇 注意:这里加了 async + this.$nextTick(async () => { + const query = uni.createSelectorQuery().in(this) + query.select('.chat-messages').boundingClientRect() + query.select('.chat-messages').scrollOffset() + + const res = await new Promise((resolve) => { + query.exec(resolve) + }) + + const currentScrollTop = res[1]?.scrollTop || 0 + const avgMessageHeight = 80 + const addedHeight = historyMessages.length * avgMessageHeight + + this.scrollTop = currentScrollTop - addedHeight + }) + } + } else { + this.showLoadMore = false + } + } catch (error) { + console.error('加载历史失败:', error) + uni.showToast({ title: '加载历史失败', icon: 'none' }) + this.showLoadMore = false + } finally { + this.isLoadingHistory = false + this.hasMoreHistory = false + this.loadingText = '加载更多历史消息' + } + }, // 显示更多工具 showMoreTools() { this.showToolsPanel = true