From 5b7ee903e8497d4255f82c43cc092eb8f2a2fab2 Mon Sep 17 00:00:00 2001 From: zhangyahui Date: Mon, 16 Mar 2026 11:43:19 +0800 Subject: [PATCH 1/7] feat: url link --- src/assets/images/link.png | Bin 0 -> 426 bytes src/assets/images/search.png | Bin 0 -> 332 bytes src/assets/images/web-card.png | Bin 0 -> 9347 bytes src/utils/useWebTitle.ts | 92 ++++++++++++++++++ src/views/home/agent/components/Agent.vue | 22 ++--- src/views/home/agent/components/Item.vue | 46 +++++++-- src/views/home/agent/components/Preview.vue | 73 +++++++++----- .../home/agent/components/ReportCard.vue | 74 +++++++++----- src/views/home/agent/components/UrlCard.vue | 2 +- src/views/home/agent/index.vue | 14 ++- 10 files changed, 255 insertions(+), 68 deletions(-) create mode 100644 src/assets/images/link.png create mode 100644 src/assets/images/search.png create mode 100644 src/assets/images/web-card.png create mode 100644 src/utils/useWebTitle.ts diff --git a/src/assets/images/link.png b/src/assets/images/link.png new file mode 100644 index 0000000000000000000000000000000000000000..2e14709d8f50ad14fd174d7147856e385a8af56e GIT binary patch literal 426 zcmV;b0agBqP)6{o0kxYgzqp7OH2*L~?5Rh-7#XvDw>QuqPx#07*qoM6N<$g6>PIwEzGB literal 0 HcmV?d00001 diff --git a/src/assets/images/search.png b/src/assets/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b84e6c4db098a0b6db0a88f18995face9efc8e GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oVGw3ym^DWND9BhG z&vLcNdnZ=gRGNpM zKlr$=S+t^Q_LDg?mL>S#oBV=*!b!*aT{c^sK1mm-INy0czoboFyt=akR{0N|f|X#fBK literal 0 HcmV?d00001 diff --git a/src/assets/images/web-card.png b/src/assets/images/web-card.png new file mode 100644 index 0000000000000000000000000000000000000000..47351d524071fbab9889e19b89bd025a2308f1c8 GIT binary patch literal 9347 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�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 literal 0 HcmV?d00001 diff --git a/src/utils/useWebTitle.ts b/src/utils/useWebTitle.ts new file mode 100644 index 0000000..5bf7367 --- /dev/null +++ b/src/utils/useWebTitle.ts @@ -0,0 +1,92 @@ +import { ref } from 'vue' + +export const useWebsiteTitle = () => { + const titles = ref>(new Map()) + const loading = ref(new Set()) + const errors = ref(new Map()) + + // 新增:重试配置 + const MAX_RETRY = 3 + const BASE_DELAY = 800 // 毫秒 + + const getCache = (url: string) => { + const cached = sessionStorage.getItem(`title_cache_${url}`) + if (!cached) return null + const { title, expire } = JSON.parse(cached) + return Date.now() < expire ? title : null + } + + const setCache = (url: string, title: string) => { + const data = { title, expire: Date.now() + 7 * 24 * 60 * 60 * 1000 } + sessionStorage.setItem(`title_cache_${url}`, JSON.stringify(data)) + } + + const fetchWithRetry = async (url: string, retryCount = 0): Promise => { + const proxyUrl = `https://api.allorigins.win/raw?url=${encodeURIComponent(url)}` + + try { + const res = await fetch(proxyUrl) + + if (!res.ok) { + throw new Error(`HTTP ${res.status}`) + } + + const html = await res.text() + const parser = new DOMParser() + const doc = parser.parseFromString(html, 'text/html') + const title = + doc.querySelector('title')?.textContent?.trim() || new URL(url).hostname || '无标题' + + return title + } catch (err) { + if (retryCount >= MAX_RETRY) { + throw err // 达到最大重试次数,抛出错误 + } + + // 第1次等800ms,第2次等1600ms,第3次等3200ms + const delay = BASE_DELAY * Math.pow(2, retryCount) + console.warn( + `获取标题失败,${retryCount + 1}/${MAX_RETRY} 次重试,等待 ${delay}ms`, + url + ) + + await new Promise((resolve) => setTimeout(resolve, delay)) + return fetchWithRetry(url, retryCount + 1) + } + } + + const fetchTitle = async (url: string): Promise => { + if (titles.value.has(url)) return titles.value.get(url)! + + const cached = getCache(url) + if (cached) { + titles.value.set(url, cached) + return cached + } + + if (loading.value.has(url)) return '' + + loading.value.add(url) + errors.value.delete(url) + + try { + const title = await fetchWithRetry(url) + titles.value.set(url, title) + setCache(url, title) + return title + } catch (err) { + const msg = `获取标题失败(已重试 ${MAX_RETRY} 次)` + errors.value.set(url, msg) + console.error(err) + return msg + } finally { + loading.value.delete(url) + } + } + + const fetchAll = async (urls: string[]) => { + await Promise.allSettled(urls.map(fetchTitle)) + } + + return { titles, loading, errors, fetchTitle, fetchAll } +} diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index f654e30..989ce44 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -210,7 +210,6 @@ // 流式响应处理 let contentBody = '' let buffer = '' - const webAddressList = [] const reader = response.body?.getReader() if (!reader) throw new Error('无法获取流读取器') @@ -248,10 +247,8 @@ ?.trim() || '' if (!hasReportStarted && eventName === 'report') { - console.log('开始生成报告--------') - isGeneratingReport.value = true - contentBody += `123` + contentBody += `123` hasReportStarted = true } @@ -298,9 +295,9 @@ params.versionID = dataLines[0] projectStore.setProject({ nodeId: dataLines[0] }) } - if (eventName === 'webAddress') { - console.log('webAddress-----', eventName, dataLines) - } + // if (eventName === 'webAddress') { + // console.log('webAddress111111111111111', eventName, dataLines) + // } if (eventName === 'tool') { MyEvent.emit('loading-sketch') @@ -313,7 +310,7 @@ const jsonData = JSON.parse(jsonText) // console.log('jsonData', jsonData) if (jsonData.webAddress) { - console.log('webAddress-----', jsonData) + aiMessage.webAddress = JSON.parse(jsonData.webAddress) } if (jsonData.title) { emits('setTitle', jsonData.title) @@ -439,7 +436,10 @@ while (i < dialogue.length) { const item = dialogue[i] - + if (item.webAddress?.length > 0) { + console.log('item.webAddress-----', item.webAddress) + debugger + } if (item.role === 'user') { // user 角色直接添加 result.push({ @@ -496,7 +496,7 @@ for (let i = 0; i < session.dialogue.length; i++) { if (session.dialogue[i].report) { session.dialogue[i].content = - `123` + + `123` + (session.dialogue[i].content || '') break } @@ -516,7 +516,7 @@ // 3. 收集 sketchIDAndUrl 到 imgList if (session.sketchIDAndUrl) { - imgList.push(...session.sketchIDAndUrl) + imgList.push(session.sketchIDAndUrl) } // 4. 处理 dialogue diff --git a/src/views/home/agent/components/Item.vue b/src/views/home/agent/components/Item.vue index fa08495..8ab6681 100644 --- a/src/views/home/agent/components/Item.vue +++ b/src/views/home/agent/components/Item.vue @@ -40,10 +40,21 @@ + + +
+ + {{ content.webAddress?.length }} web pages have been retrieved. +
@@ -96,13 +107,13 @@ isLast: Boolean }>() - watch( - () => props.content, - (newVal) => { - console.log('newVal-----', newVal) - }, - { immediate: true } - ) + // watch( + // () => props.content, + // (newVal) => { + // console.log('newVal-----', newVal) + // }, + // { immediate: true } + // ) const emit = defineEmits(['regenerate']) @@ -215,6 +226,7 @@ // 点击显示报告 } const handleClickUrls = (data) => { + MyEvent.emit('openUrls', props.content.webAddress) // 点击显示来源 } @@ -260,6 +272,24 @@ width: fit-content; max-width: 82%; } + .web-address { + width: fit-content; + min-width: 22.5rem; + line-height: 2.6rem; + padding: 0 1rem; + border-radius: 1.5rem; + color: #000000a6; + border: 0.1rem solid #0000001a; + font-family: 'Regular'; + font-weight: 400; + font-size: 1.2rem; + margin-top: 1rem; + column-gap: 0.8rem; + .search-icon { + width: 1.4rem; + height: 1.4rem; + } + } } .operate { margin-top: 1.3rem; diff --git a/src/views/home/agent/components/Preview.vue b/src/views/home/agent/components/Preview.vue index b510bf2..45805ac 100644 --- a/src/views/home/agent/components/Preview.vue +++ b/src/views/home/agent/components/Preview.vue @@ -52,27 +52,34 @@
-
+ + +
@@ -92,6 +99,9 @@ import { VueMarkdown } from '@crazydos/vue-markdown' import type { CustomAttrs } from '@crazydos/vue-markdown' import rehypeRaw from 'rehype-raw' + import { useWebsiteTitle } from '@/utils/useWebTitle' + + const { titles, loading, fetchAll } = useWebsiteTitle() const { t } = useI18n() const emits = defineEmits(['deleteSketch']) @@ -125,17 +135,29 @@ const sessionId = ref('') const markdownContent = ref('') -const setSessionId = (id: string) => { - + const urlList = ref([]) + const reportType = ref<'report' | 'urls'>('report') + const setSessionId = (id: string) => { + console.log('setSessionId-----', id) + reportType.value = 'report' sessionId.value = id } + const setUrls = (list: string[]) => { + console.log('setUrls-----', list) + reportType.value = 'urls' + urlList.value = [ + 'https://furnitureindustrynews.substack.com/p/what-2026-really-looks-like-for-furniture', + 'https://furnitureindustrynews.substack.com/p/what-2026-really-looks-like-for-furniture', + 'https://furnitureindustrynews.substack.com/p/what-2026-really-looks-like-for-furniture' + ] + fetchAll(list) + } watch( () => sessionId.value, (newVal) => { if (newVal) { markdownContent.value = localStorage.getItem(`reportsContent_${newVal}`) - console.log('markdownContent-----', markdownContent.value); - + console.log(`报告key值:reportsContent_${newVal}`, markdownContent.value) } } ) @@ -143,9 +165,7 @@ const setSessionId = (id: string) => { // 图片加载完成时触发 const handleImageLoad = (index: number) => { loadedStatus[index] = true - if (index === props.sketchList.length - 1) { - showLoading.value = false - } + showLoading.value = false } // 获取当前显示的图片源 @@ -209,6 +229,8 @@ const setSessionId = (id: string) => { watch( () => props.sketchList, (val) => { + console.log('sketchList-----', val); + if (val.length > 0) { showLoading.value = false } @@ -223,7 +245,8 @@ const setSessionId = (id: string) => { }) defineExpose({ - setSessionId + setSessionId, + setUrls }) @@ -289,6 +312,7 @@ const setSessionId = (id: string) => { flex: 1; overflow: hidden; height: 100%; + &::before { content: ''; position: absolute; @@ -348,6 +372,7 @@ const setSessionId = (id: string) => { white-space: pre-wrap; overflow-y: auto; margin: 2rem; + padding: 0 8.8rem 8.8rem; } } } diff --git a/src/views/home/agent/components/ReportCard.vue b/src/views/home/agent/components/ReportCard.vue index 6e0b133..e13210d 100644 --- a/src/views/home/agent/components/ReportCard.vue +++ b/src/views/home/agent/components/ReportCard.vue @@ -1,49 +1,79 @@ diff --git a/src/views/home/agent/components/UrlCard.vue b/src/views/home/agent/components/UrlCard.vue index af3e6fd..ccc3702 100644 --- a/src/views/home/agent/components/UrlCard.vue +++ b/src/views/home/agent/components/UrlCard.vue @@ -1,5 +1,5 @@ From b82c35f8b75bfd631779d6374c83c14f1df99f3a Mon Sep 17 00:00:00 2001 From: zhangyahui Date: Mon, 16 Mar 2026 13:07:31 +0800 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20sketch=E7=94=9F=E6=88=90=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/home/agent/components/Agent.vue | 4 +++- src/views/home/agent/components/Preview.vue | 20 +++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/views/home/agent/components/Agent.vue b/src/views/home/agent/components/Agent.vue index 989ce44..41f7c62 100644 --- a/src/views/home/agent/components/Agent.vue +++ b/src/views/home/agent/components/Agent.vue @@ -283,7 +283,7 @@ let isNodeIdEvent = eventName === 'nodeId' - let hasSketch = eventName === 'sketch' + let hasSketch = eventName === 'sketchIDAndUrl' const dataLines = event .split(/\n/) @@ -317,6 +317,8 @@ } if (hasSketch) { + console.log('sketch事件-----', jsonData); + sketchList.value.push({ [Object.keys(jsonData)[0]]: jsonData[Object.keys(jsonData)[0]] }) diff --git a/src/views/home/agent/components/Preview.vue b/src/views/home/agent/components/Preview.vue index 45805ac..b19877b 100644 --- a/src/views/home/agent/components/Preview.vue +++ b/src/views/home/agent/components/Preview.vue @@ -226,17 +226,15 @@ const handleLoadingSketch = () => { showLoading.value = true } - watch( - () => props.sketchList, - (val) => { - console.log('sketchList-----', val); - - if (val.length > 0) { - showLoading.value = false - } - }, - { deep: true } - ) + // watch( + // () => props.sketchList, + // (val) => { + // if (val.length > 0) { + // showLoading.value = false + // } + // }, + // { deep: true } + // ) onMounted(() => { MyEvent.add('loading-sketch', handleLoadingSketch) }) From 334c658d7c48cf445259c7a0d9750245e34f35a3 Mon Sep 17 00:00:00 2001 From: "X1627315083@163.com" <1627315083@qq.com> Date: Mon, 16 Mar 2026 13:19:41 +0800 Subject: [PATCH 3/7] fix --- .../components/tools/threeModel/detail.vue | 15 +++++++++++++++ src/lang/en.ts | 1 + src/lang/zh-cn.ts | 1 + 3 files changed, 17 insertions(+) diff --git a/src/components/Canvas/FlowCanvas/components/tools/threeModel/detail.vue b/src/components/Canvas/FlowCanvas/components/tools/threeModel/detail.vue index d828c77..2ae02ee 100644 --- a/src/components/Canvas/FlowCanvas/components/tools/threeModel/detail.vue +++ b/src/components/Canvas/FlowCanvas/components/tools/threeModel/detail.vue @@ -62,6 +62,7 @@ const {} = toRefs(data);
+
{{ $t('threeModel.download') }}