From 4c91c3d24498e05f8e7d32f42423e619acdb07dc Mon Sep 17 00:00:00 2001 From: moyayu <1623253835@qq.com> Date: Fri, 22 May 2026 15:04:20 +0800 Subject: [PATCH] fix: SpImage CDN resolution and split product-detail bundle/promotion entries --- src/components/sp-image/index.js | 59 ++++++++++++++++++++---------- src/subpages/item/espier-detail.js | 48 ++++++++++++++++-------- 2 files changed, 71 insertions(+), 36 deletions(-) diff --git a/src/components/sp-image/index.js b/src/components/sp-image/index.js index 775730ee0..f3485617a 100644 --- a/src/components/sp-image/index.js +++ b/src/components/sp-image/index.js @@ -9,6 +9,43 @@ import { View, Image, Text } from '@tarojs/components' import { classNames, isBase64 } from '@/utils' import './index.scss' +function getImageCdnBase() { + return process.env.APP_IMAGE_CDN || '' +} + +function isAbsoluteImageSrc(src) { + if (!src || typeof src !== 'string') return false + const trimmed = src.trim() + return /^(https?:|\/\/|wxfile:|cloud:|data:)/i.test(trimmed) +} + +/** 相对路径拼接 CDN,避免双斜杠;无 CDN 时保留以 / 开头的路径 */ +function joinImageCdn(src) { + const path = (src || 'default_img.png').replace(/^\/+/, '') + const base = getImageCdnBase().replace(/\/+$/, '') + if (!base) { + return src?.startsWith('/') ? src : `/${path}` + } + return `${base}/${path}` +} + +function resolveImageSrc(src) { + if (!src) { + return joinImageCdn('default_img.png') + } + if (isBase64(src)) { + return src + } + const trimmed = String(src).trim() + if (/^\/\//.test(trimmed)) { + return `https:${trimmed}` + } + if (isAbsoluteImageSrc(trimmed)) { + return trimmed + } + return joinImageCdn(trimmed) +} + function getDiskDriver() { try { return Taro.getStorageSync('otherSetting')?.disk_driver || 'qiniu' @@ -58,26 +95,8 @@ function SpImage(props) { // 计算最终图片URL(关键:避免OSS参数乱序导致重复请求) const imgUrl = useMemo(() => { - let url - let isOssUrl = false - - // 优先使用本地/网络绝对路径或Base64 - if (props.src) { - if (isBase64(props.src)) { - return props.src - } - if (/^http/.test(props.src)) { - url = props.src - isOssUrl = props.isOss - } - } - - if (url === undefined) { - const base = - typeof process !== 'undefined' && process.env ? process.env.APP_IMAGE_CDN : '' - url = `${base}/${props.src || 'default_img.png'}` - isOssUrl = props.isOss - } + let url = resolveImageSrc(props.src) + const isOssUrl = props.isOss && /^https?:\/\//i.test(url) // 与 sp-img 一致:仅当前存储为 oss/qiniu 时追加处理参数(七牛 URL 拼 x-oss-process 会 400) if (!isBase64(url) && isOssUrl) { diff --git a/src/subpages/item/espier-detail.js b/src/subpages/item/espier-detail.js index bb9e6e583..79a19f64c 100644 --- a/src/subpages/item/espier-detail.js +++ b/src/subpages/item/espier-detail.js @@ -688,24 +688,40 @@ function EspierDetail(props) { /> {(promotionPackage.length > 0 || promotionActivity.length > 0) && ( - { - setState((draft) => { - draft.promotionOpen = true - }) - }} - > + {promotionPackage.length > 0 && ( - {ti('6578cf7b.0fe3d0', [promotionPackage.length])} + { + Taro.navigateTo({ + url: `/subpages/marketing/package-list?id=${info.itemId}&distributor_id=${info.distributorId}` + }) + }} + > + + {ti('6578cf7b.0fe3d0', [promotionPackage.length])} + + )} - {promotionActivity.length > 0 && - promotionActivity.map((item, index) => ( - - {item.conditionRules || item.promotionTag} - - ))} - + {promotionActivity.length > 0 && ( + { + setState((draft) => { + draft.promotionOpen = true + }) + }} + > + {promotionActivity.map((item, index) => ( + + {item.promotionTag} + + ))} + + )} + )}