|
|
@ -330,40 +330,45 @@ const isTypingInProgress = ref(false); |
|
|
|
const createTypingEffect = (message, content, speed) => { |
|
|
|
return new Promise((resolve) => { |
|
|
|
chatStore.messages.push(message); |
|
|
|
if (content != "") { |
|
|
|
let index = 0; |
|
|
|
if (Array.isArray(content) && content.length > 0) { |
|
|
|
message.content = ""; |
|
|
|
message.isTyping = true; |
|
|
|
|
|
|
|
const typingInterval = setInterval(() => { |
|
|
|
if (index < content.length) { |
|
|
|
message.content += content.charAt(index); |
|
|
|
index++; |
|
|
|
} else { |
|
|
|
clearInterval(typingInterval); |
|
|
|
message.isTyping = false; |
|
|
|
let currentIndex = 0; |
|
|
|
|
|
|
|
// 处理KaTeX渲染(如果需要) |
|
|
|
const processNextElement = () => { |
|
|
|
if (currentIndex >= content.length) { |
|
|
|
message.isTyping = false; |
|
|
|
nextTick(() => { |
|
|
|
if (message.content.includes("$$")) { |
|
|
|
message.content = message.content.replace( |
|
|
|
katexRegex, |
|
|
|
(match, formula) => { |
|
|
|
try { |
|
|
|
return katex.renderToString(formula, { |
|
|
|
throwOnError: false, |
|
|
|
}); |
|
|
|
} catch (error) { |
|
|
|
console.error("KaTeX 渲染错误:", error); |
|
|
|
return match; |
|
|
|
} |
|
|
|
} |
|
|
|
); |
|
|
|
} |
|
|
|
resolve(); // 完成后resolve |
|
|
|
}); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (currentIndex % 2 === 0) { |
|
|
|
// 偶数下标:直接加入 |
|
|
|
message.content += content[currentIndex]; |
|
|
|
currentIndex++; |
|
|
|
processNextElement(); // 立即处理下一个元素 |
|
|
|
} else { |
|
|
|
// 奇数下标:打字机效果 |
|
|
|
const text = content[currentIndex]; |
|
|
|
let charIndex = 0; |
|
|
|
|
|
|
|
const typingInterval = setInterval(() => { |
|
|
|
if (charIndex < text.length) { |
|
|
|
message.content += text.charAt(charIndex); |
|
|
|
charIndex++; |
|
|
|
} else { |
|
|
|
clearInterval(typingInterval); |
|
|
|
currentIndex++; |
|
|
|
processNextElement(); // 处理下一个元素 |
|
|
|
} |
|
|
|
}, speed); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
processNextElement(); // 开始处理 |
|
|
|
} else { |
|
|
|
if (message.kline) { |
|
|
|
if (message.klineType == 1) { |
|
|
@ -572,8 +577,11 @@ watch( |
|
|
|
}; |
|
|
|
|
|
|
|
try { |
|
|
|
const env = import.meta.env.VITE_ENV; |
|
|
|
const result20 = await dataListAPI({ |
|
|
|
token: localStorage.getItem("localToken"), |
|
|
|
token: |
|
|
|
'8Csj5VVX1UbIb4C3oxrnbZi0+fEeMx8pywnIlrmTm45Cb/EllzWACLto9J9+fCFsfdgBOvKvyY94FvqlvM0', |
|
|
|
// "8nkj4QBV1RPIb4CzoRTnbZi0+fEeMx8pywnIlrmTxdwROKkuwWqAWu9orpkpeXVqL98DPfeonNYpHv+mucA", |
|
|
|
market: codeData.value.market, |
|
|
|
code: codeData.value.code, |
|
|
|
language: "cn", //t.value.suoxie, |
|
|
@ -743,7 +751,7 @@ watch( |
|
|
|
class: "title1", |
|
|
|
type: "title1", |
|
|
|
content: codeData.value.name + "全景作战报告", |
|
|
|
date: moment().format("MM/DD/YYYY"), |
|
|
|
date: moment().format("DD/MM/YYYY"), |
|
|
|
}, |
|
|
|
"", |
|
|
|
50 |
|
|
@ -796,7 +804,7 @@ watch( |
|
|
|
// } |
|
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
|
|
|
|
|
addTypingTask(aiMessage1, ac1, 50); |
|
|
|
addTypingTask(aiMessage1, ["", ac1], 50); |
|
|
|
|
|
|
|
// chatStore.messages.push({ |
|
|
|
// sender: "ai", |
|
|
@ -1030,7 +1038,7 @@ watch( |
|
|
|
// aiMessage2.isTyping = false; |
|
|
|
// } |
|
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
|
addTypingTask(aiMessage2, ac2, 50); |
|
|
|
addTypingTask(aiMessage2, ["", ac2], 50); |
|
|
|
|
|
|
|
// chatStore.messages.push({ |
|
|
|
// sender: "ai", |
|
|
@ -1087,6 +1095,8 @@ watch( |
|
|
|
// } |
|
|
|
// } |
|
|
|
// ); |
|
|
|
const ac31 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【主力行为】</p><p>`; |
|
|
|
const ac32 = `${result23.data.zhuli1}</p><p>${result23.data.zhuli2}</p><p>${result23.data.zhuli3}</p>`; |
|
|
|
const ac3 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【主力行为】</p><p>${result23.data.zhuli1}</p><p>${result23.data.zhuli2}</p><p>${result23.data.zhuli3}</p>`; |
|
|
|
|
|
|
|
// 先推送初始消息 |
|
|
@ -1110,7 +1120,7 @@ watch( |
|
|
|
|
|
|
|
// } |
|
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
|
addTypingTask(aiMessage3, ac3, 50); |
|
|
|
addTypingTask(aiMessage3, [ac31, ac32], 50); |
|
|
|
|
|
|
|
// chatStore.messages.push({ |
|
|
|
// sender: "ai", |
|
|
@ -1142,6 +1152,15 @@ watch( |
|
|
|
const nengliang = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【能量维度】</p><p>${result23.data.nengliang}</p>`; |
|
|
|
const ac4 = kongjian + shijian + nengliang; |
|
|
|
|
|
|
|
const ac41 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【空间维度】</p><p style="display:flex;justify-content:center;">`; |
|
|
|
const ac42 = `${arr[0]},${arr[1]}`; |
|
|
|
const ac43 = `</p><p style="display:flex;justify-content:center;">`; |
|
|
|
const ac44 = `${arr[2]},${arr[3]}</p>`; |
|
|
|
const ac45 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【时间维度】</p><p style="display:flex;justify-content:center;">`; |
|
|
|
const ac46 = `${result23.data.shijian}</p>`; |
|
|
|
const ac47 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【能量维度】</p><p>`; |
|
|
|
const ac48 = `${result23.data.nengliang}</p>`; |
|
|
|
|
|
|
|
// const pc4 = marked( |
|
|
|
// kongjian + |
|
|
|
// "\n" + |
|
|
@ -1179,7 +1198,11 @@ watch( |
|
|
|
|
|
|
|
// } |
|
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
|
addTypingTask(aiMessage4, ac4, 50); |
|
|
|
addTypingTask( |
|
|
|
aiMessage4, |
|
|
|
[ac41, ac42, ac43, ac44, ac45, ac46, ac47, ac48], |
|
|
|
50 |
|
|
|
); |
|
|
|
|
|
|
|
// chatStore.messages.push({ |
|
|
|
// sender: "ai", |
|
|
@ -1227,7 +1250,10 @@ watch( |
|
|
|
const cftj = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【触发条件】</p><p>${result24.data.cftl}</p>`; |
|
|
|
const gfzl = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【攻防指令】</p><p>${result24.data.gfzl}</p>`; |
|
|
|
const ac5 = cftj + gfzl; |
|
|
|
|
|
|
|
const ac51 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【触发条件】</p><p>`; |
|
|
|
const ac52 = `${result24.data.cftl}</p>`; |
|
|
|
const ac53 = `<p style="margin:0;color:#FADC0C;display:flex;justify-content:center;font-size:28px">【攻防指令】</p><p>`; |
|
|
|
const ac54 = `${result24.data.gfzl}</p>`; |
|
|
|
// const pc5 = marked(result24.data.cftl + "/n" + result24.data.gfzl); |
|
|
|
// const ac5 = pc5.replace(katexRegex, (match, formula) => { |
|
|
|
// try { |
|
|
@ -1259,7 +1285,7 @@ watch( |
|
|
|
|
|
|
|
// } |
|
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
|
addTypingTask(aiMessage5, ac5, 50); |
|
|
|
addTypingTask(aiMessage5, [ac51, ac52, ac53, ac54], 50); |
|
|
|
|
|
|
|
// chatStore.messages.push({ |
|
|
|
// sender: "ai", |
|
|
@ -1268,7 +1294,7 @@ watch( |
|
|
|
// content: ac5, |
|
|
|
// }); |
|
|
|
|
|
|
|
const ac6 = "内容由AI生成,请注意甄别"; |
|
|
|
const ac6 = "该内容由AI生成,请注意甄别"; |
|
|
|
// 先推送初始消息 |
|
|
|
const aiMessage6 = reactive({ |
|
|
|
sender: "ai", |
|
|
@ -1290,7 +1316,7 @@ watch( |
|
|
|
|
|
|
|
// } |
|
|
|
// }, 50); // 调整速度为50ms/字符 |
|
|
|
addTypingTask(aiMessage6, ac6, 100); |
|
|
|
addTypingTask(aiMessage6, ["", ac6], 100); |
|
|
|
|
|
|
|
// chatStore.messages.push({ |
|
|
|
// sender: "ai", |
|
|
@ -2286,7 +2312,7 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
fontSize: window.innerWidth > 768 ? 15 : vwToPx(1.8), |
|
|
|
}, |
|
|
|
orient: "horizontal", |
|
|
|
top: window.innerWidth > 768 ? "72%" : "64%", |
|
|
|
top: window.innerWidth > 768 ? "68%" : "64%", |
|
|
|
width: "100%", |
|
|
|
left: "center", |
|
|
|
itemGap: 15, |
|
|
@ -2389,23 +2415,53 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
}, |
|
|
|
grid: [ |
|
|
|
{ |
|
|
|
// left: window.innerWidth > 768 ? '8%' : '15%', |
|
|
|
// right: window.innerWidth > 768 ? '4%' : '2.5%', |
|
|
|
top: window.innerWidth > 768 ? "10%" : "5%", |
|
|
|
height: window.innerWidth > 768 ? "36%" : "34%", |
|
|
|
left: |
|
|
|
window.innerWidth > 1024 |
|
|
|
? "70vw" |
|
|
|
: window.innerWidth > 768 |
|
|
|
? "65vw" |
|
|
|
: "55vw", |
|
|
|
right: |
|
|
|
window.innerWidth > 1024 |
|
|
|
? "40vw" |
|
|
|
: window.innerWidth > 768 |
|
|
|
? "30vw" |
|
|
|
: "40vw", |
|
|
|
top: window.innerWidth > 768 ? "8%" : "5%", |
|
|
|
height: window.innerWidth > 768 ? "34%" : "34%", |
|
|
|
containLabel: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
// left: window.innerWidth > 768 ? '8%' : '15%', |
|
|
|
// right: window.innerWidth > 768 ? '4%' : '2.5%', |
|
|
|
top: window.innerWidth > 768 ? "50%" : "42%", |
|
|
|
height: window.innerWidth > 768 ? "20%" : "22%", |
|
|
|
left: |
|
|
|
window.innerWidth > 1024 |
|
|
|
? "70vw" |
|
|
|
: window.innerWidth > 768 |
|
|
|
? "65vw" |
|
|
|
: "55vw", |
|
|
|
right: |
|
|
|
window.innerWidth > 1024 |
|
|
|
? "40vw" |
|
|
|
: window.innerWidth > 768 |
|
|
|
? "30vw" |
|
|
|
: "40vw", |
|
|
|
top: window.innerWidth > 768 ? "45%" : "42%", |
|
|
|
height: window.innerWidth > 768 ? "22%" : "22%", |
|
|
|
containLabel: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
// left: window.innerWidth > 768 ? '8%' : '15%', |
|
|
|
// right: window.innerWidth > 768 ? '4%' : '2.5%', |
|
|
|
top: window.innerWidth > 768 ? "78%" : "70%", |
|
|
|
left: |
|
|
|
window.innerWidth > 1024 |
|
|
|
? "70vw" |
|
|
|
: window.innerWidth > 768 |
|
|
|
? "65vw" |
|
|
|
: "55vw", |
|
|
|
right: |
|
|
|
window.innerWidth > 1024 |
|
|
|
? "40vw" |
|
|
|
: window.innerWidth > 768 |
|
|
|
? "30vw" |
|
|
|
: "40vw", |
|
|
|
top: window.innerWidth > 768 ? "73%" : "70%", |
|
|
|
height: window.innerWidth > 768 ? "20%" : "22%", |
|
|
|
containLabel: false, |
|
|
|
}, |
|
|
@ -2547,7 +2603,8 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
xAxisIndex: [0, 1, 2], |
|
|
|
type: "slider", |
|
|
|
top: window.innerWidth > 768 ? "95%" : "96%", |
|
|
|
left: window.innerWidth > 768 ? "10%" : "8%", |
|
|
|
// left: window.innerWidth > 768 ? "10%" : "8%", |
|
|
|
// right: window.innerWidth > 768 ? "4%" : "8%", |
|
|
|
start: 98, |
|
|
|
end: 100, |
|
|
|
}, |
|
|
@ -2885,12 +2942,12 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
symbol: "rect", |
|
|
|
symbolSize: (value, params) => { |
|
|
|
const width = window.innerWidth; |
|
|
|
const baseHeight = 36; |
|
|
|
if (width <= 375) { |
|
|
|
return [2, 16]; |
|
|
|
} else if (width <= 768) { |
|
|
|
return [2, 24]; |
|
|
|
} |
|
|
|
const baseHeight = 22; |
|
|
|
// if (width <= 375) { |
|
|
|
// return [2, 16]; |
|
|
|
// } else if (width <= 768) { |
|
|
|
// return [2, 22]; |
|
|
|
// } |
|
|
|
return [2, baseHeight]; |
|
|
|
}, |
|
|
|
itemStyle: { |
|
|
@ -2906,7 +2963,7 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
if (item[1] === 0) { |
|
|
|
return { |
|
|
|
coord: [item[0], 20], |
|
|
|
symbolOffset: window.innerWidth > 768 ? [0, 20] : [0, 12], |
|
|
|
symbolOffset: [0, 10], |
|
|
|
itemStyle: { |
|
|
|
color: "#00ff00", |
|
|
|
}, |
|
|
@ -2938,12 +2995,12 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
symbol: "rect", |
|
|
|
symbolSize: (value, params) => { |
|
|
|
const width = window.innerWidth; |
|
|
|
const baseHeight = 36; |
|
|
|
if (width <= 375) { |
|
|
|
return [2, 16]; |
|
|
|
} else if (width <= 768) { |
|
|
|
return [2, 24]; |
|
|
|
} |
|
|
|
const baseHeight = 22; |
|
|
|
// if (width <= 375) { |
|
|
|
// return [2, 16]; |
|
|
|
// } else if (width <= 768) { |
|
|
|
// return [2, 24]; |
|
|
|
// } |
|
|
|
return [2, baseHeight]; |
|
|
|
}, |
|
|
|
itemStyle: { |
|
|
@ -2959,8 +3016,7 @@ function KlineCanvsEcharts(containerId) { |
|
|
|
if (item[1] === 100) { |
|
|
|
return { |
|
|
|
coord: [item[0], 80], |
|
|
|
symbolOffset: |
|
|
|
window.innerWidth > 768 ? [0, -20] : [0, -12], |
|
|
|
symbolOffset: [0, -10], |
|
|
|
itemStyle: { |
|
|
|
color: "#ff0000", |
|
|
|
}, |
|
|
@ -3139,7 +3195,7 @@ watch( |
|
|
|
|
|
|
|
renderAllKlineCharts(); |
|
|
|
} |
|
|
|
}, 300); |
|
|
|
}, 1000); |
|
|
|
}, |
|
|
|
{ immediate: true } // 添加immediate属性,确保初始化时执行一次 |
|
|
|
); |
|
|
@ -3354,7 +3410,6 @@ onUnmounted(() => { |
|
|
|
/* top: -30px; */ |
|
|
|
} |
|
|
|
.logo1 { |
|
|
|
position: relative; |
|
|
|
max-width: 350px; |
|
|
|
min-width: 200px; |
|
|
|
width: 25%; |
|
|
@ -3376,7 +3431,7 @@ onUnmounted(() => { |
|
|
|
|
|
|
|
.gif-area { |
|
|
|
padding: 70px 0px; |
|
|
|
/* position: relative; */ |
|
|
|
position: relative; |
|
|
|
/* height: 30vh; */ |
|
|
|
display: flex; |
|
|
|
flex-direction: column; |
|
|
@ -3659,6 +3714,7 @@ onUnmounted(() => { |
|
|
|
display: flex; |
|
|
|
justify-content: center; |
|
|
|
align-items: center; |
|
|
|
height: calc(500px + 10vw) !important; |
|
|
|
} |
|
|
|
|
|
|
|
.message-bubble.ai.content3 { |
|
|
|