From f8a1c82394566a160a829050e235f1f090c1a467 Mon Sep 17 00:00:00 2001 From: jingrow Date: Sat, 1 Nov 2025 17:04:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=A1=B5=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=87=AA=E5=8A=A8=E4=B8=8B=E8=BD=BD=E5=88=B0?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/core/pagetype/GenericListPage.vue | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue b/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue index 7b670c5..7dc78e4 100644 --- a/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue +++ b/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue @@ -287,12 +287,13 @@ import { usePageTypeSlug } from '@/shared/utils/slug' import { isSinglePageType } from '@/shared/utils/pagetype' import SinglePageDetail from './SinglePageDetail.vue' import FilterBar from '@/core/components/FilterBar.vue' -import { - resolvePagetypeListOverride, +import { + resolvePagetypeListOverride, resolvePagetypeListToolbarOverride, resolvePagetypeListFilterBarOverride, resolvePagetypeListActionsOverride } from '@/core/registry/pagetypeOverride' +import { downloadImageToLocal } from '@/shared/api/common' const route = useRoute() const router = useRouter() @@ -455,6 +456,26 @@ function handleCardImageLoad(_event: Event, rowName: string) { cardImageLoadErrors.value.delete(rowName) } +// 自动下载图片的函数(与详情页一致) +async function autoDownloadImages(imageUrls: string[]) { + const downloadPromises = imageUrls.map(async (url) => { + const filename = url.split('/').pop() || 'image.jpg' + + try { + const result = await downloadImageToLocal(url, filename) + if (result.success) { + // 返回是否是新下载的图片(非缓存) + return !(result as any).data?.cached + } + } catch (error) { + // 静默失败,不影响界面 + } + return false + }) + + await Promise.all(downloadPromises) +} + const metaFields = ref([]) const pageMeta = ref({}) const linkTitleCache = ref>({}) @@ -791,6 +812,24 @@ async function loadData() { // 预加载Link字段的title_field值(在loading期间同步执行,避免抖动) await preloadLinkTitles() + + // 自动下载图片到本地(异步执行,不阻塞界面渲染) + if (imageFieldName.value && rows.value.length > 0) { + const imageUrls: string[] = [] + rows.value.forEach((row: any) => { + const imageUrl = getImageUrl(row) + if (imageUrl && imageUrl.startsWith('/files/')) { + imageUrls.push(imageUrl) + } + }) + + if (imageUrls.length > 0) { + // 异步下载,不阻塞界面渲染 + autoDownloadImages(imageUrls).catch((error: any) => { + console.warn('列表页图片下载失败:', error) + }) + } + } } catch (error) { console.error('Load data error:', error) message.error(t('Load failed'))