|
|
@ -108,16 +108,16 @@ |
|
|
|
</div> |
|
|
|
<div class="bk-image"> |
|
|
|
<div class="text-container"> |
|
|
|
<p><span class="title">🔍 情绪监控-金融宇宙的【量子检测网络】</span> |
|
|
|
<p><span class="title">情绪监控-金融宇宙的【量子检测网络】</span> |
|
|
|
<span class="content">核心任务:构建全市场情绪引力场雷达,实时监测资金流向和情绪波动</span> |
|
|
|
</p> |
|
|
|
<p><span class="title">🧠 情绪解码-主力思维的【神经破译矩阵】</span> |
|
|
|
<p><span class="title">情绪解码-主力思维的【神经破译矩阵】</span> |
|
|
|
<span class="content">核心任务:解构资金行为的量子密码,破译主力操盘意图和策略布局</span> |
|
|
|
</p> |
|
|
|
<p><span class="title">🔮 情绪推演-未来战争的【时空推演舱】</span> |
|
|
|
<p><span class="title">情绪推演-未来战争的【时空推演舱】</span> |
|
|
|
<span class="content">核心任务:基于情绪数据推演未来走势,预测市场转折点和机会窗口</span> |
|
|
|
</p> |
|
|
|
<p><span class="title">💰 情绪套利-财富裂变的【粒子对撞机】</span> |
|
|
|
<p><span class="title">情绪套利-财富裂变的【粒子对撞机】</span> |
|
|
|
<span class="content">核心任务:将情绪差转化为收益粒子流,实现情绪能量的价值转换</span> |
|
|
|
</p> |
|
|
|
</div> |
|
|
@ -494,75 +494,75 @@ watch(currentStock, (newStock) => { |
|
|
|
renderCharts(newStock.apiData); |
|
|
|
console.log('图表数据已准备完成,开始渲染:', newStock.apiData) |
|
|
|
// 检查场景应用部分是否已经在视口中,如果是则立即触发效果 |
|
|
|
setTimeout(() => { |
|
|
|
if (scenarioApplicationRef.value && parsedConclusion.value) { |
|
|
|
const stockCode = newStock.stockInfo?.code || newStock.stockInfo?.symbol; |
|
|
|
setTimeout(() => { |
|
|
|
if (scenarioApplicationRef.value && parsedConclusion.value) { |
|
|
|
const stockCode = newStock.stockInfo?.code || newStock.stockInfo?.symbol; |
|
|
|
|
|
|
|
// 如果该股票已经显示过,不需要再处理 |
|
|
|
if (stockCode && stockTypewriterShown.value.has(stockCode)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const rect = scenarioApplicationRef.value.getBoundingClientRect(); |
|
|
|
const isInViewport = rect.top < window.innerHeight && rect.bottom > 0; |
|
|
|
|
|
|
|
if (isInViewport) { |
|
|
|
console.log('股票切换后检测到场景应用部分在视口中'); |
|
|
|
|
|
|
|
if (stockCode) { |
|
|
|
// 检查该股票是否是第一次触发 |
|
|
|
if (!stockTypewriterShown.value.has(stockCode)) { |
|
|
|
// 该股票第一次:播放音频和打字机效果 |
|
|
|
if (audioUrl.value) { |
|
|
|
console.log('该股票第一次进入场景应用,开始打字机效果和音频播放'); |
|
|
|
hasTriggeredTypewriter.value = true; |
|
|
|
hasTriggeredAudio.value = true; |
|
|
|
|
|
|
|
startTypewriterEffect(parsedConclusion.value); |
|
|
|
// 如果该股票已经显示过,不需要再处理 |
|
|
|
if (stockCode && stockTypewriterShown.value.has(stockCode)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!stockAudioPlayed.value.has(stockCode)) { |
|
|
|
console.log('开始音频播放'); |
|
|
|
stockAudioPlayed.value.set(stockCode, true); |
|
|
|
playAudio(audioUrl.value); |
|
|
|
const rect = scenarioApplicationRef.value.getBoundingClientRect(); |
|
|
|
const isInViewport = rect.top < window.innerHeight && rect.bottom > 0; |
|
|
|
|
|
|
|
if (isInViewport) { |
|
|
|
console.log('股票切换后检测到场景应用部分在视口中'); |
|
|
|
|
|
|
|
if (stockCode) { |
|
|
|
// 检查该股票是否是第一次触发 |
|
|
|
if (!stockTypewriterShown.value.has(stockCode)) { |
|
|
|
// 该股票第一次:播放音频和打字机效果 |
|
|
|
if (audioUrl.value) { |
|
|
|
console.log('该股票第一次进入场景应用,开始打字机效果和音频播放'); |
|
|
|
hasTriggeredTypewriter.value = true; |
|
|
|
hasTriggeredAudio.value = true; |
|
|
|
|
|
|
|
startTypewriterEffect(parsedConclusion.value); |
|
|
|
|
|
|
|
if (!stockAudioPlayed.value.has(stockCode)) { |
|
|
|
console.log('开始音频播放'); |
|
|
|
stockAudioPlayed.value.set(stockCode, true); |
|
|
|
playAudio(audioUrl.value); |
|
|
|
} |
|
|
|
|
|
|
|
stockTypewriterShown.value.set(stockCode, true); |
|
|
|
} else { |
|
|
|
console.log('音频尚未准备好,等待音频加载完成后再触发效果(股票切换后)'); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
stockTypewriterShown.value.set(stockCode, true); |
|
|
|
} else { |
|
|
|
console.log('音频尚未准备好,等待音频加载完成后再触发效果(股票切换后)'); |
|
|
|
return; |
|
|
|
// 非第一次或已经触发过:直接显示完整内容,不播放音频和打字机效果 |
|
|
|
console.log('非第一次股票切换或已触发过,直接显示完整内容'); |
|
|
|
|
|
|
|
// 直接显示完整内容 |
|
|
|
const conclusion = parsedConclusion.value; |
|
|
|
displayedTexts.value = { |
|
|
|
one1: conclusion.one1 || '', |
|
|
|
one2: conclusion.one2 || '', |
|
|
|
two: conclusion.two || '', |
|
|
|
three: conclusion.three || '', |
|
|
|
four: conclusion.four || '', |
|
|
|
disclaimer: '该内容由AI生成,请注意甄别' |
|
|
|
}; |
|
|
|
displayedTitles.value = { |
|
|
|
one: 'L1: 情绪监控', |
|
|
|
two: 'L2: 情绪解码', |
|
|
|
three: 'L3: 情绪推演', |
|
|
|
four: 'L4: 情绪套利' |
|
|
|
}; |
|
|
|
moduleVisibility.value = { |
|
|
|
one: !!(conclusion.one1 || conclusion.one2), |
|
|
|
two: !!conclusion.two, |
|
|
|
three: !!conclusion.three, |
|
|
|
four: !!conclusion.four, |
|
|
|
disclaimer: true |
|
|
|
}; |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 非第一次或已经触发过:直接显示完整内容,不播放音频和打字机效果 |
|
|
|
console.log('非第一次股票切换或已触发过,直接显示完整内容'); |
|
|
|
|
|
|
|
// 直接显示完整内容 |
|
|
|
const conclusion = parsedConclusion.value; |
|
|
|
displayedTexts.value = { |
|
|
|
one1: conclusion.one1 || '', |
|
|
|
one2: conclusion.one2 || '', |
|
|
|
two: conclusion.two || '', |
|
|
|
three: conclusion.three || '', |
|
|
|
four: conclusion.four || '', |
|
|
|
disclaimer: '该内容由AI生成,请注意甄别' |
|
|
|
}; |
|
|
|
displayedTitles.value = { |
|
|
|
one: 'L1: 情绪监控', |
|
|
|
two: 'L2: 情绪解码', |
|
|
|
three: 'L3: 情绪推演', |
|
|
|
four: 'L4: 情绪套利' |
|
|
|
}; |
|
|
|
moduleVisibility.value = { |
|
|
|
one: !!(conclusion.one1 || conclusion.one2), |
|
|
|
two: !!conclusion.two, |
|
|
|
three: !!conclusion.three, |
|
|
|
four: !!conclusion.four, |
|
|
|
disclaimer: true |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}, 500); // 延迟500ms确保数据完全加载 |
|
|
|
}, 500); // 延迟500ms确保数据完全加载 |
|
|
|
}); |
|
|
|
} else { |
|
|
|
console.log('页面尚未加载完成,等待数据加载完成后再渲染图表'); |
|
|
@ -1552,16 +1552,12 @@ defineExpose({ |
|
|
|
margin: 20px; |
|
|
|
background: linear-gradient(135deg, rgba(0, 212, 255, 0.15) 0%, rgba(0, 100, 200, 0.15) 100%); |
|
|
|
border: 2px solid rgba(0, 212, 255, 0.4); |
|
|
|
box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1); |
|
|
|
|
|
|
|
.conclusion-item { |
|
|
|
margin-bottom: 20px; |
|
|
|
padding: 20px; |
|
|
|
border-radius: 12px; |
|
|
|
background: linear-gradient(135deg, rgba(0, 212, 255, 0.2) 0%, rgba(0, 150, 255, 0.1) 100%); |
|
|
|
border: 1px solid rgba(0, 212, 255, 0.5); |
|
|
|
border-left: 5px solid #00d4ff; |
|
|
|
box-shadow: 0 4px 15px rgba(0, 212, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1); |
|
|
|
transition: all 0.3s ease; |
|
|
|
position: relative; |
|
|
|
overflow: hidden; |
|
|
@ -1589,9 +1585,7 @@ defineExpose({ |
|
|
|
font-weight: bold; |
|
|
|
margin: 0 0 15px 0; |
|
|
|
text-align: center; |
|
|
|
text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5), 0 0 20px rgba(0, 212, 255, 0.3); |
|
|
|
letter-spacing: 2px; |
|
|
|
position: relative; |
|
|
|
|
|
|
|
&::after { |
|
|
|
content: ''; |
|
|
@ -1612,19 +1606,10 @@ defineExpose({ |
|
|
|
margin: 0 0 12px 0; |
|
|
|
text-align: left; |
|
|
|
word-wrap: break-word; |
|
|
|
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7); |
|
|
|
padding-left: 15px; |
|
|
|
position: relative; |
|
|
|
|
|
|
|
&::before { |
|
|
|
content: '▶'; |
|
|
|
position: absolute; |
|
|
|
left: 0; |
|
|
|
top: 0; |
|
|
|
color: #00d4ff; |
|
|
|
font-size: 12px; |
|
|
|
opacity: 0.7; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
&:last-child { |
|
|
|
margin-bottom: 0; |
|
|
@ -1659,7 +1644,6 @@ defineExpose({ |
|
|
|
margin: 20px; |
|
|
|
background: linear-gradient(135deg, rgba(0, 212, 255, 0.15) 0%, rgba(0, 100, 200, 0.15) 100%); |
|
|
|
border: 2px solid rgba(0, 212, 255, 0.4); |
|
|
|
box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1); |
|
|
|
} |
|
|
|
|
|
|
|
.text-container p { |
|
|
@ -1668,15 +1652,11 @@ defineExpose({ |
|
|
|
margin-left: 0%; |
|
|
|
padding: 20px; |
|
|
|
border-radius: 12px; |
|
|
|
background: linear-gradient(135deg, rgba(0, 212, 255, 0.2) 0%, rgba(0, 150, 255, 0.1) 100%); |
|
|
|
border: 1px solid rgba(0, 212, 255, 0.5); |
|
|
|
border-left: 5px solid #00d4ff; |
|
|
|
box-shadow: 0 4px 15px rgba(0, 212, 255, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1); |
|
|
|
transition: all 0.3s ease; |
|
|
|
position: relative; |
|
|
|
overflow: hidden; |
|
|
|
text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5), 0 0 20px rgba(0, 212, 255, 0.3); |
|
|
|
letter-spacing: 2px; |
|
|
|
border: 1px solid rgba(0, 212, 255, 0.5); |
|
|
|
} |
|
|
|
|
|
|
|
.text-container p::before { |
|
|
@ -2536,7 +2516,6 @@ defineExpose({ |
|
|
|
background: linear-gradient(135deg, rgba(0, 212, 255, 0.15) 0%, rgba(0, 100, 200, 0.15) 100%); |
|
|
|
border: 2px solid rgba(0, 212, 255, 0.4); |
|
|
|
box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1); |
|
|
|
backdrop-filter: blur(15px); |
|
|
|
|
|
|
|
.conclusion-item { |
|
|
|
margin-bottom: 20px; |
|
|
@ -2573,9 +2552,7 @@ defineExpose({ |
|
|
|
font-weight: bold; |
|
|
|
margin: 0 0 15px 0; |
|
|
|
text-align: center; |
|
|
|
text-shadow: 0 2px 8px rgba(0, 212, 255, 0.5), 0 0 20px rgba(0, 212, 255, 0.3); |
|
|
|
letter-spacing: 2px; |
|
|
|
position: relative; |
|
|
|
|
|
|
|
&::after { |
|
|
|
content: ''; |
|
|
@ -2596,7 +2573,6 @@ defineExpose({ |
|
|
|
margin: 0 0 12px 0; |
|
|
|
text-align: left; |
|
|
|
word-wrap: break-word; |
|
|
|
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7); |
|
|
|
padding-left: 15px; |
|
|
|
position: relative; |
|
|
|
|
|
|
@ -2765,7 +2741,10 @@ defineExpose({ |
|
|
|
margin-top: -3%; |
|
|
|
} |
|
|
|
|
|
|
|
.title1, .title2, .title3, .title4 { |
|
|
|
.title1, |
|
|
|
.title2, |
|
|
|
.title3, |
|
|
|
.title4 { |
|
|
|
font-size: 18px; |
|
|
|
margin-left: 0; |
|
|
|
} |
|
|
|