From ac909d67570ad4c6b1cf655c046381e14b5c580d Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 6 Sep 2026 20:22:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(listings):=20=E9=A6=96=E9=A1=B5=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E7=BB=9F=E4=B8=80=E6=8E=A5=E5=85=A5=20AuthImage=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=A7=81=E6=9C=89=E5=AF=B9=E8=B1=A1=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E9=89=B4=E6=9D=83=E5=8A=A0=E8=BD=BD=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listings/components/ListingCard.vue | 26 ++++++++++++++++--- .../listings/views/ListingCollectionsView.vue | 9 ++++--- .../listings/views/MobileHomeView.css | 14 ++++++++++ .../listings/views/MobileHomeView.vue | 9 ++++--- frontend/src/shared/api/files.ts | 11 +++++++- frontend/src/shared/utils/listingDisplay.ts | 20 +++++++++++--- 6 files changed, 73 insertions(+), 16 deletions(-) diff --git a/frontend/src/features/listings/components/ListingCard.vue b/frontend/src/features/listings/components/ListingCard.vue index 38e4856..ccde1c4 100644 --- a/frontend/src/features/listings/components/ListingCard.vue +++ b/frontend/src/features/listings/components/ListingCard.vue @@ -2,6 +2,7 @@ import { computed } from 'vue' import { RouterLink } from 'vue-router' import type { Listing } from '@/features/listings' +import AuthImage from '@/shared/components/business/AuthImage.vue' import { formatCent, formatMoney } from '@/shared/utils/money' import { formatEstimatedRentalDuration, @@ -103,12 +104,13 @@ function formatStatNumber(value: number) {
-
HFB
@@ -297,6 +299,7 @@ function formatStatNumber(value: number) { cursor: pointer; } +.card-media :deep(img), .card-media img { width: 100%; height: 100%; @@ -305,10 +308,25 @@ function formatStatNumber(value: number) { transition: transform 0.25s ease; } +.hfb-listing-card:hover .card-media :deep(img), .hfb-listing-card:hover .card-media img { transform: scale(1.03); } +.card-media :deep(.auth-image-fallback) { + width: 100%; + height: 100%; + min-height: 100%; + border: none; + border-radius: 0; + background: #f1f5f9; + color: #94a3b8; + font-size: 12px; + display: flex; + align-items: center; + justify-content: center; +} + .media-empty { display: flex; align-items: center; diff --git a/frontend/src/features/listings/views/ListingCollectionsView.vue b/frontend/src/features/listings/views/ListingCollectionsView.vue index 6181bad..e68716b 100644 --- a/frontend/src/features/listings/views/ListingCollectionsView.vue +++ b/frontend/src/features/listings/views/ListingCollectionsView.vue @@ -9,6 +9,7 @@ import { useListingCollections, type ListingCollectionItem, } from '@/features/listings/composables/useListingCollections' +import AuthImage from '@/shared/components/business/AuthImage.vue' import { formatCent, formatMoney } from '@/shared/utils/money' import { formatHafCoinM, @@ -16,6 +17,7 @@ import { getCoinWan, getListingDisplayPrice, getListingTitle, + getCoinScreenshotURL, } from '@/shared/utils/listingDisplay' const route = useRoute() @@ -136,10 +138,11 @@ function timeText(item: ListingCollectionItem) {
-
HFB
diff --git a/frontend/src/features/listings/views/MobileHomeView.css b/frontend/src/features/listings/views/MobileHomeView.css index 2282614..b004bfd 100644 --- a/frontend/src/features/listings/views/MobileHomeView.css +++ b/frontend/src/features/listings/views/MobileHomeView.css @@ -728,6 +728,20 @@ display: block; } +.mobile-card-media .auth-image-fallback { + width: 100%; + height: 100%; + min-height: 100%; + border: none; + border-radius: 0; + background: #f1f5f9; + color: #94a3b8; + font-size: 11px; + display: flex; + align-items: center; + justify-content: center; +} + .media-empty { display: flex; align-items: center; diff --git a/frontend/src/features/listings/views/MobileHomeView.vue b/frontend/src/features/listings/views/MobileHomeView.vue index 4c645e6..318c55a 100644 --- a/frontend/src/features/listings/views/MobileHomeView.vue +++ b/frontend/src/features/listings/views/MobileHomeView.vue @@ -1046,12 +1046,13 @@ syncMobileHomeQuery()
-
HFB
diff --git a/frontend/src/shared/api/files.ts b/frontend/src/shared/api/files.ts index 71d2f0e..a487646 100644 --- a/frontend/src/shared/api/files.ts +++ b/frontend/src/shared/api/files.ts @@ -47,7 +47,16 @@ export async function fetchAdminFileBlob(key: string) { } export async function fetchFileBlobByURL(fileURL: string) { - const apiPath = fileURL.startsWith('/api/') ? fileURL.slice(4) : fileURL + let apiPath = fileURL + try { + const parsed = new URL(fileURL, window.location.origin) + apiPath = parsed.pathname + parsed.search + } catch { + // keep as is + } + if (apiPath.startsWith('/api/')) { + apiPath = apiPath.slice(4) + } const { data } = await apiClient.get(apiPath, { responseType: 'blob', }) diff --git a/frontend/src/shared/utils/listingDisplay.ts b/frontend/src/shared/utils/listingDisplay.ts index d834e74..b2fc320 100644 --- a/frontend/src/shared/utils/listingDisplay.ts +++ b/frontend/src/shared/utils/listingDisplay.ts @@ -416,10 +416,22 @@ export function isTopTierInsurance(value: string | undefined | null): boolean { export function getCoinScreenshotURL(item: Listing): string { const groups = item.asset_summary?.screenshot_groups if (typeof groups === 'object' && groups !== null) { - const coinUrls = (groups as Record)['coin'] - if (Array.isArray(coinUrls)) { - const firstCoin = coinUrls.find(url => typeof url === 'string' && Boolean(url)) - if (firstCoin) return firstCoin + const groupRecord = groups as Record + const orderedKeys = ['coin', 'tencentSecurity', 'skin', 'gameId', 'totalAsset'] + for (const key of orderedKeys) { + const urls = groupRecord[key] + if (Array.isArray(urls)) { + const found = urls.find(url => typeof url === 'string' && Boolean(url)) + if (found) return found + } + } + for (const key of Object.keys(groupRecord)) { + if (orderedKeys.includes(key)) continue + const urls = groupRecord[key] + if (Array.isArray(urls)) { + const found = urls.find(url => typeof url === 'string' && Boolean(url)) + if (found) return found + } } } return item.cover_url || item.screenshot_urls?.[0] || ''