Sfoglia il codice sorgente

直播及点播优化

Signed-off-by: 李妹妹 <1639016684@qq.com>
李妹妹 1 giorno fa
parent
commit
ce0fc09e84
39 ha cambiato i file con 1226 aggiunte e 601 eliminazioni
  1. 11 0
      App.vue
  2. 5 1
      api/address.js
  3. 10 10
      api/courseLook.js
  4. 19 7
      common/request.js
  5. 1 1
      components/custom-toast.vue
  6. 3 0
      main.js
  7. 1 1
      pages/auth/loginIndex.vue
  8. 1 1
      pages/shopping/cart.vue
  9. 12 3
      pages/shopping/paymentOrder.vue
  10. 1 1
      pages/store/packageOrderPay.vue
  11. 1 1
      pages/store/storeOrderPay.vue
  12. 2 2
      pages/user/editUser.vue
  13. 2 2
      pages/user/index.vue
  14. 1 1
      pages/user/integral/integralOrderPay.vue
  15. 2 2
      pages/user/userInfo.vue
  16. 31 31
      pages_course/api/course.js
  17. 53 16
      pages_course/video.vue
  18. 3 3
      pages_course/videovip - 副本 (2).vue
  19. 72 114
      pages_course/videovip.vue
  20. 67 67
      pages_im/pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue
  21. 38 38
      pages_im/pages/conversation/chating1/components/ChatingFooter/ChatingActionBar.vue
  22. 1 0
      pages_im/pages/conversation/chating1/components/ChatingFooter/index.vue
  23. 36 15
      pages_im/pages/conversation/chating1/components/MessageItem/CustomMessageRender.vue
  24. 5 4
      pages_im/pages/conversation/conversationList/index.nvue
  25. 1 3
      pages_live/living - 副本.nvue
  26. 304 79
      pages_live/living.vue
  27. 1 1
      pages_live/shopping/confirmCreateOrder.vue
  28. 3 2
      pages_live/shopping/goods.vue
  29. 8 4
      pages_live/shopping/paymentOrder.vue
  30. 31 31
      pages_mall/api/course.js
  31. 1 1
      pages_mall/my.vue
  32. 2 2
      pages_mall/paymentOrder.vue
  33. 21 1
      pages_user/user/addAddress.vue
  34. 103 71
      pages_user/user/refundOrder.vue
  35. 2 2
      pages_user/user/refundOrderList.vue
  36. 105 78
      pages_user/user/refundOrderProduct.vue
  37. 2 4
      pages_user/user/storeOrder.vue
  38. 1 1
      store/modules/conversation.js
  39. 263 0
      utils/maOpenIdInterceptor.js

+ 11 - 0
App.vue

@@ -86,6 +86,11 @@
 	import {
 	import {
 		updateMsgDot
 		updateMsgDot
 	} from '@/utils/common.js';
 	} from '@/utils/common.js';
+	// import {
+	// 	initMaOpenIdNavigationInterceptor,
+	// 	refreshUserInfoAfterBind,
+	// 	checkMaOpenIdBind
+	// } from '@/utils/maOpenIdInterceptor.js';
 	import {
 	import {
 		getImAdminToken
 		getImAdminToken
 	} from '@/pages_im/api/imApi';
 	} from '@/pages_im/api/imApi';
@@ -108,6 +113,7 @@
 			kfurl: 'https://work.weixin.qq.com/kfid/kfc3731c5008ebd8906', //企业微信客服链接
 			kfurl: 'https://work.weixin.qq.com/kfid/kfc3731c5008ebd8906', //企业微信客服链接
 			corpId: 'ww70ac72e824957fc9', //客服企业id
 			corpId: 'ww70ac72e824957fc9', //客服企业id
 			miniprogamId: 'gh_b51445318864',
 			miniprogamId: 'gh_b51445318864',
+			bindMiniProgramPath: '/pages/auth/bindApp',
 			shareCorpId: '', // 分享企业id
 			shareCorpId: '', // 分享企业id
 			shareSchema: "", // 应用跳转标识,显示在具体应用下的 Schema字段
 			shareSchema: "", // 应用跳转标识,显示在具体应用下的 Schema字段
 			shareAgentid: "", // 企业微信管理后台 应用唯一标识。显示在具体应用下的 AgentId字段
 			shareAgentid: "", // 企业微信管理后台 应用唯一标识。显示在具体应用下的 AgentId字段
@@ -118,6 +124,7 @@
 			activityId: 1,
 			activityId: 1,
 		},
 		},
 		onLaunch: function(options) {
 		onLaunch: function(options) {
+			//initMaOpenIdNavigationInterceptor();
 			uni.getClipboardData({
 			uni.getClipboardData({
 				success: (res) => {
 				success: (res) => {
 					const resutl = this.getUrlParam(res.data, 'android_schema')
 					const resutl = this.getUrlParam(res.data, 'android_schema')
@@ -159,6 +166,9 @@
 			this.initOpenIm();
 			this.initOpenIm();
 			if (this.$isLogin()) {
 			if (this.$isLogin()) {
 				uni.setStorageSync("onLaunch", 1);
 				uni.setStorageSync("onLaunch", 1);
+				// setTimeout(() => {
+				// 	checkMaOpenIdBind();
+				// }, 800);
 				//this.getClipboardData();
 				//this.getClipboardData();
 			}
 			}
 			let that = this;
 			let that = this;
@@ -194,6 +204,7 @@
 			this.geth5Path();
 			this.geth5Path();
 			var that = this;
 			var that = this;
 			if (that.$isLogin()) {
 			if (that.$isLogin()) {
+				//refreshUserInfoAfterBind();
 				//that.$getRegistrationID('update');
 				//that.$getRegistrationID('update');
 			}
 			}
 			// #ifdef APP-PLUS
 			// #ifdef APP-PLUS

+ 5 - 1
api/address.js

@@ -12,7 +12,7 @@ let request = new Request().http
  }
  }
 
 
  export function getAddressById(data) {
  export function getAddressById(data) {
- 	 return request('/app/address/getAddressById',data,'GET');
+ 	 return request('/store/app/address/getAddressById',data,'GET');
  } 
  } 
  
  
  export function addAddress(data) {
  export function addAddress(data) {
@@ -34,4 +34,8 @@ let request = new Request().http
  	return request('/store/app/address/delAllAddress',data,'POST','application/json;charset=UTF-8');
  	return request('/store/app/address/delAllAddress',data,'POST','application/json;charset=UTF-8');
  }
  }
  
  
+ //查询地址
+ export function getCityId(data) {
+ 	 return request('/app/city/process',data,'GET');
+ }
  
  

+ 10 - 10
api/courseLook.js

@@ -8,44 +8,44 @@ let request = new Request().http
  }
  }
 // 播放错误上报
 // 播放错误上报
 export function getErrMsg(data) {
 export function getErrMsg(data) {
-	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://userapp.klbycp.com');
 }
 }
 // h5课程简介
 // h5课程简介
 export function getH5CourseByVideoId(data) {
 export function getH5CourseByVideoId(data) {
-	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 // h5课程详情加问答
 // h5课程详情加问答
 export function getH5CourseVideoDetails(data) {
 export function getH5CourseVideoDetails(data) {
-	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 // 答题发红包
 // 答题发红包
 export function courseAnswer(data) {
 export function courseAnswer(data) {
-	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 // 记录看课时间(新)
 // 记录看课时间(新)
 export function getFinishCourseVideo(data) {
 export function getFinishCourseVideo(data) {
-	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 // 关注客服 是否添加客服
 // 关注客服 是否添加客服
 export function getIsAddKf(data) {
 export function getIsAddKf(data) {
-	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 // 流量(缓冲百分比)
 // 流量(缓冲百分比)
 export function getInternetTraffic(data) {
 export function getInternetTraffic(data) {
-	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 // 每十分钟获得积分
 // 每十分钟获得积分
 export function getIntegralByH5Video(data) {
 export function getIntegralByH5Video(data) {
-	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 发送奖励
 // 发送奖励
 export function sendReward(data) {
 export function sendReward(data) {
-	return request('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 // 获取真实链接
 // 获取真实链接
 export function getRealLink(data) {
 export function getRealLink(data) {
-	return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getRealLink', data, 'GET','','https://userapp.klbycp.com');
 }
 }
  //检查是否有头像以及昵称
  //检查是否有头像以及昵称
  export function checkUserInfo(data) {
  export function checkUserInfo(data) {

+ 19 - 7
common/request.js

@@ -1,9 +1,14 @@
+// import {
+// 	checkMaOpenIdForRequest
+// } from '../utils/maOpenIdInterceptor.js';
+
 // uni-app请求封装
 // uni-app请求封装
 export default class Request {
 export default class Request {
 	http(router, data = {}, method, contentType) {
 	http(router, data = {}, method, contentType) {
 		let that = this;
 		let that = this;
 		// let path2 = 'https://userapp.klbycp.com'; //百域承品
 		// let path2 = 'https://userapp.klbycp.com'; //百域承品
-	    let path = 'https://userapp.klbycp.com'; //百域承品
+	     let path = 'https://userapp.klbycp.com'; //百域承品
+		//let path = 'http://e9c6a3a9.natappfree.cc'; //百域承品 todo yhq
 	    // let path = 'http://f6b69df3.natappfree.cc'; //百域承品
 	    // let path = 'http://f6b69df3.natappfree.cc'; //百域承品
 		// let path2 = 'https://userapp.zkhj6.com';
 		// let path2 = 'https://userapp.zkhj6.com';
 		// let path = 'https://userapp.zkhj6.com';
 		// let path = 'https://userapp.zkhj6.com';
@@ -13,9 +18,9 @@ export default class Request {
 		// // #ifdef H5
 		// // #ifdef H5
 		// path = 'https://userapp.klbycp.com'; //h5接口
 		// path = 'https://userapp.klbycp.com'; //h5接口
 		// // #endif
 		// // #endif
-        if (router.indexOf("/live/liveData/like") != -1) {
-        	path = 'https://im.fhhx.runtzh.com';
-        }
+        // if (router.indexOf("/live/liveData/like") != -1) {
+        // 	path = 'https://userapp.klbycp.com';
+        // }
         // if (router.indexOf("/common") != -1) {
         // if (router.indexOf("/common") != -1) {
         // 	path = path2;
         // 	path = path2;
         // }
         // }
@@ -27,20 +32,21 @@ export default class Request {
         // if (router.indexOf("/app/order/getMergedAfterSalesList") != -1) {
         // if (router.indexOf("/app/order/getMergedAfterSalesList") != -1) {
         // 	path = path2
         // 	path = path2
         // }
         // }
+		
 		// 看课模块
 		// 看课模块
 		if (router.indexOf("/app/course/getRealLink") != -1) {
 		if (router.indexOf("/app/course/getRealLink") != -1) {
 			path = 'https://userapp.klbycp.com';
 			path = 'https://userapp.klbycp.com';
 		}
 		}
 		if(router.indexOf("/appLive") !== -1) {
 		if(router.indexOf("/appLive") !== -1) {
 			router = router.replace('/appLive','')
 			router = router.replace('/appLive','')
-			path ='https://userapp.klbycp.com';
+			// path ='https://userapp.klbycp.com';
 			// router = router.replace('/appLive','')
 			// router = router.replace('/appLive','')
 			
 			
 			// path ='http://z2fae9e9.natappfree.cc'
 			// path ='http://z2fae9e9.natappfree.cc'
 		}
 		}
 		//看课点播
 		//看课点播
 		if(router.indexOf("/course_uniapp") != -1 ) {
 		if(router.indexOf("/course_uniapp") != -1 ) {
-		    path ='https://userapp.klbycp.com';
+		    // path ='https://userapp.klbycp.com';
 			router = router.replace('/course_uniapp','')
 			router = router.replace('/course_uniapp','')
 		}
 		}
 		if(router.indexOf("/course_auto") != -1 ) {
 		if(router.indexOf("/course_auto") != -1 ) {
@@ -62,7 +68,6 @@ export default class Request {
 		if(router.indexOf("/companyapp") != -1 ) {
 		if(router.indexOf("/companyapp") != -1 ) {
 			// path = 'http://192.168.110.225:8007'
 			// path = 'http://192.168.110.225:8007'
 			// path ='https://userapp.zkhj6.com';
 			// path ='https://userapp.zkhj6.com';
-		    path ='https://userapp.klbycp.com/';
 			// router = router.replace('/companyapp','')
 			// router = router.replace('/companyapp','')
 			token = uni.getStorageSync('ManageToken');
 			token = uni.getStorageSync('ManageToken');
 		}
 		}
@@ -101,6 +106,13 @@ export default class Request {
 		// uni.showLoading({
 		// uni.showLoading({
 		// 	  title: '加载中'
 		// 	  title: '加载中'
 		// });
 		// });
+		// if (!checkMaOpenIdForRequest(router)) {
+		// 	return Promise.reject({
+		// 		code: -2,
+		// 		msg: '请先绑定小程序'
+		// 	});
+		// }
+
 		return new Promise((resolve, reject) => {
 		return new Promise((resolve, reject) => {
 			//let liveToken = uni.getStorageSync('liveToken');
 			//let liveToken = uni.getStorageSync('liveToken');
 			///console.log('indexlogin)))))))))))',uni.getStorageSync('liveToken'))
 			///console.log('indexlogin)))))))))))',uni.getStorageSync('liveToken'))

+ 1 - 1
components/custom-toast.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-  <view class="custom-toast" v-if="visible">
+  <view class="custom-toast" :style="{ opacity: visible ? 1 : 0, pointerEvents: visible ? 'auto' : 'none' }">
     {{ message }}
     {{ message }}
   </view>
   </view>
 </template>
 </template>

+ 3 - 0
main.js

@@ -9,6 +9,7 @@ import uView from "@/node_modules/uview-ui";
 import {parseIDCardInfo,logout,checkCompanyUserLoginState,parseText,getDictLabelName,parseIdCard,getAge,parsePhone,isEmpty,getDict,
 import {parseIDCardInfo,logout,checkCompanyUserLoginState,parseText,getDictLabelName,parseIdCard,getAge,parsePhone,isEmpty,getDict,
 isLogin,navBack,navTo,getUserInfo,formatHour,dateFormatStr,registerIdCode,updateMsgDot,handleBindCompanyFsUser,
 isLogin,navBack,navTo,getUserInfo,formatHour,dateFormatStr,registerIdCode,updateMsgDot,handleBindCompanyFsUser,
 setSource,companyUserIsLogin,checkWechatInstalled,isIos,isAndroid,isAgreePrivacy,getDictLabel2Name,urlToObj,loginOut,formattedViewCount} from './utils/common.js'
 setSource,companyUserIsLogin,checkWechatInstalled,isIos,isAndroid,isAgreePrivacy,getDictLabel2Name,urlToObj,loginOut,formattedViewCount} from './utils/common.js'
+import { checkMaOpenIdBind, launchBindMiniProgram } from './utils/maOpenIdInterceptor.js'
 
 
 import { showLoginPage,getRegistrationID } from './utils/login.js'
 import { showLoginPage,getRegistrationID } from './utils/login.js'
 import { formatSeconds,formatDate } from './utils/tools.js'
 import { formatSeconds,formatDate } from './utils/tools.js'
@@ -60,6 +61,8 @@ Vue.prototype.$companyUserIsLogin = companyUserIsLogin;
 Vue.prototype.$checkWechatInstalled = checkWechatInstalled;
 Vue.prototype.$checkWechatInstalled = checkWechatInstalled;
 Vue.prototype.$isIos = isIos;
 Vue.prototype.$isIos = isIos;
 Vue.prototype.$isAndroid = isAndroid;
 Vue.prototype.$isAndroid = isAndroid;
+Vue.prototype.$checkMaOpenIdBind = checkMaOpenIdBind;
+Vue.prototype.$launchBindMiniProgram = launchBindMiniProgram;
 
 
 const app = new Vue({
 const app = new Vue({
   store,	
   store,	

+ 1 - 1
pages/auth/loginIndex.vue

@@ -28,7 +28,7 @@
 			<button class="login-btn other-login-btn" :loading="btnLoading" :disabled="btnLoading"
 			<button class="login-btn other-login-btn" :loading="btnLoading" :disabled="btnLoading"
 				@click="submit()">手机号一键登录</button>
 				@click="submit()">手机号一键登录</button>
 
 
-			<button class="login-btn other-login-btn" :disabled="btnLoading" @tap="handleOtherLogin">其他方式登录</button>
+			<!-- <button class="login-btn other-login-btn" :disabled="btnLoading" @tap="handleOtherLogin">其他方式登录</button> -->
 			<view class="checkbox">
 			<view class="checkbox">
 				<view class="checkbox-icon" @tap="handleAgree">
 				<view class="checkbox-icon" @tap="handleAgree">
 					<image src="../../static/image/login/radio_default.png" v-show="!agree"></image>
 					<image src="../../static/image/login/radio_default.png" v-show="!agree"></image>

+ 1 - 1
pages/shopping/cart.vue

@@ -73,7 +73,7 @@
 <script>
 <script>
 	import {getCarts,cartNum,delCart,checkCartPurchaseLimit} from '@/api/product'
 	import {getCarts,cartNum,delCart,checkCartPurchaseLimit} from '@/api/product'
 	import likeProduct from '@/components/likeProduct.vue'
 	import likeProduct from '@/components/likeProduct.vue'
-  import {CustomToast} from '@/components/custom-toast.vue';
+  import CustomToast from '@/components/custom-toast.vue';
 	export default {
 	export default {
 		components: {
 		components: {
 			likeProduct,CustomToast
 			likeProduct,CustomToast

+ 12 - 3
pages/shopping/paymentOrder.vue

@@ -66,7 +66,7 @@
 
 
 		</view>
 		</view>
 		<uni-popup ref="popTip" type="dialog">
 		<uni-popup ref="popTip" type="dialog">
-			<uni-popup-dialog cancelText="支付失败" confirmText="支付成功" mode="base" content="是否已支付成功?" title="提示" :duration="2000" :before-close="true" @close="closeTip" @confirm="confirmTip"></uni-popup-dialog>
+			<uni-popup-dialog cancelText="支付失败" confirmText="支付成功" mode="base" content="是否已支付成功?" title="提示" :duration="2000" :before-close="true" @close="confirmTip" @confirm="confirmTip"></uni-popup-dialog>
 		</uni-popup>
 		</uni-popup>
 		<view class="btn-box">
 		<view class="btn-box">
 			<view class="btn" @click="payOrder()">去支付</view>
 			<view class="btn" @click="payOrder()">去支付</view>
@@ -106,12 +106,16 @@
 				payParams: null,
 				payParams: null,
 				userinfo: {},
 				userinfo: {},
 				isPaying: false, // 防止重复支付
 				isPaying: false, // 防止重复支付
-				payDebounceTimer: null // 防抖定时器
+				payDebounceTimer: null,// 防抖定时器
+				type:''
 			}
 			}
 		},
 		},
 		onLoad(option) {
 		onLoad(option) {
 			//this.getSafeUserInfo();
 			//this.getSafeUserInfo();
 			this.orderId = option.orderId;
 			this.orderId = option.orderId;
+			if(option.type){
+				this.type=option.type
+			}
 			// this.orderBindUser(this.orderId)
 			// this.orderBindUser(this.orderId)
 			this.getStoreOrderById();
 			this.getStoreOrderById();
 			//this.getStoreConfig();
 			//this.getStoreConfig();
@@ -119,11 +123,16 @@
 		},
 		},
 		onShow() {
 		onShow() {
 			this.getUserInfo();
 			this.getUserInfo();
+			this.checkPayResult();
 		},
 		},
 		onUnload() {
 		onUnload() {
 			this.clearPayTypeFun()
 			this.clearPayTypeFun()
 		},
 		},
 		methods: {
 		methods: {
+			checkPayResult() {
+			  // 弹窗在这里弹出!
+			  this.$refs.popTip.open();
+			},
 			closeTip(){
 			closeTip(){
 				this.$refs.popTip.close()
 				this.$refs.popTip.close()
 			},
 			},
@@ -377,7 +386,7 @@
 					if(sweixin){
 					if(sweixin){
 						console.log('调起小程序')
 						console.log('调起小程序')
 						// that.$refs.popPayType.close()
 						// that.$refs.popPayType.close()
-						that.$refs.popTip.open()
+						//that.$refs.popTip.open()
 						//唤起微信跳转小程序
 						//唤起微信跳转小程序
 						sweixin.launchMiniProgram({
 						sweixin.launchMiniProgram({
 							id:"gh_b51445318864",//gh_7a6a32e5ef61 御君方互医
 							id:"gh_b51445318864",//gh_7a6a32e5ef61 御君方互医

+ 1 - 1
pages/store/packageOrderPay.vue

@@ -439,7 +439,7 @@
 			},
 			},
 			openAddress(){
 			openAddress(){
 				uni.navigateTo({
 				uni.navigateTo({
-					url: '/pages/user/address'
+					url: '/pages_user/user/address'
 				});
 				});
 			},
 			},
 			closeTip(){
 			closeTip(){

+ 1 - 1
pages/store/storeOrderPay.vue

@@ -302,7 +302,7 @@
 			},
 			},
 			openAddress(){
 			openAddress(){
 				uni.navigateTo({
 				uni.navigateTo({
-					url: '/pages/user/address'
+					url: '/pages_user/user/address'
 				})
 				})
 			},
 			},
 			closeTip(){
 			closeTip(){

+ 2 - 2
pages/user/editUser.vue

@@ -13,7 +13,7 @@
 					<input type="text" v-model="nickName" placeholder="请输入姓名" class="input" />
 					<input type="text" v-model="nickName" placeholder="请输入姓名" class="input" />
 				</view>
 				</view>
 			</view>
 			</view>
-			<view class="info-item">
+			<!-- <view class="info-item">
 				<view class="label">性别</view>
 				<view class="label">性别</view>
 				<view class="right x-end" style="width:80%;height: 40px;justify-content: end;">
 				<view class="right x-end" style="width:80%;height: 40px;justify-content: end;">
 					<picker style="width: 100%;text-align: right;" @change="pickerSex" :value="sex" :range="sexPicker">
 					<picker style="width: 100%;text-align: right;" @change="pickerSex" :value="sex" :range="sexPicker">
@@ -22,7 +22,7 @@
 						</view>
 						</view>
 					</picker>
 					</picker>
 				</view>
 				</view>
-			</view>
+			</view> -->
 			<!-- <view class="info-item">
 			<!-- <view class="info-item">
 				<view class="label">手机号</view>
 				<view class="label">手机号</view>
 				<view class="right">
 				<view class="right">

+ 2 - 2
pages/user/index.vue

@@ -276,7 +276,7 @@
 					menus: [{
 					menus: [{
 							name: '地址管理',
 							name: '地址管理',
 							icon: "/static/image/my/address_management_icon.png",
 							icon: "/static/image/my/address_management_icon.png",
-							pageUrl: "/pages/user/address"
+							pageUrl: "/pages_user/user/address"
 						},
 						},
 						{
 						{
 							name: '优惠券',
 							name: '优惠券',
@@ -379,7 +379,7 @@
 				const menus = [{
 				const menus = [{
 						name: '收货地址',
 						name: '收货地址',
 						icon: '/static/image/my/address_management_icon.png',
 						icon: '/static/image/my/address_management_icon.png',
-						url: '/pages/user/address'
+						url: '/pages_user/user/address'
 					},
 					},
 					{
 					{
 						name: '积分商城',
 						name: '积分商城',

+ 1 - 1
pages/user/integral/integralOrderPay.vue

@@ -133,7 +133,7 @@
 			},
 			},
 			openAddress(){
 			openAddress(){
 				uni.navigateTo({
 				uni.navigateTo({
-					url: '/pages/user/address'
+					url: '/pages_user/user/address'
 				})
 				})
 			},
 			},
 			payOrder(){
 			payOrder(){

+ 2 - 2
pages/user/userInfo.vue

@@ -29,14 +29,14 @@
 				<!-- </view> -->
 				<!-- </view> -->
 				<!-- <image class="img" src="/static/images/icon_phone_left.png" mode="aspectFill"  ></image> -->
 				<!-- <image class="img" src="/static/images/icon_phone_left.png" mode="aspectFill"  ></image> -->
 			</view>
 			</view>
-			<view class="item">
+		<!-- 	<view class="item">
 				<text class="label">性别</text>
 				<text class="label">性别</text>
 				<text class="text">{{sex}}</text>
 				<text class="text">{{sex}}</text>
 			</view>
 			</view>
 			<view class="item">
 			<view class="item">
 				<text class="label">邮箱</text>
 				<text class="label">邮箱</text>
 				<text class="text">{{email}}</text>
 				<text class="text">{{email}}</text>
-			</view>
+			</view> -->
 
 
 		</view>
 		</view>
 	</view>
 	</view>

+ 31 - 31
pages_course/api/course.js

@@ -2,27 +2,27 @@ import Request from '@/common/request.js';
 let request = new Request().http
 let request = new Request().http
 
 
 export function loginByMp(data) {
 export function loginByMp(data) {
- 	 return request('/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	 return request('/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
 
 
 // 获取真实链接
 // 获取真实链接
 export function getRealLink(data) {
 export function getRealLink(data) {
-	return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getRealLink', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
 // h5课程简介
 // h5课程简介
 export function getH5CourseByVideoId(data) {
 export function getH5CourseByVideoId(data) {
-	return request('/app/course/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getH5CourseByVideoId', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
 // h5课程详情加问答
 // h5课程详情加问答
 export function getH5CourseVideoDetails(data) {
 export function getH5CourseVideoDetails(data) {
-	return request('/app/course/getH5CourseVideoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getH5CourseVideoDetails', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
 // 答题发红包
 // 答题发红包
 export function courseAnswer(data) {
 export function courseAnswer(data) {
-	return request('/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // // 记录看课时间(旧)
 // // 记录看课时间(旧)
@@ -32,95 +32,95 @@ export function courseAnswer(data) {
 
 
 // 记录看课时间(新)
 // 记录看课时间(新)
 export function getFinishCourseVideo(data) {
 export function getFinishCourseVideo(data) {
-	return request('/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 关注客服
 // 关注客服
 export function getIsAddKf(data) {
 export function getIsAddKf(data) {
-	return request('/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 流量(缓冲百分比)
 // 流量(缓冲百分比)
 export function internetTraffic(data) {
 export function internetTraffic(data) {
-	return request('/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 每十分钟获得福币
 // 每十分钟获得福币
 export function getIntegralByH5Video(data) {
 export function getIntegralByH5Video(data) {
-	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 发送奖励
 // 发送奖励
 export function sendReward(data) {
 export function sendReward(data) {
-	return request('/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 播放错误上报
 // 播放错误上报
 export function getErrMsg(data) {
 export function getErrMsg(data) {
-	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://userapp.klbycp.com');
 }
 }
 
 
 
 
 // 获取getWxConfig
 // 获取getWxConfig
 export function getWxConfig(data) {
 export function getWxConfig(data) {
-	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
  //获取弹幕列表
  //获取弹幕列表
  export function getDanmuList(videoId) {
  export function getDanmuList(videoId) {
- 	 return request('/barrage/barrage/list/'+videoId,null,'GET','','https://h5api.his.cdwjyyh.com');
+ 	 return request('/barrage/barrage/list/'+videoId,null,'GET','','https://userapp.klbycp.com');
  }
  }
  
  
  // 保存评论数据
  // 保存评论数据
  export function saveMsg(data, type) {
  export function saveMsg(data, type) {
- 	return request('/app/course/saveMsg', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/saveMsg', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
  
  
  // 撤销评论
  // 撤销评论
  export function revokeMsg(data, type) {
  export function revokeMsg(data, type) {
- 	return request('/app/course/revokeMsg', data, 'PUT', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/revokeMsg', data, 'PUT', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
  
  
  // 获取历史评论数据
  // 获取历史评论数据
  export function getComments(data, type) {
  export function getComments(data, type) {
- 	return request('/app/course/getComments', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/getComments', data, 'GET','','https://userapp.klbycp.com');
  }
  }
  
  
  // 错误日志未知异常,请联系管理员
  // 错误日志未知异常,请联系管理员
  export function errorLogUpload(data, type) {
  export function errorLogUpload(data, type) {
- 	return request('/app/common/errorLogUpload', data, 'POST','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/common/errorLogUpload', data, 'POST','','https://userapp.klbycp.com');
  }
  }
  
  
  export function getTypeTree(data, type) {
  export function getTypeTree(data, type) {
- 	return request('/app/user/complaint/getTypeTree', null, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/user/complaint/getTypeTree', null, 'GET','','https://userapp.klbycp.com');
  }
  }
  export function complaintRecord(data, type) {
  export function complaintRecord(data, type) {
- 	return request('/app/user/complaint/record', data, 'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/user/complaint/record', data, 'POST','application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
  
  
  
  
  export function loginSaleByMp(data) {
  export function loginSaleByMp(data) {
-  	 return request('/app/wx/courseLogin2',data,'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+  	 return request('/app/wx/courseLogin2',data,'POST','application/json;charset=UTF-8','https://userapp.klbycp.com');
   }
   }
  
  
  // 获取真实链接
  // 获取真实链接
  export function getSaleRealLink(data) {
  export function getSaleRealLink(data) {
- 	return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/getRealLink', data, 'GET','','https://userapp.klbycp.com');
  }
  }
  
  
  // h5课程简介
  // h5课程简介
  // export function getH5CourseByVideoId(data) {
  // export function getH5CourseByVideoId(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://userapp.klbycp.com');
  // }
  // }
  
  
  // h5课程详情加问答
  // h5课程详情加问答
  // export function getH5CourseVideoDetails(data) {
  // export function getH5CourseVideoDetails(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://userapp.klbycp.com');
  // }
  // }
  
  
  // 答题发红包
  // 答题发红包
  // export function courseAnswer(data) {
  // export function courseAnswer(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 记录看课时间(旧)
  // // 记录看课时间(旧)
@@ -130,38 +130,38 @@ export function getWxConfig(data) {
  
  
  // 记录看课时间(新)
  // 记录看课时间(新)
  // export function getFinishCourseVideo(data) {
  // export function getFinishCourseVideo(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 关注客服 是否添加客服
  // // 关注客服 是否添加客服
  // export function getIsAddKf(data) {
  // export function getIsAddKf(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 流量(缓冲百分比)
  // // 流量(缓冲百分比)
  // export function getInternetTraffic(data) {
  // export function getInternetTraffic(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 每十分钟获得福币
  // // 每十分钟获得福币
  // export function getIntegralByH5Video(data) {
  // export function getIntegralByH5Video(data) {
- // 	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 发送奖励
  // // 发送奖励
  // export function sendReward(data) {
  // export function sendReward(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 播放错误上报
  // // 播放错误上报
  // export function getErrMsg(data) {
  // export function getErrMsg(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://userapp.klbycp.com');
  // }
  // }
  
  
  
  
  // 获取getWxConfig
  // 获取getWxConfig
  export function getSaleWxConfig(data) {
  export function getSaleWxConfig(data) {
- 	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://userapp.klbycp.com');
  }
  }
  
  
   //微信小程序登录
   //微信小程序登录

+ 53 - 16
pages_course/video.vue

@@ -117,7 +117,7 @@
 				</view>
 				</view>
 				<view
 				<view
 					class="goods-cover videovip-video-overlay"
 					class="goods-cover videovip-video-overlay"
-					v-if="isFull && cardPopup && currentCardItem"
+					v-if="isFull && showCardPopup"
 					@tap.stop="goBuy(currentCardItem)"
 					@tap.stop="goBuy(currentCardItem)"
 				>
 				>
 					<view class="goods-cover-hot" v-if="hasHotSaleTag(currentCardItem) && getProductHotCount(currentCardItem) > 0">
 					<view class="goods-cover-hot" v-if="hasHotSaleTag(currentCardItem) && getProductHotCount(currentCardItem) > 0">
@@ -156,7 +156,7 @@
 			</view>
 			</view>
 		</view>
 		</view>
 		<!-- 商品卡片弹窗 -->
 		<!-- 商品卡片弹窗 -->
-		<view class="goods-card" :style="{'bottom':isShu?'280rpx':'220rpx'}" v-if="!isFull&&cardPopup && currentCardItem" @click.stop="goBuy(currentCardItem)">
+		<view class="goods-card" :style="{'bottom':isShu?'280rpx':'220rpx'}" v-if="!isFull&&showCardPopup" @click.stop="goBuy(currentCardItem)">
 			<view class="close-box" @click.stop="closeCardPopup">
 			<view class="close-box" @click.stop="closeCardPopup">
 				<image src="/static/images/course/close.png"></image>
 				<image src="/static/images/course/close.png"></image>
 			</view>
 			</view>
@@ -727,7 +727,6 @@
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
-		<ykscreenRecord></ykscreenRecord>
 		<courseExpiration v-if="showExpiration" :code="resCode" :msg="resMsg" :qrcode="qrcode"
 		<courseExpiration v-if="showExpiration" :code="resCode" :msg="resMsg" :qrcode="qrcode"
 		:userId="user && user.userId ? user.userId : ''"></courseExpiration>
 		:userId="user && user.userId ? user.userId : ''"></courseExpiration>
 	</view>
 	</view>
@@ -742,7 +741,6 @@
 	import { hasHotSaleTag, getProductHotKey, clampHotSaleCount } from './utils/productHotSale.js'
 	import { hasHotSaleTag, getProductHotKey, clampHotSaleCount } from './utils/productHotSale.js'
 	import {generateRandomString} from './utils/courseTool.js'
 	import {generateRandomString} from './utils/courseTool.js'
 	import { buildFakeOrderPool } from './utils/videovipFakeMarquee.js'
 	import { buildFakeOrderPool } from './utils/videovipFakeMarquee.js'
-	import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	import courseExpiration from './components/courseExpiration.vue'
 	import courseExpiration from './components/courseExpiration.vue'
 	import FeaturedCommentXgPlayer from './components/FeaturedCommentXgPlayer.vue'
 	import FeaturedCommentXgPlayer from './components/FeaturedCommentXgPlayer.vue'
 	import dayjs from 'dayjs';
 	import dayjs from 'dayjs';
@@ -775,7 +773,6 @@
 			commentBox,
 			commentBox,
 			ques,
 			ques,
 			goodsList,
 			goodsList,
-			ykscreenRecord,
 			courseExpiration,
 			courseExpiration,
 			FeaturedCommentXgPlayer
 			FeaturedCommentXgPlayer
 		},
 		},
@@ -1137,6 +1134,15 @@
 			isTripleMarqueeMode() {
 			isTripleMarqueeMode() {
 				return !!(this.isShu || this.isFull)
 				return !!(this.isShu || this.isFull)
 			},
 			},
+			/** 精选留言输入框弹键盘时暂时隐藏商品卡片,收起后按 cardPopup 逻辑恢复 */
+			showCardPopup() {
+				if (!this.cardPopup || !this.currentCardItem) return false
+				if (
+					this.featuredCommentComposerActive &&
+					(this.featuredCommentKeyboardBottomPx > 0 || this.featuredCommentInputFocused)
+				) return false
+				return true
+			},
 			videovipVideoConfig() {
 			videovipVideoConfig() {
 				const allowSeek = this.videolinkType == 1 || this.isFinish == 1 || this.isEnded
 				const allowSeek = this.videolinkType == 1 || this.isFinish == 1 || this.isEnded
 				return {
 				return {
@@ -1836,6 +1842,10 @@
 				const wasShu = this.isShu
 				const wasShu = this.isShu
 				this.isShu=!this.isShu
 				this.isShu=!this.isShu
 				if (wasShu && this.showTabFeaturedComments) this.tabIndex = 0
 				if (wasShu && this.showTabFeaturedComments) this.tabIndex = 0
+				// 竖屏课经 openList 切布局后,需重置播放器 CSS 全屏态,否则再次点 f 只会触发退出事件
+				if (this.displayType === 'portrait') {
+					this._xgExitFullscreen()
+				}
 			},
 			},
 			/** 有精选留言时默认 tabIndex=0,否则落到第一个可见 Tab */
 			/** 有精选留言时默认 tabIndex=0,否则落到第一个可见 Tab */
 			_selectDefaultRatingTab() {
 			_selectDefaultRatingTab() {
@@ -3861,7 +3871,18 @@
 				} catch (e) {}
 				} catch (e) {}
 				this.player = null;
 				this.player = null;
 			},
 			},
+			_resetPortraitCssFullscreen() {
+				if (!this.player) return;
+				try {
+					this.player.exitCssFullscreen();
+				} catch (e) {}
+				this.isFullscreen = false;
+			},
 			_resizePlayerLayout() {
 			_resizePlayerLayout() {
+				const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
+				if (portrait) {
+					this._resetPortraitCssFullscreen();
+				}
 				const run = () => {
 				const run = () => {
 					if (!this.player) return;
 					if (!this.player) return;
 					try {
 					try {
@@ -4037,14 +4058,23 @@
 					this._notifyFullscreenToVue(isFullscreen);
 					this._notifyFullscreenToVue(isFullscreen);
 				});
 				});
 				this.player.on(Events.CSS_FULLSCREEN_CHANGE, (isFullscreen) => {
 				this.player.on(Events.CSS_FULLSCREEN_CHANGE, (isFullscreen) => {
+					const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
+					if (portrait) {
+						// 竖屏课:f 键仅切换页面布局,进入 CSS 全屏后立即退出,避免与 openList 切布局后状态不同步
+						if (isFullscreen) {
+							this.isCSSFull = true;
+							this._resetPortraitCssFullscreen();
+							this._notifyFullscreenToVue(true);
+						} else {
+							this._resetPortraitCssFullscreen();
+						}
+						return;
+					}
 					if (this.isFullscreen == isFullscreen) return;
 					if (this.isFullscreen == isFullscreen) return;
 					this.isCSSFull = true;
 					this.isCSSFull = true;
 					this.isFullscreen = isFullscreen;
 					this.isFullscreen = isFullscreen;
-					const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
-					if (!portrait) {
-						this._applyVideoFillMode(isFullscreen);
-						this._syncAppOrientationForFullscreen(isFullscreen);
-					}
+					this._applyVideoFillMode(isFullscreen);
+					this._syncAppOrientationForFullscreen(isFullscreen);
 					this._notifyFullscreenToVue(isFullscreen);
 					this._notifyFullscreenToVue(isFullscreen);
 				});
 				});
 			},
 			},
@@ -4065,14 +4095,21 @@
 				} catch (e) {}
 				} catch (e) {}
 			},
 			},
 			handleExitFullscreen(newValue) {
 			handleExitFullscreen(newValue) {
-				if (this.player && this.isFullscreen && newValue && String(newValue).indexOf('yes') > -1) {
-					if (this.isCSSFull) {
-						this.player.exitCssFullscreen();
-					} else {
-						this.player.exitFullscreen();
-					}
+				if (!this.player || !newValue || String(newValue).indexOf('yes') === -1) return;
+				const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
+				if (portrait) {
+					this._resetPortraitCssFullscreen();
 					this._syncAppOrientationForFullscreen(false);
 					this._syncAppOrientationForFullscreen(false);
+					return;
+				}
+				if (!this.isFullscreen) return;
+				if (this.isCSSFull) {
+					this.player.exitCssFullscreen();
+				} else {
+					this.player.exitFullscreen();
 				}
 				}
+				this.isFullscreen = false;
+				this._syncAppOrientationForFullscreen(false);
 			},
 			},
 			changeVideo(newValue, oldValue, ownerInstance) {
 			changeVideo(newValue, oldValue, ownerInstance) {
 				if (!newValue) return;
 				if (!newValue) return;

+ 3 - 3
pages_course/videovip - 副本 (2).vue

@@ -561,7 +561,7 @@
 		</view>
 		</view>
 		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
 		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
 			:loading-text="loadingtext"></u-loading-page>
 			:loading-text="loadingtext"></u-loading-page>
-		<ykscreenRecord></ykscreenRecord>
+		<!-- <ykscreenRecord></ykscreenRecord> -->
 		<template v-if="tabIndex==0 && showTabFeaturedComments && !(showTabReviewPoints && isShu)">
 		<template v-if="tabIndex==0 && showTabFeaturedComments && !(showTabReviewPoints && isShu)">
 			<view
 			<view
 				v-if="featuredCommentComposerActive"
 				v-if="featuredCommentComposerActive"
@@ -699,7 +699,7 @@
 	import {
 	import {
 		mapGetters
 		mapGetters
 	} from 'vuex';
 	} from 'vuex';
-	import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
+	//import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	import courseExpiration from './components/courseExpiration.vue'
 	import courseExpiration from './components/courseExpiration.vue'
 	import {
 	import {
 		getErrMsg,
 		getErrMsg,
@@ -720,7 +720,7 @@
 	} from "@/api/user.js"
 	} from "@/api/user.js"
 	export default {
 	export default {
 		components: {
 		components: {
-			ykscreenRecord,
+			//ykscreenRecord,
 			courseExpiration,
 			courseExpiration,
 			goodsList
 			goodsList
 		},
 		},

+ 72 - 114
pages_course/videovip.vue

@@ -1,10 +1,5 @@
 <template>
 <template>
 	<view class="content ">
 	<view class="content ">
-		<!-- <view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}"> -->
-		<!-- <u-icon name="arrow-left" size="28" @click="tosales" v-if="appToken"></u-icon> -->
-		<!-- <view class="header-title" :style="{width:menuButtonLeft + 'px',height:menuButtonH+'px',lineHeight:menuButtonH+'px'}">{{courseInfo.title}}</view>
-		</view> -->
-		
 		<view class="notice-box" v-if="isLogin&&isAddKf==1">
 		<view class="notice-box" v-if="isLogin&&isAddKf==1">
 			
 			
 			<view class="notice-marquee-wrap">
 			<view class="notice-marquee-wrap">
@@ -112,7 +107,7 @@
 				</view>
 				</view>
 				<view
 				<view
 					class="goods-cover videovip-video-overlay"
 					class="goods-cover videovip-video-overlay"
-					v-if="isFull && cardPopup && currentCardItem"
+					v-if="isFull && showCardPopup"
 					@tap.stop="goBuy(currentCardItem)"
 					@tap.stop="goBuy(currentCardItem)"
 				>
 				>
 					<view class="goods-cover-hot" v-if="hasHotSaleTag(currentCardItem) && getProductHotCount(currentCardItem) > 0">
 					<view class="goods-cover-hot" v-if="hasHotSaleTag(currentCardItem) && getProductHotCount(currentCardItem) > 0">
@@ -151,7 +146,7 @@
 			</view>
 			</view>
 		</view>
 		</view>
 		<!-- 商品卡片弹窗 -->
 		<!-- 商品卡片弹窗 -->
-		<view class="goods-card" :style="{'bottom':isShu?'280rpx':'220rpx'}" v-if="!isFull&&cardPopup && currentCardItem" @click.stop="goBuy(currentCardItem)">
+		<view class="goods-card" :style="{'bottom':isShu?'280rpx':'220rpx'}" v-if="!isFull&&showCardPopup" @click.stop="goBuy(currentCardItem)">
 			<view class="close-box" @click.stop="closeCardPopup">
 			<view class="close-box" @click.stop="closeCardPopup">
 				<image src="/static/images/course/close.png"></image>
 				<image src="/static/images/course/close.png"></image>
 			</view>
 			</view>
@@ -178,62 +173,6 @@
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
-		<!-- <view v-if="remainTime > 0" class="progress-countdown end">
-			<view class="progress-title">完课积分</view>
-			<view class="progress-bar-bg">
-				<view class="progress-bar-fill" :style="{ width: countdownPercentage + '%' }"></view>
-			</view>
-			<view class="progress-text">
-				<text style="font-size: 24rpx;line-height: 40rpx;">倒计时</text>{{ formattedCountdown.hours||'00' }}:{{ formattedCountdown.minutes||'00' }}:{{ formattedCountdown.seconds||"00" }}
-			</view>
-		</view> -->
-		<!-- <view class="justify-start align-center fs24 base-color-9" v-if="userInfo.userId">
-			<view>{{nameuser?nameuser:'暂未授权昵称'}}#</view>
-			<view>{{userInfo.userId}}</view>
-		</view> -->
-		<!-- <view class="title-content" id="title-content"> -->
-			<!-- 答题时展示小节课程名,其他展示课程名 -->
-			<!-- 小节课程名 -->
-			<!-- <view class="subtitlebox " v-if="isLogin&&isAddKf==1">
-				{{courseInfo.title}}
-			</view> -->
-			<!-- 课程名字 -->
-			<!-- <view class="miantitlebox" v-else>
-				{{courseInfo.courseName}}
-			</view> -->
-		<!-- </view> -->
-		<!-- <scroll-view  style="display:none;"  v-show="!isShu" class="scroll-view" :style="{height: height}" :scroll-top="scrollTop" scroll-y="true"> -->
-			<!-- 无效或者已过期 -->
-			<!-- <view class="nocourse" v-if="msg">
-				<image :src="imgPath+'/app/image/course_expiration_img.png'" mode="widthFix"></image>
-				<view>{{msg}}</view>
-			</view> -->
-			<!-- 问题 -->
-			<!-- <view class="ques-content" v-if="isLogin&&isAddKf==1&&!isquestion">
-				<view v-if="isLogin">
-					<view class="ques-content-tit" v-if="!isquestion"
-						@click="tabChange(0)">问答题</view> -->
-					<!-- <view class="ques-content-tit" v-if="showTreatment==0"
-						:style="{ color: currentId==1? '#FF5C03':'#222'}" @click="tabChange(1)">商品</view> -->
-				<!-- </view> -->
-					<!-- <view v-for="(item,index) in quesList" :key="index">
-						<view class="ques-title">
-							<text>{{index + 1}}.</text> -->
-							<!-- <view class="ques-type" v-show="item.type == 1 || item.type == 2">
-								{{item.type == 1 ? '单选' : item.type == 2 ? '多选' : ''}}
-							</view> -->
-				<!-- 			<text class="fs40">{{item.title}}</text>
-						</view>
-						<view :class="isAnswer(item,option.name) ?'ques-option ques-option-active':'ques-option'"
-							v-for="(option,idx) in item.questionOption" :key="idx" @click="handleAnswer(item,option)">
-							<view class="fs40">
-								{{numberToLetter(idx)}}.
-							</view>
-							<view class="fs40">{{option.name}}</view>
-						</view>
-					</view>
-			</view>
-		</scroll-view> -->
 		<!-- 评价 -->
 		<!-- 评价 -->
 		<view class="rating-box" :style="{paddingTop:visibleRatingTabCount == 1?'30rpx':'24rpx'}"  v-if="isLogin&&isAddKf==1&&!isShu&&hasVisibleRatingTab">
 		<view class="rating-box" :style="{paddingTop:visibleRatingTabCount == 1?'30rpx':'24rpx'}"  v-if="isLogin&&isAddKf==1&&!isShu&&hasVisibleRatingTab">
 			<image class="bg" src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/app/vip/bg-back.png" mode="widthFix"></image>
 			<image class="bg" src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/app/vip/bg-back.png" mode="widthFix"></image>
@@ -354,26 +293,6 @@
 				</scroll-view>
 				</scroll-view>
 			</view>
 			</view>
 		</view>
 		</view>
-		<!-- 线路 -->
-		<!-- <view class="video-line" @click="openPop" v-if="isLogin&&isAddKf==1">
-			<image :src="imgPath+'/app/image/changePlayer-icon.png'"></image>
-			<text>线路{{lineIndex + 1 | numberToChinese}}</text>
-		</view> -->
-		<!-- 线路弹窗 -->
-		<!-- <uni-popup ref="popup" type="bottom"  class="full-width-popup">
-			<view class="popupbox">
-				<view class="popupbox-head">
-					<text>线路选择</text>
-					<image class="close-icon" :src="imgPath+'/app/image/tc_close_icon.png'" mode="aspectFill" @click="close">
-					</image>
-				</view>
-				<view class="popupbox-content">
-					<view :class="lineIndex == index ? 'line-item line-active': 'line-item'"
-						v-for="(it,index) in lineList" :key="index" @click="handleLine(index)">
-						线路{{index + 1 | numberToChinese}}</view>
-				</view>
-			</view>
-		</uni-popup> -->
 		<!-- 温馨提示弹窗 -->
 		<!-- 温馨提示弹窗 -->
 		<u-popup :show="tipsPopup" mode="center" :closeOnClickOverlay='true' @close='tipsPopup=!tipsPopup'
 		<u-popup :show="tipsPopup" mode="center" :closeOnClickOverlay='true' @close='tipsPopup=!tipsPopup'
 			:safeAreaInsetBottom='false' round='12'>
 			:safeAreaInsetBottom='false' round='12'>
@@ -554,7 +473,7 @@
 		</view>
 		</view>
 		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
 		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
 			:loading-text="loadingtext"></u-loading-page>
 			:loading-text="loadingtext"></u-loading-page>
-		<ykscreenRecord></ykscreenRecord>
+
 		<template v-if="tabIndex==0 && showTabFeaturedComments && !(showTabReviewPoints && isShu)">
 		<template v-if="tabIndex==0 && showTabFeaturedComments && !(showTabReviewPoints && isShu)">
 			<view
 			<view
 				v-if="featuredCommentComposerActive"
 				v-if="featuredCommentComposerActive"
@@ -692,7 +611,6 @@
 	import {
 	import {
 		mapGetters
 		mapGetters
 	} from 'vuex';
 	} from 'vuex';
-	import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	import courseExpiration from './components/courseExpiration.vue'
 	import courseExpiration from './components/courseExpiration.vue'
 	import FeaturedCommentXgPlayer from './components/FeaturedCommentXgPlayer.vue'
 	import FeaturedCommentXgPlayer from './components/FeaturedCommentXgPlayer.vue'
 	import {
 	import {
@@ -714,7 +632,6 @@
 	} from "@/api/user.js"
 	} from "@/api/user.js"
 	export default {
 	export default {
 		components: {
 		components: {
-			ykscreenRecord,
 			courseExpiration,
 			courseExpiration,
 			goodsList,
 			goodsList,
 			FeaturedCommentXgPlayer
 			FeaturedCommentXgPlayer
@@ -1017,7 +934,7 @@
 				return this.$store.state.imgpath
 				return this.$store.state.imgpath
 			},
 			},
 			appid() {
 			appid() {
-				console.log('this.$store.state.appid',this.$store.state.appid)
+				//console.log('this.$store.state.appid',this.$store.state.appid)
 				return this.$store.state.appid
 				return this.$store.state.appid
 			},
 			},
 			// 格式化后的倒计时
 			// 格式化后的倒计时
@@ -1124,6 +1041,15 @@
 			isTripleMarqueeMode() {
 			isTripleMarqueeMode() {
 				return !!(this.isShu || this.isFull)
 				return !!(this.isShu || this.isFull)
 			},
 			},
+			/** 精选留言输入框弹键盘时暂时隐藏商品卡片,收起后按 cardPopup 逻辑恢复 */
+			showCardPopup() {
+				if (!this.cardPopup || !this.currentCardItem) return false
+				if (
+					this.featuredCommentComposerActive &&
+					(this.featuredCommentKeyboardBottomPx > 0 || this.featuredCommentInputFocused)
+				) return false
+				return true
+			},
 			videovipVideoConfig() {
 			videovipVideoConfig() {
 				const allowSeek = this.isFinish == 1 || this.isEnded
 				const allowSeek = this.isFinish == 1 || this.isEnded
 				return {
 				return {
@@ -1198,16 +1124,16 @@
 		},
 		},
 		onLoad(option) {
 		onLoad(option) {
 			this.getWebviewUrl()
 			this.getWebviewUrl()
-			uni.$on('vipMsg', (data) => {
-				console.log(4444, data)
-				this.contentmsg = data
-				this.showfalse = true
-				uni.showToast({
-					icon: 'none',
-					title: data,
-					duration: 5000
-				});
-			})
+			// uni.$on('vipMsg', (data) => {
+			// 	console.log(4444, data)
+			// 	this.contentmsg = data
+			// 	this.showfalse = true
+			// 	uni.showToast({
+			// 		icon: 'none',
+			// 		title: data,
+			// 		duration: 5000
+			// 	});
+			// })
 		    this.getVideoContainerHeight()
 		    this.getVideoContainerHeight()
 			this._lockAppPortrait()
 			this._lockAppPortrait()
 			// this.code = option.code
 			// this.code = option.code
@@ -1293,7 +1219,7 @@
 		},
 		},
 		mounted() {
 		mounted() {
 			// this.getIP()
 			// this.getIP()
-			this.getHeight()
+			//this.getHeight()
 
 
 		},
 		},
 		onHide() {
 		onHide() {
@@ -2638,6 +2564,7 @@
 			   console.log('当前是否横屏:', this.isHeight);
 			   console.log('当前是否横屏:', this.isHeight);
 			},
 			},
 			fullscreenchange(event){
 			fullscreenchange(event){
+				console.log("[---]",this.isShu)
 				const isFullScreen = !!(event && event.detail && event.detail.fullScreen);
 				const isFullScreen = !!(event && event.detail && event.detail.fullScreen);
 				this.isFull = isFullScreen;
 				this.isFull = isFullScreen;
 				// 竖屏课程下:把全屏按钮当作布局切换按钮,禁止原生全屏停留
 				// 竖屏课程下:把全屏按钮当作布局切换按钮,禁止原生全屏停留
@@ -2694,6 +2621,10 @@
 				const wasShu = this.isShu
 				const wasShu = this.isShu
 				this.isShu = !this.isShu
 				this.isShu = !this.isShu
 				if (wasShu && this.showTabFeaturedComments) this.tabIndex = 0
 				if (wasShu && this.showTabFeaturedComments) this.tabIndex = 0
+				// 竖屏课经 openList 切布局后,需重置播放器 CSS 全屏态,否则再次点 f 只会触发退出事件
+				if (this.displayType === 'portrait') {
+					this._xgExitFullscreen()
+				}
 			},
 			},
 			// 倒计时格式化函数
 			// 倒计时格式化函数
 			formatCountdown(seconds) {
 			formatCountdown(seconds) {
@@ -3153,14 +3084,14 @@
 							this.viewload = false
 							this.viewload = false
 							this.courseInfo = res.data
 							this.courseInfo = res.data
 							uni.setNavigationBarTitle({
 							uni.setNavigationBarTitle({
-								title: this.courseInfo && this.courseInfo.title ? this.courseInfo.title : ''
+								title: this.courseInfo.title||''
 							});
 							});
 							this.$nextTick(() => {
 							this.$nextTick(() => {
 								this._syncRatingTabIndex()
 								this._syncRatingTabIndex()
 							})
 							})
 						}
 						}
-						this.getHeight()
-						this.getDescHeight()
+						//this.getHeight()
+						//this.getDescHeight()
 					},
 					},
 					rej => {
 					rej => {
 						this.loading = false
 						this.loading = false
@@ -3269,8 +3200,8 @@
 								this._syncRatingTabIndex()
 								this._syncRatingTabIndex()
 							})
 							})
 						}
 						}
-						this.getHeight()
-						this.getDescHeight()
+						//this.getHeight()
+						//this.getDescHeight()
 					},
 					},
 					rej => {}
 					rej => {}
 				)
 				)
@@ -3886,7 +3817,18 @@
 				} catch (e) {}
 				} catch (e) {}
 				this.player = null;
 				this.player = null;
 			},
 			},
+			_resetPortraitCssFullscreen() {
+				if (!this.player) return;
+				try {
+					this.player.exitCssFullscreen();
+				} catch (e) {}
+				this.isFullscreen = false;
+			},
 			_resizePlayerLayout() {
 			_resizePlayerLayout() {
+				const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
+				if (portrait) {
+					this._resetPortraitCssFullscreen();
+				}
 				const run = () => {
 				const run = () => {
 					if (!this.player) return;
 					if (!this.player) return;
 					try {
 					try {
@@ -4061,14 +4003,23 @@
 					this._notifyFullscreenToVue(isFullscreen);
 					this._notifyFullscreenToVue(isFullscreen);
 				});
 				});
 				this.player.on(Events.CSS_FULLSCREEN_CHANGE, (isFullscreen) => {
 				this.player.on(Events.CSS_FULLSCREEN_CHANGE, (isFullscreen) => {
+					const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
+					if (portrait) {
+						// 竖屏课:f 键仅切换页面布局,进入 CSS 全屏后立即退出,避免与 openList 切布局后状态不同步
+						if (isFullscreen) {
+							this.isCSSFull = true;
+							this._resetPortraitCssFullscreen();
+							this._notifyFullscreenToVue(true);
+						} else {
+							this._resetPortraitCssFullscreen();
+						}
+						return;
+					}
 					if (this.isFullscreen == isFullscreen) return;
 					if (this.isFullscreen == isFullscreen) return;
 					this.isCSSFull = true;
 					this.isCSSFull = true;
 					this.isFullscreen = isFullscreen;
 					this.isFullscreen = isFullscreen;
-					const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
-					if (!portrait) {
-						this._applyVideoFillMode(isFullscreen);
-						this._syncAppOrientationForFullscreen(isFullscreen);
-					}
+					this._applyVideoFillMode(isFullscreen);
+					this._syncAppOrientationForFullscreen(isFullscreen);
 					this._notifyFullscreenToVue(isFullscreen);
 					this._notifyFullscreenToVue(isFullscreen);
 				});
 				});
 			},
 			},
@@ -4089,14 +4040,21 @@
 				} catch (e) {}
 				} catch (e) {}
 			},
 			},
 			handleExitFullscreen(newValue) {
 			handleExitFullscreen(newValue) {
-				if (this.player && this.isFullscreen && newValue && String(newValue).indexOf('yes') > -1) {
-					if (this.isCSSFull) {
-						this.player.exitCssFullscreen();
-					} else {
-						this.player.exitFullscreen();
-					}
+				if (!this.player || !newValue || String(newValue).indexOf('yes') === -1) return;
+				const portrait = this.lastConfig && this.lastConfig.displayType === 'portrait';
+				if (portrait) {
+					this._resetPortraitCssFullscreen();
 					this._syncAppOrientationForFullscreen(false);
 					this._syncAppOrientationForFullscreen(false);
+					return;
+				}
+				if (!this.isFullscreen) return;
+				if (this.isCSSFull) {
+					this.player.exitCssFullscreen();
+				} else {
+					this.player.exitFullscreen();
 				}
 				}
+				this.isFullscreen = false;
+				this._syncAppOrientationForFullscreen(false);
 			},
 			},
 			changeVideo(newValue, oldValue, ownerInstance) {
 			changeVideo(newValue, oldValue, ownerInstance) {
 				if (!newValue) return;
 				if (!newValue) return;

+ 67 - 67
pages_im/pages/conversation/chating/components/ChatingFooter/ChatingActionBar.vue

@@ -55,18 +55,18 @@ export default {
 					title: '录像',
 					title: '录像',
 					icon: '/pages_im/static/images/new/picture_recording_icon.png'
 					icon: '/pages_im/static/images/new/picture_recording_icon.png'
 				}
 				}
-				,{
-				  idx: 4,
-				  type: ChatingFooterActionTypes.Call,
-				  title: "语音通话",
-				  icon: "/pages_im/static/images/new/voice_call_icon.png",
-				},
-				{
-					idx: 5,
-					type: ChatingFooterActionTypes.VideoCall,
-					title: "视频通话",
-					icon: "/pages_im/static/images/new/video_call_icon.png",
-				 }
+				// ,{
+				//   idx: 4,
+				//   type: ChatingFooterActionTypes.Call,
+				//   title: "语音通话",
+				//   icon: "/pages_im/static/images/new/voice_call_icon.png",
+				// },
+				// {
+				// 	idx: 5,
+				// 	type: ChatingFooterActionTypes.VideoCall,
+				// 	title: "视频通话",
+				// 	icon: "/pages_im/static/images/new/video_call_icon.png",
+				//  }
 				//{
 				//{
 				//         idx: 6,
 				//         idx: 6,
 				//         type: ChatingFooterActionTypes.File,
 				//         type: ChatingFooterActionTypes.File,
@@ -121,40 +121,40 @@ export default {
 			// 	title: '视频通话',
 			// 	title: '视频通话',
 			// 	icon: require('../../../../../static/images/chating_action_call.png')
 			// 	icon: require('../../../../../static/images/chating_action_call.png')
 			// });
 			// });
-			this.actionList.push({
-				idx: 6,
-				type: ChatingFooterActionTypes.Order,
-				title: '问诊订单',
-				icon: '/pages_im/static/images/new/consultation_order_icon.png'
-			});
-			this.actionList.push({
-				idx: 8,
-				type: ChatingFooterActionTypes.StoreOrder,
-				title: '药品订单',
-				icon: '/pages_im/static/images/new/drug_orders_icon.png'
-			});
-			this.actionList.push({
-				idx: 9,
-				type: ChatingFooterActionTypes.Package,
-				title: '疗法',
-				icon: '/pages_im/static/images/new/therapy_icon.png'
-			});
+			// this.actionList.push({
+			// 	idx: 6,
+			// 	type: ChatingFooterActionTypes.Order,
+			// 	title: '问诊订单',
+			// 	icon: '/pages_im/static/images/new/consultation_order_icon.png'
+			// });
+			// this.actionList.push({
+			// 	idx: 8,
+			// 	type: ChatingFooterActionTypes.StoreOrder,
+			// 	title: '药品订单',
+			// 	icon: '/pages_im/static/images/new/drug_orders_icon.png'
+			// });
+			// this.actionList.push({
+			// 	idx: 9,
+			// 	type: ChatingFooterActionTypes.Package,
+			// 	title: '疗法',
+			// 	icon: '/pages_im/static/images/new/therapy_icon.png'
+			// });
 			
 			
-			this.actionList.push({
-				idx: 10,
-				type: ChatingFooterActionTypes.CouponPackage,
-				title: '私域疗法券',
-				icon: '/pages_im/static/images/new/therapy_voucher_icon.png'
-			});
+			// this.actionList.push({
+			// 	idx: 10,
+			// 	type: ChatingFooterActionTypes.CouponPackage,
+			// 	title: '私域疗法券',
+			// 	icon: '/pages_im/static/images/new/therapy_voucher_icon.png'
+			// });
 			
 			
-			this.actionList.push({ 
-				idx: 11,
-				type: ChatingFooterActionTypes.InquirySelect,
-				title: '会诊',
-				icon: '/pages_im/static/images/new/consultation_doctors_icon.png'
-			});
+			// this.actionList.push({ 
+			// 	idx: 11,
+			// 	type: ChatingFooterActionTypes.InquirySelect,
+			// 	title: '会诊',
+			// 	icon: '/pages_im/static/images/new/consultation_doctors_icon.png'
+			// });
 			
 			
-			return;
+			//return;
 		}
 		}
 
 
 		//if((this.imType==1&&this.orderType==2)||this.imType==2){  //语音通话
 		//if((this.imType==1&&this.orderType==2)||this.imType==2){  //语音通话
@@ -174,30 +174,30 @@ export default {
 			// });
 			// });
 		//}
 		//}
 		
 		
-		if (this.imType == 1) {
-			//问诊订单
-			this.actionList.push({
-				idx: 6,
-				type: ChatingFooterActionTypes.Order,
-				title: '问诊订单',
-				icon: '/pages_im/static/images/new/consultation_order_icon.png'
-			});
-		}
-		if (this.imType == 2) {
-			//视频通话
-			this.actionList.push({
-				idx: 7,
-				type: ChatingFooterActionTypes.Follow,
-				title: '随访单',
-				icon: '/pages_im/static/images/chating_action_file.png'
-			});
-			this.actionList.push({
-				idx: 8,
-				type: ChatingFooterActionTypes.StoreOrder,
-				title: '药品订单',
-				icon: '/pages_im/static/image/new/drug_orders_icon.png'
-			});
-		}
+		// if (this.imType == 1) {
+		// 	//问诊订单
+		// 	this.actionList.push({
+		// 		idx: 6,
+		// 		type: ChatingFooterActionTypes.Order,
+		// 		title: '问诊订单',
+		// 		icon: '/pages_im/static/images/new/consultation_order_icon.png'
+		// 	});
+		// }
+		// if (this.imType == 2) {
+		// 	//视频通话
+		// 	this.actionList.push({
+		// 		idx: 7,
+		// 		type: ChatingFooterActionTypes.Follow,
+		// 		title: '随访单',
+		// 		icon: '/pages_im/static/images/chating_action_file.png'
+		// 	});
+		// 	this.actionList.push({
+		// 		idx: 8,
+		// 		type: ChatingFooterActionTypes.StoreOrder,
+		// 		title: '药品订单',
+		// 		icon: '/pages_im/static/image/new/drug_orders_icon.png'
+		// 	});
+		// }
 		
 		
 	},
 	},
 
 

+ 38 - 38
pages_im/pages/conversation/chating1/components/ChatingFooter/ChatingActionBar.vue

@@ -54,18 +54,18 @@ export default {
 					title: '录像',
 					title: '录像',
 					icon: require('../../../../../static/images/new/picture_recording_icon.png')
 					icon: require('../../../../../static/images/new/picture_recording_icon.png')
 				}
 				}
-				,{
-				  idx: 4,
-				  type: ChatingFooterActionTypes.Call,
-				  title: "语音通话",
-				  icon: require("../../../../../static/images/new/voice_call_icon.png"),
-				},
-				{
-					idx: 5,
-					type: ChatingFooterActionTypes.VideoCall,
-					title: "视频通话",
-					icon: require("../../../../../static/images/new/video_call_icon.png"),
-				 }
+				// ,{
+				//   idx: 4,
+				//   type: ChatingFooterActionTypes.Call,
+				//   title: "语音通话",
+				//   icon: require("../../../../../static/images/new/voice_call_icon.png"),
+				// },
+				// {
+				// 	idx: 5,
+				// 	type: ChatingFooterActionTypes.VideoCall,
+				// 	title: "视频通话",
+				// 	icon: require("../../../../../static/images/new/video_call_icon.png"),
+				//  }
 				//{
 				//{
 				//         idx: 6,
 				//         idx: 6,
 				//         type: ChatingFooterActionTypes.File,
 				//         type: ChatingFooterActionTypes.File,
@@ -179,32 +179,32 @@ export default {
 		//}
 		//}
 		
 		
 		
 		
-	    if(this.isDoctor){
-			if (this.imType == 1) {
-				//问诊订单
-				this.actionList.push({
-					idx: 6,
-					type: ChatingFooterActionTypes.Order,
-					title: '问诊订单',
-					icon: require('../../../../../static/images/new/consultation_order_icon.png')
-				});
-			}
-			if (this.imType == 2) {
-				//视频通话
-				this.actionList.push({
-					idx: 7,
-					type: ChatingFooterActionTypes.Follow,
-					title: '随访单',
-					icon: require('../../../../../static/images/new/consultation_order_icon.png')
-				});
-				this.actionList.push({
-					idx: 8,
-					type: ChatingFooterActionTypes.StoreOrder,
-					title: '药品订单',
-					icon: require('../../../../../static/images/new/drug_orders_icon.png')
-				});
-			}
-		}
+	 //    if(this.isDoctor){
+		// 	if (this.imType == 1) {
+		// 		//问诊订单
+		// 		this.actionList.push({
+		// 			idx: 6,
+		// 			type: ChatingFooterActionTypes.Order,
+		// 			title: '问诊订单',
+		// 			icon: require('../../../../../static/images/new/consultation_order_icon.png')
+		// 		});
+		// 	}
+		// 	if (this.imType == 2) {
+		// 		//视频通话
+		// 		this.actionList.push({
+		// 			idx: 7,
+		// 			type: ChatingFooterActionTypes.Follow,
+		// 			title: '随访单',
+		// 			icon: require('../../../../../static/images/new/consultation_order_icon.png')
+		// 		});
+		// 		this.actionList.push({
+		// 			idx: 8,
+		// 			type: ChatingFooterActionTypes.StoreOrder,
+		// 			title: '药品订单',
+		// 			icon: require('../../../../../static/images/new/drug_orders_icon.png')
+		// 		});
+		// 	}
+		// }
 		
 		
 		
 		
 	},
 	},

+ 1 - 0
pages_im/pages/conversation/chating1/components/ChatingFooter/index.vue

@@ -314,6 +314,7 @@ export default {
 				soundPath: getPurePath(path),
 				soundPath: getPurePath(path),
 				duration
 				duration
 			});
 			});
+			//console.log('message',path,message)
 			this.sendMessage(message);
 			this.sendMessage(message);
 		},
 		},
 		getRecordAreaData() {
 		getRecordAreaData() {

+ 36 - 15
pages_im/pages/conversation/chating1/components/MessageItem/CustomMessageRender.vue

@@ -293,23 +293,44 @@ export default {
 			});
 			});
       }
       }
 	  else if (item.payload.data == 'course') {
 	  else if (item.payload.data == 'course') {
-		    console.log("qxj extension:",item);
+		   // console.log("qxj extension:",item);
 			let couseItem = item.payload.extension;
 			let couseItem = item.payload.extension;
 			if (uni.getStorageSync('companyUserId')) {
 			if (uni.getStorageSync('companyUserId')) {
-				const queryString = couseItem.appRealLink.split('?')[1] || '';
-				const courseParamMatch = queryString.match(/course=({[^&]+})/);
-				
-				if (!courseParamMatch) {
-					uni.showToast({
-						icon: 'none',
-						title: '看课链接不存在'
-					})
-				}
-				const courseJson = decodeURIComponent(courseParamMatch[1]);
-				const courseData = JSON.parse(courseJson);
-				return uni.navigateTo({
-					url: `/pages_managedata/coursedetail?videoId=${courseData.videoId}&id=${courseData.id}&periodId=${courseData.periodId}`
-				});
+			  const queryString = couseItem.appRealLink.split('?')[1] || '';
+			  
+			  // 统一正则:匹配 course= 后面直到 & 之前的所有内容(兼容带 {} 和不带 {})
+			  const courseParamMatch = queryString.match(/course=([^&]+)/);
+			
+			  // 1. 匹配不到 → 提示并退出
+			  if (!courseParamMatch || !courseParamMatch[1]) {
+			    uni.showToast({
+			      icon: 'none',
+			      title: '看课链接不存在'
+			    });
+			    return; // 必须停止执行
+			  }
+			
+			  try {
+			    // 2. 取出内容并解码
+			    let courseJson = decodeURIComponent(courseParamMatch[1]);
+			    
+			    // 3. 兼容处理:如果自带 {},自动去掉
+			    courseJson = courseJson.replace(/^{|}$/g, '');
+			
+			    // 4. 解析 JSON
+			    const courseData = JSON.parse(courseJson);
+			
+			    // 5. 跳转到课程详情
+			    return uni.navigateTo({
+			      url: `/pages_managedata/coursedetail?videoId=${courseData.videoId}&id=${courseData.id}&periodId=${courseData.periodId}`
+			    });
+			  } catch (e) {
+			    console.error('课程参数解析失败', e);
+			    uni.showToast({
+			      icon: 'none',
+			      title: '课程参数格式错误'
+			    });
+			  }
 			}
 			}
 			if (couseItem.appRealLink) {
 			if (couseItem.appRealLink) {
 				const match = couseItem.appRealLink.match(/appcourse\/(.*)/);
 				const match = couseItem.appRealLink.match(/appcourse\/(.*)/);

+ 5 - 4
pages_im/pages/conversation/conversationList/index.nvue

@@ -58,7 +58,7 @@
 			</view>
 			</view>
 		</view>
 		</view>
 		<!-- 更多菜单弹窗 -->
 		<!-- 更多菜单弹窗 -->
-		<!-- <view v-if="moreMenuVisible" class="menu-mask" @click="moreMenuVisible = false">
+		<view v-if="moreMenuVisible" class="menu-mask" @click="moreMenuVisible = false">
 			<view class="menu-popup" :style="{ top: popMenuPosition.top + 'px', right: popMenuPosition.right + 'px' }">
 			<view class="menu-popup" :style="{ top: popMenuPosition.top + 'px', right: popMenuPosition.right + 'px' }">
 				<view class="menu-arrow"></view>
 				<view class="menu-arrow"></view>
 				<view v-for="(item, index) in moreMenus" :key="item.idx" class="menu-item" :class="{'menu-item-border': index < moreMenus.length - 1, 'menu-item-first': index === 0, 'menu-item-last': index === moreMenus.length - 1}" @click.stop="clickMenu(item)">
 				<view v-for="(item, index) in moreMenus" :key="item.idx" class="menu-item" :class="{'menu-item-border': index < moreMenus.length - 1, 'menu-item-first': index === 0, 'menu-item-last': index === moreMenus.length - 1}" @click.stop="clickMenu(item)">
@@ -66,8 +66,8 @@
 					<text class="menu-text">{{ item.title }}</text>
 					<text class="menu-text">{{ item.title }}</text>
 				</view>
 				</view>
 			</view>
 			</view>
-		</view> -->
-		<view v-if="moreMenuVisible" class="menu-mask" @click="moreMenuVisible = false">
+		</view>
+		<!-- <view v-if="moreMenuVisible" class="menu-mask" @click="moreMenuVisible = false">
 			<view class="menu-popup" :style="{ top: popMenuPosition.top + 'px', right: popMenuPosition.right + 'px' }">
 			<view class="menu-popup" :style="{ top: popMenuPosition.top + 'px', right: popMenuPosition.right + 'px' }">
 				<view class="menu-arrow"></view>
 				<view class="menu-arrow"></view>
 				<view v-for="(item, index) in moreMenus" :key="item.idx" class="menu-item"
 				<view v-for="(item, index) in moreMenus" :key="item.idx" class="menu-item"
@@ -79,7 +79,7 @@
 					</view>
 					</view>
 				</view>
 				</view>
 			</view>
 			</view>
-		</view>
+		</view> -->
 		<!-- 通知栏 (仅Android显示) -->
 		<!-- 通知栏 (仅Android显示) -->
 		<view class="notice" v-if="!notice && isAndroid">
 		<view class="notice" v-if="!notice && isAndroid">
 			<view class="notice-left">
 			<view class="notice-left">
@@ -1159,6 +1159,7 @@ export default {
 					IMSDK.uuid(),
 					IMSDK.uuid(),
 					conversation.conversationID,
 					conversation.conversationID,
 				);
 				);
+				console.log('ResetConversationGroupAtType',IMSDK.IMMethods.MarkConversationMessageAsRead)
 			}
 			}
 			const isNomalAtType = nomalTypes.includes(conversation.groupAtType);
 			const isNomalAtType = nomalTypes.includes(conversation.groupAtType);
 			if (isNomalAtType) {
 			if (isNomalAtType) {

+ 1 - 3
pages_live/living - 副本.nvue

@@ -803,9 +803,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-	import {
-		CustomToast
-	} from '@/components/custom-toast.vue';
+	import CustomToast from '@/components/custom-toast.vue';
 	import LikeButton from './components/like.vue';
 	import LikeButton from './components/like.vue';
 	import ThreeItemSwiper from './components/ThreeItemSwiper.vue';
 	import ThreeItemSwiper from './components/ThreeItemSwiper.vue';
 	import CryptoJS from 'crypto-js';
 	import CryptoJS from 'crypto-js';

+ 304 - 79
pages_live/living.vue

@@ -112,13 +112,13 @@
 			<!-- 主要内容区域 -->
 			<!-- 主要内容区域 -->
 			<view class="content"
 			<view class="content"
 			    :style="{height:liveItem.status!=1&&liveItem.showType==1?'calc(100% - 150rpx)':''}"
 			    :style="{height:liveItem.status!=1&&liveItem.showType==1?'calc(100% - 150rpx)':''}"
-				:class="{ 'horizontal-content': isFocus==1, 'trailer-content': liveItem.status==1,  'fullscreen-mode': isFullscreen   }">
+				:class="{ 'horizontal-content': isFocus==1, 'trailer-content': liveItem.status==1,  'fullscreen-mode': isFullscreen && liveItem.showType != 1 }">
 				<!-- 顶部信息栏(无视频时降级为普通 view,如直播结束) -->
 				<!-- 顶部信息栏(无视频时降级为普通 view,如直播结束) -->
 				<!-- 视频区域 -->
 				<!-- 视频区域 -->
-				<view class="videolist" v-if="liveItem.status == 2" :key="'live-videolist-' + livePlayerMountKey" :class="isFullscreen ? 'screen' : ''">
+				<view class="videolist" v-if="liveItem.status == 2" :key="'live-videolist-' + livePlayerMountKey" :class="isFullscreen && liveItem.showType != 1 ? 'screen' : ''">
 					<view class="video-area-wrap video-container"
 					<view class="video-area-wrap video-container"
-						:style="{ height:liveItem.showType==2?'100vh':isFullscreen?'auto':'400rpx',width:isFullscreen?'0':'100%'}"
-						:class="{'horizontal-layout': liveItem.showType == 1,'fullscreen-mode': isFullscreen}"
+						:style="liveVideoAreaStyle"
+						:class="{'horizontal-layout': liveItem.showType == 1,'fullscreen-mode': isFullscreen && liveItem.showType != 1}"
 						:key="'live-player-' + livePlayerMountKey"
 						:key="'live-player-' + livePlayerMountKey"
 						:liveVideoConfig="liveVideoConfig"
 						:liveVideoConfig="liveVideoConfig"
 						:change:liveVideoConfig="xgplayer.initJs"
 						:change:liveVideoConfig="xgplayer.initJs"
@@ -133,38 +133,37 @@
 							:class="'xg-live-player-el video-player xg-hide-play-btn' + (liveItem.showType === 2 ? ' xg-hide-player-controls' : '')"
 							:class="'xg-live-player-el video-player xg-hide-play-btn' + (liveItem.showType === 2 ? ' xg-hide-player-controls' : '')"
 							:style="{transform:liveItem.showType!==2?`scale(${scale})`:'', transformOrigin: 'center center', bottom:isFullscreen?'0':''}">
 							:style="{transform:liveItem.showType!==2?`scale(${scale})`:'', transformOrigin: 'center center', bottom:isFullscreen?'0':''}">
 						</view>
 						</view>
-						<template v-if="liveItem.videoUrl && liveItem.liveType == 2 && !generating">
-							<!-- 顶部信息栏:叠加在西瓜播放器之上 -->
-							<view v-if="!isFullscreen && liveItem.showType == 2" class="cover-top-info-bar"
-								:class="liveItem.showType == 1 ? 'cover-top-info-bar--light' : 'cover-top-info-bar--dark'"
-								:style="coverTopBarStyle">
-								<view class="cover-user-info-section">
-									<image v-if="!scene && liveItem.showType==2" class="cover-back-icon"
-										src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/return3.png"
-										@tap="goBack" />
-									<image v-if="!scene && liveItem.showType==1" class="cover-back-icon-sm"
-										src="/static/images/live/return_black.png" @tap="goBack" />
-									<view class="cover-user-avatar-container">
-										<view class="cover-avatar-round" style="width:32px;height: 32px;border-radius: 50px;overflow: hidden;">
-											<image class="cover-avatar-round__img" :src="liveAvatarUrl" style="width:32px;height: 32px;display:block;"></image>
-										</view>
-										<view class="cover-user-name">{{ liveItem.liveName ? truncateString(liveItem.liveName, 8) : '未命名' }}</view>
+						<!-- 竖屏顶部信息栏:直播/回放生成中均使用 cover-top-info-bar -->
+						<view
+							v-if="!isFullscreen && liveItem.showType == 2 && liveItem.videoUrl && liveItem.liveType == 2"
+							class="cover-top-info-bar cover-top-info-bar--dark"
+							:style="coverTopBarStyle">
+							<view class="cover-user-info-section">
+								<image v-if="!scene && liveItem.showType==2" class="cover-back-icon"
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/return3.png"
+									@tap="goBack" />
+								<view class="cover-user-avatar-container">
+									<view class="cover-avatar-round" style="width:32px;height: 32px;border-radius: 50px;overflow: hidden;">
+										<image class="cover-avatar-round__img" :src="liveAvatarUrl" style="width:32px;height: 32px;display:block;"></image>
 									</view>
 									</view>
+									<view class="cover-user-name">{{ liveItem.liveName ? truncateString(liveItem.liveName, 8) : '未命名' }}</view>
 								</view>
 								</view>
-								<view v-if="Array.isArray(filteredViewers)" class="cover-viewers-section">
-									<view class="cover-viewers-inner">
-										<view v-for="(item, index) in (filteredViewers || [])"
-											v-if="item" :key="'cv-' + index" class="cover-avatar-round cover-avatar-round--sm"
-											:style="coverAvatarClipStyleSm">
-											<image class="cover-avatar-round__img" :src="item" />
-										</view>
-										<view class="cover-viewer-count">{{ formattedWatchCount || 0 }}</view>
+							</view>
+							<view v-if="Array.isArray(filteredViewers)" class="cover-viewers-section">
+								<view class="cover-viewers-inner">
+									<view v-for="(item, index) in (filteredViewers || [])"
+										v-if="item" :key="'cv-' + index" class="cover-avatar-round cover-avatar-round--sm"
+										:style="coverAvatarClipStyleSm">
+										<image class="cover-avatar-round__img" :src="item" />
 									</view>
 									</view>
+									<view class="cover-viewer-count">{{ formattedWatchCount || 0 }}</view>
 								</view>
 								</view>
 							</view>
 							</view>
-							<!-- 积分倒计时 -->
+						</view>
+						<template v-if="liveItem.videoUrl && liveItem.liveType == 2 && !generating">
+							<!-- 积分倒计时(竖屏/全屏叠在视频上;横屏小屏在 slide-group 上方) -->
 							<view
 							<view
-								v-if="!isFocus && countdownPercentage!=100&&liveItem.completionPointsEnabled&&!receiveStatus&&!hasReceived&&!isPreview"
+								v-if="!isFocus && !shouldPausePointsCountdown && countdownPercentage!=100&&liveItem.completionPointsEnabled&&!receiveStatus&&!hasReceived&&!isPreview && (liveItem.showType==2 || isFullscreen)"
 								class="cover-progress-countdown"
 								class="cover-progress-countdown"
 								:class="liveItem.showType==2 ? 'cover-progress-countdown--vertical' : ''"
 								:class="liveItem.showType==2 ? 'cover-progress-countdown--vertical' : ''"
 								:style="coverProgressCountdownStyle">
 								:style="coverProgressCountdownStyle">
@@ -299,7 +298,8 @@
 							</LiveCommentInput>
 							</LiveCommentInput>
 							<view
 							<view
 								v-if="useVerticalVideoCover && !isFocus && liveActionButtonsVisible && !commentInputVisible"
 								v-if="useVerticalVideoCover && !isFocus && liveActionButtonsVisible && !commentInputVisible"
-								class="cover-input-actions-container cover-input-actions-container--actions-only">
+								class="cover-input-actions-container cover-input-actions-container--actions-only"
+								:style="coverInputActionsContainerStyle">
 								<LiveActionButtons
 								<LiveActionButtons
 									size="large"
 									size="large"
 									:show-type="liveItem.showType"
 									:show-type="liveItem.showType"
@@ -311,7 +311,8 @@
 							<view class="txt">回放生成中...</view>
 							<view class="txt">回放生成中...</view>
 							<view
 							<view
 								v-if="!isFocus && liveActionButtonsVisible"
 								v-if="!isFocus && liveActionButtonsVisible"
-								class="cover-input-actions-container cover-input-actions-container--actions-only">
+								class="cover-input-actions-container cover-input-actions-container--actions-only"
+								:style="coverInputActionsContainerStyle">
 								<LiveActionButtons
 								<LiveActionButtons
 									size="large"
 									size="large"
 									:show-type="liveItem.showType"
 									:show-type="liveItem.showType"
@@ -393,7 +394,8 @@
 							<view class="cover-replay-label cover-replay-label--status4">直播回放</view>
 							<view class="cover-replay-label cover-replay-label--status4">直播回放</view>
 							<view
 							<view
 								v-if="useVerticalVideoCover && !isFocus && liveActionButtonsVisible"
 								v-if="useVerticalVideoCover && !isFocus && liveActionButtonsVisible"
-								class="cover-input-actions-container cover-input-actions-container--actions-only">
+								class="cover-input-actions-container cover-input-actions-container--actions-only"
+								:style="coverInputActionsContainerStyle">
 								<LiveActionButtons
 								<LiveActionButtons
 									size="large"
 									size="large"
 									:show-type="liveItem.showType"
 									:show-type="liveItem.showType"
@@ -406,6 +408,18 @@
 				<!-- v-if="!hasReachedTarget" -->
 				<!-- v-if="!hasReachedTarget" -->
 				<!-- &&liveItem.completionPointsEnabled -->
 				<!-- &&liveItem.completionPointsEnabled -->
 
 
+				<!-- 横屏小屏完课倒计时:与点赞同列,位于点赞上方 -->
+				<view
+					v-if="!isFocus && !shouldPausePointsCountdown && countdownPercentage!=100&&liveItem.completionPointsEnabled&&!receiveStatus&&!hasReceived&&!isPreview && liveItem.showType==1 && !isFullscreen && !useVerticalVideoCover"
+					class="cover-progress-countdown cover-progress-countdown--horizontal"
+					:style="coverProgressCountdownStyle">
+					<image class="cover-progress-title" src="/static/images/live/points_title.png" />
+					<view class="cover-progress-bar-bg">
+						<view class="cover-progress-bar-fill" :style="{ width: countdownPercentage + '%' }"></view>
+					</view>
+					<view class="cover-progress-text">倒计时{{ formattedCountdown.hours||'00' }}:{{ formattedCountdown.minutes||'00' }}:{{ formattedCountdown.seconds||"00" }}</view>
+				</view>
+
 				<view
 				<view
 					class="slide-group"
 					class="slide-group"
 					:class="{
 					:class="{
@@ -459,7 +473,7 @@
 						</view>
 						</view>
 					</view>
 					</view>
 					<view class="chat-content-wrapper"
 					<view class="chat-content-wrapper"
-						:style="{ 'height':liveItem.status == 1 && !liveItem.previewUrl && liveItem.showType == 2?'48vh':''}"
+						
 						:class="{ 'chat-content-focused': isFocus }">
 						:class="{ 'chat-content-focused': isFocus }">
 						<view class="notice-message" v-if="isShowNotice"
 						<view class="notice-message" v-if="isShowNotice"
 							:style="{ 'display':isFocus&&liveItem.showType == 2?'none':''}"
 							:style="{ 'display':isFocus&&liveItem.showType == 2?'none':''}"
@@ -926,9 +940,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-	import {
-		CustomToast
-	} from '@/components/custom-toast.vue';
+	import CustomToast from '@/components/custom-toast.vue';
 	import LikeButton from './components/like.vue';
 	import LikeButton from './components/like.vue';
 	import LiveGoods from './components/liveGoods.vue';
 	import LiveGoods from './components/liveGoods.vue';
 	import LiveActionButtons from './components/liveActionButtons.vue';
 	import LiveActionButtons from './components/liveActionButtons.vue';
@@ -1040,6 +1052,8 @@ import {
 				isHeight: false,
 				isHeight: false,
 				isFullscreen: false,
 				isFullscreen: false,
 				isVideoRotated: false,
 				isVideoRotated: false,
+				fullscreenToggleLock: false,
+				fullscreenToggleTimer: null,
 				showNonVideoElementsFlag: true,
 				showNonVideoElementsFlag: true,
 				videoRatio: 56.25, // 默认16:9比例
 				videoRatio: 56.25, // 默认16:9比例
 				scale: 1,
 				scale: 1,
@@ -1488,6 +1502,20 @@ import {
 			shouldShowFullscreenButton() {
 			shouldShowFullscreenButton() {
 				return this.liveItem.showType == 1 && !this.isFullscreen;
 				return this.liveItem.showType == 1 && !this.isFullscreen;
 			},
 			},
+			/** 横屏小屏走播放器原生全屏,页面容器保持小屏尺寸,避免小米等机型闪动后回弹 */
+			liveVideoAreaStyle() {
+				const showType = this.liveItem && this.liveItem.showType;
+				if (showType === 2) {
+					return { height: '100vh', width: '100%' };
+				}
+				if (this.isFullscreen && showType === 1) {
+					return { height: '400rpx', width: '100%' };
+				}
+				if (this.isFullscreen) {
+					return { height: 'auto', width: '0' };
+				}
+				return { height: '400rpx', width: '100%' };
+			},
 			...mapGetters(['coureLogin']),
 			...mapGetters(['coureLogin']),
 			appid() {
 			appid() {
 				return this.$store.state.appid
 				return this.$store.state.appid
@@ -1502,11 +1530,19 @@ import {
 					!this.isReplayPlayback() &&
 					!this.isReplayPlayback() &&
 					!this.generating;
 					!this.generating;
 			},
 			},
+			// 直播结束/回放生成中:暂停完课积分倒计时
+			shouldPausePointsCountdown() {
+				const item = this.liveItem;
+				if (!item) return true;
+				if (item.status === 3) return true;
+				if (this.generating) return true;
+				if (this.hasLiveEnd && item.status === 2 && !this.isReplayPlayback()) return true;
+				return false;
+			},
 			liveActionButtonsVisible() {
 			liveActionButtonsVisible() {
-				if (!this.liveItem || this.liveItem.status == 3) return false;
-				// 竖屏回放生成中也需要显示更多和小黄车
-				if (this.generating && this.liveItem.showType === 2) return true;
-				return !this.generating;
+				if (!this.liveItem) return false;
+				// 回放生成中也需展示更多和小黄车
+				return true;
 			},
 			},
 			coverTopBarStyle() {
 			coverTopBarStyle() {
 				const top = (this.menuButtonInfo && this.menuButtonInfo.top) ? this.menuButtonInfo.top : '0px';
 				const top = (this.menuButtonInfo && this.menuButtonInfo.top) ? this.menuButtonInfo.top : '0px';
@@ -1539,6 +1575,19 @@ import {
 				if (this.liveItem && this.liveItem.showType === 2) {
 				if (this.liveItem && this.liveItem.showType === 2) {
 					return { top: '15%', left: '24rpx', right: 'auto' };
 					return { top: '15%', left: '24rpx', right: 'auto' };
 				}
 				}
+				if (this.isFullscreen) {
+					return { top: '20rpx', right: '20rpx' };
+				}
+				// 横屏小屏:与 slide-group--horizontal 对齐,位于点赞上方
+				if (this.liveItem && this.liveItem.showType === 1) {
+					const likeBottom = this.isShowGoods ? '480rpx' : '380rpx';
+					return {
+						right: '20rpx',
+						left: 'auto',
+						top: 'auto',
+						bottom: `calc(${likeBottom} + 144rpx)`,
+					};
+				}
 				return { top: '45%', right: '20rpx' };
 				return { top: '45%', right: '20rpx' };
 			},
 			},
 			coverComplaintStyle() {
 			coverComplaintStyle() {
@@ -1571,13 +1620,18 @@ import {
 				}
 				}
 				return false;
 				return false;
 			},
 			},
-			// 无 video 节点时顶部栏降级为普通 view(如直播结束、回放生成中)
+			// 无 video 节点时顶部栏降级为普通 view(如直播结束、横屏回放生成中)
 			showTopInfoBarOutside() {
 			showTopInfoBarOutside() {
 				if (this.isFullscreen || !this.liveItem) return false;
 				if (this.isFullscreen || !this.liveItem) return false;
 				if (this.liveItem.status == 1) return false;
 				if (this.liveItem.status == 1) return false;
 				if (this.showTopInfoBarAboveVideo) return true;
 				if (this.showTopInfoBarAboveVideo) return true;
 				if (this.liveItem.status == 3) return true;
 				if (this.liveItem.status == 3) return true;
 				if (this.liveItem.status == 2) {
 				if (this.liveItem.status == 2) {
+					// 竖屏回放生成中已使用 cover-top-info-bar,不再展示外部降级栏
+					if (this.generating && this.liveItem.showType === 2 &&
+						this.liveItem.videoUrl && this.liveItem.liveType === 2) {
+						return false;
+					}
 					return !this.liveItem.videoUrl || this.generating || this.liveItem.liveType != 2;
 					return !this.liveItem.videoUrl || this.generating || this.liveItem.liveType != 2;
 				}
 				}
 				if (this.liveItem.status == 4) {
 				if (this.liveItem.status == 4) {
@@ -1599,19 +1653,23 @@ import {
 				const item = this.liveItem || {};
 				const item = this.liveItem || {};
 				let url = '';
 				let url = '';
 				let mode = '';
 				let mode = '';
+				const normalizeUrl = (rawUrl) => {
+					if (rawUrl == null || rawUrl === '') return '';
+					return String(rawUrl).trim();
+				};
 				if (item.status === 1 && item.previewUrl) {
 				if (item.status === 1 && item.previewUrl) {
-					url = item.previewUrl;
+					url = normalizeUrl(item.previewUrl);
 					mode = 'preview';
 					mode = 'preview';
 				} else if (item.status === 2 && item.liveType === 2 && item.videoUrl && !this.generating) {
 				} else if (item.status === 2 && item.liveType === 2 && item.videoUrl && !this.generating) {
-					url = item.originalVideoUrl || item.videoUrl;
-					if (this.videoReloadKey > 0 && url) {
-						const base = url.split(/[?&]t=/)[0];
-						const sep = base.includes('?') ? '&' : '?';
-						url = base + sep + 't=' + this.videoReloadKey;
-					}
+					url = normalizeUrl(item.originalVideoUrl || item.videoUrl);
+					// if (this.videoReloadKey > 0 && url) {
+					// 	const base = url.split(/[?&]t=/)[0];
+					// 	const sep = base.includes('?') ? '&' : '?';
+					// 	url = base + sep + 't=' + this.videoReloadKey;
+					// }
 					mode = 'live';
 					mode = 'live';
 				} else if (item.status === 4 && item.liveType === 3 && item.videoUrl) {
 				} else if (item.status === 4 && item.liveType === 3 && item.videoUrl) {
-					url = item.videoUrl;
+					url = normalizeUrl(item.videoUrl);
 					mode = 'replay';
 					mode = 'replay';
 				}
 				}
 				const showType = item.showType;
 				const showType = item.showType;
@@ -1670,6 +1728,31 @@ import {
 					backgroundColor: 'rgba(0,0,0,0.01)'
 					backgroundColor: 'rgba(0,0,0,0.01)'
 				};
 				};
 			},
 			},
+			// 竖屏底部操作栏(仅按钮 / 输入+按钮),动态控制尺寸避免 height:100% 撑满视频区
+			coverInputActionsContainerStyle() {
+				const item = this.liveItem;
+				if (!item || item.showType !== 2 || this.isFullscreen) return {};
+				const isVerticalOverlay = this.useVerticalVideoCover ||
+					(this.generating && item.videoUrl);
+				if (!isVerticalOverlay) return {};
+				const m = this.getCoverChatMetrics();
+				const pad = this.getCoverPx(24);
+				const style = {
+					left: '0',
+					right: '0',
+					bottom: m.safeBottom + 'px',
+					width: '100%',
+					height: 'auto',
+					padding: `${pad}px`,
+					boxSizing: 'border-box',
+				};
+				// 回放生成中无播放器,fixed 定位避免受 video 容器 100vh 影响
+				if (this.generating) {
+					style.position = 'fixed';
+					style.zIndex = 99999;
+				}
+				return style;
+			},
 			// 横屏/竖屏小窗聊天区 scroll-view 高度(随公告显隐调整)
 			// 横屏/竖屏小窗聊天区 scroll-view 高度(随公告显隐调整)
 			chatMessageScrollStyle() {
 			chatMessageScrollStyle() {
 				const noticeH = Number(this.commonViewHeight) || 0;
 				const noticeH = Number(this.commonViewHeight) || 0;
@@ -1852,6 +1935,7 @@ import {
             			}
             			}
 			// 清除所有定时器(使用增强清理)
 			// 清除所有定时器(使用增强清理)
 			this.clearAllTimersEnhanced();
 			this.clearAllTimersEnhanced();
+			this._clearFullscreenToggleLock();
 
 
 			this.exitFullscreenSignal = 'yes' + new Date().getTime();
 			this.exitFullscreenSignal = 'yes' + new Date().getTime();
 			this.pauseVideo();
 			this.pauseVideo();
@@ -1963,6 +2047,18 @@ import {
 					});
 					});
 				}
 				}
 			},
 			},
+			generating(val, oldVal) {
+				if (val) {
+					this.stopCountdown();
+				} else if (oldVal && this.liveItem?.completionPointsEnabled && !this.shouldPausePointsCountdown) {
+					this.startCountdown();
+				}
+			},
+			hasLiveEnd(val) {
+				if (val && this.shouldPausePointsCountdown) {
+					this.stopCountdown();
+				}
+			},
 		},
 		},
 		methods: {
 		methods: {
 			// 查询当前用户当前直播间领取积分的剩余时长
 			// 查询当前用户当前直播间领取积分的剩余时长
@@ -2191,6 +2287,9 @@ import {
 				if (!this.liveItem.completionPointsEnabled) {
 				if (!this.liveItem.completionPointsEnabled) {
 					return;
 					return;
 				}
 				}
+				if (this.shouldPausePointsCountdown) {
+					return;
+				}
 				// 如果倒计时已经在运行,先清除旧的定时器
 				// 如果倒计时已经在运行,先清除旧的定时器
 				if (this.countdownTimer) {
 				if (this.countdownTimer) {
 					clearInterval(this.countdownTimer);
 					clearInterval(this.countdownTimer);
@@ -2218,6 +2317,13 @@ import {
 				if (!this.liveItem) {
 				if (!this.liveItem) {
 					return;
 					return;
 				}
 				}
+				if (this.shouldPausePointsCountdown) {
+					if (this.countdownTimer) {
+						clearInterval(this.countdownTimer);
+						this.countdownTimer = null;
+					}
+					return;
+				}
 				//console.log("this.completionPointsEnabled",this.completionTime)
 				//console.log("this.completionPointsEnabled",this.completionTime)
 				this.completionTime = this.liveItem.duration * this.completionRate;
 				this.completionTime = this.liveItem.duration * this.completionRate;
 				//console.log("qxj watchDuration:"+this.watchDuration+" completionTime:"+this.completionTime+" pointsRemainingTime:"+this.pointsRemainingTime);
 				//console.log("qxj watchDuration:"+this.watchDuration+" completionTime:"+this.completionTime+" pointsRemainingTime:"+this.pointsRemainingTime);
@@ -2597,9 +2703,31 @@ import {
 			onXgVideoError(e) {
 			onXgVideoError(e) {
 				this.videoError(e || {}, this.liveItem);
 				this.videoError(e || {}, this.liveItem);
 			},
 			},
+			_armFullscreenToggleLock(ms = 1000) {
+				this.fullscreenToggleLock = true;
+				if (this.fullscreenToggleTimer) {
+					clearTimeout(this.fullscreenToggleTimer);
+				}
+				this.fullscreenToggleTimer = setTimeout(() => {
+					this.fullscreenToggleLock = false;
+					this.fullscreenToggleTimer = null;
+				}, ms);
+			},
+			armFullscreenToggleLockFromRender(e) {
+				const ms = e && e.ms != null ? Number(e.ms) : 1000;
+				this._armFullscreenToggleLock(ms);
+			},
+			_clearFullscreenToggleLock() {
+				if (this.fullscreenToggleTimer) {
+					clearTimeout(this.fullscreenToggleTimer);
+					this.fullscreenToggleTimer = null;
+				}
+				this.fullscreenToggleLock = false;
+			},
 			// 退出全屏
 			// 退出全屏
 			exitFullscreen() {
 			exitFullscreen() {
 				console.log('执行退出全屏');
 				console.log('执行退出全屏');
+				this._clearFullscreenToggleLock();
 				this.exitFullscreenSignal = 'yes' + new Date().getTime();
 				this.exitFullscreenSignal = 'yes' + new Date().getTime();
 				this.isFullscreen = false;
 				this.isFullscreen = false;
 				this.restoreVideoList();
 				this.restoreVideoList();
@@ -2701,6 +2829,8 @@ import {
 				const isLandscape = windowWidth > windowHeight;
 				const isLandscape = windowWidth > windowHeight;
 				if (this.isFullscreen) {
 				if (this.isFullscreen) {
 					if (!isLandscape) {
 					if (!isLandscape) {
+						// 小米等机型进入原生全屏时,旋转过渡期 window 尺寸会短暂仍为竖屏,勿立即退出
+						if (this.fullscreenToggleLock) return;
 						this.exitFullscreenSignal = 'yes' + new Date().getTime();
 						this.exitFullscreenSignal = 'yes' + new Date().getTime();
 						this.exitFullscreen();
 						this.exitFullscreen();
 					} else {
 					} else {
@@ -2726,6 +2856,7 @@ import {
 				if (this.isFullscreen) {
 				if (this.isFullscreen) {
 					this.exitFullscreen();
 					this.exitFullscreen();
 				} else {
 				} else {
+					this._armFullscreenToggleLock(1000);
 					this._lockAppLandscape();
 					this._lockAppLandscape();
 					this.fullscreenRequest = 'yes' + new Date().getTime();
 					this.fullscreenRequest = 'yes' + new Date().getTime();
 					this.enterFullscreen();
 					this.enterFullscreen();
@@ -2769,15 +2900,20 @@ import {
 				} else if (e && e.detail && typeof e.detail.fullscreen !== 'undefined') {
 				} else if (e && e.detail && typeof e.detail.fullscreen !== 'undefined') {
 					fullScreen = !!e.detail.fullscreen;
 					fullScreen = !!e.detail.fullscreen;
 				}
 				}
+				if (!fullScreen && this.fullscreenToggleLock) {
+					return;
+				}
 
 
 				this.isFullscreen = fullScreen;
 				this.isFullscreen = fullScreen;
 				this.showCustomControls = !this.isFullscreen;
 				this.showCustomControls = !this.isFullscreen;
 				this.$forceUpdate();
 				this.$forceUpdate();
 
 
 				if (this.isFullscreen) {
 				if (this.isFullscreen) {
+					this._armFullscreenToggleLock(1000);
 					this._lockAppLandscape();
 					this._lockAppLandscape();
 					this.hideNonVideoElements();
 					this.hideNonVideoElements();
 				} else {
 				} else {
+					this._armFullscreenToggleLock(400);
 					this._lockAppPortrait();
 					this._lockAppPortrait();
 					this.showNonVideoElements();
 					this.showNonVideoElements();
 				}
 				}
@@ -4411,6 +4547,7 @@ import {
 				this.isPreview = false;
 				this.isPreview = false;
 				this.isEnd = true;
 				this.isEnd = true;
 				this.generating = false;
 				this.generating = false;
+				this.stopCountdown();
 				if (this.liveStartTimer) {
 				if (this.liveStartTimer) {
 					clearInterval(this.liveStartTimer);
 					clearInterval(this.liveStartTimer);
 					this.liveStartTimer = null;
 					this.liveStartTimer = null;
@@ -5580,14 +5717,10 @@ import {
 						num: 1
 						num: 1
 					});
 					});
 					if (res.code !== 200) {
 					if (res.code !== 200) {
-						this.$refs.customToast.show({
-							title: res.msg || '该商品限购,目前剩余可购买数量不足',
-							duration: 2000
-						});
-						// uni.showToast({
-						// 	icon: 'none',
-						// 	title: res.msg || '该商品限购,目前剩余可购买数量不足'
-						// });
+							this.$refs.customToast.show({
+								title: res.msg || '该商品限购,目前剩余可购买数量不足',
+								duration: 2000
+							});
 						return;
 						return;
 					}
 					}
 					
 					
@@ -6264,6 +6397,7 @@ import {
 							}
 							}
 							if (socketMessage.cmd == 'live_end') {
 							if (socketMessage.cmd == 'live_end') {
 								this.hasLiveEnd = true;
 								this.hasLiveEnd = true;
+								this.stopCountdown();
 							}
 							}
 							//  请求最新直播间数据
 							//  请求最新直播间数据
 							this.$nextTick(() => {
 							this.$nextTick(() => {
@@ -6482,6 +6616,7 @@ import {
 <script module="xgplayer" lang="renderjs">
 <script module="xgplayer" lang="renderjs">
 	const XG_SCRIPT = 'https://unpkg.byted-static.com/xgplayer/3.0.20/dist/index.min.js';
 	const XG_SCRIPT = 'https://unpkg.byted-static.com/xgplayer/3.0.20/dist/index.min.js';
 	const XG_CSS = 'https://unpkg.byted-static.com/xgplayer/3.0.20/dist/index.min.css';
 	const XG_CSS = 'https://unpkg.byted-static.com/xgplayer/3.0.20/dist/index.min.css';
+	const XG_HLS_SCRIPT = 'https://unpkg.byted-static.com/xgplayer-hls/3.0.20/dist/index.min.js';
 
 
 	export default {
 	export default {
 		data() {
 		data() {
@@ -6531,6 +6666,85 @@ import {
 				}
 				}
 				return document.querySelector('.video-container') || document.body;
 				return document.querySelector('.video-container') || document.body;
 			},
 			},
+			_isHlsUrl(url) {
+				if (!url || typeof url !== 'string') return false;
+				const path = url.split('?')[0].split('#')[0].toLowerCase();
+				return path.endsWith('.m3u8') || path.endsWith('.m3u') ||
+					url.toLowerCase().indexOf('mpegurl') > -1;
+			},
+			_canNativeHls() {
+				try {
+					const video = document.createElement('video');
+					return !!video.canPlayType('application/vnd.apple.mpegurl') ||
+						!!video.canPlayType('application/x-mpegURL');
+				} catch (e) {
+					return false;
+				}
+			},
+			_needsHlsPlugin(url) {
+				return this._isHlsUrl(url) && !this._canNativeHls();
+			},
+			_ensureHlsPlugin(callback) {
+				if (window.HlsPlugin) {
+					callback();
+					return;
+				}
+				const existing = document.querySelector('script[data-xg-hls-js]');
+				if (existing) {
+					const waitForPlugin = (attempt = 0) => {
+						if (window.HlsPlugin || attempt >= 50) {
+							callback();
+							return;
+						}
+						setTimeout(() => waitForPlugin(attempt + 1), 100);
+					};
+					waitForPlugin();
+					return;
+				}
+				const script = document.createElement('script');
+				script.src = XG_HLS_SCRIPT;
+				script.setAttribute('data-xg-hls-js', '1');
+				script.onload = callback;
+				script.onerror = callback;
+				document.head.appendChild(script);
+			},
+			_ensurePlayerAssets(url, callback) {
+				const runAfterPlayer = () => {
+					if (this._needsHlsPlugin(url)) {
+						this._ensureHlsPlugin(callback);
+					} else {
+						callback();
+					}
+				};
+				if (typeof window.Player === 'function') {
+					runAfterPlayer();
+					return;
+				}
+				const script = document.createElement('script');
+				script.src = XG_SCRIPT;
+				script.onload = runAfterPlayer;
+				script.onerror = runAfterPlayer;
+				document.head.appendChild(script);
+				if (!document.querySelector('link[data-xg-live-css]')) {
+					const link = document.createElement('link');
+					link.rel = 'stylesheet';
+					link.href = XG_CSS;
+					link.setAttribute('data-xg-live-css', '1');
+					document.body.appendChild(link);
+				}
+			},
+			_buildPlayerPlugins(url) {
+				const plugins = [];
+				if (!this._needsHlsPlugin(url) || !window.HlsPlugin) {
+					return plugins;
+				}
+				if (typeof window.HlsPlugin.isSupported === 'function' &&
+					!window.HlsPlugin.isSupported()) {
+					return plugins;
+				}
+				plugins.push(window.HlsPlugin);
+				return plugins;
+			},
 			_ensureXgVideoStyles() {
 			_ensureXgVideoStyles() {
 				if (document.querySelector('style[data-xg-live-video-fix]')) return;
 				if (document.querySelector('style[data-xg-live-video-fix]')) return;
 				const style = document.createElement('style');
 				const style = document.createElement('style');
@@ -6590,27 +6804,12 @@ import {
 					}
 					}
 					return;
 					return;
 				}
 				}
-				const bootstrap = () => {
+				this._ensurePlayerAssets(newValue.url, () => {
 					this._ensureXgVideoStyles();
 					this._ensureXgVideoStyles();
 					this._waitForPlayerDom(newValue.playerId || 'live-detail-video', () => {
 					this._waitForPlayerDom(newValue.playerId || 'live-detail-video', () => {
 						this.initPlayer(newValue, oldValue, ownerInstance);
 						this.initPlayer(newValue, oldValue, ownerInstance);
 					});
 					});
-				};
-				if (typeof window.Player === 'function') {
-					bootstrap();
-					return;
-				}
-				const script = document.createElement('script');
-				script.src = XG_SCRIPT;
-				script.onload = bootstrap;
-				document.head.appendChild(script);
-				if (!document.querySelector('link[data-xg-live-css]')) {
-					const link = document.createElement('link');
-					link.rel = 'stylesheet';
-					link.href = XG_CSS;
-					link.setAttribute('data-xg-live-css', '1');
-					document.body.appendChild(link);
-				}
+				});
 			},
 			},
 			_waitForPlayerDom(playerId, callback, attempt = 0) {
 			_waitForPlayerDom(playerId, callback, attempt = 0) {
 				const el = document.getElementById(playerId);
 				const el = document.getElementById(playerId);
@@ -6684,12 +6883,13 @@ import {
 
 
 				const playerId = newValue.playerId || 'live-detail-video';
 				const playerId = newValue.playerId || 'live-detail-video';
 				const fit = newValue.objectFit === 'contain' ? 'contain' : 'fill';
 				const fit = newValue.objectFit === 'contain' ? 'contain' : 'fill';
-				const isLiveMode = newValue.mode === 'live' || newValue.mode === 'preview';
+				// 预告为点播 m3u8/mp4,仅录播进行中按直播 UI 隐藏进度条
+				const isLiveMode = newValue.mode === 'live';
 				const hideControls = !!newValue.hideControls;
 				const hideControls = !!newValue.hideControls;
 				const hidePlayBtn = newValue.mode === 'live';
 				const hidePlayBtn = newValue.mode === 'live';
 				const allowFullscreen = newValue.showType === 1 && (newValue.mode === 'live' || newValue.mode === 'replay');
 				const allowFullscreen = newValue.showType === 1 && (newValue.mode === 'live' || newValue.mode === 'replay');
 				const ignores = ['volume', 'miniscreen', 'keyboard', 'playbackrate'];
 				const ignores = ['volume', 'miniscreen', 'keyboard', 'playbackrate'];
-				if (isLiveMode) {
+				if (isLiveMode || newValue.mode === 'preview') {
 					ignores.push('progress', 'time');
 					ignores.push('progress', 'time');
 				}
 				}
 				if (hidePlayBtn) {
 				if (hidePlayBtn) {
@@ -6709,10 +6909,12 @@ import {
 					oldValue.mountKey !== newValue.mountKey ||
 					oldValue.mountKey !== newValue.mountKey ||
 					oldValue.liveStatus !== newValue.liveStatus
 					oldValue.liveStatus !== newValue.liveStatus
 				);
 				);
-				if (needRecreate) {
+				const needsHlsPlugin = this._needsHlsPlugin(newValue.url);
+				if (needRecreate || needsHlsPlugin) {
 					this._destroyPlayer();
 					this._destroyPlayer();
 				}
 				}
 				const fsTarget = this._getFullscreenTarget(playerId);
 				const fsTarget = this._getFullscreenTarget(playerId);
+				const plugins = this._buildPlayerPlugins(newValue.url);
 				const option = {
 				const option = {
 					lang: 'zh',
 					lang: 'zh',
 					url: newValue.url,
 					url: newValue.url,
@@ -6745,6 +6947,10 @@ import {
 						disable: true
 						disable: true
 					}
 					}
 				};
 				};
+				if (plugins.length) {
+					option.plugins = plugins;
+					option.isLive = false;
+				}
 
 
 				if (this.player) {
 				if (this.player) {
 					this.player.loop = !!newValue.loop;
 					this.player.loop = !!newValue.loop;
@@ -6818,6 +7024,9 @@ import {
 				});
 				});
 				this.player.on(Events.FULLSCREEN_CHANGE, (isFullscreen) => {
 				this.player.on(Events.FULLSCREEN_CHANGE, (isFullscreen) => {
 					if (this.isFullscreen == isFullscreen) return;
 					if (this.isFullscreen == isFullscreen) return;
+					if (isFullscreen) {
+						this.ownerInstance.callMethod('armFullscreenToggleLockFromRender', { ms: 1000 });
+					}
 					this.isFullscreen = isFullscreen;
 					this.isFullscreen = isFullscreen;
 					// #ifdef APP-PLUS
 					// #ifdef APP-PLUS
 					try {
 					try {
@@ -6834,6 +7043,9 @@ import {
 				});
 				});
 				this.player.on(Events.CSS_FULLSCREEN_CHANGE, (isFullscreen) => {
 				this.player.on(Events.CSS_FULLSCREEN_CHANGE, (isFullscreen) => {
 					if (this.isFullscreen == isFullscreen) return;
 					if (this.isFullscreen == isFullscreen) return;
+					if (isFullscreen) {
+						this.ownerInstance.callMethod('armFullscreenToggleLockFromRender', { ms: 1000 });
+					}
 					this.isCSSFull = true;
 					this.isCSSFull = true;
 					this.isFullscreen = isFullscreen;
 					this.isFullscreen = isFullscreen;
 					// #ifdef APP-PLUS
 					// #ifdef APP-PLUS
@@ -6862,6 +7074,7 @@ import {
 			requestFullscreen(newValue, oldValue, ownerInstance) {
 			requestFullscreen(newValue, oldValue, ownerInstance) {
 				if (!this.ownerInstance) this.ownerInstance = ownerInstance;
 				if (!this.ownerInstance) this.ownerInstance = ownerInstance;
 				if (this.player && newValue && newValue.indexOf('yes') > -1) {
 				if (this.player && newValue && newValue.indexOf('yes') > -1) {
+					this.ownerInstance.callMethod('armFullscreenToggleLockFromRender', { ms: 1000 });
 					// #ifdef APP-PLUS
 					// #ifdef APP-PLUS
 					try {
 					try {
 						plus.screen.lockOrientation('landscape-primary');
 						plus.screen.lockOrientation('landscape-primary');
@@ -7143,6 +7356,10 @@ import {
 		transform: rotate(90deg) !important;
 		transform: rotate(90deg) !important;
 		transform-origin: center center !important;
 		transform-origin: center center !important;
 
 
+		&.horizontal-layout {
+			transform: none !important;
+		}
+
 		// .video-player {
 		// .video-player {
 		// 	width: 100vh !important;
 		// 	width: 100vh !important;
 		// 	height: 100vw !important;
 		// 	height: 100vw !important;
@@ -7293,6 +7510,13 @@ import {
 		right: auto;
 		right: auto;
 	}
 	}
 
 
+	.cover-progress-countdown--horizontal {
+		//position: fixed;
+		//top: auto;
+		bottom: 50% !important;
+		z-index: 10001;
+	}
+
 	.cover-progress-title {
 	.cover-progress-title {
 		width: 148rpx;
 		width: 148rpx;
 		height: 28rpx;
 		height: 28rpx;
@@ -7601,6 +7825,7 @@ import {
 		left: 0;
 		left: 0;
 		bottom: 0;
 		bottom: 0;
 		width: 100%;
 		width: 100%;
+		height: auto;
 		padding: 24rpx;
 		padding: 24rpx;
 		display: flex;
 		display: flex;
 		flex-direction: row;
 		flex-direction: row;
@@ -8069,7 +8294,7 @@ import {
 
 
 
 
 				&.horizontal-content {
 				&.horizontal-content {
-					z-index: 999;
+					//z-index: 999;
 				}
 				}
 
 
 				&.trailer-content {
 				&.trailer-content {

+ 1 - 1
pages_live/shopping/confirmCreateOrder.vue

@@ -510,7 +510,7 @@
 					} else {
 					} else {
 						orderList = await this.createLiveOrder(); // 购买订单
 						orderList = await this.createLiveOrder(); // 购买订单
 					}
 					}
-					console.log("orderList>>", orderList)
+					// console.log("orderList>>", orderList)
 					// 跳转到支付页面
 					// 跳转到支付页面
 					uni.redirectTo({
 					uni.redirectTo({
 						url: `/pages/shopping/paymentOrder?orderId=${orderList.id}`,
 						url: `/pages/shopping/paymentOrder?orderId=${orderList.id}`,

+ 3 - 2
pages_live/shopping/goods.vue

@@ -52,7 +52,7 @@
 		<view class="det-box">
 		<view class="det-box">
 			<view class="title">图文详情</view>
 			<view class="title">图文详情</view>
 			<view class="inner">
 			<view class="inner">
-				<view v-html="goosDetail.description" style="font-size:0"></view>
+				<view v-if="goosDetail && goosDetail.description" v-html="goosDetail.description" style="font-size:0"></view>
 			</view>
 			</view>
 		</view>
 		</view>
 		<!-- 底部按钮 -->
 		<!-- 底部按钮 -->
@@ -66,7 +66,7 @@
 
 
 		<!-- 选择产品规格弹窗 -->
 		<!-- 选择产品规格弹窗 -->
 		<popupBottom ref="popup" :visible.sync="specVisible" title=" " radius="32" maxHeight="1024">
 		<popupBottom ref="popup" :visible.sync="specVisible" title=" " radius="32" maxHeight="1024">
-			<view class="product-spec">
+			<view class="product-spec" v-if="goosDetail">
 				<view class="pro-info">
 				<view class="pro-info">
 					<view class="img-box">
 					<view class="img-box">
 						<!-- 这里应该显示当前选择规格的图片 -->
 						<!-- 这里应该显示当前选择规格的图片 -->
@@ -742,6 +742,7 @@
 			}
 			}
 
 
 			.info-text {
 			.info-text {
+				width: calc(100% - 230rpx);
 				height: 200upx;
 				height: 200upx;
 				display: flex;
 				display: flex;
 				flex-direction: column;
 				flex-direction: column;

+ 8 - 4
pages_live/shopping/paymentOrder.vue

@@ -24,7 +24,7 @@
 						</label>
 						</label>
 					</view>
 					</view>
 					<!-- #ifdef APP-PLUS||H5 -->
 					<!-- #ifdef APP-PLUS||H5 -->
-					<view class="item">
+					<!-- <view class="item">
 						<view class="left">
 						<view class="left">
 							<image src="/static/images/zfb.png" mode=""></image>
 							<image src="/static/images/zfb.png" mode=""></image>
 							<text class="text">支付宝</text>
 							<text class="text">支付宝</text>
@@ -32,7 +32,7 @@
 						<label>
 						<label>
 							<radio :value="3" :checked="payType === 3" />
 							<radio :value="3" :checked="payType === 3" />
 						</label>
 						</label>
-					</view>
+					</view> -->
 					<!-- #endif -->
 					<!-- #endif -->
 				</radio-group>
 				</radio-group>
 			</view>
 			</view>
@@ -113,7 +113,10 @@
 				return this.order?.updateTime ?
 				return this.order?.updateTime ?
 					dayjs(this.order.updateTime).add(2, 'day').format('YYYY-MM-DD HH:mm:ss') :
 					dayjs(this.order.updateTime).add(2, 'day').format('YYYY-MM-DD HH:mm:ss') :
 					'';
 					'';
-			}
+			},
+			appid() {
+				return this.$store.state.appid
+			},
 		},
 		},
 		onLoad(options) {
 		onLoad(options) {
 			// if (options.payPrice) {
 			// if (options.payPrice) {
@@ -384,7 +387,8 @@
 			},
 			},
 			toPayConfirmReward() {
 			toPayConfirmReward() {
 				let data = {
 				let data = {
-					orderId: this.order.orderId
+					orderId: this.order.id,
+					appId:this.appid
 				}
 				}
 				payConfirmReward(data).then(
 				payConfirmReward(data).then(
 					res => {
 					res => {

+ 31 - 31
pages_mall/api/course.js

@@ -2,27 +2,27 @@ import Request from '@/common/request.js';
 let request = new Request().http
 let request = new Request().http
 
 
 export function loginByMp(data) {
 export function loginByMp(data) {
- 	 return request('/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	 return request('/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
 
 
 // 获取真实链接
 // 获取真实链接
 export function getRealLink(data) {
 export function getRealLink(data) {
-	return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getRealLink', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
 // h5课程简介
 // h5课程简介
 export function getH5CourseByVideoId(data) {
 export function getH5CourseByVideoId(data) {
-	return request('/app/course/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getH5CourseByVideoId', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
 // h5课程详情加问答
 // h5课程详情加问答
 export function getH5CourseVideoDetails(data) {
 export function getH5CourseVideoDetails(data) {
-	return request('/app/course/getH5CourseVideoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getH5CourseVideoDetails', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
 // 答题发红包
 // 答题发红包
 export function courseAnswer(data) {
 export function courseAnswer(data) {
-	return request('/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // // 记录看课时间(旧)
 // // 记录看课时间(旧)
@@ -32,95 +32,95 @@ export function courseAnswer(data) {
 
 
 // 记录看课时间(新)
 // 记录看课时间(新)
 export function getFinishCourseVideo(data) {
 export function getFinishCourseVideo(data) {
-	return request('/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 关注客服
 // 关注客服
 export function getIsAddKf(data) {
 export function getIsAddKf(data) {
-	return request('/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 流量(缓冲百分比)
 // 流量(缓冲百分比)
 export function internetTraffic(data) {
 export function internetTraffic(data) {
-	return request('/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 每十分钟获得福币
 // 每十分钟获得福币
 export function getIntegralByH5Video(data) {
 export function getIntegralByH5Video(data) {
-	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 发送奖励
 // 发送奖励
 export function sendReward(data) {
 export function sendReward(data) {
-	return request('/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
 }
 }
 
 
 // 播放错误上报
 // 播放错误上报
 export function getErrMsg(data) {
 export function getErrMsg(data) {
-	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://userapp.klbycp.com');
 }
 }
 
 
 
 
 // 获取getWxConfig
 // 获取getWxConfig
 export function getWxConfig(data) {
 export function getWxConfig(data) {
-	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://h5api.his.cdwjyyh.com');
+	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://userapp.klbycp.com');
 }
 }
 
 
  //获取弹幕列表
  //获取弹幕列表
  export function getDanmuList(videoId) {
  export function getDanmuList(videoId) {
- 	 return request('/barrage/barrage/list/'+videoId,null,'GET','','https://h5api.his.cdwjyyh.com');
+ 	 return request('/barrage/barrage/list/'+videoId,null,'GET','','https://userapp.klbycp.com');
  }
  }
  
  
  // 保存评论数据
  // 保存评论数据
  export function saveMsg(data, type) {
  export function saveMsg(data, type) {
- 	return request('/app/course/saveMsg', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/saveMsg', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
  
  
  // 撤销评论
  // 撤销评论
  export function revokeMsg(data, type) {
  export function revokeMsg(data, type) {
- 	return request('/app/course/revokeMsg', data, 'PUT', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/revokeMsg', data, 'PUT', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
  
  
  // 获取历史评论数据
  // 获取历史评论数据
  export function getComments(data, type) {
  export function getComments(data, type) {
- 	return request('/app/course/getComments', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/getComments', data, 'GET','','https://userapp.klbycp.com');
  }
  }
  
  
  // 错误日志未知异常,请联系管理员
  // 错误日志未知异常,请联系管理员
  export function errorLogUpload(data, type) {
  export function errorLogUpload(data, type) {
- 	return request('/app/common/errorLogUpload', data, 'POST','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/common/errorLogUpload', data, 'POST','','https://userapp.klbycp.com');
  }
  }
  
  
  export function getTypeTree(data, type) {
  export function getTypeTree(data, type) {
- 	return request('/app/user/complaint/getTypeTree', null, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/user/complaint/getTypeTree', null, 'GET','','https://userapp.klbycp.com');
  }
  }
  export function complaintRecord(data, type) {
  export function complaintRecord(data, type) {
- 	return request('/app/user/complaint/record', data, 'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/user/complaint/record', data, 'POST','application/json;charset=UTF-8','https://userapp.klbycp.com');
  }
  }
  
  
  
  
  export function loginSaleByMp(data) {
  export function loginSaleByMp(data) {
-  	 return request('/app/wx/courseLogin2',data,'POST','application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+  	 return request('/app/wx/courseLogin2',data,'POST','application/json;charset=UTF-8','https://userapp.klbycp.com');
   }
   }
  
  
  // 获取真实链接
  // 获取真实链接
  export function getSaleRealLink(data) {
  export function getSaleRealLink(data) {
- 	return request('/app/course/getRealLink', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/course/getRealLink', data, 'GET','','https://userapp.klbycp.com');
  }
  }
  
  
  // h5课程简介
  // h5课程简介
  // export function getH5CourseByVideoId(data) {
  // export function getH5CourseByVideoId(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://userapp.klbycp.com');
  // }
  // }
  
  
  // h5课程详情加问答
  // h5课程详情加问答
  // export function getH5CourseVideoDetails(data) {
  // export function getH5CourseVideoDetails(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://userapp.klbycp.com');
  // }
  // }
  
  
  // 答题发红包
  // 答题发红包
  // export function courseAnswer(data) {
  // export function courseAnswer(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 记录看课时间(旧)
  // // 记录看课时间(旧)
@@ -130,38 +130,38 @@ export function getWxConfig(data) {
  
  
  // 记录看课时间(新)
  // 记录看课时间(新)
  // export function getFinishCourseVideo(data) {
  // export function getFinishCourseVideo(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 关注客服 是否添加客服
  // // 关注客服 是否添加客服
  // export function getIsAddKf(data) {
  // export function getIsAddKf(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 流量(缓冲百分比)
  // // 流量(缓冲百分比)
  // export function getInternetTraffic(data) {
  // export function getInternetTraffic(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 每十分钟获得福币
  // // 每十分钟获得福币
  // export function getIntegralByH5Video(data) {
  // export function getIntegralByH5Video(data) {
- // 	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 发送奖励
  // // 发送奖励
  // export function sendReward(data) {
  // export function sendReward(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/sendReward', data, 'POST', 'application/json;charset=UTF-8','https://userapp.klbycp.com');
  // }
  // }
  
  
  // // 播放错误上报
  // // 播放错误上报
  // export function getErrMsg(data) {
  // export function getErrMsg(data) {
- // 	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+ // 	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://userapp.klbycp.com');
  // }
  // }
  
  
  
  
  // 获取getWxConfig
  // 获取getWxConfig
  export function getSaleWxConfig(data) {
  export function getSaleWxConfig(data) {
- 	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://h5api.his.cdwjyyh.com');
+ 	return request('/app/wx/mp/getWxConfig', data, 'GET','','https://userapp.klbycp.com');
  }
  }
  
  
   //微信小程序登录
   //微信小程序登录

+ 1 - 1
pages_mall/my.vue

@@ -159,7 +159,7 @@
 				toolMenu: [{
 				toolMenu: [{
 						name: '收货地址',
 						name: '收货地址',
 						icon: '/static/image/my/address_management_icon.png',
 						icon: '/static/image/my/address_management_icon.png',
-						url: '/pages/user/address'
+						url: '/pages_user/user/address'
 					},
 					},
 					{
 					{
 						name: '积分商城',
 						name: '积分商城',

+ 2 - 2
pages_mall/paymentOrder.vue

@@ -232,10 +232,10 @@
 	import {
 	import {
 		H5WxPayment
 		H5WxPayment
 	} from '@/api/packageOrder'
 	} from '@/api/packageOrder'
-	import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
+	//import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	export default {
 	export default {
 		components: {
 		components: {
-			ykscreenRecord
+			//ykscreenRecord
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {

+ 21 - 1
pages_user/user/addAddress.vue

@@ -50,7 +50,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-	import {parseAddress,getCity,getCitys,getAddressById,addAddress,editAddress} from '@/api/address'
+	import {parseAddress,getCity,getCitys,getAddressById,addAddress,editAddress,getCityId} from '@/api/address'
 	import EvanSwitch from '@/components/evan-switch/evan-switch.vue'
 	import EvanSwitch from '@/components/evan-switch/evan-switch.vue'
 	export default {
 	export default {
 		components: {
 		components: {
@@ -143,6 +143,7 @@
 							this.form.city=res.data.cityName
 							this.form.city=res.data.cityName
 							this.form.district=res.data.expAreaName
 							this.form.district=res.data.expAreaName
 							this.form.detail=res.data.streetName+res.data.address
 							this.form.detail=res.data.streetName+res.data.address
+							this.getCityId(this.form.province,this.form.city,this.form.district)
 						}else{
 						}else{
 							uni.showToast({
 							uni.showToast({
 								icon:'none',
 								icon:'none',
@@ -153,6 +154,25 @@
 					rej => {}
 					rej => {}
 				);
 				);
 			},
 			},
+			// 获得cityId
+			getCityId(province, city, district) {
+				getCityId({
+					province: province,
+					city: city,
+					district: district
+				}).then(res => {
+						if (res.code == 200) {
+							this.form.cityId = res.cityId
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
 			getAddressById(){
 			getAddressById(){
 				var data={id:this.id};
 				var data={id:this.id};
 				getAddressById(data).then(
 				getAddressById(data).then(

+ 103 - 71
pages_user/user/refundOrder.vue

@@ -1,10 +1,10 @@
 <template>
 <template>
 	<view class="content">
 	<view class="content">
 		<view class="inner">
 		<view class="inner">
-			<!-- 品列表 -->
+			<!-- 品列表 -->
 			<view class="drug-list">
 			<view class="drug-list">
 				<view  class="item">
 				<view  class="item">
-					<!-- 品信息 -->
+					<!-- 品信息 -->
 					<!-- <view v-if="order!=null&&order.isPackage!=1" class="drug-info" v-for="(item,index) in items" :key="index"> -->
 					<!-- <view v-if="order!=null&&order.isPackage!=1" class="drug-info" v-for="(item,index) in items" :key="index"> -->
 					<view class="drug-info" v-for="(item,index) in items" :key="index">
 					<view class="drug-info" v-for="(item,index) in items" :key="index">
 						<view class="img-box">
 						<view class="img-box">
@@ -51,7 +51,7 @@
 					<picker @change="reasonsChange" :value="reasons"  range-key="dictLabel" :range="reasonsList">
 					<picker @change="reasonsChange" :value="reasons"  range-key="dictLabel" :range="reasonsList">
 						<view class="chose-box"  >
 						<view class="chose-box"  >
 							<text class="text">{{reasons}}</text>
 							<text class="text">{{reasons}}</text>
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow_gray.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png" mode=""></image>
 						</view>
 						</view>
 					</picker>
 					</picker>
 				</view>
 				</view>
@@ -105,29 +105,47 @@
 			}
 			}
 		},
 		},
 		onLoad(option) {
 		onLoad(option) {
-			console.log(option);
-			this.type=option.type;
-			this.orderCode=option.orderCode;
-			this.items=uni.getStorageSync('refundItems')
-			console.log(uni.getStorageSync('refundItems'))
-			console.log(JSON.parse(this.items[0].jsonInfo));
-			this.reasonsList=this.$getDict("storeAfterSalesReasons");
-			this.orderId=option.orderId;
-			// this.getMyStoreOrderItemByOrderId()
+		  //console.log(option);
+		  this.type = option.type;
+		  this.orderCode = option.orderCode;
+		  
+		  // 统一在 onLoad 中解析数据
+		  try {
+		    // 如果 option.items 是字符串,解析为数组
+		    if (typeof option.items === 'string') {
+		      this.items = JSON.parse(option.items);
+		    } else {
+		      this.items = option.items || [];
+		    }
+		    //console.log("解析后的 items:", this.items);
+		  } catch (e) {
+		    console.error('解析 items 失败:', e);
+		    this.items = [];
+		  }
+		  
+		  this.reasonsList = this.$getDict("storeAfterSalesReasons");
+		  this.orderId = option.orderId;
 		},
 		},
-		computed:{
-			refundAmount(){
-				const counts = this.items.map(item=> {
-					return{
-						...item,
-						price:JSON.parse(item.jsonInfo).price*item.num
-						}
-					}
-				);
-				const count = counts.reduce((accumulator, item) => accumulator + item.price, 0);
-				console.log(count)
-				return count
-			}
+		computed: {
+		  refundAmount(){
+		    if(!this.items || !Array.isArray(this.items)) return 0;
+		    
+		    const total = this.items.reduce((sum, item) => {
+		      try {
+		        // 确保 jsonInfo 是对象,如果是字符串则解析
+		        const jsonInfo = typeof item.jsonInfo === 'string' 
+		          ? JSON.parse(item.jsonInfo) 
+		          : item.jsonInfo;
+		        return sum + (jsonInfo.price || 0) * (item.num || 0);
+		      } catch (e) {
+		        console.error('解析 jsonInfo 失败:', e);
+		        return sum;
+		      }
+		    }, 0);
+		    
+		    console.log('退款金额:', total);
+		    return total;
+		  }
 		},
 		},
 		methods: {
 		methods: {
 			getMyStoreOrderItemByOrderId(){
 			getMyStoreOrderItemByOrderId(){
@@ -152,55 +170,69 @@
 				});
 				});
 			},
 			},
 			reasonsChange(e) {
 			reasonsChange(e) {
-				console.log(e.detail.value)
+				const index = e.detail.value;
+				  // 🔥 安全判断:必须有值、必须在数组范围内
+				  if (index === undefined || !this.reasonsList || !this.reasonsList[index]) {
+				    this.reasons = "请选择";
+				    return;
+				  }
 				this.reasons = this.reasonsList[e.detail.value].dictLabel
 				this.reasons = this.reasonsList[e.detail.value].dictLabel
 			},
 			},
 			submit(){
 			submit(){
-				if(this.reasons=="请选择"){
-					uni.showToast({
-						icon:'none',
-						title: '请选择原因'
-					});
-					return;
-				}
-				if(this.refundAmount<0){
-					uni.showToast({
-						icon:'none',
-						title: '请输入退款金额'
-					});
-					return;
-				}
-				 
-				var productIds=this.items.map(item=>item.productId);
-				var nums=this.items.map(item=>item.num);
-				var products=[];
-				for(var i=0;i<productIds.length;i++){
-					var item={productId:productIds[i],num:nums[i]};
-					products.push(item);
-				}
-				var data={refundAmount:this.refundAmount,orderCode:this.orderCode,serviceType:this.type,reasons:this.reasons,explains:this.explains,productList:products};
-				applyAfterSales(data).then(res => {
-					if(res.code==200){
-						 uni.showToast({
-						 	icon:'success',
-						 	title:'提交成功'
-						 });
-						 setTimeout(function() {
-							 uni.$emit('refreshOrder');
-							 uni.navigateBack({
-								 delta: 1
-							 })
-						 }, 500);
-						 
-					}else{
-						uni.showToast({
-							icon:'none',
-							title: res.msg
-						});
-						 
-					}
-				});
-			},
+			    if(this.reasons == "请选择"){
+			      uni.showToast({
+			        icon: 'none',
+			        title: '请选择原因'
+			      });
+			      return;
+			    }
+			    
+			    // 直接使用 this.items,因为已经在 onLoad 中解析过了
+			    if (!Array.isArray(this.items)) {
+			      uni.showToast({
+			        icon: 'none',
+			        title: '商品数据异常'
+			      });
+			      return;
+			    }
+			    
+			    var productIds = this.items.map(item => item.productId);
+			    var nums = this.items.map(item => item.num);
+			    var products = [];
+			    for(var i = 0; i < productIds.length; i++){
+			      var item = {productId: productIds[i], num: nums[i]};
+			      products.push(item);
+			    }
+			    
+			    var data = {
+			      refundAmount: this.refundAmount, 
+			      orderCode: this.orderCode, 
+			      serviceType: this.type, 
+			      reasons: this.reasons, 
+			      explains: this.explains, 
+			      productList: products
+			    };
+			    
+			    applyAfterSales(data).then(res => {
+			      if(res.code == 200){
+			        uni.showToast({
+			          icon: 'success',
+			          title: '提交成功'
+			        });
+			        setTimeout(function() {
+			          uni.$emit('refreshOrder');
+			          uni.navigateBack({
+			            delta: 1
+			          })
+			        }, 500);
+			      } else {
+			        uni.showToast({
+			          icon: 'none',
+			          title: res.msg
+			        });
+			      }
+			    });
+			  },
 		}
 		}
 	}
 	}
 </script>
 </script>

+ 2 - 2
pages_user/user/refundOrderList.vue

@@ -90,7 +90,7 @@
 
 
 <script>
 <script>
 	import {
 	import {
-		getAfterSalesList
+		getStoreAfterSalesList
 	} from '@/api/storeAfterSales.js'
 	} from '@/api/storeAfterSales.js'
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	// import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	// import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
@@ -164,7 +164,7 @@
 					page: page.num,
 					page: page.num,
 					pageSize: page.size
 					pageSize: page.size
 				};
 				};
-				getAfterSalesList(data).then(res => {
+				getStoreAfterSalesList(data).then(res => {
 					if (res.code == 200) {
 					if (res.code == 200) {
 						//设置列表数据
 						//设置列表数据
 						if (page.num == 1) {
 						if (page.num == 1) {

+ 105 - 78
pages_user/user/refundOrderProduct.vue

@@ -3,10 +3,14 @@
 		<view class="inner">
 		<view class="inner">
 			<view class="goods-list">
 			<view class="goods-list">
 				<view v-if="order!=null&&order.isPackage!=1" class="item" v-for="(item,index) in items" :key="index">
 				<view v-if="order!=null&&order.isPackage!=1" class="item" v-for="(item,index) in items" :key="index">
-					<label style="margin-right: 30upx;">
+					<!-- <label style="margin-right: 30upx;">
 						<checkbox :value="item.checked"  :checked="item.checked" @click="checkChange(item)" />
 						<checkbox :value="item.checked"  :checked="item.checked" @click="checkChange(item)" />
-					</label>
+					</label> -->
+					<!-- <u-checkbox v-model="item.checked" @change="checkChange(item)" :name="item.id" size="36"
+						active-color="#007AFF" style="margin-right: 30upx;"></u-checkbox> -->
+						
 					<image class="goods-img" :src="JSON.parse(item.jsonInfo).image" mode="aspectFit"></image>
 					<image class="goods-img" :src="JSON.parse(item.jsonInfo).image" mode="aspectFit"></image>
+
 					<view class="info">
 					<view class="info">
 						<view class="top">
 						<view class="top">
 							<view class="title ellipsis2">{{ JSON.parse(item.jsonInfo).productName}}</view>
 							<view class="title ellipsis2">{{ JSON.parse(item.jsonInfo).productName}}</view>
@@ -18,13 +22,12 @@
 								<text class="price">{{JSON.parse(item.jsonInfo).price.toFixed(2)}}</text>
 								<text class="price">{{JSON.parse(item.jsonInfo).price.toFixed(2)}}</text>
 							</view>
 							</view>
 							<!-- <view class="num">x{{JSON.parse(item.jsonInfo).num}}</view> -->
 							<!-- <view class="num">x{{JSON.parse(item.jsonInfo).num}}</view> -->
-							<u-number-box v-model="item.num" 
-							@change="e=>valChange(e.value,item.num)" 
-							:min="1" :max="item.num"></u-number-box>
+							<u-number-box v-model="item.num" @change="e=>valChange(e.value,item.num)" :min="1"
+								:max="item.num"></u-number-box>
 						</view>
 						</view>
 					</view>
 					</view>
 				</view>
 				</view>
-				<view  v-if="order!=null&&order.isPackage==1&&order.packageJson!=null"   class="item">
+				<view v-if="order!=null&&order.isPackage==1&&order.packageJson!=null" class="item">
 					<image class="goods-img" :src="JSON.parse(order.packageJson).imgUrl" mode="aspectFit"></image>
 					<image class="goods-img" :src="JSON.parse(order.packageJson).imgUrl" mode="aspectFit"></image>
 					<view class="info">
 					<view class="info">
 						<view class="top">
 						<view class="top">
@@ -34,91 +37,95 @@
 							<view class="spec">{{JSON.parse(order.packageJson).descs}}</view>
 							<view class="spec">{{JSON.parse(order.packageJson).descs}}</view>
 						</view>
 						</view>
 					</view>
 					</view>
-					 
+
 				</view>
 				</view>
 			</view>
 			</view>
-			 
+
 		</view>
 		</view>
 		<!-- 底部按钮 -->
 		<!-- 底部按钮 -->
 		<view class="btn-box">
 		<view class="btn-box">
 			<view class="text">提交申请后,客服会与您电话沟通,请保持手机通畅</view>
 			<view class="text">提交申请后,客服会与您电话沟通,请保持手机通畅</view>
 			<view class="btns">
 			<view class="btns">
-				 <view class="left"></view>
+				<view class="left"></view>
 				<view class="right">
 				<view class="right">
-					<view  class="btn cancel" v-if="order.status==1 || order.status==2" @click="submit(0)" >仅退款</view>
-					<view  class="btn cancel" v-if="order.status==3||order.status==4" @click="submit(1)"  >退款退货</view>
+					<view class="btn cancel" v-if="order.status==1 || order.status==2" @click="submit(0)">仅退款</view>
+					<view class="btn cancel" v-if="order.status==3||order.status==4" @click="submit(1)">退款退货</view>
 				</view>
 				</view>
-				
+
 			</view>
 			</view>
-		
+
 		</view>
 		</view>
-	 
+
 	</view>
 	</view>
 </template>
 </template>
 
 
 <script>
 <script>
-	import {getMyStoreOrderItemByOrderId,applyAfterSales} from '@/api/storeAfterSales'
+	import {
+		getMyStoreOrderItemByOrderId,
+		applyAfterSales
+	} from '@/api/storeAfterSales'
 	export default {
 	export default {
-		 
+
 		data() {
 		data() {
 			return {
 			return {
-				order:null,
-				items:[],
-				 
+				order:{},
+				items: [],
+
 			}
 			}
 		},
 		},
 		onLoad(option) {
 		onLoad(option) {
-			this.orderId=option.orderId;
-		},
-		onShow() {
+			this.orderId = option.orderId;
 			this.getMyStoreOrderItemByOrderId()
 			this.getMyStoreOrderItemByOrderId()
 		},
 		},
 		methods: {
 		methods: {
-			valChange(e){
-				console.log(this.items)
+			valChange(e) {
+				//console.log(e)
+				//console.log(this.items)
 			},
 			},
-			checkChange(item){
-				item.checked=!item.checked;
+			checkChange(item) {
+				item.checked = !item.checked;
 			},
 			},
-			submit(type){
-				var refundItems=this.items.filter(item => item.checked==true )
-				if(refundItems.length==0){
-					uni.showToast({
-						icon:'none',
-						title: '请选择退款商品'
-					});
-					return;
-				}
+			submit(type) {
+				// var refundItems = this.items.filter(item => item.checked == true)
+				// if (refundItems.length == 0) {
+				// 	uni.showToast({
+				// 		icon: 'none',
+				// 		title: '请选择退款商品'
+				// 	});
+				// 	return;
+				// }
 				uni.navigateTo({
 				uni.navigateTo({
-					url: '/pages_user/user/refundOrder?items='+JSON.stringify(refundItems)+"&type="+type+"&orderCode="+this.order.orderCode
+					// url: '/pages_user/user/refundOrder?items=' + JSON.stringify(refundItems) + "&type=" + type +
+					// 	"&orderCode=" + this.order.orderCode
+					url: '/pages_user/user/refundOrder?items=' + JSON.stringify(this.items) + "&type=" + type +
+						"&orderCode=" + this.order.orderCode
+						
+					
 				})
 				})
 				// uni.navigateTo({
 				// uni.navigateTo({
 				// 	url: '/pages_user/user/refundOrder?type='+type+"&orderCode="+this.order.orderCode
 				// 	url: '/pages_user/user/refundOrder?type='+type+"&orderCode="+this.order.orderCode
 				// })
 				// })
-				uni.setStorageSync('refundItems',refundItems)
+				// uni.setStorageSync('refundItems', refundItems)
 				// console.log(refundItems)
 				// console.log(refundItems)
 				// uni.redirectTo({
 				// uni.redirectTo({
 				// 	url: '/pages_user/user/refundOrder?orderId='+this.order.id+"&type="+type+"&orderCode="+this.order.orderCode
 				// 	url: '/pages_user/user/refundOrder?orderId='+this.order.id+"&type="+type+"&orderCode="+this.order.orderCode
 				// })
 				// })
 			},
 			},
-			getMyStoreOrderItemByOrderId(){
-				var data={orderId:this.orderId};
+			getMyStoreOrderItemByOrderId() {
+				var data = {
+					orderId: this.orderId
+				};
 				getMyStoreOrderItemByOrderId(data).then(res => {
 				getMyStoreOrderItemByOrderId(data).then(res => {
-					if(res.code==200){
-						this.order=res.order;
-						this.items=res.items.map(item=>{
-							return {
-								...item,
-								checked:false
-							}
-						});
-						 
-					}else{
+					if (res.code == 200) {
+						this.order = res.order;
+						this.items = res.items;
+
+					} else {
 						uni.showToast({
 						uni.showToast({
-							icon:'none',
+							icon: 'none',
 							title: "请求失败",
 							title: "请求失败",
 						});
 						});
-						 
+
 					}
 					}
 				});
 				});
 			},
 			},
@@ -127,42 +134,49 @@
 </script>
 </script>
 
 
 <style lang="scss">
 <style lang="scss">
-	.content{
+	.content {
 		margin-bottom: 170upx;
 		margin-bottom: 170upx;
-		.inner{
+
+		.inner {
 			padding: 20upx;
 			padding: 20upx;
-			.goods-list{
-				.item{
+
+			.goods-list {
+				.item {
 					box-sizing: border-box;
 					box-sizing: border-box;
 					height: 221upx;
 					height: 221upx;
 					background: #FFFFFF;
 					background: #FFFFFF;
 					padding: 30upx;
 					padding: 30upx;
 					display: flex;
 					display: flex;
 					align-items: center;
 					align-items: center;
-					&:last-child{
+
+					&:last-child {
 						margin-bottom: 0;
 						margin-bottom: 0;
 					}
 					}
-					.goods-img{
+
+					.goods-img {
 						width: 160upx;
 						width: 160upx;
 						height: 160upx;
 						height: 160upx;
 						background: #FFFFFF;
 						background: #FFFFFF;
 						margin-right: 30upx;
 						margin-right: 30upx;
 						flex-shrink: 0;
 						flex-shrink: 0;
 					}
 					}
-					.info{
+
+					.info {
 						width: calc(100% - 160upx);
 						width: calc(100% - 160upx);
 						height: 160upx;
 						height: 160upx;
 						display: flex;
 						display: flex;
 						flex-direction: column;
 						flex-direction: column;
 						justify-content: space-between;
 						justify-content: space-between;
-						.top{
-							.title{
+
+						.top {
+							.title {
 								font-size: 28upx;
 								font-size: 28upx;
 								font-family: PingFang SC;
 								font-family: PingFang SC;
 								font-weight: 500;
 								font-weight: 500;
 								color: #111111;
 								color: #111111;
 								line-height: 1.4;
 								line-height: 1.4;
-								.tag{
+
+								.tag {
 									display: inline-block;
 									display: inline-block;
 									padding: 0 6upx;
 									padding: 0 6upx;
 									height: 30upx;
 									height: 30upx;
@@ -178,7 +192,8 @@
 									margin-top: 7upx;
 									margin-top: 7upx;
 								}
 								}
 							}
 							}
-							.spec{
+
+							.spec {
 								font-size: 24upx;
 								font-size: 24upx;
 								font-family: PingFang SC;
 								font-family: PingFang SC;
 								font-weight: 500;
 								font-weight: 500;
@@ -187,14 +202,17 @@
 								margin-top: 14upx;
 								margin-top: 14upx;
 							}
 							}
 						}
 						}
-						.price-num{
+
+						.price-num {
 							display: flex;
 							display: flex;
 							align-items: center;
 							align-items: center;
 							justify-content: space-between;
 							justify-content: space-between;
-							.price-box{
+
+							.price-box {
 								display: flex;
 								display: flex;
 								align-items: flex-end;
 								align-items: flex-end;
-								.unit{
+
+								.unit {
 									font-size: 24upx;
 									font-size: 24upx;
 									font-family: PingFang SC;
 									font-family: PingFang SC;
 									font-weight: 500;
 									font-weight: 500;
@@ -202,7 +220,8 @@
 									line-height: 1.2;
 									line-height: 1.2;
 									margin-right: 5upx;
 									margin-right: 5upx;
 								}
 								}
-								.price{
+
+								.price {
 									font-size: 32upx;
 									font-size: 32upx;
 									font-family: PingFang SC;
 									font-family: PingFang SC;
 									font-weight: 500;
 									font-weight: 500;
@@ -210,7 +229,8 @@
 									line-height: 1;
 									line-height: 1;
 								}
 								}
 							}
 							}
-							.num{
+
+							.num {
 								font-size: 24upx;
 								font-size: 24upx;
 								font-family: PingFang SC;
 								font-family: PingFang SC;
 								font-weight: bold;
 								font-weight: bold;
@@ -220,15 +240,17 @@
 					}
 					}
 				}
 				}
 			}
 			}
-			 
+
 		}
 		}
-		.btn-box{
+
+		.btn-box {
 			width: 100%;
 			width: 100%;
 			height: 160upx;
 			height: 160upx;
 			position: fixed;
 			position: fixed;
 			bottom: 0;
 			bottom: 0;
 			background: #FFFFFF;
 			background: #FFFFFF;
-			.text{
+
+			.text {
 				font-size: 24upx;
 				font-size: 24upx;
 				font-family: PingFang SC;
 				font-family: PingFang SC;
 				font-weight: 500;
 				font-weight: 500;
@@ -237,24 +259,28 @@
 				padding: 28upx 0;
 				padding: 28upx 0;
 				text-align: center;
 				text-align: center;
 			}
 			}
-			.btns{
+
+			.btns {
 				padding: 0upx 30upx;
 				padding: 0upx 30upx;
 				display: flex;
 				display: flex;
 				flex-direction: row;
 				flex-direction: row;
 				justify-content: space-between;
 				justify-content: space-between;
 				align-items: center;
 				align-items: center;
-				.left{
+
+				.left {
 					font-size: 24upx;
 					font-size: 24upx;
 					font-family: PingFang SC;
 					font-family: PingFang SC;
 					font-weight: 500;
 					font-weight: 500;
 					color: #999999;
 					color: #999999;
 				}
 				}
-				.right{
+
+				.right {
 					display: flex;
 					display: flex;
 					flex-direction: row;
 					flex-direction: row;
 					justify-content: flex-end;
 					justify-content: flex-end;
 					align-items: center;
 					align-items: center;
-					.btn{
+
+					.btn {
 						width: 155upx;
 						width: 155upx;
 						height: 64upx;
 						height: 64upx;
 						line-height: 64upx;
 						line-height: 64upx;
@@ -264,15 +290,16 @@
 						text-align: center;
 						text-align: center;
 						border-radius: 32upx;
 						border-radius: 32upx;
 						margin-left: 15upx;
 						margin-left: 15upx;
-						&.cancel{
+
+						&.cancel {
 							border: 1px solid #DDDDDD;
 							border: 1px solid #DDDDDD;
 							color: #666666;
 							color: #666666;
 						}
 						}
 					}
 					}
 				}
 				}
-				
+
 			}
 			}
-			
+
 		}
 		}
 	}
 	}
-</style>
+</style>

+ 2 - 4
pages_user/user/storeOrder.vue

@@ -125,9 +125,7 @@
 		checkOrderPurchaseLimit
 		checkOrderPurchaseLimit
 	} from '@/api/product';
 	} from '@/api/product';
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
-	import {
-		CustomToast
-	} from '@/components/custom-toast.vue';
+	import CustomToast from '@/components/custom-toast.vue';
 	// import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	// import ykscreenRecord from "@/components/yk-screenRecord/yk-screenRecord.vue"
 	export default {
 	export default {
 		components: {
 		components: {
@@ -383,7 +381,7 @@
 						// 支付
 						// 支付
 						console.log("去支付", item)
 						console.log("去支付", item)
 						uni.navigateTo({
 						uni.navigateTo({
-							url: `/pages_live/shopping/paymentOrder?orderList=${encodeURIComponent(JSON.stringify(item))}`,
+							url: `/pages_live/shopping/paymentOrder?type=win&orderList=${encodeURIComponent(JSON.stringify(item))}`,
 							success: () => {
 							success: () => {
 								// 跳转成功,延迟清除标志位(页面会跳转走)
 								// 跳转成功,延迟清除标志位(页面会跳转走)
 								setTimeout(() => {
 								setTimeout(() => {

+ 1 - 1
store/modules/conversation.js

@@ -41,7 +41,7 @@ const mutations = {
 		//#endif
 		//#endif
 		
 		
 	  } else {
 	  } else {
-			  uni.removeTabBarBadge({ index: 0 }); 
+			  uni.removeTabBarBadge({ index: 3 }); 
 			// #ifdef APP-PLUS
 			// #ifdef APP-PLUS
 	            const sysInfo = uni.getSystemInfoSync();
 	            const sysInfo = uni.getSystemInfoSync();
 	            const brand = (sysInfo.brand || '').toLowerCase();
 	            const brand = (sysInfo.brand || '').toLowerCase();

+ 263 - 0
utils/maOpenIdInterceptor.js

@@ -0,0 +1,263 @@
+const TOKEN_KEY = 'AppToken';
+
+let isBinding = false;
+let pendingBindRefresh = false;
+let lastBindPromptTime = 0;
+const BIND_PROMPT_INTERVAL = 3000;
+
+const WHITELIST_APIS = [
+	'/app/app/login',
+	'/app/app/loginByWeChat',
+	'/app/app/loginByPhone',
+	'/app/app/loginByApple',
+	'/app/app/loginByUserId',
+	'/app/app/register',
+	'/app/app/registerByPhone',
+	'/app/app/checkLogin',
+	'/app/app/bindWeChat',
+	'/app/app/setPhone',
+	'/app/app/setIPhoneNumber',
+	'/app/app/sendCode',
+	'/app/app/registerSendCode',
+	'/app/wx/loginByMp',
+	'/app/wx/h5/mp/loginByMp',
+	'/app/user/getUserInfo',
+	'/app/app/logout',
+	'/app/common/',
+	'/app/app/getAppVersion',
+	'/app/app/updatePushId',
+];
+
+const WHITELIST_PAGES = [
+	'pages/auth/login',
+	'pages/auth/loginIndex',
+	'pages/auth/bindMobile',
+	'pages/auth/h5WxLogin',
+	'pages/auth/wechatList',
+	'pages/auth/register',
+];
+
+function isLogin() {
+	return !!uni.getStorageSync(TOKEN_KEY);
+}
+
+function getUserInfoFromStorage() {
+	let userInfo = uni.getStorageSync('userInfo');
+	if (userInfo && JSON.stringify(userInfo) !== '{}') {
+		try {
+			userInfo = typeof userInfo === 'string' ? JSON.parse(userInfo) : userInfo;
+		} catch (e) {
+			userInfo = {};
+		}
+	} else {
+		userInfo = {};
+	}
+	return userInfo;
+}
+
+export function hasMaOpenId(userInfo) {
+	if (!userInfo) {
+		return false;
+	}
+	return !!(userInfo.maOpenId || userInfo.maopenid);
+}
+
+export function needBindMaOpenId() {
+	if (!isLogin()) {
+		return false;
+	}
+	const userInfo = getUserInfoFromStorage();
+	return !!(userInfo && userInfo.userId && !hasMaOpenId(userInfo));
+}
+
+export function isWhitelistedApi(router) {
+	if (!router) {
+		return true;
+	}
+	return WHITELIST_APIS.some((api) => router.indexOf(api) !== -1);
+}
+
+export function isWhitelistedPage(route) {
+	if (!route) {
+		return false;
+	}
+	const path = route.replace(/^\//, '');
+	return WHITELIST_PAGES.some((page) => path.indexOf(page) !== -1);
+}
+
+export function getBindMiniProgramPath() {
+	const app = getApp();
+	const userInfo = getUserInfoFromStorage();
+	const userId = userInfo && userInfo.userId ? userInfo.userId : '';
+	const basePath = (app && app.globalData && app.globalData.bindMiniProgramPath) ||
+		'/pages/auth/bindApp';
+	const connector = basePath.indexOf('?') !== -1 ? '&' : '?';
+	return `${basePath}${connector}userId=${userId}&source=app`;
+}
+
+export function launchBindMiniProgram() {
+	// #ifdef APP-PLUS
+	if (!needBindMaOpenId()) {
+		return Promise.resolve(true);
+	}
+	return new Promise((resolve) => {
+		plus.share.getServices(function(res) {
+			let sweixin = null;
+			for (let i = 0; i < res.length; i++) {
+				if (res[i].id === 'weixin') {
+					sweixin = res[i];
+					break;
+				}
+			}
+			if (!sweixin) {
+				uni.showToast({
+					title: '请先安装微信后再绑定小程序',
+					icon: 'none',
+					duration: 3000
+				});
+				resolve(false);
+				return;
+			}
+			pendingBindRefresh = true;
+			sweixin.launchMiniProgram({
+				// id: getApp().globalData.miniprogamId,
+				// path: getBindMiniProgramPath(),
+				// type: 0,
+				id:"gh_b51445318864",//gh_7a6a32e5ef61 御君方互医
+				path:'pages/user/index',
+				type:0
+			}, function() {
+				resolve(true);
+			}, function(e) {
+				console.log('launchBindMiniProgram fail', e);
+				pendingBindRefresh = false;
+				uni.showToast({
+					title: '微信唤起失败,请检查是否安装微信',
+					icon: 'none'
+				});
+				resolve(false);
+			});
+		}, function() {
+			uni.showToast({
+				title: '微信唤起失败,请检查是否安装微信',
+				icon: 'none'
+			});
+			resolve(false);
+		});
+	});
+	// #endif
+
+	// #ifndef APP-PLUS
+	return Promise.resolve(true);
+	// #endif
+}
+
+export function promptBindMaOpenId() {
+	const now = Date.now();
+	if (isBinding) {
+		return false;
+	}
+	if (now - lastBindPromptTime < BIND_PROMPT_INTERVAL) {
+		return false;
+	}
+	if (!needBindMaOpenId()) {
+		return true;
+	}
+
+	isBinding = true;
+	lastBindPromptTime = now;
+	uni.showModal({
+		title: '提示',
+		content: '请先绑定小程序后再继续使用',
+		showCancel: false,
+		confirmText: '去绑定',
+		success: () => {
+			launchBindMiniProgram().finally(() => {
+				isBinding = false;
+			});
+		},
+		fail: () => {
+			isBinding = false;
+		}
+	});
+	return false;
+}
+
+export function checkMaOpenIdForRequest(router) {
+	// #ifndef APP-PLUS
+	return true;
+	// #endif
+	if (isWhitelistedApi(router)) {
+		return true;
+	}
+	if (!needBindMaOpenId()) {
+		return true;
+	}
+	promptBindMaOpenId();
+	return false;
+}
+
+export function checkMaOpenIdBind() {
+	if (!needBindMaOpenId()) {
+		return true;
+	}
+	return promptBindMaOpenId();
+}
+
+export function initMaOpenIdNavigationInterceptor() {
+	// #ifndef APP-PLUS
+	return;
+	// #endif
+
+	const interceptor = {
+		invoke(args) {
+			const targetUrl = args.url || '';
+			if (isWhitelistedPage(targetUrl)) {
+				return args;
+			}
+			const pages = getCurrentPages();
+			const curPage = pages[pages.length - 1];
+			const curRoute = curPage && curPage.route || '';
+			if (isWhitelistedPage(curRoute)) {
+				return args;
+			}
+			if (!needBindMaOpenId()) {
+				return args;
+			}
+			promptBindMaOpenId();
+			return false;
+		}
+	};
+
+	['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].forEach((method) => {
+		uni.addInterceptor(method, interceptor);
+	});
+}
+
+export function refreshUserInfoAfterBind() {
+	if (!isLogin()) {
+		pendingBindRefresh = false;
+		return;
+	}
+	const shouldRefresh = pendingBindRefresh || needBindMaOpenId();
+	if (!shouldRefresh) {
+		return;
+	}
+	const wasPending = pendingBindRefresh;
+	pendingBindRefresh = false;
+
+	// 延迟加载,避免与 request.js 循环依赖
+	const userApi = require('@/api/user.js');
+	userApi.getUserInfo().then((res) => {
+		if (res.code == 200 && res.user) {
+			uni.setStorageSync('userInfo', JSON.stringify(res.user));
+			uni.setStorageSync('userData', JSON.stringify(res.user));
+			uni.$emit('refreshUserInfo', {});
+			if (wasPending && !hasMaOpenId(res.user)) {
+				setTimeout(() => {
+					promptBindMaOpenId();
+				}, 500);
+			}
+		}
+	});
+}