修复列表页有些图片不显示的问题

This commit is contained in:
jingrow 2025-11-01 16:54:10 +08:00
parent 96d7d50c0b
commit 86635c26c4

View File

@ -131,8 +131,13 @@
/>
</div>
<!-- 卡片图片 -->
<div v-if="imageFieldName && getImageUrl(row)" class="card-image">
<img :src="getImageUrl(row) || ''" :alt="row[primaryLabel] || row.name" />
<div v-if="imageFieldName && getImageUrl(row) && !cardImageLoadErrors.has(row.name)" class="card-image">
<img
:src="getImageUrl(row) || ''"
:alt="row[primaryLabel] || row.name"
@error="(e) => handleCardImageError(e, row.name)"
@load="(e) => handleCardImageLoad(e, row.name)"
/>
</div>
<div class="card-content">
<div class="info" @click.stop="openDetail(row.name)">
@ -216,7 +221,13 @@
</div>
<!-- 列表图片 -->
<div v-if="imageFieldName" class="col-image" @click.stop="openDetail(row.name)">
<img v-if="getImageUrl(row)" :src="getImageUrl(row) || ''" :alt="row[primaryLabel] || row.name" />
<img
v-if="getImageUrl(row) && !imageLoadErrors.has(row.name)"
:src="getImageUrl(row) || ''"
:alt="row[primaryLabel] || row.name"
@error="(e) => handleImageError(e, row.name)"
@load="(e) => handleImageLoad(e, row.name)"
/>
<span v-else class="image-placeholder"></span>
</div>
<div v-for="col in displayColumns" :key="col.key" :class="`col-${col.key}`" @click.stop="openDetail(row.name)">
@ -388,8 +399,60 @@ const imageFieldName = computed(() => {
function getImageUrl(row: any): string | null {
if (!imageFieldName.value) return null
const imageValue = row[imageFieldName.value]
if (!imageValue || typeof imageValue !== 'string') return null
return imageValue.trim() || null
if (!imageValue) return null
//
if (typeof imageValue === 'string') {
const trimmed = imageValue.trim()
return trimmed || null
}
//
if (typeof imageValue === 'object') {
// URL
const url = imageValue.file_url || imageValue.url || imageValue.value || imageValue
if (typeof url === 'string' && url.trim()) {
return url.trim()
}
}
return null
}
//
const imageLoadErrors = ref<Set<string>>(new Set())
function handleImageError(event: Event, rowName: string) {
const img = event.target as HTMLImageElement
imageLoadErrors.value.add(rowName)
console.warn('[ListPage] Image load failed:', {
rowName,
src: img.src,
imageField: imageFieldName.value,
rowData: rows.value.find((r: any) => r.name === rowName)?.[imageFieldName.value]
})
}
function handleImageLoad(_event: Event, rowName: string) {
imageLoadErrors.value.delete(rowName)
}
//
const cardImageLoadErrors = ref<Set<string>>(new Set())
function handleCardImageError(event: Event, rowName: string) {
const img = event.target as HTMLImageElement
cardImageLoadErrors.value.add(rowName)
console.warn('[ListPage] Card image load failed:', {
rowName,
src: img.src,
imageField: imageFieldName.value,
rowData: rows.value.find((r: any) => r.name === rowName)?.[imageFieldName.value]
})
}
function handleCardImageLoad(_event: Event, rowName: string) {
cardImageLoadErrors.value.delete(rowName)
}
const metaFields = ref<any[]>([])