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}
+
+ ))}
+
+ )}
+
)}