13 Commits

  1. 90
      src/views/AiEmotion.vue
  2. 2
      src/views/Announcement.vue
  3. 2345
      src/views/components/emoEnergyConverter.vue
  4. 6
      src/views/components/emotionDecod.vue
  5. 2
      src/views/components/emotionalBottomRadar.vue
  6. 2
      src/views/homePage.vue

90
src/views/AiEmotion.vue

@ -694,9 +694,15 @@ const stockAudioStates = ref(new Map());
// //
const getStockUniqueId = (stock) => { const getStockUniqueId = (stock) => {
// 使uniqueId
if (stock.uniqueId) {
return stock.uniqueId;
}
//
const stockCode = stock.stockInfo?.code || stock.stockInfo?.symbol; const stockCode = stock.stockInfo?.code || stock.stockInfo?.symbol;
const timestamp = stock.timestamp; const timestamp = stock.timestamp;
return stockCode && timestamp ? `${stockCode}_${timestamp}` : stockCode;
return stockCode && timestamp ? `${stockCode}_${timestamp}` : null;
}; };
// //
const currentOnCompleteCallback = ref(null); const currentOnCompleteCallback = ref(null);
@ -943,7 +949,7 @@ watch(
hasTriggeredAudio.value = false; hasTriggeredAudio.value = false;
hasTriggeredTypewriter.value = false; hasTriggeredTypewriter.value = false;
//
// 使uniqueId
const stockUniqueId = getStockUniqueId(newStock); const stockUniqueId = getStockUniqueId(newStock);
// URL // URL
@ -955,10 +961,10 @@ watch(
? newStock.conclusionData ? newStock.conclusionData
: JSON.parse(newStock.conclusionData); : JSON.parse(newStock.conclusionData);
//
if (stockUniqueId && stockTypewriterShown.value.has(stockUniqueId)) {
//
// URL
const shouldShowTypewriter = stockUniqueId && stockTypewriterTexts.value.has(stockUniqueId);
if (!shouldShowTypewriter) {
// URL // URL
let voiceUrl = null; let voiceUrl = null;
// 使one1_urlURL // 使one1_urlURL
@ -2176,16 +2182,44 @@ async function handleSendMessage(input, onComplete) {
}; };
console.log("第二个接口参数:", conclusionParams); console.log("第二个接口参数:", conclusionParams);
// Promise.all
const stockUniqueId = `${parsedData.code}_${parsedData.market}_${new Date().toISOString()}`;
const isFirstTime = !stockTypewriterShown.value.has(stockUniqueId);
//
if (isFirstTime && isUserInitiated.value) {
//
console.log('预设股票为打字机模式:', parsedData.name);
stockTypewriterTexts.value.set(stockUniqueId, {
one1: "", one2: "", two: "", three: "", four: "", disclaimer: ""
});
stockTypewriterVisibility.value.set(stockUniqueId, {
one: false, two: false, three: false, four: false, disclaimer: false
});
} else {
//
console.log('预设股票为完整显示模式:', parsedData.name);
stockTypewriterTexts.value.delete(stockUniqueId);
stockTypewriterVisibility.value.delete(stockUniqueId);
//
if (isFirstTime) {
stockTypewriterShown.value.set(stockUniqueId, true);
stockAudioPlayed.value.set(stockUniqueId, true);
}
}
// fetchData // fetchData
const [conclusionResult, fetchDataResult] = await Promise.all([ const [conclusionResult, fetchDataResult] = await Promise.all([
getConclusionAPI(conclusionParams), getConclusionAPI(conclusionParams),
fetchData( fetchData(
parsedData.code,
parsedData.market,
parsedData.name || "未知股票",
input.trim(),
parsedData.stockId
),
parsedData.code,
parsedData.market,
parsedData.name || "未知股票",
input.trim(),
parsedData.stockId,
stockUniqueId //
),
]); ]);
// //
@ -2436,7 +2470,7 @@ async function handleSendMessage(input, onComplete) {
} }
// //
async function fetchData(code, market, stockName, queryText, stockId) {
async function fetchData(code, market, stockName, queryText, stockId, presetUniqueId = null) {
try { try {
const stockDataParams = { const stockDataParams = {
stockId: stockId, stockId: stockId,
@ -2516,6 +2550,7 @@ async function fetchData(code, market, stockName, queryText, stockId) {
apiData: stockDataResponse.data, apiData: stockDataResponse.data,
conclusionData: conclusionData.value, // conclusionData: conclusionData.value, //
timestamp: new Date().toISOString(), timestamp: new Date().toISOString(),
uniqueId: presetUniqueId || `${code}_${market}_${new Date().toISOString()}`, //
}; };
// storeStockTabs // storeStockTabs
emotionStore.addStock(stockData); emotionStore.addStock(stockData);
@ -2722,22 +2757,23 @@ async function renderChartsSequentially(clonedData, stockIndex = 0) {
console.log(`${config.name}Ref方法:`, typeof config.ref[config.method]); console.log(`${config.name}Ref方法:`, typeof config.ref[config.method]);
if (typeof config.ref[config.method] === "function") { if (typeof config.ref[config.method] === "function") {
try {
// DOM
await new Promise((resolve) => setTimeout(resolve, 100));
try {
// 2
const delay = stockIndex === 0 ? 100 : 300 + (stockIndex * 100);
await new Promise((resolve) => setTimeout(resolve, delay));
config.ref[config.method](...config.params);
console.log(`${stockIndex}个股票的${config.name}图表渲染成功`);
config.ref[config.method](...config.params);
console.log(`${stockIndex}个股票的${config.name}图表渲染成功`);
//
await new Promise((resolve) => setTimeout(resolve, 800));
} catch (error) {
console.error(
`${stockIndex}个股票的${config.name}图表渲染失败:`,
error
);
}
} else {
//
await new Promise((resolve) => setTimeout(resolve, 800));
} catch (error) {
console.error(
`${stockIndex}个股票的${config.name}图表渲染失败:`,
error
);
}
} else {
console.error( console.error(
`${stockIndex}个股票的${config.name}Ref.${config.method} 方法不存在` `${stockIndex}个股票的${config.name}Ref.${config.method} 方法不存在`
); );
@ -4099,7 +4135,7 @@ const emit = defineEmits(["updateMessage", "sendMessage", "ensureAIchat", "enabl
.user-content { .user-content {
display: flex; display: flex;
height: 100%; height: 100%;
align-items: flex-start;
align-items: center;
margin-right: 5px; margin-right: 5px;
} }

2
src/views/Announcement.vue

@ -114,7 +114,7 @@ onMounted(() => {
<div class="announcement"> <div class="announcement">
<p class="announcementItem">各位AI小财神的用户,大家好!</p> <p class="announcementItem">各位AI小财神的用户,大家好!</p>
<p class="announcementItem"> <p class="announcementItem">
试运行期间,用户可在AI小财神中查看全市场数据,每个市场可查看20只股票.
试运行期间,用户可在AI小财神中查看全市场数据,每个市场可查看一定数量的股票.
</p> </p>
<p class="announcementItem">以下为各个市场可以查看的股票</p> <p class="announcementItem">以下为各个市场可以查看的股票</p>
<!-- <p class="announcementItem">历软件云版静态市场一致!</p> <!-- <p class="announcementItem">历软件云版静态市场一致!</p>

2345
src/views/components/emoEnergyConverter.vue
File diff suppressed because it is too large
View File

6
src/views/components/emotionDecod.vue

@ -406,6 +406,12 @@ function initQXNLZHEcharts(kline, qxnlzhqData) {
], ],
}; };
// DOM
if (!KlineCanvs.value) {
console.error('DOM元素未准备好,无法初始化ECharts');
return;
}
// echarts // echarts
if (KlineCanvsChart) { if (KlineCanvsChart) {
KlineCanvsChart.dispose(); KlineCanvsChart.dispose();

2
src/views/components/emotionalBottomRadar.vue

@ -416,7 +416,7 @@ function initEmotionalBottomRadar(KlineData, barAndLineData) {
color: 'white', color: 'white',
formatter: function (value, index) { formatter: function (value, index) {
// //
return value.toFixed(1);
return value.toFixed(0);
} }
}, },
splitLine: { splitLine: {

2
src/views/homePage.vue

@ -1429,7 +1429,7 @@ onUnmounted(() => {
</div> </div>
<div class="backToHomeBtn" @click="backToHome()"> <div class="backToHomeBtn" @click="backToHome()">
<img <img
src="https://d31zlh4on95l9h.cloudfront.net/images/d8b388e461423f79087ddbe016002217.png"
src="https://d31zlh4on95l9h.cloudfront.net/images/9cbc5b2eb2327bd04d015c19d8c3f1f9.png"
alt="返回首页" alt="返回首页"
class="backImg" class="backImg"
/> />

Loading…
Cancel
Save