Merge remote-tracking branch 'remotes/origin/dev/1.0' into PR-1-ai-agent-link

This commit is contained in:
2026-08-15 09:27:58 +08:00
7 changed files with 114 additions and 60 deletions

View File

@@ -160,6 +160,18 @@ const localDevConfig = ({
uniacid: 228, uniacid: 228,
domain: 'https://5g.aigc-quickapp.com/', domain: 'https://5g.aigc-quickapp.com/',
}, },
'2797': { //
uniacid: 2797,
domain: 'https://xcx.aigc-quickapp.com/',
},
'5g-95': { // 商品分类,没有立即咨询文字
uniacid: 95,
domain: 'https://5g.aigc-quickapp.com/',
},
'5g-160': { // 商品分类,没有立即咨询文字
uniacid: 160,
domain: 'https://5g.aigc-quickapp.com/',
},
// })['5g-237']; // 商品分类,没有立即咨询文字 // })['5g-237']; // 商品分类,没有立即咨询文字
// })['5g-97']; // 大宗商品贸易,支持自定义字体大小、颜色 // })['5g-97']; // 大宗商品贸易,支持自定义字体大小、颜色
// })['5g-50']; // 燃气安全产品机器人,购物车无反应 // })['5g-50']; // 燃气安全产品机器人,购物车无反应
@@ -173,7 +185,7 @@ const localDevConfig = ({
// })['2724']; // 生物菌肥 // })['2724']; // 生物菌肥
// })['2811']; // 选择要使用的环境配置 // })['2811']; // 选择要使用的环境配置
// })['local-11']; // 选择要使用的环境配置 // })['local-11']; // 选择要使用的环境配置
})['228']; // 本地 })['5g-160']; // 本地
// })['local-2']; // 本地 // })['local-2']; // 本地
// })['local-11']; // 本地 // })['local-11']; // 本地
// })['1-test']; // test // })['1-test']; // test

View File

@@ -118,6 +118,8 @@
.goods-video video { .goods-video video {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain;
object-position: center;
} }
.goods-video .uni-video-cover { .goods-video .uni-video-cover {

View File

@@ -55,6 +55,7 @@
<uni-popup ref="videoPopup" type="center" style="background:transparent;width:100%;height:100%;"> <uni-popup ref="videoPopup" type="center" style="background:transparent;width:100%;height:100%;">
<view class="video-container" :style="popupVideoStyle"> <view class="video-container" :style="popupVideoStyle">
<video <video
:key="video_url"
ref="popupVideoRef" ref="popupVideoRef"
class="adaptive-video" class="adaptive-video"
:autoPauseIfNavigate="true" :autoPauseIfNavigate="true"
@@ -65,6 +66,9 @@
:src="video_url" :src="video_url"
:controls="true" :controls="true"
object-fit="contain" object-fit="contain"
playsinline
webkit-playsinline
x5-playsinline
@loadedmetadata="onPopupVideoLoaded" @loadedmetadata="onPopupVideoLoaded"
@error="onPopupVideoError" @error="onPopupVideoError"
></video> ></video>
@@ -144,41 +148,21 @@ export default {
// 弹窗视频容器样式 // 弹窗视频容器样式
popupVideoStyle() { popupVideoStyle() {
let style = 'position:fixed;width:100%;left:0;'; // 容器横向铺满,黑色背景填满左右边界
const defaultRatio = 9 / 16; // 视频用 object-fit:contain 保持原比例居中,左右黑边由容器黑色背景填充
let style = 'position:fixed;width:100%;height:50vh;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:0;';
let ratio = defaultRatio;
if (this.popupVideoWidth && this.popupVideoHeight) {
ratio = this.popupVideoHeight / this.popupVideoWidth;
}
const isPortrait = ratio > 1;
if (isPortrait) {
style += 'top:50%;transform:translateY(-50%);';
} else {
style += 'top:20%;';
}
// #ifdef H5
style += 'padding-top: ' + (ratio * 100) + '%;';
// #endif
// #ifdef MP-WEIXIN
style += 'padding-top: ' + (ratio * 100) + '%;';
// #endif
// #ifdef MP-HARMONY
style += 'height: ' + (this.windowWidth * ratio) + 'px;';
// #endif
return style; return style;
} }
}, },
methods: { methods: {
// 显示视频播放弹窗 // 显示视频播放弹窗
showVideo(item) { showVideo(item) {
this.video_url = item.videoUrl; let url = item.videoUrl || '';
// 处理视频URL:完整链接直接使用,否则通过 $util.img() 转换
if (url && url.indexOf('http://') !== 0 && url.indexOf('https://') !== 0) {
url = this.$util.img(url);
}
this.video_url = url;
this.popupVideoWidth = 0; this.popupVideoWidth = 0;
this.popupVideoHeight = 0; this.popupVideoHeight = 0;
this.$refs.videoPopup.open(); this.$refs.videoPopup.open();
@@ -625,22 +609,6 @@ export default {
left: 0; left: 0;
} }
/* #ifdef MP-WEIXIN */
.adaptive-video {
position: absolute;
top: 0;
left: 0;
}
/* #endif */
/* #ifdef MP-HARMONY */
.adaptive-video {
position: static;
display: block;
box-sizing: border-box;
}
/* #endif */
.video-nav { .video-nav {
padding: 16rpx; padding: 16rpx;
box-sizing: border-box; box-sizing: border-box;

View File

@@ -11,6 +11,9 @@
:style="videoWarpCss" :style="videoWarpCss"
controls controls
preload="metadata" preload="metadata"
playsinline
webkit-playsinline
x5-playsinline
@loadedmetadata="onVideoLoaded" @loadedmetadata="onVideoLoaded"
@click="handlerClick(videoUrl)" @click="handlerClick(videoUrl)"
></video> ></video>
@@ -106,11 +109,11 @@ export default {
} }
// #ifdef H5 // #ifdef H5
style += 'padding-top: ' + (ratio * 100) + '%;'; style += 'height:0;padding-top: ' + (ratio * 100) + '%;';
// #endif // #endif
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
style += 'padding-top: ' + (ratio * 100) + '%;'; style += 'height:0;padding-top: ' + (ratio * 100) + '%;';
// #endif // #endif
// #ifdef MP-HARMONY // #ifdef MP-HARMONY

View File

@@ -9,9 +9,13 @@
<view class="video-popup-body"> <view class="video-popup-body">
<video <video
v-if="videoUrl" v-if="videoUrl"
id="popupVideoPlayer"
:src="videoUrl" :src="videoUrl"
controls controls
autoplay autoplay
playsinline
webkit-playsinline
x5-playsinline
class="video-player" class="video-player"
></video> ></video>
<view v-else class="video-error">{{ $lang('components.ns-video-player-popup.videoUrlNotExist') }}</view> <view v-else class="video-error">{{ $lang('components.ns-video-player-popup.videoUrlNotExist') }}</view>
@@ -22,6 +26,8 @@
</template> </template>
<script> <script>
import { playVideoInContext } from '@/common/js/video-helper.js';
export default { export default {
name: 'ns-video-player-popup', name: 'ns-video-player-popup',
props: { props: {
@@ -76,6 +82,10 @@ export default {
* @param {Object} e - 弹窗状态变化事件 * @param {Object} e - 弹窗状态变化事件
*/ */
onVideoPopupChange(e) { onVideoPopupChange(e) {
// H5 端弹窗显示后触发播放:避免 autoplay 被浏览器拦截 / 弹窗动画未完成被 pause() 打断
if (e && e.show) {
playVideoInContext('popupVideoPlayer', this);
}
this.$emit('popup-change', e); this.$emit('popup-change', e);
} }
} }

View File

@@ -56,10 +56,11 @@
</view> </view>
</view> </view>
<!-- 商品视频 --> <!-- 商品视频:objectFit=contain 保留原始宽高比,在固定高度的图片容器内居中播放 -->
<view class="goods-video" :class="{ show: switchMedia == 'video' }"> <view class="goods-video" :class="{ show: switchMedia == 'video' }">
<video id="goodsVideo" :src="$util.img(goodsSkuDetail.video_url)" <video id="goodsVideo" :src="$util.img(goodsSkuDetail.video_url)"
:poster="$util.img(goodsSkuDetail.sku_image, { size: 'big' })" objectFit="cover"></video> :poster="$util.img(goodsSkuDetail.sku_image, { size: 'big' })" objectFit="contain"
playsinline webkit-playsinline x5-playsinline></video>
</view> </view>
<!-- 切换视频、图片 --> <!-- 切换视频、图片 -->

View File

@@ -1,5 +1,10 @@
<template> <template>
<!-- #ifdef MP-HARMONY -->
<view :style="themeColor" class="harmony-root">
<!-- #endif -->
<!-- #ifndef MP-HARMONY -->
<view :style="themeColor"> <view :style="themeColor">
<!-- #endif -->
<!-- <!--
自绘导航栏(仅在 navigationStyle:custom 的端渲染:APP / 微信小程序 / 华为快应用 / 鸿蒙元服务) 自绘导航栏(仅在 navigationStyle:custom 的端渲染:APP / 微信小程序 / 华为快应用 / 鸿蒙元服务)
- pages.json 已为这几端开启 navigationStyle:custom,系统不再提供原生 navbar - pages.json 已为这几端开启 navigationStyle:custom,系统不再提供原生 navbar
@@ -23,6 +28,19 @@
</view> </view>
<!-- #endif --> <!-- #endif -->
<block v-if="detail"> <block v-if="detail">
<!-- 鸿蒙元服务:用原生 scroll-view 包裹表单,替代 CSS overflow 滚动(ArkUI 不识别 WebKit overflow 语义)。
根容器 harmony-root 占满 100vh 并 flex 列布局,navbar 占顶部固定高度,page flex:1 占剩余,scroll-view 在其内滚动。
提交按钮由 diy-form 内部渲染,处于 scroll-view 内,用户可滚到末尾点击。 -->
<!-- #ifdef MP-HARMONY -->
<view class="page harmony-page">
<scroll-view scroll-y="true" :show-scrollbar="false" class="form-scroll">
<view class="system-form-wrap">
<diy-form ref="form" :value="diyValue" dataMode="raw" :onSubmit="handleSubmit" />
</view>
</scroll-view>
</view>
<!-- #endif -->
<!-- #ifndef MP-HARMONY -->
<view class="page"> <view class="page">
<view class="system-form-wrap"> <view class="system-form-wrap">
<!-- 复用 diy-form:banner / tip / 表单字段 / 提交按钮 全部由其内部渲染,样式(bannerPaddingX/tipColor/submitBgColor 等)由 form_config 控制。 <!-- 复用 diy-form:banner / tip / 表单字段 / 提交按钮 全部由其内部渲染,样式(bannerPaddingX/tipColor/submitBgColor 等)由 form_config 控制。
@@ -32,6 +50,7 @@
<diy-form ref="form" :value="diyValue" dataMode="raw" :onSubmit="handleSubmit" /> <diy-form ref="form" :value="diyValue" dataMode="raw" :onSubmit="handleSubmit" />
</view> </view>
</view> </view>
<!-- #endif -->
</block> </block>
<block v-else> <block v-else>
<ns-empty :text="complete ? $lang('form.formdata.submitSuccess') : $lang('form.formdata.noFormInfo')" <ns-empty :text="complete ? $lang('form.formdata.submitSuccess') : $lang('form.formdata.noFormInfo')"
@@ -420,10 +439,49 @@ page {
background: #fff; background: #fff;
} }
.system-form-wrap { // ===== 非鸿蒙端(H5 / 微信小程序 / App):保留原有 WebKit 滚动 / 安全区处理 =====
overflow: hidden; // 鸿蒙走下方 MP-HARMONY 专属的 scroll-view 方案,不编译这些 WebKit 属性
margin: 0 0 60rpx 0; /* #ifdef H5 || MP-WEIXIN || APP-PLUS */
.page {
min-height: 100vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
box-sizing: border-box;
} }
.system-form-wrap {
overflow: visible;
margin: 0 0 60rpx 0;
padding-bottom: env(safe-area-inset-bottom, 40rpx);
}
/* #endif */
// ===== 鸿蒙元服务:用原生 scroll-view 做滚动容器 =====
// ArkUI 不识别 WebKit 的 overflow / -webkit-overflow-scrolling,必须用 scroll-view 组件(编译为 ArkUI Scroll)。
// 根容器 harmony-root 占满 100vh 并 flex 列布局,navbar 占顶部固定高度,page flex:1 占剩余空间,
// scroll-view 在 page 内 flex:1 获得确定高度后内部滚动。提交按钮由 diy-form 渲染在 scroll-view 内,可滚动到。
/* #ifdef MP-HARMONY */
.harmony-root {
height: 100vh;
display: flex;
flex-direction: column;
}
.harmony-page {
flex: 1;
min-height: 0; // 允许内容收缩,内部 scroll-view 才能拿到确定高度并正确滚动
display: flex;
flex-direction: column;
}
.form-scroll {
flex: 1;
height: 100%;
}
.system-form-wrap {
// 不再用 overflow:hidden 裁剪;提交按钮在 scroll-view 内,滚动可见
overflow: visible;
margin: 0 0 60rpx 0;
padding-bottom: 40rpx; // 鸿蒙不识别 env(safe-area-inset-bottom),固定值兜底
}
/* #endif */
// 穿透 diy-form 包装层:消除其自带的 10rpx 圆角与白色背景, // 穿透 diy-form 包装层:消除其自带的 10rpx 圆角与白色背景,
// 让 form 内容区域保持与原始 ns-newform 接入时一致的视觉 // 让 form 内容区域保持与原始 ns-newform 接入时一致的视觉