Explorar o código

优化缓存草稿逻辑显示
处理预览自动播放逻辑

liyanbo hai 1 mes
pai
achega
db725f3264

+ 0 - 2
src/types/auto-imports.d.ts

@@ -7,8 +7,6 @@ export {}
 declare global {
   const DICT_TYPE: typeof import('@/utils/dict')['DICT_TYPE']
   const EffectScope: typeof import('vue')['EffectScope']
-  const ElMessage: typeof import('element-plus/es')['ElMessage']
-  const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
   const computed: typeof import('vue')['computed']
   const createApp: typeof import('vue')['createApp']
   const customRef: typeof import('vue')['customRef']

+ 1 - 1
src/views/bjdx/course/aiGenerate/VideoPreview.vue

@@ -407,7 +407,7 @@ watch(currentSectionIndex, () => {
 
 // 监听对话变化
 watch(currentDialogue, () => {
-  if (!isPlaying.value) {
+  if (!isPlaying.value && props.visible) {
     playDialogueAudio()
   }
 })

+ 35 - 16
src/views/bjdx/course/aiGenerate/aiGengrate.vue

@@ -462,6 +462,7 @@ import { ChatConversationApi } from '@/api/ai/chat/conversation'
 import { ChatRoleApi } from '@/api/ai/model/chatRole'
 import { ImageApi } from '@/api/ai/image'
 import { TtsApi } from '@/api/ai/tts'
+import { deleteFile } from '@/api/infra/file'
 import VideoPreview from '@/views/bjdx/course/aiGenerate/VideoPreview.vue'
 import { AiImageStatusEnum, AiPlatformEnum } from '@/views/ai/utils/constants'
 import { marked } from 'marked'
@@ -509,16 +510,7 @@ const userStore = useUserStore()
 const userId = computed(() => userStore.getUser.id)
 
 // 检查是否存在草稿缓存
-const hasDraftCache = computed(() => {
-  try {
-    const key = `courseScriptData_${userId.value}`
-    const cachedData = localStorage.getItem(key)
-    return !!cachedData
-  } catch (error) {
-    console.error('检查草稿缓存失败:', error)
-    return false
-  }
-})
+const hasDraftCache = ref(false)
 
 // 步骤2生成状态
 const isGeneratingImages = ref(false)
@@ -591,7 +583,8 @@ const saveScriptDataToCache = () => {
   try {
     const key = `courseScriptData_${userId.value}`
     localStorage.setItem(key, JSON.stringify(scriptData))
-    console.log("保存脚本数据到缓存****", key)
+    hasDraftCache.value = true
+    console.log("保存脚本数据到缓存", key)
   } catch (error) {
     console.error('保存缓存数据失败:', error)
   }
@@ -601,7 +594,8 @@ const saveScriptDataToCache = () => {
 const clearScriptDataCache = () => {
   const key = `courseScriptData_${userId.value}`
   localStorage.removeItem(key)
-  console.log("清除脚本数据缓存****", key)
+  hasDraftCache.value = false
+  console.log("清除脚本数据缓存", key)
 }
 
 // 加载草稿并跳转到步骤2
@@ -629,7 +623,6 @@ watch(() => props.visible, (newVisible, oldVisible) => {
       isEditMode.value = true
       try {
         const parsedData = JSON.parse(props.initialScriptData)
-        console.log("草稿json数据:",parsedData)
         Object.assign(scriptData, parsedData)
       } catch (error) {
         console.error('解析脚本数据失败:', error)
@@ -650,7 +643,6 @@ watch(() => props.visible, (newVisible, oldVisible) => {
     }
   } else if (oldVisible) {
     // 对话框关闭时
-    console.log("====",props.initialScriptData)
     if (props.initialScriptData) {
       // 编辑进来的,清空缓存
       clearScriptDataCache()
@@ -711,6 +703,9 @@ const showVideoPreviewModal = ref(false)
 // 全屏状态
 const fullscreen = ref(false)
 
+// 存储被替换的URL链接集合
+const replacedUrls = ref(new Set())
+
 const activeConversationId = ref(null) // 选中的对话编号
 const conversationInAbortController = ref() // 对话进行中 abort 控制器(控制 stream 对话)
 const conversationInProgress = ref(false) // 对话是否正在进行中。目前只有【发送】消息时,会更新为 true,避免切换对话、删除对话等操作
@@ -721,8 +716,6 @@ const receiveMessageFullText = ref('')
 const scriptDataTemp = ref(null)
 
 
-
-
 // 步骤1:生成脚本
 const generateScript = async () => {
   isGenerating.value = true
@@ -909,6 +902,11 @@ const generateMedia = async (sectionIndex) => {
   const section = scriptData.sections[sectionIndex]
   const media = section.backgroundImage
 
+  // 记录旧的URL
+  if (media.url) {
+    replacedUrls.value.add(media.url)
+  }
+
   media.generating = true
   try {
     const form = {
@@ -1004,6 +1002,7 @@ const playAudio = (url, type) => {
   let audio = audioInstances.get(`${type}_${url}`)
   if (!audio) {
     audio = new Audio(url)
+    audio.autoplay = false
     audioInstances.set(`${type}_${url}`, audio)
 
     audio.onended = () => {
@@ -1058,6 +1057,11 @@ const generateVoiceover = async (sectionIndex, dialogueIndex) => {
     return
   }
 
+  // 记录旧的URL
+  if (dialogue.voiceoverUrl) {
+    replacedUrls.value.add(dialogue.voiceoverUrl)
+  }
+
   dialogue.generatingVoiceover = true
 
   let role = digitalHumans.value.find(r => r.name === dialogue.roleName)
@@ -1141,6 +1145,21 @@ const saveScript = async () => {
   if (!isValidationPassed.value) {
     return
   }
+
+  // 删除所有被替换的URL链接
+  for (const url of replacedUrls.value) {
+    try {
+      // 从URL中提取文件ID或直接使用URL删除
+      // 这里需要根据实际的URL格式和删除API进行调整
+      console.log('删除文件:', url)
+      // 注意:这里需要根据实际的删除API进行调整
+      // 例如,如果API需要文件ID,可以从URL中提取
+      // 或者如果API支持通过URL删除,则直接使用URL
+    } catch (error) {
+      console.error('删除文件失败:', error)
+    }
+  }
+
   console.log('scriptData===', JSON.stringify(scriptData))
   // 保存脚本后清除缓存
   clearScriptDataCache()