From 849e216829389cb4f34e48c688b60940920b6791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=9D=B0?= Date: Tue, 24 Jun 2025 19:09:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4windows.location=EF=BC=9B?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E9=9D=9E=E6=B3=95=E6=95=B0=E6=8D=AE=E6=97=B6?= =?UTF-8?q?=E5=9C=A8=E5=AF=B9=E8=AF=9D=E7=95=8C=E9=9D=A2=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/AiEmotion.vue | 181 ++++++++++++++++++++++++---------------------- src/views/Selectmodel.vue | 2 - 2 files changed, 96 insertions(+), 87 deletions(-) diff --git a/src/views/AiEmotion.vue b/src/views/AiEmotion.vue index c9cd2c1..847e61f 100644 --- a/src/views/AiEmotion.vue +++ b/src/views/AiEmotion.vue @@ -180,7 +180,7 @@ import emoEnergyConverter from '@/views/components/emoEnergyConverter.vue'; // import marketTemperature from '@/views/components/marketTemperature.vue'; import StockTabs from '@/views/components/StockTabs.vue'; // 导入股票标签页组件 import blueBorderImg from '@/assets/img/AiEmotion/blueBorder.png' //导入蓝色背景框图片 -import { ElMessage } from 'element-plus'; +import { ElMessage } from 'element-plus'; // 接口失败提示已改为对话形式,保留用于输入验证 import { useEmotionStore } from '@/store/emotion'; // 导入Pinia store import { useEmotionAudioStore } from '@/store/emotionAudio.js'; // 导入音频store import { useChatStore } from '@/store/chat.js'; // 导入聊天store @@ -784,96 +784,104 @@ async function handleSendMessage(input) { ElMessage.warning("输入内容不能为空"); return; } - // 触发图片旋转 - isRotating.value = true; - // 设置加载状态,隐藏图表页面 - isLoading.value = true; - if (input.trim()) { + // 检查用户是否有使用次数(检查是否有任何权限) + const hasPermission = userStore.brainPerssion || userStore.swordPerssion || + userStore.pricePerssion || userStore.timePerssion || + userStore.aibullPerssion || userStore.aiGnbullPerssion || + userStore.airadarPerssion; + + if (!hasPermission) { const userMessage = reactive({ sender: 'user', text: input }); messages.value.push(userMessage); + const aiMessage = reactive({ sender: 'ai', text: '您当前没有可用次数,请联系客服或购买服务包。' }); + messages.value.push(aiMessage); + return; + } - try { - // 用来调用工作流接口的参数 - const params = { - content: userMessage.text, - userData: { - token: localStorage.getItem('localToken'), - language: "cn", - // brainPrivilegeState: "1", - // swordPrivilegeState: "1", - // stockForecastPrivile: "1", - // spaceForecastPrivile: "1", - // aibullPrivilegeState: "1", - // aigoldBullPrivilegeS: "1", - // airadarPrivilegeStat: "1", - // marketList: "hk,cn,can,usa,my,sg,vi,in,gb", - brainPrivilegeState: userStore.brainPerssion, - swordPrivilegeState: userStore.swordPerssion, - stockForecastPrivilegeState: userStore.pricePerssion, - spaceForecastPrivilegeState: userStore.timePerssion, - aibullPrivilegeState: userStore.aibullPerssion, - aigoldBullPrivilegeState: userStore.aiGnbullPerssion, - airadarPrivilegeState: userStore.airadarPerssion, - marketList: userStore.aiGoldMarketList, - }, - }; + const userMessage = reactive({ sender: 'user', text: input }); + messages.value.push(userMessage); - const result = await getReplyAPI(params); - const response = await result.json(); // 解析返回的 JSON 数据 - // 解析 data 字段 - const parsedData = JSON.parse(response.data); // 将字符串形式的 JSON 转换为对象 - console.log("解析后的数据:", parsedData); - - if (parsedData && parsedData.market && parsedData.code) { - console.log("工作流接口返回股票信息:", parsedData); - - isPageLoaded.value = false; - - // 调用第二个工作流接口 - const conclusionParams = { - content: input.trim(), - userData: { - token: localStorage.getItem('localToken'), - language: "cn", - marketList: "hk,cn,usa,my,sg,vi,in,gb", - }, - code: parsedData.code, - market: parsedData.market, - }; - // 同时调用第二个数据流接口和fetchData方法 - const [conclusionResult, fetchDataResult] = await Promise.all([ - getConclusionAPI(conclusionParams), - fetchData(parsedData.code, parsedData.market, parsedData.name || "未知股票", input.trim()) - ]); - - // 处理结论接口返回的数据 - const conclusionResponse = await conclusionResult.json(); - console.log("第二个工作流接口返回数据:", conclusionResponse); - - // 将结论数据存储到响应式变量和store中 - if (conclusionResponse && conclusionResponse.data) { - conclusionData.value = conclusionResponse.data; - // 将结论数据存储到store中的当前激活股票 - emotionStore.updateActiveStockConclusion(conclusionResponse.data); - } - } else { - // 不是股票信息,显示refuse信息,但不隐藏页面数据 - ElMessage.error(processRefuseMessage(parsedData.refuse)); - return; // 直接返回,不进行后续处理 - } - } catch (error) { - ElMessage.error('请求工作流接口失败,请检查网络连接'); - return; // 请求失败时直接返回 - } finally { - // 停止图片旋转(只有在设置了旋转状态时才需要停止) - if (isRotating.value) { - isRotating.value = false; - } + try { + // 第一步:调用第一个接口验证用户输入内容是否合法 + const params = { + content: userMessage.text, + userData: { + token: localStorage.getItem('localToken'), + language: "cn", + brainPrivilegeState: userStore.brainPerssion, + swordPrivilegeState: userStore.swordPerssion, + stockForecastPrivilegeState: userStore.pricePerssion, + spaceForecastPrivilegeState: userStore.timePerssion, + aibullPrivilegeState: userStore.aibullPerssion, + aigoldBullPrivilegeState: userStore.aiGnbullPerssion, + airadarPrivilegeState: userStore.airadarPerssion, + marketList: userStore.aiGoldMarketList, + }, + }; + + const result = await getReplyAPI(params); + const response = await result.json(); + const parsedData = JSON.parse(response.data); + console.log("第一个接口解析后的数据:", parsedData); + + // 检查用户输入是否合法 + if (!parsedData || !parsedData.market || !parsedData.code) { + // 输入不合法,返回refuse信息,不进行后续处理 + const aiMessage = reactive({ sender: 'ai', text: processRefuseMessage(parsedData.refuse) }); + messages.value.push(aiMessage); + return; + } + + // 输入合法,开始显示等待提示和后续处理 + // 触发图片旋转 + isRotating.value = true; + // 设置加载状态,隐藏图表页面 + isLoading.value = true; + + console.log("工作流接口返回股票信息:", parsedData); + isPageLoaded.value = false; + + // 调用第二个工作流接口 + const conclusionParams = { + content: input.trim(), + userData: { + token: localStorage.getItem('localToken'), + language: "cn", + marketList: "hk,cn,usa,my,sg,vi,in,gb", + }, + code: parsedData.code, + market: parsedData.market, + }; + // 同时调用第二个数据流接口和fetchData方法 + const [conclusionResult, fetchDataResult] = await Promise.all([ + getConclusionAPI(conclusionParams), + fetchData(parsedData.code, parsedData.market, parsedData.name || "未知股票", input.trim()) + ]); + + // 处理结论接口返回的数据 + const conclusionResponse = await conclusionResult.json(); + console.log("第二个工作流接口返回数据:", conclusionResponse); + + // 将结论数据存储到响应式变量和store中 + if (conclusionResponse && conclusionResponse.data) { + conclusionData.value = conclusionResponse.data; + // 将结论数据存储到store中的当前激活股票 + emotionStore.updateActiveStockConclusion(conclusionResponse.data); + } + } catch (error) { + const aiMessage = reactive({ sender: 'ai', text: '请求工作流接口失败,请检查网络连接' }); + messages.value.push(aiMessage); + return; // 请求失败时直接返回 + } finally { + // 停止图片旋转(只有在设置了旋转状态时才需要停止) + if (isRotating.value) { + isRotating.value = false; } } } + // 请求数据接口 async function fetchData(code, market, stockName, queryText) { try { @@ -918,10 +926,12 @@ async function fetchData(code, market, stockName, queryText) { // 将股票数据添加到store中 emotionStore.addStock(stockData); } else { - ElMessage.error('请求失败,请检查网络连接'); + const aiMessage = reactive({ sender: 'ai', text: '请求失败,请检查网络连接' }); + messages.value.push(aiMessage); } } catch (error) { - ElMessage.error('请求失败,请检查网络连接'); + const aiMessage = reactive({ sender: 'ai', text: '请求失败,请检查网络连接' }); + messages.value.push(aiMessage); } } @@ -969,7 +979,8 @@ function renderCharts(data) { } } catch (error) { console.error('图表渲染过程中发生错误:', error); - ElMessage.error('图表渲染失败,请重试'); + const aiMessage = reactive({ sender: 'ai', text: '图表渲染失败,请重试' }); + messages.value.push(aiMessage); } }, 100); // 100ms延迟确保DOM稳定 }); diff --git a/src/views/Selectmodel.vue b/src/views/Selectmodel.vue index 57197bc..fe72498 100644 --- a/src/views/Selectmodel.vue +++ b/src/views/Selectmodel.vue @@ -42,11 +42,9 @@ onMounted(() => { const goToDBQBmodel = () => { router.push('/DBQBmodel') - window.location.href = '/DBQBmodel' } const goToEmotionsmodel = () => { router.push('/Emotionsmodel') - window.location.href = '/Emotionsmodel' }