From 10dc1e51432b05ab0ca78c24ce3f10cecb1431ee Mon Sep 17 00:00:00 2001
From: no99 <17663930442@163.com>
Date: Tue, 8 Jul 2025 16:46:59 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81=EF=BC=8C?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A5=E6=9C=9F=E7=9A=84=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/AIchat.vue | 642 ++++++++++++++++++++++++++++++++++-----------------
1 file changed, 425 insertions(+), 217 deletions(-)
diff --git a/src/views/AIchat.vue b/src/views/AIchat.vue
index 0a426c2..f8f5f1c 100644
--- a/src/views/AIchat.vue
+++ b/src/views/AIchat.vue
@@ -176,7 +176,11 @@ const playAudioSequence = (audioUrls) => {
);
// 增强URL验证
- if (!currentUrl || typeof currentUrl !== 'string' || currentUrl.trim() === '') {
+ if (
+ !currentUrl ||
+ typeof currentUrl !== "string" ||
+ currentUrl.trim() === ""
+ ) {
console.error(`音频 ${currentIndex + 1} URL无效,跳过该音频`);
currentIndex++;
setTimeout(() => {
@@ -214,10 +218,10 @@ const playAudioSequence = (audioUrls) => {
audioStore.isPlaying = true;
audioStore.isPaused = false;
console.log(`开始播放音频 ${currentIndex + 1}`);
- console.log('音频播放状态:', {
+ console.log("音频播放状态:", {
duration: sound.duration(),
state: sound.state(),
- playing: sound.playing()
+ playing: sound.playing(),
});
},
onpause: () => {
@@ -234,7 +238,7 @@ const playAudioSequence = (audioUrls) => {
currentIndex++;
// 如果是最后一个音频播放完成,立即清除实例
if (currentIndex >= audioSequence.length) {
- console.log('最后一个音频播放完成,清除音频实例');
+ console.log("最后一个音频播放完成,清除音频实例");
audioStore.soundInstance = null;
audioStore.nowSound = null;
currentIndex = 0; // 立即重置索引
@@ -252,8 +256,8 @@ const playAudioSequence = (audioUrls) => {
},
onloaderror: (id, err) => {
console.error(`音频 ${currentIndex + 1} 加载失败:`, err);
- console.error('失败的音频URL:', currentUrl);
- console.error('错误详情:', { id, err });
+ console.error("失败的音频URL:", currentUrl);
+ console.error("错误详情:", { id, err });
// 增加重试机制
if (!sound.retryCount) {
@@ -262,7 +266,9 @@ const playAudioSequence = (audioUrls) => {
if (sound.retryCount < 2) {
sound.retryCount++;
- console.log(`音频 ${currentIndex + 1} 第${sound.retryCount}次重试加载`);
+ console.log(
+ `音频 ${currentIndex + 1} 第${sound.retryCount}次重试加载`
+ );
setTimeout(() => {
sound.load();
}, 1000 * sound.retryCount); // 递增延时重试
@@ -282,7 +288,7 @@ const playAudioSequence = (audioUrls) => {
// 添加播放超时检测
const playTimeout = setTimeout(() => {
- if (!audioStore.isPlaying && sound.state() === 'loading') {
+ if (!audioStore.isPlaying && sound.state() === "loading") {
console.warn(`音频 ${currentIndex + 1} 播放超时,可能网络问题`);
sound.stop();
currentIndex++;
@@ -291,7 +297,7 @@ const playAudioSequence = (audioUrls) => {
}, 10000); // 10秒超时
// 播放成功后清除超时
- sound.once('play', () => {
+ sound.once("play", () => {
clearTimeout(playTimeout);
});
@@ -302,33 +308,38 @@ const playAudioSequence = (audioUrls) => {
// 重写togglePlayPause方法以支持音频序列控制
const originalTogglePlayPause = audioStore.togglePlayPause;
audioStore.togglePlayPause = () => {
- console.log('音频控制按钮被点击');
- console.log('当前播放状态:', audioStore.isPlaying);
- console.log('当前暂停状态:', audioStore.isPaused);
- console.log('当前音频实例:', audioStore.soundInstance);
- console.log('当前索引:', currentIndex, '音频序列长度:', audioSequence.length);
+ console.log("音频控制按钮被点击");
+ console.log("当前播放状态:", audioStore.isPlaying);
+ console.log("当前暂停状态:", audioStore.isPaused);
+ console.log("当前音频实例:", audioStore.soundInstance);
+ console.log(
+ "当前索引:",
+ currentIndex,
+ "音频序列长度:",
+ audioSequence.length
+ );
if (audioStore.soundInstance) {
if (audioStore.isPlaying) {
// 暂停当前音频
- console.log('暂停当前音频');
+ console.log("暂停当前音频");
audioStore.pause();
} else if (audioStore.isPaused) {
// 从暂停位置继续播放
- console.log('从暂停位置继续播放');
+ console.log("从暂停位置继续播放");
audioStore.play();
} else {
// 重新开始播放当前音频或从头开始播放序列
- console.log('重新开始播放,当前索引:', currentIndex);
+ console.log("重新开始播放,当前索引:", currentIndex);
if (currentIndex >= audioSequence.length) {
- console.log('所有音频已播放完成,从头开始');
+ console.log("所有音频已播放完成,从头开始");
currentIndex = 0; // 重置到第一个音频
}
playNext();
}
} else {
// 没有音频实例时,从头开始播放
- console.log('没有音频实例,从头开始播放');
+ console.log("没有音频实例,从头开始播放");
currentIndex = 0;
playNext();
}
@@ -422,13 +433,13 @@ const createTypingEffect = (message, content, speed) => {
const processNextElement = () => {
if (currentIndex >= content.length) {
if (message.isEnd) {
- if (message.isEnd == '1') {
+ if (message.isEnd == "1") {
apiStatus.one.isEnd = true;
- } else if (message.isEnd == '2') {
+ } else if (message.isEnd == "2") {
apiStatus.two.isEnd = true;
- } else if (message.isEnd == '3') {
+ } else if (message.isEnd == "3") {
apiStatus.three.isEnd = true;
- } else if (message.isEnd == '4') {
+ } else if (message.isEnd == "4") {
apiStatus.four.isEnd = true;
}
}
@@ -437,14 +448,14 @@ const createTypingEffect = (message, content, speed) => {
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
- if (message.error == '2') {
+ if (message.error == "2") {
apiStatus.two.isError = true;
- } else if (message.error == '3') {
+ } else if (message.error == "3") {
apiStatus.three.isError = true;
- } else if (message.error == '4') {
+ } else if (message.error == "4") {
apiStatus.four.isError = true;
}
}
@@ -551,13 +562,13 @@ const createTypingEffect = (message, content, speed) => {
});
}
if (message.isEnd) {
- if (message.isEnd == '1') {
+ if (message.isEnd == "1") {
apiStatus.one.isEnd = true;
- } else if (message.isEnd == '2') {
+ } else if (message.isEnd == "2") {
apiStatus.two.isEnd = true;
- } else if (message.isEnd == '3') {
+ } else if (message.isEnd == "3") {
apiStatus.three.isEnd = true;
- } else if (message.isEnd == '4') {
+ } else if (message.isEnd == "4") {
apiStatus.four.isEnd = true;
}
}
@@ -566,14 +577,14 @@ const createTypingEffect = (message, content, speed) => {
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
- if (message.error == '2') {
+ if (message.error == "2") {
apiStatus.two.isError = true;
- } else if (message.error == '3') {
+ } else if (message.error == "3") {
apiStatus.three.isError = true;
- } else if (message.error == '4') {
+ } else if (message.error == "4") {
apiStatus.four.isError = true;
}
}
@@ -583,13 +594,13 @@ const createTypingEffect = (message, content, speed) => {
}, 1000);
} else {
if (message.isEnd) {
- if (message.isEnd == '1') {
+ if (message.isEnd == "1") {
apiStatus.one.isEnd = true;
- } else if (message.isEnd == '2') {
+ } else if (message.isEnd == "2") {
apiStatus.two.isEnd = true;
- } else if (message.isEnd == '3') {
+ } else if (message.isEnd == "3") {
apiStatus.three.isEnd = true;
- } else if (message.isEnd == '4') {
+ } else if (message.isEnd == "4") {
apiStatus.four.isEnd = true;
}
}
@@ -598,14 +609,14 @@ const createTypingEffect = (message, content, speed) => {
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
- if (message.error == '2') {
+ if (message.error == "2") {
apiStatus.two.isError = true;
- } else if (message.error == '3') {
+ } else if (message.error == "3") {
apiStatus.three.isError = true;
- } else if (message.error == '4') {
+ } else if (message.error == "4") {
apiStatus.four.isError = true;
}
}
@@ -618,7 +629,7 @@ const createTypingEffect = (message, content, speed) => {
});
};
-let apiStatus = {}
+let apiStatus = {};
// 队列处理函数
const processTypingQueue = async () => {
@@ -734,8 +745,8 @@ watch(
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
}
@@ -780,8 +791,6 @@ watch(
marketList: userStore.aiGoldMarketList,
});
-
-
const HomePage = result20.data.HomePage;
const AIGoldBull = result20.data.AIGoldBull;
@@ -793,10 +802,34 @@ watch(
let result24;
// 用于跟踪API完成状态和结果
apiStatus = {
- one: { completed: false, result: null, error: null, isError: false, isEnd: false },
- two: { completed: false, result: null, error: null, isError: false, isEnd: false },
- three: { completed: false, result: null, error: null, isError: false, isEnd: false },
- four: { completed: false, result: null, error: null, isError: false, isEnd: false },
+ one: {
+ completed: false,
+ result: null,
+ error: null,
+ isError: false,
+ isEnd: false,
+ },
+ two: {
+ completed: false,
+ result: null,
+ error: null,
+ isError: false,
+ isEnd: false,
+ },
+ three: {
+ completed: false,
+ result: null,
+ error: null,
+ isError: false,
+ isEnd: false,
+ },
+ four: {
+ completed: false,
+ result: null,
+ error: null,
+ isError: false,
+ isEnd: false,
+ },
};
// 音频预加载状态跟踪
@@ -804,7 +837,7 @@ watch(
one: { loaded: false, url: null },
two: { loaded: false, url: null },
three: { loaded: false, url: null },
- four: { loaded: false, url: null }
+ four: { loaded: false, url: null },
};
// 音频播放队列管理
@@ -818,24 +851,38 @@ watch(
let currentPlayIndex = 0;
const playNextAudio = () => {
- console.log('=== playNextAudio 被调用 ===');
- console.log('当前队列状态:', {
+ console.log("=== playNextAudio 被调用 ===");
+ console.log("当前队列状态:", {
queueLength: audioQueue.value.length,
- queueItems: audioQueue.value.map(item => item.name),
+ queueItems: audioQueue.value.map((item) => item.name),
currentPlayIndex: currentPlayIndex,
isPlayingAudio: isPlayingAudio.value,
isCallingPlayNext: isCallingPlayNext,
- audioStoreIsPlaying: audioStore.isPlaying
+ audioStoreIsPlaying: audioStore.isPlaying,
});
- if (audioQueue.value.length === 0 || isPlayingAudio.value || isCallingPlayNext) {
- console.log('❌ 播放条件不满足 - 队列长度:', audioQueue.value.length, '正在播放:', isPlayingAudio.value, '正在调用:', isCallingPlayNext);
+ if (
+ audioQueue.value.length === 0 ||
+ isPlayingAudio.value ||
+ isCallingPlayNext
+ ) {
+ console.log(
+ "❌ 播放条件不满足 - 队列长度:",
+ audioQueue.value.length,
+ "正在播放:",
+ isPlayingAudio.value,
+ "正在调用:",
+ isCallingPlayNext
+ );
return;
}
// 检查是否已播放完所有音频(仅在队列不为空时重置)
- if (currentPlayIndex >= audioQueue.value.length && audioQueue.value.length > 0) {
- console.log('🔄 所有音频播放完成,重置索引从第一个开始');
+ if (
+ currentPlayIndex >= audioQueue.value.length &&
+ audioQueue.value.length > 0
+ ) {
+ console.log("🔄 所有音频播放完成,重置索引从第一个开始");
currentPlayIndex = 0;
}
@@ -843,12 +890,25 @@ watch(
isPlayingAudio.value = true;
const audioInfo = audioQueue.value[currentPlayIndex];
- console.log(`✅ 开始播放${audioInfo.name}音频 (索引:${currentPlayIndex}),队列总长度:`, audioQueue.value.length);
- console.log('完整队列内容:', audioQueue.value.map((item, index) => `${index === currentPlayIndex ? '▶️' : '⏸️'} ${item.name}`));
+ console.log(
+ `✅ 开始播放${audioInfo.name}音频 (索引:${currentPlayIndex}),队列总长度:`,
+ audioQueue.value.length
+ );
+ console.log(
+ "完整队列内容:",
+ audioQueue.value.map(
+ (item, index) =>
+ `${index === currentPlayIndex ? "▶️" : "⏸️"} ${item.name}`
+ )
+ );
// 只有在确实需要停止时才停止之前的音频
- if (audioStore.nowSound && (audioStore.nowSound.playing() || audioStore.nowSound.state() === 'loading')) {
- console.log('停止之前的音频实例');
+ if (
+ audioStore.nowSound &&
+ (audioStore.nowSound.playing() ||
+ audioStore.nowSound.state() === "loading")
+ ) {
+ console.log("停止之前的音频实例");
audioStore.nowSound.stop();
}
@@ -862,14 +922,25 @@ watch(
audioStore.isPaused = false;
isPlayingAudio.value = true; // 确保状态同步
isCallingPlayNext = false; // 重置调用标志
- console.log(`${audioInfo.name}音频开始播放,时长:`, audio.duration());
- console.log('音频播放状态确认 - isPlayingAudio:', isPlayingAudio.value, 'audioStore.isPlaying:', audioStore.isPlaying);
+ console.log(
+ `${audioInfo.name}音频开始播放,时长:`,
+ audio.duration()
+ );
+ console.log(
+ "音频播放状态确认 - isPlayingAudio:",
+ isPlayingAudio.value,
+ "audioStore.isPlaying:",
+ audioStore.isPlaying
+ );
},
onpause: () => {
audioStore.isPlaying = false;
audioStore.isPaused = true;
audioStore.playbackPosition = audio.seek() || 0;
- console.log(`${audioInfo.name}音频已暂停,位置:`, audioStore.playbackPosition);
+ console.log(
+ `${audioInfo.name}音频已暂停,位置:`,
+ audioStore.playbackPosition
+ );
},
onresume: () => {
audioStore.isPlaying = true;
@@ -878,7 +949,14 @@ watch(
},
onend: () => {
console.log(`${audioInfo.name}音频播放完成,准备播放下一个`);
- console.log('播放完成时的状态 - 当前索引:', currentPlayIndex, '队列长度:', audioQueue.value.length, 'isPlayingAudio:', isPlayingAudio.value);
+ console.log(
+ "播放完成时的状态 - 当前索引:",
+ currentPlayIndex,
+ "队列长度:",
+ audioQueue.value.length,
+ "isPlayingAudio:",
+ isPlayingAudio.value
+ );
audioStore.isPlaying = false;
audioStore.isPaused = false;
audioStore.playbackPosition = 0;
@@ -889,13 +967,23 @@ watch(
// 确保只有在音频真正播放完成时才播放下一个
if (currentPlayIndex < audioQueue.value.length) {
- console.log(`队列中还有音频,500ms后播放下一个 (索引:${currentPlayIndex}),当前队列:`, audioQueue.value.map((item, index) => `${index === currentPlayIndex ? '▶️' : '⏸️'} ${item.name}`));
+ console.log(
+ `队列中还有音频,500ms后播放下一个 (索引:${currentPlayIndex}),当前队列:`,
+ audioQueue.value.map(
+ (item, index) =>
+ `${index === currentPlayIndex ? "▶️" : "⏸️"} ${
+ item.name
+ }`
+ )
+ );
setTimeout(() => {
isCallingPlayNext = false; // 在调用前重置标志
playNextAudio();
}, 500);
} else {
- console.log('🎉 所有音频播放完成,清除音频实例,队列保持完整,下次播放将从第一个开始');
+ console.log(
+ "🎉 所有音频播放完成,清除音频实例,队列保持完整,下次播放将从第一个开始"
+ );
// 清除音频实例,确保重新播放时不会使用旧实例
audioStore.nowSound = null;
audioStore.soundInstance = null;
@@ -917,7 +1005,7 @@ watch(
setTimeout(() => {
playNextAudio();
}, 100);
- }
+ },
});
// 设置当前音频URL到store
@@ -931,51 +1019,69 @@ watch(
// 音频队列顺序管理
const audioQueueOrder = {
- 'API1-第一个': 1,
- 'API2-第二个': 2,
- 'API3-第三个': 3,
- 'API4-第四个': 4
+ "API1-第一个": 1,
+ "API2-第二个": 2,
+ "API3-第三个": 3,
+ "API4-第四个": 4,
};
// 添加音频到播放队列(确保顺序)
const addToAudioQueue = (url, name) => {
console.log(`=== 添加音频到队列 ===`);
- console.log('URL:', url);
- console.log('Name:', name);
- console.log('音频启用状态:', audioStore.isVoiceEnabled);
+ console.log("URL:", url);
+ console.log("Name:", name);
+ console.log("音频启用状态:", audioStore.isVoiceEnabled);
if (url && audioStore.isVoiceEnabled) {
- const audioItem = { url, name, order: audioQueueOrder[name] || 999 };
+ const audioItem = {
+ url,
+ name,
+ order: audioQueueOrder[name] || 999,
+ };
audioQueue.value.push(audioItem);
// 按顺序排序队列
audioQueue.value.sort((a, b) => a.order - b.order);
- console.log(`音频${name}已添加到播放队列,顺序:${audioItem.order}`);
- console.log('当前队列顺序:', audioQueue.value.map(item => `${item.name}(${item.order})`));
- console.log('当前播放状态详情:');
- console.log(' - isPlayingAudio:', isPlayingAudio.value);
- console.log(' - audioStore.isPlaying:', audioStore.isPlaying);
- console.log(' - audioStore.nowSound:', audioStore.nowSound);
- console.log(' - isCallingPlayNext:', isCallingPlayNext);
- console.log(' - 队列长度:', audioQueue.value.length);
+ console.log(
+ `音频${name}已添加到播放队列,顺序:${audioItem.order}`
+ );
+ console.log(
+ "当前队列顺序:",
+ audioQueue.value.map((item) => `${item.name}(${item.order})`)
+ );
+ console.log("当前播放状态详情:");
+ console.log(" - isPlayingAudio:", isPlayingAudio.value);
+ console.log(" - audioStore.isPlaying:", audioStore.isPlaying);
+ console.log(" - audioStore.nowSound:", audioStore.nowSound);
+ console.log(" - isCallingPlayNext:", isCallingPlayNext);
+ console.log(" - 队列长度:", audioQueue.value.length);
// 只有在确实没有音频在播放且这是第一个音频时才开始播放
- if (!isPlayingAudio.value && !audioStore.isPlaying && audioQueue.value.length === 1) {
- console.log('✅ 条件满足:没有音频在播放且这是第一个音频,立即开始播放');
+ if (
+ !isPlayingAudio.value &&
+ !audioStore.isPlaying &&
+ audioQueue.value.length === 1
+ ) {
+ console.log(
+ "✅ 条件满足:没有音频在播放且这是第一个音频,立即开始播放"
+ );
playNextAudio();
} else {
- console.log('⏳ 等待条件:', {
+ console.log("⏳ 等待条件:", {
isPlayingAudio: isPlayingAudio.value,
audioStoreIsPlaying: audioStore.isPlaying,
queueLength: audioQueue.value.length,
- reason: audioQueue.value.length > 1 ? '队列中已有其他音频' : '有音频正在播放'
+ reason:
+ audioQueue.value.length > 1
+ ? "队列中已有其他音频"
+ : "有音频正在播放",
});
}
} else {
- console.log('❌ 跳过添加音频:', {
+ console.log("❌ 跳过添加音频:", {
hasUrl: !!url,
- voiceEnabled: audioStore.isVoiceEnabled
+ voiceEnabled: audioStore.isVoiceEnabled,
});
}
console.log(`=== 添加音频完成 ===`);
@@ -984,62 +1090,113 @@ watch(
// 重写audioStore的togglePlayPause方法以支持队列播放控制
const originalTogglePlayPause = audioStore.togglePlayPause;
audioStore.togglePlayPause = () => {
- console.log('主页音频控制按钮被点击');
- console.log('当前音频状态 - isPlaying:', audioStore.isPlaying, 'isPaused:', audioStore.isPaused);
- console.log('当前音频实例:', audioStore.soundInstance);
- console.log('队列播放状态 - isPlayingAudio:', isPlayingAudio.value, '队列长度:', audioQueue.value.length);
- console.log('当前播放索引:', currentPlayIndex, '是否所有音频播放完成:', currentPlayIndex >= audioQueue.value.length);
+ console.log("主页音频控制按钮被点击");
+ console.log(
+ "当前音频状态 - isPlaying:",
+ audioStore.isPlaying,
+ "isPaused:",
+ audioStore.isPaused
+ );
+ console.log("当前音频实例:", audioStore.soundInstance);
+ console.log(
+ "队列播放状态 - isPlayingAudio:",
+ isPlayingAudio.value,
+ "队列长度:",
+ audioQueue.value.length
+ );
+ console.log(
+ "当前播放索引:",
+ currentPlayIndex,
+ "是否所有音频播放完成:",
+ currentPlayIndex >= audioQueue.value.length
+ );
// 检查是否所有音频都播放完成,如果是则重新开始
- if (audioStore.soundInstance && currentPlayIndex < audioQueue.value.length && isPlayingAudio.value) {
+ if (
+ audioStore.soundInstance &&
+ currentPlayIndex < audioQueue.value.length &&
+ isPlayingAudio.value
+ ) {
if (audioStore.isPlaying) {
// 暂停当前音频
- console.log('暂停当前音频');
+ console.log("暂停当前音频");
audioStore.soundInstance.pause();
- } else if (audioStore.isPaused && audioStore.playbackPosition > 0) {
+ } else if (
+ audioStore.isPaused &&
+ audioStore.playbackPosition > 0
+ ) {
// 从暂停位置继续播放
- console.log('从暂停位置继续播放音频,位置:', audioStore.playbackPosition);
+ console.log(
+ "从暂停位置继续播放音频,位置:",
+ audioStore.playbackPosition
+ );
audioStore.soundInstance.seek(audioStore.playbackPosition);
audioStore.soundInstance.play();
} else {
// 重新开始播放
- console.log('重新开始播放音频');
+ console.log("重新开始播放音频");
audioStore.soundInstance.play();
}
} else {
- console.log('没有音频实例,检查是否需要重新播放队列');
- console.log('重新播放条件检查:', {
+ console.log("没有音频实例,检查是否需要重新播放队列");
+ console.log("重新播放条件检查:", {
isPlayingAudio: isPlayingAudio.value,
queueLength: audioQueue.value.length,
currentPlayIndex: currentPlayIndex,
condition1: audioQueue.value.length === 0,
condition2: currentPlayIndex >= audioQueue.value.length,
- finalCondition: !isPlayingAudio.value && (audioQueue.value.length === 0 || currentPlayIndex >= audioQueue.value.length)
+ finalCondition:
+ !isPlayingAudio.value &&
+ (audioQueue.value.length === 0 ||
+ currentPlayIndex >= audioQueue.value.length),
});
// 没有音频实例时,检查是否所有音频都播放完成
- if (!isPlayingAudio.value && (audioQueue.value.length === 0 || currentPlayIndex >= audioQueue.value.length)) {
- console.log('所有音频播放完成,重新构建队列从第一个开始播放');
+ if (
+ !isPlayingAudio.value &&
+ (audioQueue.value.length === 0 ||
+ currentPlayIndex >= audioQueue.value.length)
+ ) {
+ console.log("所有音频播放完成,重新构建队列从第一个开始播放");
// 重新构建音频队列,按顺序添加所有音频(不自动播放)
const audioItems = [];
if (audioPreloadStatus.one.url) {
- audioItems.push({ url: audioPreloadStatus.one.url, name: "API1-第一个", order: 1 });
+ audioItems.push({
+ url: audioPreloadStatus.one.url,
+ name: "API1-第一个",
+ order: 1,
+ });
}
if (audioPreloadStatus.two.url) {
- audioItems.push({ url: audioPreloadStatus.two.url, name: "API2-第二个", order: 2 });
+ audioItems.push({
+ url: audioPreloadStatus.two.url,
+ name: "API2-第二个",
+ order: 2,
+ });
}
if (audioPreloadStatus.three.url) {
- audioItems.push({ url: audioPreloadStatus.three.url, name: "API3-第三个", order: 3 });
+ audioItems.push({
+ url: audioPreloadStatus.three.url,
+ name: "API3-第三个",
+ order: 3,
+ });
}
if (audioPreloadStatus.four.url) {
- audioItems.push({ url: audioPreloadStatus.four.url, name: "API4-第四个", order: 4 });
+ audioItems.push({
+ url: audioPreloadStatus.four.url,
+ name: "API4-第四个",
+ order: 4,
+ });
}
// 按顺序排序并添加到队列
audioItems.sort((a, b) => a.order - b.order);
audioQueue.value = audioItems;
- console.log('队列重建完成,队列内容:', audioQueue.value.map(item => item.name));
- console.log('开始从第一个音频播放');
+ console.log(
+ "队列重建完成,队列内容:",
+ audioQueue.value.map((item) => item.name)
+ );
+ console.log("开始从第一个音频播放");
// 重置播放状态并开始播放第一个音频
if (audioQueue.value.length > 0) {
@@ -1053,37 +1210,47 @@ watch(
audioStore.nowSound = null;
audioStore.soundInstance = null;
- console.log('🔄 状态完全重置完成,准备从第一个音频开始播放');
+ console.log("🔄 状态完全重置完成,准备从第一个音频开始播放");
- console.log('✅ 完全重置播放状态,准备播放第一个音频');
- console.log('重置后状态检查:', {
+ console.log("✅ 完全重置播放状态,准备播放第一个音频");
+ console.log("重置后状态检查:", {
isPlayingAudio: isPlayingAudio.value,
isCallingPlayNext: isCallingPlayNext,
currentPlayIndex: currentPlayIndex,
audioStoreIsPlaying: audioStore.isPlaying,
- queueLength: audioQueue.value.length
+ queueLength: audioQueue.value.length,
});
setTimeout(() => {
- console.log('🚀 延迟后开始播放第一个音频');
- console.log('播放前最终状态检查:', {
+ console.log("🚀 延迟后开始播放第一个音频");
+ console.log("播放前最终状态检查:", {
currentPlayIndex: currentPlayIndex,
queueLength: audioQueue.value.length,
- queueItems: audioQueue.value.map((item, index) => `${index}: ${item.name}`),
+ queueItems: audioQueue.value.map(
+ (item, index) => `${index}: ${item.name}`
+ ),
isPlayingAudio: isPlayingAudio.value,
isCallingPlayNext: isCallingPlayNext,
audioStoreIsPlaying: audioStore.isPlaying,
- audioStoreInstance: !!audioStore.soundInstance
+ audioStoreInstance: !!audioStore.soundInstance,
});
- console.log('🎯 即将调用 playNextAudio,期望播放:', audioQueue.value[currentPlayIndex]?.name || '无音频');
+ console.log(
+ "🎯 即将调用 playNextAudio,期望播放:",
+ audioQueue.value[currentPlayIndex]?.name || "无音频"
+ );
playNextAudio();
}, 200);
}
} else if (!isPlayingAudio.value && audioQueue.value.length > 0) {
- console.log('队列中还有音频,继续播放');
+ console.log("队列中还有音频,继续播放");
playNextAudio();
} else {
- console.log('无法播放 - isPlayingAudio:', isPlayingAudio.value, '队列长度:', audioQueue.value.length);
+ console.log(
+ "无法播放 - isPlayingAudio:",
+ isPlayingAudio.value,
+ "队列长度:",
+ audioQueue.value.length
+ );
}
}
};
@@ -1116,7 +1283,7 @@ watch(
audioPreloadStatus[apiKey].loaded = true; // 标记为已处理,避免阻塞
// URL已经在上面设置了,即使预加载失败也保留URL
resolve();
- }
+ },
});
});
};
@@ -1132,12 +1299,18 @@ watch(
if (canStartFirstOutput() && !apiStatus.one.executed) {
if (apiStatus.one.result) {
apiStatus.one.executed = true;
- console.log("执行OneAPI代码(文本和音频同步开始):", apiStatus.one.result);
+ console.log(
+ "执行OneAPI代码(文本和音频同步开始):",
+ apiStatus.one.result
+ );
// 将第一个音频添加到播放队列(确保顺序:API1)
if (audioPreloadStatus.one.url) {
addToAudioQueue(audioPreloadStatus.one.url, "API1-第一个");
- console.log("音频队列:添加API1音频,当前队列长度:", audioQueue.value.length);
+ console.log(
+ "音频队列:添加API1音频,当前队列长度:",
+ audioQueue.value.length
+ );
}
// 在这里添加OneAPI成功后需要执行的代码
@@ -1166,10 +1339,10 @@ watch(
const pc1 = marked(
result21.data.name +
- "\n" +
- result21.data.price +
- "\n" +
- result21.data.date
+ "\n" +
+ result21.data.price +
+ "\n" +
+ result21.data.date
);
const ac1 = pc1.replace(katexRegex, (match, formula) => {
try {
@@ -1329,22 +1502,22 @@ watch(
// klineType: 2,
// });
- addTypingTask(
- {
- sender: "ai",
- class: "content2",
- type: "content2",
- kline: true,
- chartData: Kline20,
- messageId: klineMessageId2,
- hasValidData: true, // 添加hasValidData标志
- klineType: 2,
- error: apiStatus.two.error ? '2' : '',
- isEnd: '1',
- },
- "",
- 50
- );
+ addTypingTask(
+ {
+ sender: "ai",
+ class: "content2",
+ type: "content2",
+ kline: true,
+ chartData: Kline20,
+ messageId: klineMessageId2,
+ hasValidData: true, // 添加hasValidData标志
+ klineType: 2,
+ error: apiStatus.two.error ? "2" : "",
+ isEnd: "1",
+ },
+ "",
+ 50
+ );
// console.log("K线消息已添加到聊天列表");
@@ -1368,22 +1541,23 @@ watch(
// const containerId = `kline-container-${klineIndex}`;
// console.log("图表容器ID:", containerId);
- // // 确保DOM已经渲染完成
- // setTimeout(() => {
- // console.log("延时执行,确保DOM已渲染");
- // KlineCanvsEcharts(containerId);
- // }, 100); // 短暂延时确保DOM已渲染
- // } else {
- // console.warn("未找到K线消息");
- // }
- // });
+ // // 确保DOM已经渲染完成
+ // setTimeout(() => {
+ // console.log("延时执行,确保DOM已渲染");
+ // KlineCanvsEcharts(containerId);
+ // }, 100); // 短暂延时确保DOM已渲染
+ // } else {
+ // console.warn("未找到K线消息");
+ // }
+ // });
+ }
} else {
chatStore.messages.push({
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
}
}
@@ -1394,7 +1568,6 @@ watch(
apiStatus.two.completed &&
!apiStatus.two.executed
) {
-
if (apiStatus.two.result) {
apiStatus.two.executed = true;
console.log("执行TwoAPI代码:", apiStatus.two.result);
@@ -1402,7 +1575,10 @@ watch(
// 将第二个音频添加到播放队列(确保顺序:API2)
if (audioPreloadStatus.two.url) {
addToAudioQueue(audioPreloadStatus.two.url, "API2-第二个");
- console.log("音频队列:添加API2音频,当前队列长度:", audioQueue.value.length);
+ console.log(
+ "音频队列:添加API2音频,当前队列长度:",
+ audioQueue.value.length
+ );
}
// 在这里添加TwoAPI成功后需要执行的代码
@@ -1444,8 +1620,8 @@ watch(
type: "content3",
content: "",
isTyping: true,
- error: apiStatus.three.error ? '3' : '',
- isEnd: '2'
+ error: apiStatus.three.error ? "3" : "",
+ isEnd: "2",
});
// chatStore.messages.push(aiMessage2);
@@ -1468,15 +1644,19 @@ watch(
// content: ac2,
// });
} else {
- console.log('1111111111111111111')
- if (apiStatus.one.isEnd && apiStatus.two.error && !apiStatus.two.isError) {
- apiStatus.two.isError = true
+ console.log("1111111111111111111");
+ if (
+ apiStatus.one.isEnd &&
+ apiStatus.two.error &&
+ !apiStatus.two.isError
+ ) {
+ apiStatus.two.isError = true;
chatStore.messages.push({
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
}
}
@@ -1488,7 +1668,6 @@ watch(
apiStatus.three.completed &&
!apiStatus.three.executed
) {
-
if (apiStatus.three.result) {
apiStatus.three.executed = true;
console.log("执行ThreeAPI代码:", apiStatus.three.result);
@@ -1496,7 +1675,10 @@ watch(
// 将第三个音频添加到播放队列(确保顺序:API3)
if (audioPreloadStatus.three.url) {
addToAudioQueue(audioPreloadStatus.three.url, "API3-第三个");
- console.log("音频队列:添加API3音频,当前队列长度:", audioQueue.value.length);
+ console.log(
+ "音频队列:添加API3音频,当前队列长度:",
+ audioQueue.value.length
+ );
}
// 在这里添加ThreeAPI成功后需要执行的代码
@@ -1619,8 +1801,8 @@ watch(
type: "content3",
content: "",
isTyping: true,
- error: apiStatus.four.error ? '4' : '',
- isEnd: '3'
+ error: apiStatus.four.error ? "4" : "",
+ isEnd: "3",
});
// chatStore.messages.push(aiMessage4);
@@ -1648,14 +1830,18 @@ watch(
// content: ac4,
// });
} else {
- if (apiStatus.two.isEnd && apiStatus.three.error && !apiStatus.three.isError) {
+ if (
+ apiStatus.two.isEnd &&
+ apiStatus.three.error &&
+ !apiStatus.three.isError
+ ) {
apiStatus.three.isError = true;
chatStore.messages.push({
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试1111',
- })
+ content: "工作流返回出错,请稍后重试1111",
+ });
chatStore.isLoading = false;
}
}
@@ -1667,7 +1853,6 @@ watch(
apiStatus.four.completed &&
!apiStatus.four.executed
) {
-
if (apiStatus.four.result) {
apiStatus.four.executed = true;
console.log("执行FourAPI代码:", apiStatus.four.result);
@@ -1675,7 +1860,10 @@ watch(
// 将第四个音频添加到播放队列(确保顺序:API4)
if (audioPreloadStatus.four.url) {
addToAudioQueue(audioPreloadStatus.four.url, "API4-第四个");
- console.log("音频队列:添加API4音频,当前队列长度:", audioQueue.value.length);
+ console.log(
+ "音频队列:添加API4音频,当前队列长度:",
+ audioQueue.value.length
+ );
}
// 在这里添加FourAPI成功后需要执行的代码
@@ -1752,7 +1940,7 @@ watch(
type: "mianze",
content: "",
isTyping: true,
- end: true
+ end: true,
});
// chatStore.messages.push(aiMessage6);
@@ -1774,16 +1962,20 @@ watch(
// class: "mianze",
// type: "mianze",
// content: "内容由AI生成,请注意甄别",
- // });
+ // });
} else {
- if (apiStatus.three.isEnd && apiStatus.four.error && !apiStatus.four.isError) {
+ if (
+ apiStatus.three.isEnd &&
+ apiStatus.four.error &&
+ !apiStatus.four.isError
+ ) {
apiStatus.four.isError = true;
chatStore.messages.push({
class: "ing",
type: "ing",
flag: false,
- content: '工作流返回出错,请稍后重试',
- })
+ content: "工作流返回出错,请稍后重试",
+ });
chatStore.isLoading = false;
}
}
@@ -1804,19 +1996,31 @@ watch(
console.log("audioPreloadStatus:", audioPreloadStatus);
if (audioPreloadStatus.one.url) {
- console.log("添加预加载音频URL one:", audioPreloadStatus.one.url);
+ console.log(
+ "添加预加载音频URL one:",
+ audioPreloadStatus.one.url
+ );
audioUrls.push(audioPreloadStatus.one.url);
}
if (audioPreloadStatus.two.url) {
- console.log("添加预加载音频URL two:", audioPreloadStatus.two.url);
+ console.log(
+ "添加预加载音频URL two:",
+ audioPreloadStatus.two.url
+ );
audioUrls.push(audioPreloadStatus.two.url);
}
if (audioPreloadStatus.three.url) {
- console.log("添加预加载音频URL three:", audioPreloadStatus.three.url);
+ console.log(
+ "添加预加载音频URL three:",
+ audioPreloadStatus.three.url
+ );
audioUrls.push(audioPreloadStatus.three.url);
}
if (audioPreloadStatus.four.url) {
- console.log("添加预加载音频URL four:", audioPreloadStatus.four.url);
+ console.log(
+ "添加预加载音频URL four:",
+ audioPreloadStatus.four.url
+ );
audioUrls.push(audioPreloadStatus.four.url);
}
@@ -1838,7 +2042,7 @@ watch(
// 预加载第一个接口的音频
if (result21?.data?.url) {
- await preloadAudio(result21.data.url.trim(), 'one');
+ await preloadAudio(result21.data.url.trim(), "one");
} else {
audioPreloadStatus.one.loaded = true;
}
@@ -1865,7 +2069,7 @@ watch(
// 预加载第二个接口的音频
if (result22?.data?.url) {
- await preloadAudio(result22.data.url.trim(), 'two');
+ await preloadAudio(result22.data.url.trim(), "two");
} else {
audioPreloadStatus.two.loaded = true;
}
@@ -1878,7 +2082,6 @@ watch(
apiStatus.two.error = error;
audioPreloadStatus.two.loaded = true;
checkAndExecuteInOrder();
-
}
};
@@ -1894,7 +2097,7 @@ watch(
// 预加载第三个接口的音频
if (result23?.data?.url) {
- await preloadAudio(result23.data.url.trim(), 'three');
+ await preloadAudio(result23.data.url.trim(), "three");
} else {
audioPreloadStatus.three.loaded = true;
}
@@ -1920,7 +2123,7 @@ watch(
// 预加载第四个接口的音频
if (result24?.data?.url) {
- await preloadAudio(result24.data.url.trim(), 'four');
+ await preloadAudio(result24.data.url.trim(), "four");
} else {
audioPreloadStatus.four.loaded = true;
}
@@ -1933,7 +2136,6 @@ watch(
apiStatus.four.error = error;
audioPreloadStatus.four.loaded = true;
checkAndExecuteInOrder();
-
}
};
@@ -2219,7 +2421,7 @@ function KlineCanvsEcharts(containerId) {
},
axisLabel: {
show: true,
- formatter: function (v) { },
+ formatter: function (v) {},
textStyle: {
color: "auto",
},
@@ -2885,14 +3087,14 @@ function KlineCanvsEcharts(containerId) {
window.innerWidth > 1024
? "70vw"
: window.innerWidth > 768
- ? "65vw"
- : "55vw",
+ ? "65vw"
+ : "55vw",
right:
window.innerWidth > 1024
? "40vw"
: window.innerWidth > 768
- ? "30vw"
- : "40vw",
+ ? "30vw"
+ : "40vw",
top: window.innerWidth > 768 ? "8%" : "5%",
height: window.innerWidth > 768 ? "34%" : "34%",
containLabel: false,
@@ -2902,14 +3104,14 @@ function KlineCanvsEcharts(containerId) {
window.innerWidth > 1024
? "70vw"
: window.innerWidth > 768
- ? "65vw"
- : "55vw",
+ ? "65vw"
+ : "55vw",
right:
window.innerWidth > 1024
? "40vw"
: window.innerWidth > 768
- ? "30vw"
- : "40vw",
+ ? "30vw"
+ : "40vw",
top: window.innerWidth > 768 ? "45%" : "42%",
height: window.innerWidth > 768 ? "22%" : "22%",
containLabel: false,
@@ -2919,14 +3121,14 @@ function KlineCanvsEcharts(containerId) {
window.innerWidth > 1024
? "70vw"
: window.innerWidth > 768
- ? "65vw"
- : "55vw",
+ ? "65vw"
+ : "55vw",
right:
window.innerWidth > 1024
? "40vw"
: window.innerWidth > 768
- ? "30vw"
- : "40vw",
+ ? "30vw"
+ : "40vw",
top: window.innerWidth > 768 ? "73%" : "70%",
height: window.innerWidth > 768 ? "20%" : "22%",
containLabel: false,
@@ -3786,11 +3988,15 @@ onUnmounted(() => {
-