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 || '发送名片' }}