From d605f4c9ea7797575c272ff098ad11f8b9864153 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Wed, 21 Oct 2026 16:35:47 +0800
Subject: [PATCH 1/2] =?UTF-8?q?feat(goods-detail):=20=E5=95=86=E5=93=81?=
=?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E4=B8=BB=E5=9B=BE/=E8=A7=86?=
=?UTF-8?q?=E9=A2=91=E6=8C=89=E5=90=8E=E5=8F=B0=E3=80=8C=E5=AA=92=E4=BD=93?=
=?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=A1=BA=E5=BA=8F=E3=80=8D=E5=88=87=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
后台商品「高级设置」新增 media_order(1=主图在前 2=视频在前), 前端按其决定
商品详情页媒体区默认展示哪一个, 以及底部「图片/视频」切换按钮的排列顺序.
改动:
- goods-detail-view 组件:
- 新增 applyMediaOrder() 按 media_order 决定默认展示主图还是视频
- 新增 mediaOrderKey 计算属性 + watcher: 只在「媒体显示顺序/视频地址」
变化时重新应用, 避免用户手动切到「视频」后被详情数据深层变更打回
- 新增 mediaTabs 计算属性: 切换按钮顺序跟随配置
- 切换按钮改用 switchMediaTab(), 切回主图时暂停视频
- common/js/goods_detail_base.js: 父级那行 switchMedia 赋值原本是死代码
(父级无此 data 字段, 无模板读取), 改成与新规则一致, 避免两处规则打架
---
common/js/goods_detail_base.js | 7 ++++-
.../_components/goods-detail-view/detail.js | 21 +++++++++++++++
.../goods-detail-view/goods-detail-view.vue | 27 ++++++++++++++++---
3 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/common/js/goods_detail_base.js b/common/js/goods_detail_base.js
index 75bc04e..185f9c4 100644
--- a/common/js/goods_detail_base.js
+++ b/common/js/goods_detail_base.js
@@ -115,7 +115,12 @@ export default {
}
//媒体
- if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
+ // 媒体显示顺序以后台商品「高级设置 → 媒体显示顺序」media_order 为准
+ // (1=主图在前 2=视频在前); 真正渲染媒体区的是 goods-detail-view 组件,
+ // 组件内部按同一规则切换, 这里保持一致避免两处规则打架
+ if (this.goodsSkuDetail.video_url) {
+ this.switchMedia = (Number(this.goodsSkuDetail.media_order) === 2) ? "video" : "img";
+ }
if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
diff --git a/pages_goods/_components/goods-detail-view/detail.js b/pages_goods/_components/goods-detail-view/detail.js
index f8a2566..bb8798f 100644
--- a/pages_goods/_components/goods-detail-view/detail.js
+++ b/pages_goods/_components/goods-detail-view/detail.js
@@ -105,6 +105,24 @@ export default {
}
},
methods: {
+ /**
+ * 应用后台「高级设置 → 媒体显示顺序」(media_order)
+ * 1 = 主图在前(默认) 2 = 视频在前
+ * 商品没有视频时一律主图在前
+ */
+ applyMediaOrder() {
+ const detail = this.goodsSkuDetail || {};
+ if (!detail.video_url) {
+ this.switchMedia = 'img';
+ return;
+ }
+ this.switchMedia = Number(detail.media_order) === 2 ? 'video' : 'img';
+ },
+ // 手动切换图片/视频
+ switchMediaTab(key) {
+ this.switchMedia = key;
+ if (key === 'img' && this.videoContext) this.videoContext.pause();
+ },
init(params) {
this.skuId = params.sku_id;
this.goodsId = params.goods_id;
@@ -136,6 +154,9 @@ export default {
this.videoContext = uni.createVideoContext('goodsVideo');
+ // 媒体显示顺序: 以后台商品「高级设置 → 媒体显示顺序」为准
+ this.applyMediaOrder();
+
// #ifdef MP-WEIXIN
this.goodsSyncToGoodsCircle();
// #endif
diff --git a/pages_goods/_components/goods-detail-view/goods-detail-view.vue b/pages_goods/_components/goods-detail-view/goods-detail-view.vue
index c7a9fc8..0fa0385 100644
--- a/pages_goods/_components/goods-detail-view/goods-detail-view.vue
+++ b/pages_goods/_components/goods-detail-view/goods-detail-view.vue
@@ -65,10 +65,11 @@
- {{
- $lang('goods.detail.video') }}
- {{ $lang('goods.detail.image') }}
+ {{
+ tab.key == 'video' ? $lang('goods.detail.video') : $lang('goods.detail.image')
+ }}
@@ -684,6 +685,24 @@ export default {
// 用于「未拿到任何数据时不显示真实内容」, 避免加载失败/异常时切到空详情页
hasRealData() {
return this.goodsSkuDetail && Number(this.goodsSkuDetail.goods_id) > 0;
+ },
+ // 媒体顺序的变更标识: 只在「媒体显示顺序 / 视频地址」变化时重新应用
+ // 用它而不是直接 watch goodsSkuDetail(深度监听), 是为了避免用户手动切到
+ // 「视频」后被详情数据的任意一次深层变更打回「主图」
+ mediaOrderKey() {
+ const detail = this.goodsSkuDetail || {};
+ return (detail.media_order || 1) + '|' + (detail.video_url || '');
+ },
+ // 底部「图片 / 视频」切换按钮的排列, 与后台设置的媒体显示顺序保持一致
+ mediaTabs() {
+ const detail = this.goodsSkuDetail || {};
+ const tabs = [{ key: 'img' }, { key: 'video' }];
+ return Number(detail.media_order) === 2 ? tabs.reverse() : tabs;
+ }
+ },
+ watch: {
+ mediaOrderKey() {
+ this.applyMediaOrder();
}
},
mixins: [scroll, detail]
From d64e989c25f3f28d4c80ce2842fd361a29c2227f Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Thu, 22 Oct 2026 14:14:42 +0800
Subject: [PATCH 2/2] =?UTF-8?q?feat(diy-card):=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E9=93=BE=E6=8E=A5=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD=EF=BC=8C?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E5=90=8D=E7=89=87=E5=8F=91=E9=80=81=E6=8C=89?=
=?UTF-8?q?=E9=92=AE=E6=96=87=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components-diy/diy-card-entry.vue | 10 ++++++++++
components-diy/diy-card-list.vue | 10 ++++++++++
components-diy/diy-card-mini.vue | 4 ++--
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/components-diy/diy-card-entry.vue b/components-diy/diy-card-entry.vue
index a805391..59b8669 100644
--- a/components-diy/diy-card-entry.vue
+++ b/components-diy/diy-card-entry.vue
@@ -156,6 +156,16 @@ export default {
uni.showToast({ title: '自定义路径需以 / 开头', icon: 'none' });
return;
}
+ } else if (v.linkMode === 'link') {
+ // 平台统一「选择链接」: link 是个对象({name,title,wap_url,page_key,page_params}),
+ // 走 $util.diyRedirectTo 由平台统一处理(内部页/外链/小程序/拨号 等)
+ const link = v.link && typeof v.link === 'object' ? v.link : null;
+ if (!link || !link.name) {
+ uni.showToast({ title: '请先选择链接', icon: 'none' });
+ return;
+ }
+ this.$util.diyRedirectTo(link);
+ return;
} else {
url = '/pages_tool/card/list';
}
diff --git a/components-diy/diy-card-list.vue b/components-diy/diy-card-list.vue
index 0501ead..09925b7 100644
--- a/components-diy/diy-card-list.vue
+++ b/components-diy/diy-card-list.vue
@@ -229,6 +229,16 @@ export default {
uni.showToast({ title: '自定义路径需以 / 开头', icon: 'none' });
return;
}
+ } else if (mode === 'link') {
+ // 平台统一「选择链接」: moreLink 是个对象({name,title,wap_url,page_key,page_params}),
+ // 走 $util.diyRedirectTo 由平台统一处理(内部页/外链/小程序/拨号 等)
+ const link = this.v.moreLink && typeof this.v.moreLink === 'object' ? this.v.moreLink : null;
+ if (!link || !link.name) {
+ uni.showToast({ title: '请先选择链接', icon: 'none' });
+ return;
+ }
+ this.$util.diyRedirectTo(link);
+ return;
}
this.$util.redirectTo(url);
},
diff --git a/components-diy/diy-card-mini.vue b/components-diy/diy-card-mini.vue
index 05a0d64..1d573a4 100644
--- a/components-diy/diy-card-mini.vue
+++ b/components-diy/diy-card-mini.vue
@@ -98,9 +98,9 @@
{{ qrTip || '扫码查看完整名片' }}
-
+
- {{ detailBtnText || '查看完整名片' }}
+ {{ detailBtnText || '发送名片' }}