|
|
@ -59,7 +59,10 @@ |
|
|
|
<span class="dot">.</span> |
|
|
|
</span> |
|
|
|
</div> |
|
|
|
<div v-else>{{ message.text }}</div> |
|
|
|
<div v-else> |
|
|
|
<div v-if="message.isHtml" v-html="message.text"></div> |
|
|
|
<div v-else>{{ message.text }}</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
@ -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, |
|
|
|
'<span class="token-link" style="color: blue; cursor: pointer; text-decoration: underline;" onclick="window.handleTokenClick()">获取token次数</span>' |
|
|
|
); |
|
|
|
|
|
|
|
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"]); |
|
|
|
|
|
|
|
// 导出方法供外部使用(已在上方定义) |
|
|
|
</script> |
|
|
|