- 重构 ImageUpload 组件,使用 rawUrl 跟踪原始路径 - 新增 normalizeStorageImageUrl 避免存储绝对 URL - 商品增删改后同步清除缓存和旧图片文件 - 修复秒杀活动列表商品图片为空的问题
67 lines
1.7 KiB
TypeScript
67 lines
1.7 KiB
TypeScript
import defaultProductImage from '@/assets/default-product.svg'
|
|
|
|
export const DEFAULT_PRODUCT_IMAGE = defaultProductImage
|
|
|
|
const ABSOLUTE_URL_PATTERN = /^(https?:)?\/\//i
|
|
const SPECIAL_URL_PATTERN = /^(data:|blob:)/i
|
|
|
|
const normalizeBaseUrl = (value?: string) => {
|
|
if (!value) return ''
|
|
return value.endsWith('/') ? value.slice(0, -1) : value
|
|
}
|
|
|
|
export const resolveImageUrl = (value?: string | null) => {
|
|
if (!value || !String(value).trim()) {
|
|
return DEFAULT_PRODUCT_IMAGE
|
|
}
|
|
|
|
const imageUrl = String(value).trim()
|
|
if (ABSOLUTE_URL_PATTERN.test(imageUrl) || SPECIAL_URL_PATTERN.test(imageUrl)) {
|
|
return imageUrl
|
|
}
|
|
|
|
const baseUrl = normalizeBaseUrl(import.meta.env.VITE_API_BASE_URL)
|
|
if (!baseUrl) {
|
|
return imageUrl.startsWith('/') ? imageUrl : `/${imageUrl}`
|
|
}
|
|
|
|
return imageUrl.startsWith('/') ? `${baseUrl}${imageUrl}` : `${baseUrl}/${imageUrl}`
|
|
}
|
|
|
|
export const normalizeStorageImageUrl = (value?: string | null) => {
|
|
if (!value || !String(value).trim()) {
|
|
return ''
|
|
}
|
|
|
|
const imageUrl = String(value).trim()
|
|
if (ABSOLUTE_URL_PATTERN.test(imageUrl)) {
|
|
try {
|
|
const parsed = new URL(imageUrl.startsWith('//') ? `http:${imageUrl}` : imageUrl)
|
|
if (
|
|
parsed.pathname.startsWith('/uploads/') ||
|
|
parsed.pathname.startsWith('/images/') ||
|
|
parsed.pathname.startsWith('/static/')
|
|
) {
|
|
return parsed.pathname
|
|
}
|
|
} catch {
|
|
return imageUrl
|
|
}
|
|
}
|
|
|
|
return imageUrl
|
|
}
|
|
|
|
export const applyFallbackImage = (event: Event) => {
|
|
const target = event.target as HTMLImageElement | null
|
|
if (!target) return
|
|
|
|
if (target.dataset.fallbackApplied === 'true') {
|
|
return
|
|
}
|
|
|
|
target.dataset.fallbackApplied = 'true'
|
|
target.onerror = null
|
|
target.src = DEFAULT_PRODUCT_IMAGE
|
|
}
|