From b6a5bb0f624fada165617e256dbe3b09b11aa181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=9D=B0?= Date: Sat, 23 Aug 2025 15:10:02 +0800 Subject: [PATCH] =?UTF-8?q?token=E4=B8=BA0=E6=97=B6=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E5=85=85=E5=80=BC=E9=93=BE=E6=8E=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/emotion.ts | 1 + src/views/AiEmotion.vue | 135 +++++++++++++++++++++++++++++++++++++++++++++--- src/views/homePage.vue | 1 + 3 files changed, 131 insertions(+), 6 deletions(-) diff --git a/src/store/emotion.ts b/src/store/emotion.ts index 7cf7874..c1d3c3a 100644 --- a/src/store/emotion.ts +++ b/src/store/emotion.ts @@ -209,4 +209,5 @@ interface ConversationMessage { timestamp?: string; // 消息时间戳 id?: string; // 消息唯一标识(可选) type?: string; // 消息类型(可选,如 'text', 'error', 'system' 等) + isHtml?: boolean; // 是否为HTML内容(可选) } \ No newline at end of file diff --git a/src/views/AiEmotion.vue b/src/views/AiEmotion.vue index 3d1c238..b2ef2f6 100644 --- a/src/views/AiEmotion.vue +++ b/src/views/AiEmotion.vue @@ -59,7 +59,10 @@ . -
{{ message.text }}
+
+
+
{{ message.text }}
+
@@ -532,6 +535,7 @@ const loadConversationsFromStore = () => { messages.value = storedConversations.map((conv) => ({ sender: conv.sender, text: conv.text, + isHtml: conv.isHtml || false, })); }; @@ -2205,10 +2209,124 @@ async function handleSendMessage(input, onComplete) { marketList: "hk,cn,usa,my,sg,vi,in,gb", content: userMessage.text, }); - const response = result; - const parsedData = response.data; + const parsedData = result.data; console.log("第一个接口返回的完整数据:", parsedData); - // 检查用户输入是否合法 + + // 根据状态码判断并处理不同情况 + if (result.code === 400) { + // 状态码400:用户输入内容不合法 + if (thinkingMessageRef) { + const index = messages.value.indexOf(thinkingMessageRef); + if (index > -1) { + messages.value.splice(index, 1); + } + } + + isPageLoaded.value = false; + const refuseMessage = result.msg || "用户输入内容不合法,请重新输入"; + const aiMessage = reactive({ + sender: "ai", + text: processRefuseMessage(refuseMessage), + }); + messages.value.push(aiMessage); + + emotionStore.addConversation({ + sender: "ai", + text: processRefuseMessage(refuseMessage), + timestamp: new Date().toISOString(), + }); + isRotating.value = false; + messages.value = [...previousMessages, ...messages.value]; + + nextTick(() => { + scrollToBottom(); + }); + + if (onComplete && typeof onComplete === "function") { + onComplete(); + currentOnCompleteCallback.value = null; + } + return; + } else if (result.code === 406) { + // 状态码406:token为0 + if (thinkingMessageRef) { + const index = messages.value.indexOf(thinkingMessageRef); + if (index > -1) { + messages.value.splice(index, 1); + } + } + + isPageLoaded.value = false; + const refuseMessage = result.msg || "您的使用次数已用完,请联系客服或购买服务包"; + + // 处理消息中的"获取token次数"文字,将其转换为可点击的链接 + const processedMessage = processRefuseMessage(refuseMessage).replace( + /获取token次数/g, + '获取token次数' + ); + + const aiMessage = reactive({ + sender: "ai", + text: processedMessage, + isHtml: true, // 标记这是HTML内容 + }); + messages.value.push(aiMessage); + + emotionStore.addConversation({ + sender: "ai", + text: processedMessage, + isHtml: true, // 保存HTML标记 + timestamp: new Date().toISOString(), + }); + isRotating.value = false; + messages.value = [...previousMessages, ...messages.value]; + + nextTick(() => { + scrollToBottom(); + }); + + if (onComplete && typeof onComplete === "function") { + onComplete(); + currentOnCompleteCallback.value = null; + } + return; + } else if (result.code !== 200) { + // 其他非200状态码,显示通用错误信息 + if (thinkingMessageRef) { + const index = messages.value.indexOf(thinkingMessageRef); + if (index > -1) { + messages.value.splice(index, 1); + } + } + + isPageLoaded.value = false; + const refuseMessage = result.msg || "系统异常,请稍后再试"; + const aiMessage = reactive({ + sender: "ai", + text: processRefuseMessage(refuseMessage), + }); + messages.value.push(aiMessage); + + emotionStore.addConversation({ + sender: "ai", + text: processRefuseMessage(refuseMessage), + timestamp: new Date().toISOString(), + }); + isRotating.value = false; + messages.value = [...previousMessages, ...messages.value]; + + nextTick(() => { + scrollToBottom(); + }); + + if (onComplete && typeof onComplete === "function") { + onComplete(); + currentOnCompleteCallback.value = null; + } + return; + } + + // 状态码200:用户输入内容合法,检查数据完整性 if (!parsedData || !parsedData.market || !parsedData.code) { // 输入不合法,先清理思考过程消息 if (thinkingMessageRef) { @@ -2221,7 +2339,7 @@ async function handleSendMessage(input, onComplete) { // 关闭加载状态和等待提示,返回refuse信息,停止图片旋转,恢复历史数据 // isLoading.value = false; isPageLoaded.value = false; - const refuseMessage = response && response.msg ? response.msg : "系统正在为您努力加载中,请稍后再试"; + const refuseMessage = result && result.msg ? result.msg : "系统正在为您努力加载中,请稍后再试"; const aiMessage = reactive({ sender: "ai", text: processRefuseMessage(refuseMessage), @@ -3332,6 +3450,11 @@ const handleContainerScroll = () => { // 页面挂载完成后触发图片旋转和设置滚动监听 onMounted(async () => { + // 设置全局点击处理函数 + window.handleTokenClick = () => { + emit('showCount'); + }; + // 恢复对话记录 loadConversationsFromStore(); // 从stockList加载对话记录 @@ -3538,7 +3661,7 @@ onUnmounted(() => { }); // 声明组件可以触发的事件 -const emit = defineEmits(["updateMessage", "sendMessage", "ensureAIchat", "enableInput", "scrollToBottom"]); +const emit = defineEmits(["updateMessage", "sendMessage", "ensureAIchat", "enableInput", "scrollToBottom", "showCount"]); // 导出方法供外部使用(已在上方定义) diff --git a/src/views/homePage.vue b/src/views/homePage.vue index f663f57..a8ecba0 100644 --- a/src/views/homePage.vue +++ b/src/views/homePage.vue @@ -1319,6 +1319,7 @@ onUnmounted(() => { @ensureAIchat="ensureAIchat" @enableInput="enableInput" @scrollToBottom="handleAiEmotionScrollToBottom" + @showCount="showCount" ref="aiEmotionRef" />