/** 商品无图时的占位图 */ export const PRODUCT_IMAGE_FALLBACK = '/images/1.png'; export type ProductImageSource = { mainImageUrl?: string | null; carouselUrls?: string[] | null; detailImageUrls?: string[] | null; }; function uniqueUrls(urls: Array) { const seen = new Set(); const result: string[] = []; for (const url of urls) { if (!url || seen.has(url)) continue; seen.add(url); result.push(url); } return result; } /** 首页/列表轮播图:优先 CAROUSEL,否则封面 */ export function getProductImages(source?: ProductImageSource | null): string[] { const carousel = uniqueUrls(source?.carouselUrls ?? []); if (carousel.length > 0) return carousel; const main = source?.mainImageUrl; if (main) return [main]; return [PRODUCT_IMAGE_FALLBACK]; } /** 单张主图:封面优先 */ export function getProductMainImage(source?: ProductImageSource | null): string { return source?.mainImageUrl ?? source?.carouselUrls?.[0] ?? PRODUCT_IMAGE_FALLBACK; } /** 详情页顶部轮播 */ export function getProductCarouselImages(source?: ProductImageSource | null): string[] { const carousel = uniqueUrls(source?.carouselUrls ?? []); if (carousel.length > 0) return carousel; return getProductImages(source); } /** 详情页图文长图 */ export function getProductDetailImages(source?: ProductImageSource | null): string[] { return uniqueUrls(source?.detailImageUrls ?? []); }