Browse Source

fix: 修复AI聊天图片提取和子页面工具处理逻辑

1. 优化AI聊天内容的图片链接提取逻辑,支持直接匹配纯链接格式
2. 修复子页面工具列表的响应式处理问题,过滤已标记的工具
3. 完善工具保留/放弃后的状态更新和索引重置逻辑
lsc 1 day ago
parent
commit
db31f8f2d0

+ 7 - 3
src/components/CollapsibleToolbar/componets/aiChat.vue

@@ -945,9 +945,13 @@ const generate = async (message: ChatMessage) => {
     console.log('图片', result)
     console.log('图片', result)
     const content = await result.promise
     const content = await result.promise
     console.log('event.data', content)
     console.log('event.data', content)
-    // 从content中提取图片链接
-    const urlMatch = content.match(/\[.*?\]\((https?:\/\/.*?)\)/)
-    const imageUrl = urlMatch ? urlMatch[1] : ''
+    // 从content中提取图片链接:先判断content是否本身就是链接,是则直接使用,否则从markdown格式中提取
+    const trimmedContent = content.trim()
+    const directUrlMatch = trimmedContent.match(/^(https?:\/\/\S+)$/)
+    const urlMatch = directUrlMatch
+      ? null
+      : trimmedContent.replace(/\n/g, '').match(/\[.*?\]\((https?:\/\/.*?)\)/)
+    const imageUrl = directUrlMatch ? directUrlMatch[1] : (urlMatch ? urlMatch[1] : '')
 
 
     // 判断当前页面是否是工具页(含frame元素)
     // 判断当前页面是否是工具页(含frame元素)
     const isToolPage = (currentSlide.value?.elements || []).some((el: any) => el.type === 'frame')
     const isToolPage = (currentSlide.value?.elements || []).some((el: any) => el.type === 'frame')

+ 24 - 15
src/views/Editor/Canvas/ChildPageDisplay.vue

@@ -53,14 +53,14 @@ const { childPageToolsArray, userid, courseTitle, childPageIndex } = storeToRefs
 const { setChildPageState } = mainStore
 const { setChildPageState } = mainStore
 const { currentSlide, slideIndex } = storeToRefs(slidesStore)
 const { currentSlide, slideIndex } = storeToRefs(slidesStore)
 
 
-const toolsArray = childPageToolsArray.value
+const toolsArray = ref(childPageToolsArray.value.filter(t => !t.isSet))
 const selectedToolIndex = ref(0)
 const selectedToolIndex = ref(0)
 const agentid2 = ref('f86aa63c-b7b7-4d03-9b37-b59f116d36f3')// 生成内容
 const agentid2 = ref('f86aa63c-b7b7-4d03-9b37-b59f116d36f3')// 生成内容
 const loading = ref(true)
 const loading = ref(true)
 
 
 
 
 const toolsJson = computed(() => {
 const toolsJson = computed(() => {
-  return toolsArray[selectedToolIndex.value] || {}
+  return toolsArray.value[selectedToolIndex.value] || {}
 })
 })
 
 
 const formatHint = (str: string, count: number) => {
 const formatHint = (str: string, count: number) => {
@@ -69,20 +69,20 @@ const formatHint = (str: string, count: number) => {
 
 
 const selectTool = (index: number) => {
 const selectTool = (index: number) => {
   selectedToolIndex.value = index
   selectedToolIndex.value = index
-  console.log('👶 选中工具:', toolsArray[index])
+  console.log('👶 选中工具:', toolsArray.value[index])
 }
 }
 
 
 onMounted(() => {
 onMounted(() => {
-  console.log('👶 带选页打开,toolsArray:', toolsArray)
-  const toolsToCreate = toolsArray.filter(t => !t.url)
+  console.log('👶 带选页打开,toolsArray:', toolsArray.value)
+  const toolsToCreate = toolsArray.value.filter(t => !t.url)
   if (toolsToCreate.length === 0) {
   if (toolsToCreate.length === 0) {
     loading.value = false
     loading.value = false
     // return
     // return
   }
   }
   
   
   // const createPromises = toolsToCreate.map((tool) => {
   // const createPromises = toolsToCreate.map((tool) => {
-  //   const originalIndex = toolsArray.findIndex(t => t.tool_id === tool.tool_id)
-  //   return createTool(toolsArray, tool, originalIndex)
+  //   const originalIndex = toolsArray.value.findIndex(t => t.tool_id === tool.tool_id)
+  //   return createTool(toolsArray.value, tool, originalIndex)
   // })
   // })
   
   
   // await Promise.all(createPromises)
   // await Promise.all(createPromises)
@@ -183,16 +183,20 @@ const createTool = async (array: any[], tool: any, index: number) => {
 
 
 const setTool = () => {
 const setTool = () => {
   const slide = currentSlide.value
   const slide = currentSlide.value
-  slidesStore.updateSlide({ toolsArray: toolsArray }, slide.id)
+  slidesStore.updateSlide({ toolsArray: toolsArray.value }, slide.id)
   console.log(slide)
   console.log(slide)
 
 
   // 判断所有工具是否都已保留
   // 判断所有工具是否都已保留
-  const allToolsSet = toolsArray.every(t => t.isSet)
+  const allToolsSet = toolsArray.value.every(t => t.isSet)
   if (allToolsSet) {
   if (allToolsSet) {
     const slide = currentSlide.value
     const slide = currentSlide.value
     slidesStore.updateSlide({ toolsArray: [] }, slide.id) 
     slidesStore.updateSlide({ toolsArray: [] }, slide.id) 
     setChildPageState(false, [], slideIndex.value || 0)
     setChildPageState(false, [], slideIndex.value || 0)
   }
   }
+
+  // 过滤掉已处理(保留/放弃)的工具,剩余未处理的供继续选择
+  toolsArray.value = toolsArray.value.filter(t => !t.isSet)
+  selectedToolIndex.value = 0
 }
 }
 
 
 const setUrl = () => {
 const setUrl = () => {
@@ -241,31 +245,36 @@ const saveTool = (url: string, type: any, index: number) => {
   createSlide()
   createSlide()
   createFrameElement(url, type)
   createFrameElement(url, type)
   changeSlideIndex(childPageIndex.value)
   changeSlideIndex(childPageIndex.value)
-  toolsArray[index].isSet = true
+  toolsArray.value[index].isSet = true
   setTool()
   setTool()
   setTimeout(() => {
   setTimeout(() => {
     changeSlideIndex(childPageIndex.value + 1)
     changeSlideIndex(childPageIndex.value + 1)
     setChildPageState(false, [], slideIndex.value || 0)
     setChildPageState(false, [], slideIndex.value || 0)
   }, 100)
   }, 100)
-  console.log('保留工具', toolsArray)
+  console.log('保留工具', toolsArray.value)
 }
 }
 
 
 // 放弃工具
 // 放弃工具
 const discardTool = (index: number) => {
 const discardTool = (index: number) => {
-  toolsArray[index].isSet = true
+  toolsArray.value[index].isSet = true
   setTool()
   setTool()
-  console.log('放弃工具', toolsArray)
+  // 丢弃后自动切换到下一个未处理的题;全部处理完时 setTool 内已关闭带选页
+  if (toolsArray.value.length > 0) {
+    selectedToolIndex.value = Math.min(index, toolsArray.value.length - 1)
+  }
+  console.log('放弃工具', toolsArray.value)
 }
 }
 
 
 // 保留所有工具
 // 保留所有工具
 const keepAllTools = () => {
 const keepAllTools = () => {
-  toolsArray.forEach(tool => {
+  toolsArray.value.forEach(tool => {
     if (!tool.isSet) {
     if (!tool.isSet) {
       createSlide()
       createSlide()
       createFrameElement(tool.url, getToolType(tool.tool_id))
       createFrameElement(tool.url, getToolType(tool.tool_id))
       tool.isSet = true
       tool.isSet = true
     }
     }
   })
   })
+
   changeSlideIndex(childPageIndex.value)
   changeSlideIndex(childPageIndex.value)
   setTool()
   setTool()
   setTimeout(() => {
   setTimeout(() => {
@@ -283,7 +292,7 @@ const toolTypeMap: Record<string, number> = {
 }
 }
 
 
 const currentToolType = computed(() => {
 const currentToolType = computed(() => {
-  const toolId = toolsArray[selectedToolIndex.value]?.tool_id
+  const toolId = toolsArray.value[selectedToolIndex.value]?.tool_id
   return toolId ? toolTypeMap[toolId] || 0 : 0
   return toolId ? toolTypeMap[toolId] || 0 : 0
 })
 })