liujiaxin 1 개월 전
부모
커밋
5bfd5ac6d9
100개의 변경된 파일14591개의 추가작업 그리고 1680개의 파일을 삭제
  1. 50 1
      App.vue
  2. 5 2
      api/class.js
  3. 9 0
      api/companyUser.js
  4. 94 0
      api/courseAuto.js
  5. 12 0
      api/courseLook.js
  6. 1 1
      api/index.js
  7. 233 0
      api/living.js
  8. 26 1
      api/manageCompany.js
  9. 236 0
      api/order.js
  10. 149 0
      api/pay.js
  11. 24 0
      api/pay_new.js
  12. 1 5
      api/payment.js
  13. 4 0
      api/user.js
  14. 101 41
      common/request.js
  15. 43 0
      components/Server.vue
  16. 1 1
      components/chengpeng-audio/redme.md
  17. 1 1
      components/im/tui-chat/message-elements/audio-message/index.vue
  18. 1 1
      components/im/tui-chat/message-elements/custom-message/index.vue
  19. 1 1
      components/im/tui-chat/message-elements/file-message/index.vue
  20. 2 2
      components/im/tui-chat/message-elements/video-message/index.vue
  21. 0 8
      components/im/tui-chat/message-input/index.vue
  22. 1 1
      components/im/tui-chat/message-private/service-evaluation/index.vue
  23. 1 1
      components/likeProduct.vue
  24. 2 2
      components/px-popup-bottom/px-popup-bottom.vue
  25. 13 13
      components/tabbar/tabbar.vue
  26. 3 3
      components/tuiProduct.vue
  27. 3 0
      main.js
  28. 78 76
      manifest.json
  29. 323 10
      package-lock.json
  30. 1 0
      package.json
  31. 292 40
      pages.json
  32. 44 5
      pages/auth/login.vue
  33. 761 0
      pages/auth/numberlogin.vue
  34. 2 2
      pages/common/launch.vue
  35. 4 4
      pages/healthy/detail.vue
  36. 2 2
      pages/healthy/idea.vue
  37. 5 5
      pages/healthy/index.vue
  38. 2 2
      pages/healthy/readUsers.vue
  39. 2 1
      pages/home/components/HotProduct.vue
  40. 6 6
      pages/home/doctorCase.vue
  41. 112 89
      pages/home/index.vue
  42. 1 1
      pages/home/new/articleDetails.vue
  43. 2 2
      pages/home/new/articleList.vue
  44. 2 2
      pages/home/new/chineseMedicineDetails.vue
  45. 2 2
      pages/home/new/chineseMedicineList.vue
  46. 2 2
      pages/home/new/diseaseDetails.vue
  47. 2 2
      pages/home/new/diseaseList.vue
  48. 2 2
      pages/home/new/famousPrescribeDetails.vue
  49. 2 2
      pages/home/new/famousPrescribeList.vue
  50. 2 2
      pages/home/new/medicatedFoodDetails.vue
  51. 1 1
      pages/home/new/medicatedFoodList.vue
  52. 2 2
      pages/home/new/questionsDetails.vue
  53. 2 2
      pages/home/new/questionsList.vue
  54. 6 6
      pages/home/new/test.vue
  55. 2 2
      pages/home/new/testDetails.vue
  56. 2 2
      pages/home/new/testList.vue
  57. 2 2
      pages/home/new/vesselDetails.vue
  58. 2 2
      pages/home/new/vesselList.vue
  59. 13 13
      pages/home/productList.vue
  60. 3 3
      pages/home/productSearch.vue
  61. 1 1
      pages/index/index.vue
  62. 4 4
      pages/shopping/cart.vue
  63. 9 9
      pages/shopping/confirmOrder.vue
  64. 9 9
      pages/shopping/index.vue
  65. 1 1
      pages/shopping/payOrder.vue
  66. 10 10
      pages/shopping/paymentOrder.vue
  67. 16 16
      pages/shopping/prescribe.vue
  68. 23 22
      pages/shopping/productDetails.vue
  69. 1 1
      pages/shopping/success.vue
  70. 281 167
      pages/user/index.vue
  71. 2 2
      pages_company/coupon.vue
  72. 1 1
      pages_company/couponDetails.vue
  73. 146 89
      pages_company/index.vue
  74. 3 3
      pages_company/order/cart.vue
  75. 5 5
      pages_company/order/confirmCompanyOrder.vue
  76. 2 2
      pages_company/order/confirmOrder.vue
  77. 2 2
      pages_company/order/coupon.vue
  78. 711 598
      pages_company/order/productDetails.vue
  79. 16 15
      pages_company/order/productList.vue
  80. 7 7
      pages_company/order/productShowDetails.vue
  81. 450 0
      pages_company/shareLive.vue
  82. 4 4
      pages_company/storeOrder.vue
  83. 12 12
      pages_company/storeOrderDetail.vue
  84. 5 4
      pages_company/storeProductPackage.vue
  85. 4 4
      pages_company/storeProductPackageDetails.vue
  86. 122 0
      pages_company/wechatcode.vue
  87. 101 95
      pages_course/becomeVIP.vue
  88. 106 0
      pages_course/components/ThreeItemSwiper.vue
  89. 705 0
      pages_course/components/commentBox.vue
  90. 162 0
      pages_course/components/descInfo.vue
  91. 206 0
      pages_course/components/descInfoNav.vue
  92. 238 0
      pages_course/components/like.vue
  93. 146 0
      pages_course/components/ques.vue
  94. 60 66
      pages_course/learn.vue
  95. 5679 0
      pages_course/living.vue
  96. 159 0
      pages_course/livingList.vue
  97. 2 2
      pages_course/reward.vue
  98. 34 23
      pages_course/teacherClassroom.vue
  99. 2302 0
      pages_course/video.vue
  100. 141 127
      pages_course/videovip.vue

+ 50 - 1
App.vue

@@ -3,10 +3,16 @@
 	// import TIM from 'tim-wx-sdk';
 	// import COS from 'cos-wx-sdk-v5';
 	export default {
+		globalData: {
+			// wsUrl: 'wss://websocket.cdwjyyh.com',
+			wsUrl: '',
+			appId: 'wxedde588767b358b1',
+		},
 		onLoad: function (){
 			
 		},
 		onLaunch: function() {
+			this.checkUpdate()
 			// uni.hideTabBar({ animation: true })
 			// uni.$TUIKit = TIM.create({
 			// 	SDKAppID: 1400693126
@@ -26,6 +32,14 @@
 			// uni.$TUIKit.on(uni.$TUIKitEvent.NET_STATE_CHANGE, this.onNetStateChange);
 			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_RELOAD, this.onSDKReload);
 			// console.log('IM')
+			// 看课题目字体跟随系统变化
+			const systemInfo = uni.getSystemInfoSync();
+			const baseFontSize = 14; // 标准字体大小(你可以自定义)
+			const userFontSize = systemInfo.fontSizeSetting || baseFontSize;
+			// 计算比例
+			const scale = userFontSize / baseFontSize;
+			// 存储到全局变量或 Vuex
+			uni.setStorageSync('fontScale', scale);
 		},
 		onShow: function () {
 		    console.log('App Show')
@@ -76,6 +90,38 @@
 		},
 		 
 		methods: {
+			checkUpdate() {
+				const updateManager = uni.getUpdateManager();
+				updateManager.onCheckForUpdate(function(res) {
+					// 请求完新版本信息的回调
+					console.log('是否有新版本:', res.hasUpdate);
+				});
+			
+				updateManager.onUpdateReady(function() {
+					uni.showModal({
+						title: '更新提示',
+						content: '新版本已经准备好,是否重启小程序?',
+						confirmText: '立即重启',
+						confirmColor: '#2179f5',
+						showCancel: false,
+						success(res) {
+							if (res.confirm) {
+								// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+								updateManager.applyUpdate();
+							}
+						}
+					});
+				});
+			
+				updateManager.onUpdateFailed(function() {
+					// 新的版本下载失败
+					uni.showModal({
+						title: '更新提示',
+						content: '新版本下载失败,请检查网络后重试。',
+						showCancel: false
+					});
+				});
+			},
 			// TODO:
 			resetLoginData() {
 				// this.globalData.expiresIn = '';
@@ -112,13 +158,16 @@
 	}
 </script>
  
+ <style lang="less">
+	 @import './assets/css/common.less';
+ </style>
+ 
 <style lang="scss">
 	
     /*每个页面公共css */
 	@import "uview-ui/index.scss";
 	@import './assets/iconfont/iconfont.css';
 	@import '@/assets/css/common.scss';
-	// @import './assets/css/common.less';
 	@import './assets/css/theme.scss';
 	page{
 		background-color: #f6f6f6;

+ 5 - 2
api/class.js

@@ -1,9 +1,12 @@
 import Request from '../common/request.js';
 let request = new Request().http
  export function courseList() {
- 	 return request('/app/course/getAppletCourse',null,'GET');
+ 	 return request('/course_auto/app/course/getAppletCourse',null,'GET');
  }
  // 课程详情
  export function courseDetails() {
- 	 return request('/app/course/getH5CourseByVideoId',data,'GET');
+ 	 return request('/course_auto/app/course/getH5CourseByVideoId',data,'GET');
  }
+ export function courseListB() {
+ 	 return request('/course_auto/app/course/getPrivateCourse',null,'GET');
+ }

+ 9 - 0
api/companyUser.js

@@ -15,6 +15,15 @@ let request = new Request().http
  export function getCompanyUserCard(data) {
  	 return request('/app/companyUser/getCompanyUserCard',data,'GET','application/json;charset=UTF-8');
  }
+ //获取公司微信收款码
+ export function getcomapycode(data) {
+ 	 return request('/app/companyUser/getCompanyWxaCodeByPayment',data,'GET','application/json;charset=UTF-8');
+ }
+ //生成公司微信收款码
+ export function generateComapycode(data) {
+ 	 return request('/app/payment/getWxaCodeByPayment',data,'GET','application/json;charset=UTF-8');
+ }
+ 
  
  
  

+ 94 - 0
api/courseAuto.js

@@ -0,0 +1,94 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+export function loginByMp(data) {
+ 	 return request('/course_auto/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8');
+ }
+
+// 获取真实链接
+export function getRealLink(data) {
+	return request('/course_auto/app/course/getRealLink', data, 'GET','');
+}
+
+// h5课程简介
+export function getH5CourseByVideoId(data) {
+	return request('/course_auto/app/course/getH5CourseByVideoId', data, 'GET','');
+}
+
+// h5课程详情加问答
+export function getH5CourseVideoDetails(data) {
+	return request('/course_auto/app/course/getH5CourseVideoDetails', data, 'GET','');
+}
+
+// 答题发红包
+export function courseAnswer(data) {
+	return request('/course_auto/app/course/courseAnswer', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// // 记录看课时间(旧)
+// export function getFinishCourseVideo(data) {
+// 	return request('/course_auto/app/course/getFinishCourseVideo', data, 'POST', 'application/json;charset=UTF-8');
+// }
+
+// 记录看课时间(新)
+export function getFinishCourseVideo(data) {
+	return request('/course_auto/app/course/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 关注客服
+export function getIsAddKf(data) {
+	return request('/course_auto/app/course/isAddKf', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 流量(缓冲百分比)
+export function getInternetTraffic(data) {
+	return request('/course_auto/app/course/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 每十分钟获得积分
+export function getIntegralByH5Video(data) {
+	return request('/course_auto/app/course/getIntegralByH5Video', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 发送奖励
+export function sendReward(data) {
+	return request('/course_auto/app/course/sendReward', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 播放错误上报
+export function getErrMsg(data) {
+	return request('/app/course/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded');
+}
+
+
+// 获取getWxConfig
+export function getWxConfig(data) {
+	return request('/course_auto/app/wx/mp/getWxConfig', data, 'GET','');
+}
+
+// 保存评论数据
+export function saveMsg(data) {
+	return request('/course_auto/app/course/saveMsg', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 撤销评论
+export function revokeMsg(data) {
+	return request('/course_auto/app/course/revokeMsg', data, 'PUT', 'application/json;charset=UTF-8');
+}
+
+// 获取历史评论数据
+export function getComments(data) {
+	return request('/course_auto/app/course/getComments', data, 'GET');
+}
+
+// 企业理念
+export function getConcept() {
+	return request('/course_auto/app/index/getConcept', null, 'GET');
+}
+
+ export function getTypeTree(data) {
+ 	return request('/course_auto/app/user/complaint/getTypeTree', null, 'GET');
+ }
+ export function complaintRecord(data) {
+ 	return request('/course_auto/app/user/complaint/record', data, 'POST','application/json;charset=UTF-8');
+ }

+ 12 - 0
api/courseLook.js

@@ -61,4 +61,16 @@ export function getRealLink(data) {
  //获取头像以及昵称信息
  export function getusername(data) {
  	 return request('/companyapp/app/wx/h5/mp/userInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ //h5授权登录
+ export function handleFsUserWx(data) {
+ 	 return request('/course_uniapp/app/wx/h5/mp/handleFsUserWx',data,'POST','application/json;charset=UTF-8');
+ }
+ //h5授权登录
+ export function H5logoinApp(data,type) {
+	 if(type&&type==1) {
+		return request('/app/wx/h5/mp/courseLoginByMp',data,'POST','application/json;charset=UTF-8'); 
+	 } else {
+		return request('/app/wx/h5/mp/loginByMp',data,'POST','application/json;charset=UTF-8'); 
+	 }
  }

+ 1 - 1
api/index.js

@@ -59,7 +59,7 @@ export function getCartCount() {
  export function getChineseMedicineById(data) {
  	 return request('/app/index/getChineseMedicineById',data,'GET');
  }
- export function getpro(data) {
+ export function getConfigByKey(data) {
  	 return request('/app/common/getConfigByKey',data,'GET');
  } 
  

+ 233 - 0
api/living.js

@@ -0,0 +1,233 @@
+import Request from '@/common/request.js';
+let request = new Request().http
+const api = {
+	liveDataLike: (liveId) => `/app/live/liveData/like/${liveId}`, // 点赞
+	collectStore: (sotreId) => `/app/live/liveData/collectStore?storeId=${sotreId}`, // 店铺收藏/取消收藏
+	collectGoods: (goodId) => `/app/live/liveData/collectGoods?goodId=${goodId}`, // 商品收藏/取消收藏
+	store: (storeld, key, liveId) => `/app/live/store/${storeld}?key=${key}&liveId=${liveId}`, // 小黄车查询店铺
+
+	queryStore: (storeld, pageSize, pageNum, keywords) =>
+		`/app/live/store?storeId=${storeld}&pageSize=${pageSize}&pageNum=${pageNum}&keywords=${keywords}`, // 查询店铺
+	follow: (liveId) => `/app/live/liveData/follow/${liveId}`, // 关注/取消关注
+	// getRecentLiveViewers: (liveId) => `/app/live/liveData/getRecentLiveViewers/${liveId}`, // 获取直播间用户(展示在线用户)
+	watchUserList: (liveId, pageSize, pageNum, reasonable) =>
+		`/app/live/liveWatchUser/watchUserList/?liveId=${liveId}&pageSize=${pageSize}&pageNum=${pageNum}&reasonable=${reasonable}`, // 获取直播间用户(展示在线用户)
+	liveMsg: (liveId, pageSize, pageNum) =>
+		`/app/live/liveMsg/list/?liveId=${liveId}&pageSize=${pageSize}&pageNum=${pageNum}`, //获取最近聊天记录
+
+	// checkSms: 'api/sms/checkSms',
+	getLiveInfo: (liveId) => `/app/live/${liveId}`, // 获取直播间信息接口
+	getLiveViewData: (liveId) => `/app/live/liveData/getLiveViewData/${liveId}`, // 直播间点赞、关注、在线人数数据
+	liveRed: '/app/live/liveRed/claim', // 点击领红包
+	// 直播订单
+	liveStore: (liveId, key) => `/app/live/liveGoods/liveStore/${liveId}?key=${key}`, // 店铺展示
+	
+	
+	liveGoodsDetail: (productId) => `/app/live/liveGoods/liveGoodsDetail/${productId}`, // 商品详情
+	liveOrderUser: (liveId) => `/app/live/liveOrder/liveOrderUser/${liveId}`, // 正在购买
+	showGoods: (liveId) => `/app/live/liveGoods/showGoods/${liveId}`, // 弹出商品卡片
+	currentActivities: (liveId) => `/app/live/currentActivities?liveId=${liveId}`, // 弹出商品卡片
+	claim: '/app/live/liveLottery/claim', // 抽奖
+	liveLottery: '/app/live/liveLottery/detail', // 抽奖查询
+	getlive: '/app/live/live',
+	liveList: '/app/live/liveList', //直播列表
+	// liveShareList: (companyId, pageSize, pageNum) =>
+	// 	`/app/live/liveList/${companyId}?pageSize=${pageSize}&pageNum=${pageNum}`, //销售端分享直播列表
+		liveShareList: ( pageSize, pageNum) =>
+			`/app/live/liveListAll?pageSize=${pageSize}&pageNum=${pageNum}`, //销售端分享直播列表
+	subNotifyLive: '/app/live/subNotifyLive' ,//订阅消息
+	coupon: '/app/live/coupon/claim' ,//领取优惠券
+	curCoupon: '/app/live/coupon/curCoupon' ,//优惠券列表
+	
+	// export function getGotoWxAppLiveLink(data) {
+	// 	return request('/app/fs/course/getGotoWxAppLiveLink', data, 'GET', 'application/json;charset=UTF-8');
+	// }
+	// getGotoWxAppLiveLink: (appid, linkst) =>
+	// 	`/app/fs/course/getGotoWxAppLiveLink?appid=${appid}&linkst=${linkst}`, 
+}
+// 点赞
+export function liveDataLike(liveId, data = {}) {
+	return request(api.liveDataLike(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 店铺收藏/取消收藏
+export function collectStore(sotreId, data = {}) {
+	return request(api.collectStore(sotreId), data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 商品收藏/取消收藏
+export function collectGoods(goodId, data = {}) {
+	return request(api.collectGoods(goodId), data, 'POST', 'application/json;charset=UTF-8')
+}
+// 小黄车查询店铺
+export function store(storeld, key, liveId, data = {}) {
+	return request(api.store(storeld, key, liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+// 查询店铺
+export function queryStore(storeld, pageSize, pageNum, keywords, data = {}) {
+	return request(api.queryStore(storeld, pageSize, pageNum, keywords), data, 'GET', 'application/json;charset=UTF-8',
+		false)
+}
+
+//弹出商品卡片
+export function showGoods(liveId, data = {}) {
+	return request(api.showGoods(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 点击领红包
+export function liveRed(data) {
+	return request(api.liveRed, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 关注/取消关注
+export function follow(liveId, data = {}) {
+	return request(api.follow(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+
+// 观众
+// 获取直播间用户(展示在线用户)
+// export function getRecentLiveViewers(liveId, data = {}) {
+// 	return request(api.getRecentLiveViewers(liveId), data, 'GET', 'application/json;charset=UTF-8')
+// }
+// 获取直播间用户(展示在线用户)
+export function watchUserList(liveId, pageSize, pageNum, reasonable, data = {}) {
+	return request(api.watchUserList(liveId, pageSize, pageNum, reasonable), data, 'GET',
+		'application/json;charset=UTF-8')
+}
+// 获取最近聊天记录
+export function liveMsg(liveId, pageSize, pageNum, data = {}) {
+	return request(api.liveMsg(liveId, pageSize, pageNum), data, 'GET', 'application/json;charset=UTF-8')
+}
+// 加载直播间消息接口
+// export function liveMsg(liveId, pageSize, pageNum, data = {}) {
+// 	return request('/app/live/liveMsg/list', data, 'GET', 'application/json;charset=UTF-8');
+// }
+
+
+// 小黄车
+// 店铺展示
+export function liveStore(liveId, key, data) {
+	return request(api.liveStore(liveId, key), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 商品详情
+export function liveGoodsDetail(productId, data) {
+	return request(api.liveGoodsDetail(productId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+//正在购买
+export function liveOrderUser(liveId, data = {}) {
+	return request(api.liveOrderUser(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+
+
+
+
+
+// 直播间
+export function getLiveInfo(liveId, data = {}) {
+	return request(api.getLiveInfo(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 直播间点赞、关注、在线人数数据
+export function getLiveViewData(liveId, data = {}) {
+	return request(api.getLiveViewData(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+
+// 红包 卡片 抽奖
+export function currentActivities(liveId, data = {}) {
+	return request(api.currentActivities(liveId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+//抽奖
+export function claim(data) {
+	return request(api.claim, data, 'POST', 'application/json;charset=UTF-8')
+}
+// 抽奖查询
+export function liveLottery(data) {
+	return request(api.liveLottery, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+//直播间信息
+export function getlive(data) {
+	return request(api.getlive, data, 'GET', 'application/json;charset=UTF-8');
+}
+//直播列表
+export function liveList(data) {
+	return request(api.liveList, data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//销售端分享直播列表
+export function liveShareList(pageSize, pageNum, data = {}) {
+	return request(api.liveShareList( pageSize, pageNum), data, 'GET', 'application/json;charset=UTF-8');
+}
+
+//订阅消息
+export function subNotifyLive(data) {
+	return request(api.subNotifyLive, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//领取优惠券
+export function coupon(data) {
+	return request(api.coupon, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//优惠券列表
+export function curCoupon(data) {
+	return request(api.curCoupon, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 流量(缓冲百分比)
+export function internetTraffic(data) {
+	return request('/app/live/liveTrafficLog/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8');
+}
+// 直播流量(缓冲百分比)
+export function liveInternetTraffic(data) {
+	return request('/app/live/liveTrafficLog/getLiveInternetTraffic', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 积分
+export function getUserIntegralInfo(data) {
+	return request('/app/live/liveData/getUserIntegralInfo', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+// 我的中奖明细
+export function myLottery(data) {
+	return request('/app/live/liveLottery/myLottery', data, 'GET', 'application/json;charset=UTF-8');
+}
+// // 消息弹窗
+// export function sendPopMsg(liveId, pageSize, pageNum, data = {}) {
+// 	return request('/app/live/liveMsg/myList', data, 'GET', 'application/json;charset=UTF-8');
+// }
+
+// 电话号码登录
+export function login(data) {
+	return request('/app/app/login', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 分享直播间短链
+// export function getGotoWxAppLiveLink(appid,linkst,data={}) {
+// 	return request(api.getGotoWxAppLiveLink(appid,linkst), data, 'GET', 'application/json;charset=UTF-8');
+// }
+
+export function getGotoWxAppLiveLink(data) {
+	return request('/app/fs/course/getGotoWxAppLiveLink', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+
+// export function getGotoWxAppLiveLink(data) {
+// 	return request('/app/fs/course/getGotoWxAppLiveLink', data, 'GET', 'application/json;charset=UTF-8');
+// }
+
+
+
+export function loginByMp(data) {
+ 	 return request('/liveAPP/app/wx/courseLogin',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getUserInfo() {
+ 	 return request('/liveAPP/app/user/getUserInfo',null,'GET');
+ }

+ 26 - 1
api/manageCompany.js

@@ -249,4 +249,29 @@ export function getprojectChange(data) {
 //生成小程序链接
 export function copyuniLink(data) {
 	return request('/companyapp/app/fs/course/getGotoWxAppLink', data, 'GET', 'application/json;charset=UTF-8');
-}
+}
+
+ //语音接口
+ export function addVoicePrintUrl(data) {
+ 	 return request('/companyapp/app/companyUser/addVoicePrintUrl',data,'POST','application/json;charset=UTF-8');
+ }
+ //  模板语音上传接口
+ export function companyUserVoiceNew(data) {
+ 	 return request('/companyapp/app/companyUser/companyUserVoiceNew',data,'GET','application/json;charset=UTF-8');
+ }
+ // 模板语音上传接口
+ export function companyUserVoice(data) {
+ 	 return request('/companyapp/app/companyUser/companyUserVoice',data,'GET','application/json;charset=UTF-8');
+ }
+ // 获取语音列表
+ export function querySopVoiceList(data) {
+ 	 return request('/companyapp/app/companyUser/querySopVoiceList',data,'GET','application/json;charset=UTF-8');
+ }
+ // 获取语音详情
+ export function queryDetail(id) {
+ 	 return request('/companyapp/app/companyUser/query/'+id,null,'GET','application/json;charset=UTF-8');
+ }
+  
+ export function createUserAllVoice(id) {
+ 	 return request('/companyapp/app/companyUser/createUserAllVoice',null,'GET','application/json;charset=UTF-8');
+ }

+ 236 - 0
api/order.js

@@ -0,0 +1,236 @@
+import Request from '@/common/request.js';
+let request = new Request().http
+const api = {
+	// 直播订单
+	liveOrderList: '/app/live/liveOrder/getMyStoreOrderList', // 订单列表
+	// liveOrderList: '/app/live/liveOrder/list', // 订单列表
+	createliveOrder: '/app/live/liveOrder/create', // 创建订单
+	createReward: '/app/live/liveOrder/createReward', // 创建中奖订单
+	
+	updateConfirm: (orderId, type) => `/app/live/liveOrder/updateConfirm/${orderId}/${type} `, // 取消/支付订单确认
+	updateLiveOrder: '/app/live/liveOrder/update', // 取消/支付订单
+	liveOrderKey: '/app/live/liveOrder/confirm', // 生成订单key
+	userAddr: '/app/address/getAddressByDefault ', // 获取用户收货地址
+	addAddress: '/app/address/addAddress', // 添加地址
+	editAddress: '/app/address/editAddress', // 编辑地址
+	delAddress: '/app/address/delAddress', // 删除地址
+	getCitys: '/app/common/getCitys', // 获取省市区
+	parseAddress: '/app/address/parseAddress', //地址解析 
+	getAddressById: '/app/address/getAddressById', //
+
+	queryLiveCartList: '/live/liveCart/list', //查询购物车列表
+	exportLiveCartList: '(/live/liveCart/export ', //导出购物车列表
+	liveCartDetails: (cardIds) => `/live/liveCart/${cardId} `, //获取购物车详情
+	addLiveCart: '/live/liveCart ', //新增购物车
+	modifyLiveCart: '/live/liveCart/update', //修改购物车
+	delLiveCart: '/live/liveCart/delete', //删除购物车
+	cartOrder: '/app/live/liveOrder/buy', //购物车订单
+	checked: '/live/liveCart/checked', //获取购物车选中商品
+	cancelOrder: '/app/live/liveOrder/cancelOrder', // 取消订单
+	finishOrder: '/app/live/liveOrder/finishOrder', // 确认收货
+
+	getStoreOrderItems: '/app/live/storeAfterSales/getStoreOrderItems', // 获取订单项列表
+	applyAfterSales: '/app/live/storeAfterSales/applyAfterSales', // 申请售后
+	revoke: '/app/live/storeAfterSales/revoke', // 撤销售后
+	getStoreAfterSalesList: (liveId, pageSize, pageNum, status) =>
+		`/app/live/storeAfterSales/getStoreAfterSalesList?liveId=${liveId}&pageSize=${pageSize}&pageNum=${pageNum}&status=${status}`, // 获取售后列表
+	getStoreAfterSalesById: (id) => `/app/live/storeAfterSales/getStoreAfterSalesById?id=${id}`, // 获取售后详情
+
+	liveOrder: (orderId) => `/app/live/liveOrder/info/${orderId}`, // 订单详情
+	getMyStoreOrderById: (orderId) => `/app/live/liveOrder/info/${orderId}`,
+	computed: '/app/live/liveOrder/computed', // 查询创建订单信息
+	computedReward: '/app/live/liveOrder/computedReward', // 中奖填地址=>查询创建中奖订单信息
+	
+	// finishOrder: '/app/live/liveOrder/finishOrder', 
+	// cancelOrder: '/app/live/liveOrder/cancelOrder',
+	
+
+}
+
+
+// 直播订单
+
+// 创建订单
+export function createliveOrder(data) {
+	return request(api.createliveOrder, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 创建中奖订单
+export function createReward(data) {
+	return request(api.createReward, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 生成订单key
+export function liveOrderKey(data = {}) {
+	return request(api.liveOrderKey, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 点击取消/支付订单
+export function updateConfirm(data) {
+	return request(api.updateConfirm(orderId, type), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 取消/支付订单
+export function updateLiveOrder(data) {
+	return request(api.updateLiveOrder, data, 'POST', 'application/json;charset=UTF-8')
+}
+// 订单列表
+export function liveOrderList(data) {
+	return request(api.liveOrderList, data, 'GET', 'application/json;charset=UTF-8')
+}
+// 订单详情
+export function liveOrder(orderId, data = {}) {
+	return request(api.liveOrder(orderId), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 获取用户收货地址
+export function userAddr(data = {}) {
+	return request(api.userAddr, data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 添加地址
+export function addAddress(data) {
+	return request(api.addAddress, data, 'POST', 'application/json;charset=UTF-8')
+}
+// 编辑地址
+export function editAddress(data) {
+	return request(api.editAddress, data, 'POST', 'application/json;charset=UTF-8')
+}
+// 删除地址
+export function delAddress(data) {
+	return request(api.delAddress, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+//获取省市区 
+export function getCitys(data) {
+	return request(api.getCitys, data, 'GET', 'application/json;charset=UTF-8')
+}
+
+
+//地址解析 
+export function parseAddress(data) {
+	return request(api.parseAddress, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 
+export function getAddressById(data) {
+	return request(api.getAddressById, data, 'GET', 'application/json;charset=UTF-8')
+}
+
+
+// 查询购物车列表
+export function queryLiveCartList(data) {
+	return request(api.queryLiveCartList, data, 'GET', 'application/json;charset=UTF-8')
+}
+// 导出购物车列表
+export function exportLiveCartList(data) {
+	return request(api.exportLiveCartList, data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 获取购物车详情
+export function liveCartDetails(cardIds, data = {}) {
+	return request(api.liveCartDetails(cardIds), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 新增购物车
+export function addLiveCart(data) {
+	return request(api.addLiveCart, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 修改购物车
+export function modifyLiveCart(data) {
+	return request(api.modifyLiveCart, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 删除购物车
+export function delLiveCart(data) {
+	return request(api.delLiveCart, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+//购物车订单
+export function cartOrder(data) {
+	return request(api.cartOrder, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+//获取购物车选中商品
+export function checked(data) {
+	return request(api.checked, data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 取消订单
+export function cancelOrder(data) {
+	return request(api.cancelOrder, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 确认收货
+export function finishOrder(data) {
+	return request(api.finishOrder, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+
+// 售后
+// 获取订单项列表
+export function getStoreOrderItems(data) {
+	return request(api.getStoreOrderItems, data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 申请售后
+export function applyAfterSales(data) {
+	return request(api.applyAfterSales, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+// 撤销售后
+export function revoke(data) {
+	return request(api.revoke, data, 'POST', 'application/json;charset=UTF-8')
+}
+
+//获取售后列表
+export function getStoreAfterSalesList(liveId, pageSize, pageNum, status, data = {}) {
+	return request(api.getStoreAfterSalesList(liveId, pageSize, pageNum, status), data, 'GET',
+		'application/json;charset=UTF-8')
+}
+
+// 获取售后详情
+export function getStoreAfterSalesById(id, data = {}) {
+	return request(api.getStoreAfterSalesById(id), data, 'GET', 'application/json;charset=UTF-8')
+}
+
+// 申请原因
+export function Dicts(data) {
+	return request('/app/common/getDictByKey', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+
+
+
+
+
+export function getMyStoreOrderById(orderId, data = {}) {
+	return request(api.getMyStoreOrderById(orderId), data, 'GET', 'application/json;charset=UTF-8');
+}
+
+// 查询创建订单信息
+export function computed(data ) {
+	return request(api.computed, data, 'POST', 'application/json;charset=UTF-8');
+}
+// 中奖填地址=>查询中奖创建订单信息
+export function computedReward(data ) {
+	return request(api.computedReward, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//填写物流
+ export function addDelivery(data) {
+ 	 return request('/app/live/storeAfterSales/addDelivery',data,'POST','application/json;charset=UTF-8');
+ }
+
+ export function getExpressMulti(data) {
+ 	 return request('/app/live/liveOrder/getExpressMulti',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getExpress(data) {
+ 	 return request('/app/live/liveOrder/getExpress',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ // 抽奖中奖接口
+ export function payConfirmReward(data) {
+ 	 return request('/app/live/liveOrder/payConfirmReward',data,'POST','application/json;charset=UTF-8');
+ }

+ 149 - 0
api/pay.js

@@ -0,0 +1,149 @@
+import Request from '@/common/request.js';
+let request = new Request().http
+const api = {
+	// 支付
+	zfbPayment: '/app/live/liveOrder/aliPayment', // 支付宝付款
+	weChatPayment: '/app/live/liveOrder/weChatPayment', // 微信付款
+
+
+	// updateConfirm: (orderId, type) => `/app/live/liveOrder/updateConfirm/${orderId}/${type} `, // 取消/支付订单确认
+
+
+
+}
+
+
+// 支付
+
+// 支付宝付款
+export function zfbPayment(data) {
+	return request(api.zfbPayment, data, 'POST', 'application/json;charset=UTF-8')
+}
+// 微信付款
+// export function weChatPayment(data) {
+// 	return request(api.weChatPayment, data, 'POST', 'application/json;charset=UTF-8')
+// }
+/**
+ * 微信支付(全平台适配简化版)
+ * @param {String} orderId 订单ID
+ * @param {Number} amount 金额(单位:分)
+ * @returns {Promise}
+ */
+// export function weChatPayment(orderId, amount) {
+export function weChatPayment(data) {
+	return new Promise((resolve, reject) => {
+		let res = {
+"code": 200,
+"msg": "success",
+"payType": 1,
+"result": {"timeStamp":"1757906581","package":"prepay_id=wx151123017811185ff21654a23ca0660000","paySign":"XZOdWmeUE4vtrsTiBcgc830dI5cTxDMOld4nEodSImjtnxNP7g4ehBCYBT9lSXQviX2CAqYfYS3Nazt81jCz3U8rjcxvf0IP1rKzesYHozTwkTh9PfOMu5kwBIf48pF1pG8P4w02cBMvfmEvN8c9ISc1Lx528IqV/pC12cxGTNBktH8UFFU5hdEmbpu9sI+4VfDpgroHs5y8xx2DK072LulF8g9xQvP2Hif/PFuEphBRmdxAN7Cp+gX6kHYmIijPe10eI0dTG/L0nR/r3UPUt9vubUnLW0cnYnimQ0FW5A1ANXN4LdCO+R3jFONsu99qpw/7uqrpJ1vUVpEvLu8fTg==","appId":"wx503cf8ab31f83dd4","signType":"RSA","nonceStr":"RKjdY0O5yroLPnEjXmTMtAEFIq2AhD63"}
+}
+				invokePayment(res.data)
+					.then(resolve)
+					.catch(err => {
+						handlePaymentError(err);
+						reject(err);
+					});
+
+		// 1. 获取支付参数
+		// totalFee: amount, // platform: getPlatform() // 自动识别平台
+		// request(api.weChatPayment, data, 'POST', 'application/json;charset=UTF-8')
+		// 	.then(res => {
+		// 		// 2. 调用平台支付
+				// invokePayment(res.data)
+				// 	.then(resolve)
+				// 	.catch(err => {
+				// 		handlePaymentError(err);
+				// 		reject(err);
+				// 	});
+		// 	})
+		// 	.catch(err => {
+		// 		handlePaymentError(err);
+		// 		reject(err);
+		// 	});
+	});
+}
+
+// ==================== 内部方法 ====================
+function getPlatform() {
+	// #ifdef MP-WEIXIN
+	return 'miniprogram';
+	// #endif
+	// #ifdef APP-PLUS
+	return 'app';
+	// #endif
+	// #ifdef H5
+	return 'h5';
+	// #endif
+}
+
+function invokePayment(payData) {
+	return new Promise((resolve, reject) => {
+		// #ifdef MP-WEIXIN
+		uni.requestPayment({
+			provider: 'wxpay',
+			...payData, // 直接展开小程序所需参数
+			success: (res) => {
+				uni.showToast({
+					title: '支付成功'
+				});
+				resolve(res);
+			},
+			fail: (err) => {
+				reject(new Error(formatError(err)));
+			}
+		});
+		// #endif
+
+		// #ifdef APP-PLUS
+		uni.requestPayment({
+			provider: 'wxpay',
+			orderInfo: payData.orderInfo,
+			success: resolve,
+			fail: (err) => {
+				reject(new Error(formatError(err)));
+			}
+		});
+		// #endif
+
+		// #ifdef H5
+		if (typeof WeixinJSBridge === 'undefined') {
+			return reject(new Error('请在微信浏览器中打开'));
+		}
+
+		WeixinJSBridge.invoke(
+			'getBrandWCPayRequest',
+			payData,
+			(res) => {
+				if (res.err_msg === 'get_brand_wcpay_request:ok') {
+					resolve(res);
+				} else {
+					reject(new Error(res.err_msg || '支付失败'));
+				}
+			}
+		);
+		// #endif
+	});
+}
+
+function formatError(err) {
+	if (err.errMsg) {
+		if (err.errMsg.includes('cancel')) return '支付已取消';
+		if (err.errMsg.includes('fail')) return '支付失败';
+	}
+	return err.message || '支付异常';
+}
+
+function handlePaymentError(err) {
+	console.error('[支付错误]', err);
+	uni.showToast({
+		title: err.message,
+		icon: 'none',
+		duration: 3000
+	});
+}
+
+// 微信
+// export function userAddr(userId, data={}) {
+// 	return request(api.userAddr(userId), data, 'GET', 'application/json;charset=UTF-8')
+// }

+ 24 - 0
api/pay_new.js

@@ -0,0 +1,24 @@
+import Request from '@/common/request.js';
+let request = new Request().http
+const api = {
+	// 支付
+	zfbPayment: '/app/live/liveOrder/aliPayment', // 支付宝付款
+	// weChatPayment: '/app/live/liveOrder/weChatPayment', // 微信付款
+	weChatPayment: '/app/live/liveOrder/pay', // 微信付款
+
+
+	// updateConfirm: (orderId, type) => `/app/live/liveOrder/updateConfirm/${orderId}/${type} `, // 取消/支付订单确认
+
+
+
+}
+
+
+//微信支付
+ export function weChatPayment(data) {
+ 	 return request(api.weChatPayment,data,'POST','application/json;charset=UTF-8');
+ }
+// 支付宝付款
+export function zfbPayment(data) {
+	return request(api.zfbPayment, data, 'POST', 'application/json;charset=UTF-8')
+}

+ 1 - 5
api/payment.js

@@ -3,9 +3,5 @@ let request = new Request().http
 
   
  export function payment(data) {
- 	 return request('/app/payment/payment',data,'POST','application/json;charset=UTF-8');
+ 	 return request('/app/payment/paymentByWxaCode',data,'POST','application/json;charset=UTF-8');
  }
-  
- 
- 
- 

+ 4 - 0
api/user.js

@@ -56,6 +56,10 @@ let request = new Request().http
  export function bindPromoter(data) {
  	 return request('/app/user/bindPromoter',data,'POST','application/json;charset=UTF-8');
  }
+ //获取跳转配置
+ export function getConfigByKey(data) {
+ 	 return request('/app/common/getConfigByKey',data,'GET');
+ }
  
  
  

+ 101 - 41
common/request.js

@@ -1,46 +1,84 @@
 // uni-app请求封装
+import {
+	TOKEN_KEYAuto
+} from '@/utils/courseTool.js'
+import store from '@/store/index.js'
 export default class Request {
-	http(router, data = {}, method,contentType) {
+	http(router, data = {}, method, contentType) {
 		let that = this;
 		//let path = 'http://localhost:7014';
 		// let path = 'https://test.userapp.store.cdwjyyh.com';
 		// let path = 'https://user.test.ylrztop.com/api';
-		// let path = 'https://userapp.zkhj6.com'//中康
-		let path = 'http://zd7f9ae7.natappfree.cc'//中康
-		uni.setStorageSync('requestPath',path)
+
+		let path = 'https://userapp.klbycp.com/store'; //百域承品
+		let path2 = 'https://userapp.klbycp.com'; //百域承品
+
+
+
+		// let path = 'http://j9d5863c.natappfree.cc/store';//百域承品
+		// let path2 = 'http://j9d5863c.natappfree.cc';//百域承品
+
+		let type = 0
+		uni.setStorageSync('requestPath', path2)
 		// uni.showLoading({
 		// 	title: '加载中'
 		// });
+
+		if (router.indexOf("/live/liveData/like") != -1) {
+			path = 'https://im.fhhx.runtzh.com';
+		}
+
+		if (router.indexOf("/live") !== -1||router.indexOf("/liveAPP") !== -1) {
+			path = 'https://userapp.klbycp.com';
+			console.log("在live里面>>>>.",`${path}${router}`)
+			router = router.replace('/liveAPP', '')
+			type=4
+			token = uni.getStorageSync('AppToken');
+		}
+		
+		if (router.indexOf("/patient/getPatientList") !== -1) {
+			path = 'https://userapp.klbycp.com';
+			// path = 'http://j9d5863c.natappfree.cc';
+		}
+		if (router.indexOf("/getGotoWxAppLiveLink") !== -1) {
+			path = 'https://userapp.klbycp.com/companyapp';
+		}
+
 		let token = uni.getStorageSync('AppToken');
-		if(router.indexOf("/companyapp")!=-1){
+		if (router.indexOf("/companyapp") != -1) {
 			// router =router.replace('/companyapp','')
-			 // path = 'http://192.168.10.158:7015'//
-			 token = uni.getStorageSync('ManageToken');
+			path = 'https://userapp.klbycp.com' //百域承品
+			type = 1
+			token = uni.getStorageSync('ManageToken');
 		}
-		if(router.indexOf("/course_uniapp")!=-1){
-			router =router.replace('/course_uniapp','')
+
+
+		// 企微看课
+		if (router.indexOf("/course_auto") != -1) {
+			type = 2
+			router = router.replace('/course_auto', '')
+			// path = 'http://w43fa358.natappfree.cc'
+			path = 'https://userapp.klbycp.com' //百域承品
+			token = uni.getStorageSync(TOKEN_KEYAuto)
+			console.log("TOKEN_KEYAuto===", TOKEN_KEYAuto, token)
+		}
+		if (router.indexOf("/course_uniapp") != -1) {
+			type = 3
+			router = router.replace('/course_uniapp', '')
 			//张玉朋
-			// let path = 'http://192.168.10.158:7014'//
-			// path = 'https://userapp.zkhj6.com'//中康
-			// path = 'https://user.test.ylrztop.com/api'//云融融智
-			// path = 'https://userapp.ashyisheng.com'//蜂巢快药(爱上嘉园)
-			// path = 'https://userapp.liangmiaoedu.com'//良苗
-			// path = 'https://usercourse.beliyostore.com'//倍力优
-			// path = 'https://userapp.bainian1000y.cn/prod-api'//百年康城
-			// path = 'https://userapp.whhm.ylrzcloud.com/prod-api'//惠名大药房
-			// path = 'https://userapp.cqsft.vip'//四福堂
-			// path = 'https://userapp.drkzyy.cn/prod-api'//青岛市德瑞康
-			// path = 'http://192.168.10.131:7014'
-			token =uni.getStorageSync('TOKEN_WEXIN')
+			// let path = 'http://192.168.10.158:8113'//
+			path = 'https://userapp.klbycp.com' //百域承品
+			token = uni.getStorageSync('TOKEN_WEXIN')
 		}
+
 		return new Promise((resolve, reject) => {
 			// token = uni.getStorageSync('AppToken');
-			var httpContentType='application/x-www-form-urlencoded';
-			if(contentType!=undefined){
+			var httpContentType = 'application/x-www-form-urlencoded';
+			if (contentType != undefined) {
 				//application/json;charset=UTF-8
-				httpContentType=contentType;
+				httpContentType = contentType;
 			}
-			var routers=router;
+			var routers = router;
 			// 请求
 			uni.request({
 				header: {
@@ -52,26 +90,48 @@ export default class Request {
 				data: data,
 				method: method,
 				success: (res) => {
+					if (type !== 0 && (res.data.code == 401 || res.data.code == 4001 || res.data
+							.code == 4004)) {
+						store.commit('setCoureLogin', 2);
+						uni.removeStorageSync("userinfos")
+						// uni.removeStorageSync('userInfo');
+						uni.removeStorageSync('TOKEN_WEXIN');
+						if (type == 2) {
+							uni.removeStorageSync(TOKEN_KEYAuto)
+						}
+						if (type == 1) {
+							uni.removeStorageSync('ManageToken');
+							uni.navigateTo({
+								url: '/pages_manage/login'
+							})
+						}
+						resolve({
+							code: 401,
+							data: null
+						});
+						return
+					}
 					//收到开发者服务器成功返回的回调函数
-					if(res.data.code==401){//没有权限直接退出到登录界面
+					if (res.data.code == 401) { //没有权限直接退出到登录界面
 						let pages = getCurrentPages();
 						pages.forEach(function(element) {
-						  if(element!=undefined&&element.route=="pages/auth/login"){
-						  	resolve(res.data)
-						  	return;
-						  }
+							if (element != undefined && element.route ==
+								"pages/auth/login") {
+								resolve(res.data)
+								return;
+							}
 						});
 						// let url = pages[ pages.length - 1]; //当前页页面实例
 						// //如果登录界面已打开,自动关闭
-						// if(url!=undefined&&url.route=="pages/auth/login"){
+						// if(url!=undefined&&url.route=="pages/auth/numberlogin"){
 						//  	resolve(res.data)
 						// 	return;
 						// }
 						uni.navigateTo({
-							url:'/pages/auth/login',
+							url: '/pages/auth/login',
 							success: () => {
 								uni.hideLoading();
-								
+
 							},
 							fail: () => {
 								uni.hideLoading();
@@ -79,25 +139,25 @@ export default class Request {
 						})
 						return;
 					}
-					if (res.data.token) {
-						uni.setStorageSync('AppToken',res.data.token)
+					if (res.data.token && type == 0) {
+						uni.setStorageSync('AppToken', res.data.token)
 					}
 					resolve(res.data)
 				},
-				fail:(res) =>{
+				fail: (res) => {
 					//接口调用失败的回调函数
 				},
-				complete:(res) =>{
+				complete: (res) => {
 					//接口调用结束的回调函数(调用成功、失败都会执行)
 					if (res.data.code == 401) {
 						return false
 					}
 					uni.hideLoading();
 				}
-				
+
 			})
 		})
-		 
+
 	}
-	
-}
+
+}

+ 43 - 0
components/Server.vue

@@ -0,0 +1,43 @@
+<template>
+	<view>
+		<view class="serve">
+			<image class="w130 h130"
+				src="/static/images/server.png"
+				mode=""></image>
+			<text class="text">官方客服</text>
+			<button class="contact-btn" open-type="contact"></button>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"Server",
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style  lang="scss" scoped>
+.serve{
+	position: fixed;
+	right: 20rpx;
+	top: 80%;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	z-index: 9;
+	.text{
+		margin-top: 10rpx;
+		font-weight: 500;
+		font-size: 24rpx;
+		color: #333;
+		background: rgba(255, 255, 255, 0.8);
+		padding: 8rpx 16rpx;
+		border-radius: 20rpx;
+	}
+}
+</style>

+ 1 - 1
components/chengpeng-audio/redme.md

@@ -9,7 +9,7 @@
 ```javascript
 //html
 <template>
-  <free-audio startPic='https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/icon/play.png' endPic='https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/icon/stop.png' :audioId='audio1' :url='path'></free-audio>
+  <free-audio startPic='https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon/play.png' endPic='https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon/stop.png' :audioId='audio1' :url='path'></free-audio>
 </template>
 
 //js

+ 1 - 1
components/im/tui-chat/message-elements/audio-message/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<view :class="'audio-message ' + (isMine ? 'my-audio' : '')">
-		<image class="audio-icon" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/audio.png"></image>
+		<image class="audio-icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/audio.png"></image>
 		<view class="audio " @click="handlePlayAudioMessage" :style="'width: ' + 120 + 'rpx'">{{ '" ' + message.payload.second }}</view>
 	</view>
 </template>

+ 1 - 1
components/im/tui-chat/message-elements/custom-message/index.vue

@@ -19,7 +19,7 @@
 			<view class="custom-content">
 				<view class="custom-content-title">{{ renderDom[0].title }}</view>
 				<view class="custom-content-score">
-					<image v-for="(item, index) in renderDom[0].score" :key="index" class="score-star" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/star.png"></image>
+					<image v-for="(item, index) in renderDom[0].score" :key="index" class="score-star" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/star.png"></image>
 				</view>
 				<view class="custom-content-description">{{ renderDom[0].description }}</view>
 			</view>

+ 1 - 1
components/im/tui-chat/message-elements/file-message/index.vue

@@ -3,7 +3,7 @@
 		<view class="TUI-fileMessage">
 			<view class="fileMessage">
 				<view class="fileMessage-box">
-					<image class="file-icon" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/file.png"></image>
+					<image class="file-icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/file.png"></image>
 					<label @tap="download" class="file-title">{{ filePayload.fileName }}</label>
 				</view>
 			</view>

+ 2 - 2
components/im/tui-chat/message-elements/video-message/index.vue

@@ -1,11 +1,11 @@
 <template>
 	<view :class="'video-box ' + (isMine ? 'my-video' : '')" @click="playerHander">
-		<image class="video-icon" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/video-play.png"></image>
+		<image class="video-icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/video-play.png"></image>
 	</view>
 </template>
 
 <script>
-import videoIcon from 'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/video-play.png';
+import videoIcon from 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/video-play.png';
 export default {
 	data() {
 		return {

+ 0 - 8
components/im/tui-chat/message-input/index.vue

@@ -59,14 +59,6 @@
 					<image class="TUI-Extension-icon" src="/static/assets/send-video.svg"></image>
 					<view class="TUI-Extension-slot-name">发送视频</view>
 				</view>
-				<!-- <view class="TUI-Extension-slot" @tap="handleCalling(1)">
-					<image class="TUI-Extension-icon" src="/static/assets/audio-calling.svg"></image>
-					<view class="TUI-Extension-slot-name">语音通话</view>
-				</view>
-				<view class="TUI-Extension-slot" @tap="handleCalling(2)">
-					<image class="TUI-Extension-icon" src="/static/assets/video-calling.svg"></image>
-					<view class="TUI-Extension-slot-name">视频通话</view>
-				</view> -->
 				<view class="TUI-Extension-slot" @tap="handleServiceEvaluation">
 					<image class="TUI-Extension-icon" src="/static/assets/service-assess.svg"></image>
 					<view class="TUI-Extension-slot-name">服务评价</view>

+ 1 - 1
components/im/tui-chat/message-private/service-evaluation/index.vue

@@ -12,7 +12,7 @@
 						:key="index"
 						class="score-star"
 						:data-score="item"
-						:src="'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/star' + (item > score ? '-grey' : '') + '.png'"
+						:src="'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/star' + (item > score ? '-grey' : '') + '.png'"
 						@tap="handleScore"
 					></image>
 				</view>

+ 1 - 1
components/likeProduct.vue

@@ -1,7 +1,7 @@
 <template>
    <view>
 		<view class="like-title" v-show="list &&list.length > 0">
-			<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/like.png" mode=""></image>
+			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/like.png" mode=""></image>
 			<text class="text">猜你喜欢</text>
 		</view>
 		<view class="like-list">

+ 2 - 2
components/px-popup-bottom/px-popup-bottom.vue

@@ -24,7 +24,7 @@
 </template>
 
 <script>
-	// import iconClose from 'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close40.png'
+	// import iconClose from 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close40.png'
 	export default {
 		props: {
 			title: { //标题
@@ -82,7 +82,7 @@
 				isAnimaStart: false,
 				rpxRate: "",
 				cotRadius: 0,
-				closeIcon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close40.png'
+				closeIcon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close40.png'
 			}
 		},
 		watch: {

+ 13 - 13
components/tabbar/tabbar.vue

@@ -71,36 +71,36 @@
 			},
 			themeicon() {
 				this.tabbarList = [{
-						iconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/home.png",
-						selectedIconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/home_sel.png",
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/home.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/home_sel.png",
 						Text: '首页',
 						url: '/pages/home/index',
 						isshowed:true
 					},
 					{
-						iconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/health.png",
-						selectedIconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/health_sel.png",
-						Text: '健康百科',
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/health.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/health_sel.png",
+						Text: '百域百科',
 						url: '/pages/healthy/index',
 						isshowed:true
 					},
 					{
-						iconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/archive.png",
-						selectedIconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/archive_sel.png",
-						Text: '健康档案',
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/archive.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/archive_sel.png",
+						Text: '百域档案',
 						url: '/pages/healthy/idea',
 						isshowed:false
 					},
 					{
-						iconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/shop_mall.png",
-						selectedIconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/shop_mall_sel.png",
-						Text: '健康产品',
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/shop_mall.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/shop_mall_sel.png",
+						Text: '百域产品',
 						url: '/pages/shopping/index',
 						isshowed:false
 					},
 					{
-						iconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/my.png",
-						selectedIconPath: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/my_sel.png",
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/my.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/my_sel.png",
 						Text: '我的',
 						url: '/pages/user/index',
 						isshowed:true

+ 3 - 3
components/tuiProduct.vue

@@ -1,9 +1,9 @@
 <template>
    <view>
-		<!-- <view class="like-title">
-			<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/tui.png" mode=""></image>
+		<view class="like-title">
+			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/tui.png" mode=""></image>
 			<text class="text">精选商品</text>
-		</view> -->
+		</view>
 		<view class="like-list">
 			<view class="item" v-for="(item,index) in list" :key="index" @click="showProduct(item)">
 				<view class="img-box">

+ 3 - 0
main.js

@@ -8,8 +8,11 @@ import uView from 'uview-ui'
 import {formatSeconds}from './utils/tools.js'
 Vue.prototype.$formatSeconds = formatSeconds;
 import {isLoginCourse,isLoginCourseqw} from './utils/common.js'
+import {isLoginCourseAuto} from '@/utils/courseTool.js'
 Vue.prototype.$isLoginCourse = isLoginCourse
 Vue.prototype.$isLoginCourseqw = isLoginCourseqw
+Vue.prototype.$isLoginCourseAuto = isLoginCourseAuto
+
 Vue.use(uView)
 // uni.$u.config.unit = 'rpx'
   

+ 78 - 76
manifest.json

@@ -1,77 +1,79 @@
 {
-    "name" : "zhongkmall_user_app",
-    "appid" : "__UNI__A8490FA",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    /* 5+App特有相关 */
-    "app-plus" : {
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
-        },
-        /* 模块配置 */
-        "modules" : {},
-        /* 应用发布信息 */
-        "distribute" : {
-            /* android打包配置 */
-            "android" : {
-                "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
-            },
-            /* ios打包配置 */
-            "ios" : {},
-            /* SDK配置 */
-            "sdkConfigs" : {}
-        }
-    },
-    /* 快应用特有相关 */
-    "quickapp" : {},
-    /* 小程序特有相关 */
-    "mp-weixin" : {
-        "appid" : "wxedde588767b358b1",
-        "setting" : {
-            "urlCheck" : false
-        },
-        "usingComponents" : true,
-        "permission" : {
-            "scope.userLocation" : {
-                "desc" : "获取您的位置信息为了更好的推荐服务"
-            }
-        }
-    },
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents" : true
-    },
-    "mp-toutiao" : {
-        "usingComponents" : true
-    },
-    "uniStatistics" : {
-        "enable" : false
-    },
-    "vueVersion" : "2"
-}
+	"name": "联志甄选",
+	"appid": "__UNI__A8490FA",
+	"description": "",
+	"versionName": "1.0.0",
+	"versionCode": "100",
+	"transformPx": false,
+	/* 5+App特有相关 */
+	"app-plus": {
+		"usingComponents": true,
+		"nvueStyleCompiler": "uni-app",
+		"compilerVersion": 3,
+		"splashscreen": {
+			"alwaysShowBeforeRender": true,
+			"waiting": true,
+			"autoclose": true,
+			"delay": 0
+		},
+		/* 模块配置 */
+		"modules": {},
+		/* 应用发布信息 */
+		"distribute": {
+			/* android打包配置 */
+			"android": {
+				"permissions": [
+					"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+					"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+					"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+					"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+					"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CAMERA\"/>",
+					"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+					"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+					"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+					"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+					"<uses-feature android:name=\"android.hardware.camera\"/>",
+					"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+				]
+			},
+			/* ios打包配置 */
+			"ios": {
+				"dSYMs": false
+			},
+			/* SDK配置 */
+			"sdkConfigs": {}
+		}
+	},
+	/* 快应用特有相关 */
+	"quickapp": {},
+	/* 小程序特有相关 */
+	"mp-weixin": {
+		"appid": "wx44beed5640bcb1ba",
+		"setting": {
+			"urlCheck": false
+		},
+		"usingComponents": true,
+		"permission": {
+			"scope.userInfo": {
+				"desc": "用于显示用户昵称和头像"
+			}
+		}
+	},
+	"mp-alipay": {
+		"usingComponents": true
+	},
+	"mp-baidu": {
+		"usingComponents": true
+	},
+	"mp-toutiao": {
+		"usingComponents": true
+	},
+	"uniStatistics": {
+		"enable": false
+	},
+	"vueVersion": "2"
+}

+ 323 - 10
package-lock.json

@@ -1,30 +1,343 @@
 {
   "name": "zhongkmall_user_app",
   "version": "1.0.0",
-  "lockfileVersion": 1,
+  "lockfileVersion": 3,
   "requires": true,
-  "dependencies": {
-    "@vue/devtools-api": {
+  "packages": {
+    "": {
+      "name": "zhongkmall_user_app",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "crypto-js": "^4.2.0",
+        "dayjs": "^1.11.13",
+        "uview-ui": "^2.0.38",
+        "vuex": "^4.1.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz",
+      "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@babel/types": "^7.28.0"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.28.2",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz",
+      "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
+      "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
+      "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@babel/parser": "^7.28.0",
+        "@vue/shared": "3.5.18",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
+      "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/compiler-core": "3.5.18",
+        "@vue/shared": "3.5.18"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
+      "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@babel/parser": "^7.28.0",
+        "@vue/compiler-core": "3.5.18",
+        "@vue/compiler-dom": "3.5.18",
+        "@vue/compiler-ssr": "3.5.18",
+        "@vue/shared": "3.5.18",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.17",
+        "postcss": "^8.5.6",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
+      "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.18",
+        "@vue/shared": "3.5.18"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
       "version": "6.6.4",
       "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
       "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
     },
-    "dayjs": {
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz",
+      "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/shared": "3.5.18"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
+      "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/reactivity": "3.5.18",
+        "@vue/shared": "3.5.18"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
+      "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/reactivity": "3.5.18",
+        "@vue/runtime-core": "3.5.18",
+        "@vue/shared": "3.5.18",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
+      "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.18",
+        "@vue/shared": "3.5.18"
+      },
+      "peerDependencies": {
+        "vue": "3.5.18"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz",
+      "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/dayjs": {
       "version": "1.11.13",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
-      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+      "license": "MIT"
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.17",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "peer": true,
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC",
+      "peer": true
+    },
+    "node_modules/postcss": {
+      "version": "8.5.6",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "nanoid": "^3.3.11",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
     },
-    "uview-ui": {
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/uview-ui": {
       "version": "2.0.38",
       "resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.38.tgz",
-      "integrity": "sha512-6egHDf9lXHKpG3hEjRE0vMx4+VWwKk/ReTf5x18KrIKqdvdPRqO3+B8Unh7vYYwrIxzAWIlmhZ9RJpKI/4UqPQ=="
+      "integrity": "sha512-6egHDf9lXHKpG3hEjRE0vMx4+VWwKk/ReTf5x18KrIKqdvdPRqO3+B8Unh7vYYwrIxzAWIlmhZ9RJpKI/4UqPQ==",
+      "engines": {
+        "HBuilderX": "^3.1.0"
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.5.18",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz",
+      "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.18",
+        "@vue/compiler-sfc": "3.5.18",
+        "@vue/runtime-dom": "3.5.18",
+        "@vue/server-renderer": "3.5.18",
+        "@vue/shared": "3.5.18"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
     },
-    "vuex": {
+    "node_modules/vuex": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
       "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
-      "requires": {
+      "dependencies": {
         "@vue/devtools-api": "^6.0.0-beta.11"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
       }
     }
   }

+ 1 - 0
package.json

@@ -10,6 +10,7 @@
   "license": "ISC",
   "description": "",
   "dependencies": {
+    "crypto-js": "^4.2.0",
     "dayjs": "^1.11.13",
     "uview-ui": "^2.0.38",
     "vuex": "^4.1.0"

+ 292 - 40
pages.json

@@ -12,6 +12,13 @@
 				"navigationBarTitleText": "授权登录",
 				"navigationStyle": "custom"
 			}
+		},{
+			"path": "pages/auth/numberlogin",
+			"style": {
+				"navigationBarTitleText": "电话号码登录",
+				"navigationStyle": "custom"
+			}
+
 		},
 		{
 			"path": "pages/auth/wxLogin",
@@ -24,7 +31,7 @@
 		{
 			"path": "pages/home/index",
 			"style": {
-				"navigationBarTitleText": "中康智慧",
+				"navigationBarTitleText": "百域承品",
 				"enablePullDownRefresh": false,
 				"navigationStyle": "custom",
 				"app-plus": {
@@ -67,7 +74,7 @@
 		{
 			"path": "pages/healthy/idea",
 			"style": {
-				"navigationBarTitleText": "健康档案",
+				"navigationBarTitleText": "百域档案",
 				"enablePullDownRefresh": false,
 				"navigationStyle": "custom",
 				"app-plus": {
@@ -87,7 +94,7 @@
 		{
 			"path": "pages/healthy/index",
 			"style": {
-				"navigationBarTitleText": "健康知识",
+				"navigationBarTitleText": "百域知识",
 				"enablePullDownRefresh": false,
 				"navigationStyle": "custom",
 				"app-plus": {
@@ -190,7 +197,7 @@
 		//     "path" : "pages/shopping/productList",
 		//     "style" :                                                                                    
 		//     {
-		//         "navigationBarTitleText": "品列表",
+		//         "navigationBarTitleText": "品列表",
 		//         "enablePullDownRefresh": false
 		//     }
 
@@ -515,7 +522,7 @@
 				{
 					"path": "index/articleList",
 					"style": {
-						"navigationBarTitleText": "健康知识",
+						"navigationBarTitleText": "百域知识",
 						"app-plus": {
 							"titleNView": false
 						}
@@ -558,7 +565,7 @@
 			"pages": [{
 					"path": "user/addPatient",
 					"style": {
-						"navigationBarTitleText": "创建健康档案",
+						"navigationBarTitleText": "创建百域档案",
 						"app-plus": {
 							"titleNView": false
 						}
@@ -603,7 +610,7 @@
 				}, {
 					"path": "user/patient",
 					"style": {
-						"navigationBarTitleText": "健康档案",
+						"navigationBarTitleText": "百域档案",
 						"enablePullDownRefresh": false
 					}
 
@@ -775,21 +782,21 @@
 				}, {
 					"path": "user/doc",
 					"style": {
-						"navigationBarTitleText": "健康档案",
+						"navigationBarTitleText": "百域档案",
 						"enablePullDownRefresh": false
 					}
 
 				}, {
 					"path": "user/addDoc",
 					"style": {
-						"navigationBarTitleText": "创建健康档案",
+						"navigationBarTitleText": "创建百域档案",
 						"enablePullDownRefresh": false
 					}
 
 				}, {
 					"path": "user/docDetail",
 					"style": {
-						"navigationBarTitleText": "健康档案",
+						"navigationBarTitleText": "百域档案",
 						"navigationBarBackgroundColor": "#dff9f5",
 						"enablePullDownRefresh": false
 					}
@@ -797,14 +804,14 @@
 				}, {
 					"path": "user/docRecord",
 					"style": {
-						"navigationBarTitleText": "健康记录",
+						"navigationBarTitleText": "百域记录",
 						"enablePullDownRefresh": false
 					}
 
 				}, {
 					"path": "user/addDocRecord",
 					"style": {
-						"navigationBarTitleText": "添加健康记录",
+						"navigationBarTitleText": "添加百域记录",
 						"enablePullDownRefresh": false
 					}
 
@@ -866,6 +873,14 @@
 							"titleNView": false
 						}
 					}
+				},{
+					"path": "shareLive",
+					"style": {
+						"navigationBarTitleText": "分享直播间",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
 				},
 				{
 					"path": "storeOrder",
@@ -990,6 +1005,15 @@
 						}
 					}
 				},
+				{
+					"path": "wechatcode",
+					"style": {
+						"navigationBarTitleText": "微信收款码",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
 				{
 					"path": "card",
 					"style": {
@@ -1022,7 +1046,7 @@
 				{
 					"path": "shopping/productList",
 					"style": {
-						"navigationBarTitleText": "品列表",
+						"navigationBarTitleText": "品列表",
 						"enablePullDownRefresh": false
 					}
 
@@ -1048,19 +1072,161 @@
 						"enablePullDownRefresh": false
 					}
 
+				},
+				{
+					"path": "live/storeOrderDetail",
+					"style": {
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+						
+					}
+
+				},{
+					"path": "live/complaint",
+					"style": {
+						"navigationBarTitleText": "我的反馈",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+{
+					"path": "live/complaintList",
+					"style": {
+						"navigationBarTitleText": "反馈与投诉",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/goods",
+					"style": {
+						"navigationBarTitleText": "商品详情",
+						"enablePullDownRefresh": false
+					}
+
+				},{
+					"path": "live/integral",
+					"style": {
+						"navigationBarTitleText": "积分",
+						"enablePullDownRefresh": false
+					}
+
+				},
+
+				{
+					"path": "live/order",
+					"style": {
+						"navigationBarTitleText": "我的订单",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/confirmCreateOrder",
+					"style": {
+						"navigationBarTitleText": "确认订单",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/paymentOrder",
+					"style": {
+						"navigationBarTitleText": "支付订单",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/refundOrder",
+					"style": {
+						"navigationBarTitleText": "申请售后",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "live/refundOrderProduct",
+					"style": {
+						"navigationBarTitleText": "订单售后",
+						"enablePullDownRefresh": false
+					}
+
+				},{
+					"path": "live/storeOrderDelivery",
+					"style": {
+						"navigationBarTitleText": "物流信息",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "live/storeOrderRefundList",
+					"style": {
+						"navigationBarTitleText": "我的售后",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black"
+					}
+				},
+				
+				{
+					"path": "live/storeOrderRefundSubmit",
+					"style": {
+						"navigationBarTitleText": "提交售后",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+					}
+				},
+				{
+					"path": "live/success",
+					"style": {
+						"navigationBarTitleText": "支付成功",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/refundOrderDetail",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationStyle": "custom",
+						"scrollIndicator": "none",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/refundOrderDelivery",
+					"style": {
+						"navigationBarTitleText": "物流信息",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
 				}
 
 			]
 		},
 		{
 			"root": "pages_manage",
-			"pages": [{
-					"path": "teacherClassroom",
-					"style": {
-						"navigationBarTitleText": "名师课堂",
-						"enablePullDownRefresh": false
-					}
-				},
+			"pages": [
 				{
 					"path": "login",
 					"style": {
@@ -1095,16 +1261,9 @@
 						"navigationBarTitleText": "销售详情",
 						"enablePullDownRefresh": false
 					}
-				},
-				{
-					"path" : "learn",
-					"style" : 
-					{
-						"navigationBarTitleText" : "健康生活方式指导",
-						"enablePullDownRefresh": false
-					}
 				}
 				
+				
 			]
 		},
 		{
@@ -1185,6 +1344,42 @@
 						"navigationBarTitleText": "更换会员归属",
 						"enablePullDownRefresh": false
 					}
+				},
+				{
+					"path": "voice",
+					"style": {
+						"navigationBarTitleText": "声音采集",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none" // 页面回弹
+						}
+					}
+				},{
+					"path" : "voiceItem",
+					"style" : 
+					{
+						"navigationBarTitleText" : "声音录制",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black",
+						"app-plus": {
+							"bounce": "none" // 页面回弹
+						}
+					}
+				},{
+					"path" : "voiceList",
+					"style" : 
+					{
+						"navigationBarTitleText" : "声音录制",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black",
+						"app-plus": {
+							"bounce": "none" // 页面回弹
+						}
+					}
 				}
 			]
 		},
@@ -1224,13 +1419,63 @@
 						"navigationBarTitleText": "看课详情",
 						"enablePullDownRefresh": false
 					}
+				},
+				{
+					"path" : "learn",
+					"style" : 
+					{
+						"navigationBarTitleText" : "百域生活方式指导",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "teacherClassroom",
+					"style": {
+						"navigationBarTitleText": "名师课堂",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "video",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom"
+					}
+				}, {
+					"path": "livingList",
+					"style": {
+						"navigationBarTitleText": "课程列表",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}, {
+					"path": "living",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": true,
+						"navigationStyle": "custom",
+						"softinputMode": "adjustResize", // 必须配置这个才能正常获取高度
+						"app-plus": {
+							"bounce": "none",
+							"videoFullscreen": true,
+							"videoAutoFullscreen": false,
+							"videoObjectFit": "contain"
+						},
+						"h5": {
+							"videoFullscreen": true
+						}
+					}
 				}
 			]
 		}
 	],
 	"globalStyle": {
 		"navigationBarTextStyle": "black",
-		"navigationBarTitleText": "中康智慧",
+		"navigationBarTitleText": "百域承品",
 		"navigationBarBackgroundColor": "#FFFFFF",
 		"backgroundColor": "#FFFFFF"
 	},
@@ -1251,23 +1496,30 @@
 				"text": "首页"
 			},
 
+			// {
+			// 	"pagePath": "pages/healthy/index",
+			// 	"iconPath": "/static/tabbar/health.png",
+			// 	"selectedIconPath": "/static/tabbar/health_sel.png",
+			// 	"text": "百域百科"
+			// }
 			{
-				"pagePath": "pages/healthy/index",
-				"iconPath": "/static/tabbar/health.png",
-				"selectedIconPath": "/static/tabbar/health_sel.png",
-				"text": "健康百科"
-			},
-			{
-				"pagePath": "pages/shopping/index",
-				"iconPath": "/static/tabbar/shop_mall.png",
-				"selectedIconPath": "/static/tabbar/shop_mall_sel.png",
-				"text": "健康产品"
+				"pagePath": "pages/shopping/cart",
+				"iconPath": "/static/tabbar/cart.png",
+				"selectedIconPath": "/static/tabbar/cart_sel.png",
+				"text": "购物车"
 			},
+			// {
+			// 	"pagePath": "pages/shopping/index",
+			// 	"iconPath": "/static/tabbar/shop_mall.png",
+			// 	"selectedIconPath": "/static/tabbar/shop_mall_sel.png",
+			// 	"text": "百域商城"
+			// },
+			
 			// {
 			// 	"pagePath": "pages/healthy/idea",
 			// 	"iconPath": "/static/tabbar/archive.png",
 			// 	"selectedIconPath": "/static/tabbar/archive_sel.png",
-			// 	"text": "健康档案"
+			// 	"text": "百域档案"
 			// },
 			{
 				"pagePath": "pages/user/index",

+ 44 - 5
pages/auth/login.vue

@@ -3,15 +3,22 @@
     <!-- #ifdef MP-WEIXIN -->
     <view  class="force-login-wrap">
       <view class="force-login__content y-f">
-        <open-data class="user-avatar" type="userAvatarUrl"></open-data>
-        <open-data class="user-name" type="userNickName"></open-data>
+		  <view class="logo">
+		  	<view class="logo-img">
+		  		<!-- <image  :src="imgPath+'/app/images/logo.png'"></image> -->
+				<image  src="/static/logo.png"></image>
+		  	</view>
+		  	<view class="title">百域承品</view>
+		  </view>
+        <!-- <open-data class="user-avatar" type="userAvatarUrl"></open-data>
+        <open-data class="user-name" type="userNickName"></open-data> -->
         <view class="login-notice">为了提供更优质的服务,请先登录</view>
 		
 		<button
 			class="author-btn"
 			open-type="getPhoneNumber"
 			@getphonenumber="phoneLogin"  >手机号一键登录</button>
-       <!-- <button class="close-btn" @tap="back">暂不登录</button> -->
+       <button class="close-btn" @tap="back">暂不登录</button>
 		 <view class="tips">
 			 <checkbox  :checked="isAgreement" @click="handleAgreement()" />
 			 <view  @click="handleAgreement()">您同意并接受</view>
@@ -36,6 +43,9 @@ export default {
 		}
 	},
 	computed: {
+		imgPath() {
+		  return this.$store.state.imgpath
+		},
 	},
 	onLoad(option) 
 	{
@@ -152,7 +162,8 @@ export default {
 							   encryptedData: e.mp.detail.encryptedData,
 							   iv: e.mp.detail.iv,
 							   code: code,
-							   userCode:userCode
+							   userCode:userCode,
+							   appId:wx.getAccountInfoSync().miniProgram.appId,
 							})
 							.then( res => {
 								if(res.code==200){
@@ -217,12 +228,40 @@ export default {
 </script>
 
 <style lang="scss">
+	.logo{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.logo-img{
+			border: 4upx solid #FFFFFF;
+			box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
+			border-radius: 50%;
+			width: 80px;
+			height: 80px;
+			image{
+				border-radius: 50%;
+				width: 100%;
+				height: 100%;
+				overflow: hidden;
+			}
+		}
+		
+		.title{
+			margin-top: 20rpx;
+			font-size: 35rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #000;
+			margin-bottom: 30rpx;
+		}
+	}
 .container {
   flex: 1;
   display: flex;
   flex-direction: column;
   justify-content: flex-start;
-  position: relative;
+  // position: relative;
 }
 
 .force-login-wrap {

+ 761 - 0
pages/auth/numberlogin.vue

@@ -0,0 +1,761 @@
+<template>
+	<view>
+		 <view class="content x-c">
+			<image class="backImg" @tap="goBack()" src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/icon_close.png"></image>
+			 <view class="pageTop  x-c">
+					<view class="head x-c">
+						 登录即可体验完整功能
+					 </view>
+					<view class="loginBox">
+							 <view class="login-item">
+								 <view class="input-account">
+									 <input  v-model="userName" placeholder="手机号登录" type="number" />
+								 </view>
+								 <view class="line"></view>
+							 </view> 
+							<!-- <view class="login-item">
+								 <view class="input-pwd">
+									 <input v-model="password"  placeholder="请输入密码" type="password" />
+								 </view>
+								  <view class="line"></view>
+							 </view> -->
+							 <view class="btns">
+								 <view class="login-btn" @click="login">登录</view>
+							 </view>
+							 <view class="reg-box x-bc">
+								  <view class="reg-btn" @click="goToRegister()">注册账号</view>
+								  <!-- <view class="reg-btn" @click="goToFindPass()">忘记密码</view>  -->
+							 </view>
+					</view>
+			</view>
+			<view class="pageBottom" v-if="isApp && isAgreePrivacy">
+					<view class="tips y-f"> — 快捷登录 — </view> 
+					<view class="menu x-ac">
+						 <view @tap="loginWeixin" ><image src="/static/image/login/weixin.png"></image></view>
+						 <view v-if="isIos" @tap="quickAppleLogin" ><image src="/static/image/login/apple.png"></image></view>
+				   </view>		
+			</view>
+		
+			<view class="checkbox">
+				<view class="checkbox-icon" @tap="handleAgree">
+					<image src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/right_org_ling.png" v-show="!agree"></image>
+					<image src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/right_org.png" v-show="agree"></image>
+				</view>
+				<view>我已阅读并同意<text @tap="goToWeb(0)">《用户协议》</text><text @tap="goToWeb(1)">《隐私政策》</text> 并使用本机号码登录</view>
+			</view>
+			
+		 </view>
+	</view>
+	
+</template>
+
+<script>
+	import { login } from '@/api/living'
+	// login
+import { loginByWeChat,getUserInfo,loginByApple } from '@/api/user'
+export default {
+	data() {
+		return {
+			userName:"",
+			password:"",
+		    registrationID:"",
+			unionid:"",
+			userPhone:"",
+			loginType:0,
+			isApp:false,
+			agree: false,
+			isAgreePrivacy:false,
+			isIos:false,
+			from: '',
+			source:'',
+			appleKey:""
+		}
+	},
+	onLoad(option) {
+		// #ifdef APP-PLUS
+		this.isIos = plus.os.name == "iOS"
+		// #endif  
+		this.from= option.from || ''
+			let that=this;
+			uni.$on('getRegistrationID', function(data) {
+				//console.log("getRegistrationID " + JSON.stringify(data));
+				that.registrationID=data;
+			}); 
+		// #ifdef APP-PLUS
+		   this.isApp=true;
+		   this.source = plus.runtime.channel || 'app'
+		// #endif
+		// if(!this.$isLogin()) {
+		// 	this.$showLoginPage()
+		// } 
+	},
+	onShow() {
+		// if(this.$isLogin()) {
+		// 	this.goPage()
+		// }
+		// #ifdef APP-PLUS
+			this.isAgreePrivacy=this.isIos ? true : plus.runtime.isAgreePrivacy();
+			if(plus.runtime.isAgreePrivacy()) {
+			    this.getRegistrationID();
+			}
+		// #endif
+    },
+	onUnload() {
+		uni.$off('getRegistrationID');
+    },
+    mounted() {
+       
+    },
+    methods: {
+	   initUniverify(){
+		   const callback = (res) => {
+		     // 获取一键登录弹框协议勾选状态
+		     univerifyManager.getCheckBoxState({
+		       success(res) {
+		         console.log("getCheckBoxState res: ", res);
+		         if (res.state) {
+		           // 关闭一键登录弹框
+		           univerifyManager.close()
+		         }
+		       }
+		     })
+		   }
+		   // 订阅自定义按钮点击事件
+		   univerifyManager.onButtonsClick(callback);
+		   // 取消订阅自定义按钮点击事件
+		   univerifyManager.offButtonsClick(callback);  
+	   },
+       login(){
+			
+			// if (this.$isEmpty(this.password)) {
+			// 	uni.showToast({
+			// 		title: "请输入密码",
+			// 		icon: 'none',
+			// 	});
+			// 	return
+			// }
+			if (!this.agree) {
+				uni.showToast({
+					title: "请同意相关协议",
+					icon: 'none'
+				});
+				return
+			}
+			var data = {
+				phone:this.userName,
+				password: this.password,
+				jpushId:this.registrationID,
+				loginType:3,
+				source: this.source
+			};
+			var that=this;
+			uni.showLoading({
+				title:"处理中..."
+			});
+			login(data).then(res => {
+					uni.hideLoading();
+					console.log("qxj res:"+JSON.stringify(res));
+					if(res.code==200){
+						console.log("登录了>>>>",res)
+						uni.setStorageSync('AppToken',res.token);
+						uni.setStorageSync('userInfo',JSON.stringify(res.user));
+						uni.$emit('refreshIM');
+						uni.$emit('showHealthButler');
+						that.goPage();
+						
+						// // #ifdef H5
+						//     this.$navBack();
+						// // #endif
+						
+						// // #ifdef APP-PLUS
+						//      this.$navBack();
+						//     // uni.reLaunch({
+						//     // 	url: '../index/index',
+						//     // 	animationType: 'pop-in',
+						//     // 	animationDuration: 100
+						//     // })
+						// // #endif
+					}
+					else{
+						uni.showToast({title: res.msg,icon: 'none'});
+					}
+				},
+				rej => {
+					console.log("qxj rej:"+JSON.stringify(rej));
+				}
+			);
+	   },
+	  quickAppleLogin() {
+	   	let that=this;
+		if (!this.agree) {
+			uni.showToast({
+				title: "请同意相关协议",
+				icon: 'none'
+			});
+			return
+		}
+		uni.getProvider({
+			service: 'oauth',
+			success: function (res) {
+				// console.log(res.provider)
+				if (res.provider.indexOf('apple')) {
+					uni.login({
+						provider: 'apple',
+						success: function (loginRes) {
+							that.appleKey = loginRes.authResult.openid
+							that.loginByAppleAct(loginRes.authResult)
+							
+						},
+						fail: function (err) {
+							console.log(err);
+							// 登录授权失败
+							// err.code错误码参考`授权失败错误码(code)说明`
+						}
+					});
+				}
+			}
+		});
+	   },
+	   async loginByAppleAct(authResult) {
+		   let loginDevice = ''
+			if(plus.runtime.isAgreePrivacy()) {
+				const info = await uni.getPushClientId();
+				uni.setStorageSync("registrationID", info.cid);
+				this.registrationID = info.cid;
+				let devinfo= await uni.getDeviceInfo();
+				if(devinfo!=null){
+					loginDevice += devinfo.deviceBrand ? devinfo.deviceBrand : "";
+					loginDevice += devinfo.deviceModel ? " " + devinfo.deviceModel : "";
+					loginDevice += devinfo.system ? " " + devinfo.system : "";
+				}
+			}	
+		    const params={
+				loginDevice:loginDevice,
+			   jpushId:this.registrationID,
+			   source:this.source,
+			   appleKey: authResult.openid
+			};
+			uni.showLoading({
+				title: '登陆中'
+			})
+		    loginByApple(params).then(res=>{
+				uni.hideLoading()
+				if(res.user!=null){
+					   uni.hideLoading();
+					   uni.setStorageSync('AppToken',res.token);
+					   uni.setStorageSync('userInfo',JSON.stringify(res.user));
+					   uni.closeAuthView();
+					   uni.$emit('refreshIM');
+					   uni.$emit('showHealthButler');
+					   uni.$emit('refreshUserInfo',{});
+					   // this.$navBack();
+					   this.goPage()
+				}else{
+					if(res.isNew){
+						this.bindMobile('apple');
+					}
+				}
+			}).catch(()=>{
+				uni.hideLoading()
+			})
+	   },
+	   loginWeixin(){
+		   if (!this.agree) {
+		   	uni.showToast({
+		   		title: "请同意相关协议",
+		   		icon: 'none'
+		   	});
+		   	return
+		   }
+		   uni.login({
+		   	provider: "weixin",
+		   	onlyAuthorize:true,
+		   	success: async (res) => {
+		   		let that=this;
+		   		uni.showLoading({
+		   			title:"处理中..."
+		   		});
+		   		const params={code:res.code,jpushId:this.registrationID,source:this.source};
+		   		this.loginByWeChatAct(params);
+		   	},
+		   	fail: (err) => {
+		   		console.log('qxj loginWeixin fail:', JSON.stringify(err));
+		   		// 未开通
+		   		if (err.code == 1000) {
+		   			uni.showModal({
+		   				title: '登录失败',
+		   				content: `${err.errMsg}\n,错误码:${err.code}`,
+		   				confirmText: '开通指南',
+		   				cancelText: '确定',
+		   				success: (res) => {
+		   					if (res.confirm) {
+		   						setTimeout(() => {
+		   							plus.runtime.openWeb('https://ask.dcloud.net.cn/article/37965')
+		   						}, 500)
+		   					}
+		   				}
+		   			});
+		   			return;
+		   		}
+		   		// 一键登录预登陆失败
+		   		if (err.code == '30005') {
+		   			uni.showModal({
+		   				showCancel: false,
+		   				title: '预登录失败',
+		   				content: err.errMsg
+		   			});
+		   			return;
+		   		}
+		   		// 一键登录用户关闭验证界面
+		   		if (err.code != '30003') {
+		   			uni.showModal({
+		   				showCancel: false,
+		   				title: '登录失败',
+		   				content: JSON.stringify(err)
+		   			});
+		   		}
+		   	},
+		   	complete: () => {
+		   		
+		   	}
+		   });			
+		   								
+	   },
+	   goToRegister(){
+		   this.$navTo('./register');
+	   },
+	   goToFindPass(){
+	   	   this.$navTo('./findpass');
+	   },
+	   doUniverify(authResult){
+		   uniCloud.callFunction({
+				 name: 'loginByMobile', // 你的云函数名称
+				 data: {
+				   access_token: authResult.access_token, // 客户端一键登录接口返回的access_token
+				   openid:authResult.openid // 客户端一键登录接口返回的openid
+				 }
+		   }).then(res => {
+			    uni.closeAuthView();
+			   if(res.result.errCode==0){
+				   this.userName=res.result.phoneNumber;
+			   }else{
+				   uni.showToast({title:res.result.message,icon: 'none' });
+			   }
+		      
+		   }).catch(err=>{
+		       // 处理错误
+			    console.error('调用云函数失败:',err);
+			    // 详细记录错误信息
+			    console.error('错误信息:', err.errMsg);
+		   })
+	   },
+	   loginByWeChatAct(params){
+	   	 loginByWeChat(params).then(res => {
+	   	 		if(res.code==200){
+	   	 			if(res.user!=null){
+	   	 				   uni.hideLoading();
+	   	 				   uni.setStorageSync('AppToken',res.token);
+	   	 				   uni.setStorageSync('userInfo',JSON.stringify(res.user));
+	   	 				   uni.closeAuthView();
+						   uni.$emit('refreshIM');
+						   uni.$emit('showHealthButler');
+	   					   uni.$emit('refreshUserInfo',{});
+						   // this.$navBack();
+						   this.goPage()
+	   	 			}else{
+	   	 				this.unionid=res.unionid;
+	   	 				if(res.isNew){
+	   	 					this.bindMobile();
+	   	 				}
+	   	 			}
+	   	 		    
+				}
+	   	 		else{
+	   	 			uni.hideLoading();
+	   	 			uni.showToast({title: res.msg,icon: 'none'});
+	   	 		}
+	   	 	},
+	   	 	rej => {}
+	   	 );								
+	   },
+	   bindMobile(type){
+	   	 // #ifdef APP-PLUS
+	
+	   	    uni.login({
+	   	    		        provider: 'univerify',
+	   	    				univerifyStyle: { // 自定义登录框样式
+	   	    				   fullScreen: false,
+	   	    				   authButton: {
+	   	    				    	"title": "绑定手机号", 
+	   	    						"normalColor": "#FF5C03", 
+	   	    						"highlightColor": "#FF5C03",
+	   	    				   },
+	   	    				   privacyTerms: {
+	   	    					        "defaultCheckBoxState":true, // 条款勾选框初始状态 默认值: true
+	   	    					        "isCenterHint":false, //未勾选服务条款时点击登录按钮的提示是否居中显示 默认值: false (3.7.13+ 版本支持)
+	   	    					        "uncheckedImage":"", // 可选 条款勾选框未选中状态图片(仅支持本地图片 建议尺寸 24x24px)(3.2.0+ 版本支持)
+	   	    					        "checkedImage":"", // 可选 条款勾选框选中状态图片(仅支持本地图片 建议尺寸24x24px)(3.2.0+ 版本支持)
+	   	    					        "checkBoxSize":18, // 可选 条款勾选框大小
+	   	    					        "textColor": "#BBBBBB", // 文字颜色 默认值:#BBBBBB
+	   	    					        "termsColor": "#FF5C03", //  协议文字颜色 默认值: #5496E3
+	   	    					        "prefix": "我已阅读并同意", // 条款前的文案 默认值:“我已阅读并同意”
+	   	    					        "suffix": "并使用本机号码登录", // 条款后的文案 默认值:“并使用本机号码登录”
+	   	    					        "privacyItems": [  // 自定义协议条款,最大支持2个,需要同时设置url和title. 否则不生效
+	   	    					           
+	   	    					        ]
+	   	    					    },
+	   	    				   },
+	   						   success(res){ //
+	   								console.log("qxj univerify login:"+JSON.stringify(res.authResult));  // {openid:'登录授权唯一标识',access_token:'接口返回的 token'}
+	   								if(type == 'apple') {
+										this.loginByUniverify(res.authResult,3);
+									} else {
+										this.loginByUniverify(res.authResult,1);
+									}
+	   						   },
+	   	    				   fail(res){  
+	   								uni.hideLoading();
+	   								uni.showToast({title: "一键登录失败请检查网络和SIM卡是否可用",icon: 'none',position:'bottom'});
+	   								//setTimeout(function() {
+	   									uni.navigateTo({url: "/pages/auth/login"});
+	   								//}, 1800);
+	   								//}
+	   								//登录失败
+	   								console.log("qxj failRes:"+JSON.stringify(res));
+	   	    				
+	   					}
+	   	    });
+	   	    	
+	   	 // #endif
+	   	 
+	   	 // #ifdef H5
+			   uni.navigateTo({
+				    url: "/pages/auth/login"
+			   });
+	   	 // #endif
+	   },
+	   loginByUniverify(authResult,type){
+	   		   uniCloud.callFunction({
+	   				 name: 'loginByMobile', // 你的云函数名称
+	   				 data: {
+	   				   access_token: authResult.access_token, // 客户端一键登录接口返回的access_token
+	   				   openid:authResult.openid // 客户端一键登录接口返回的openid
+	   				 }
+	   		   }).then(res => {
+	   			    console.log("qxj doUniverify:",JSON.stringify(res));
+	   			   if(res.result.errCode==0){
+	   				   userPhone=res.result.phoneNumber;
+					   if(type==3) {
+						   // 苹果登录
+						   this.setPhoneAct(3,userPhone,this.unionid);
+					   } else {
+						   this.setPhoneAct(1,userPhone,this.unionid);
+					   }
+	   			   }else{
+	   				   uni.showToast({title:res.result.message,icon: 'none' });
+	   			   }
+	   		   }).catch(err=>{
+	   		       // 处理错误
+	   			    console.error('调用云函数失败:',err);
+	   			    // 详细记录错误信息
+	   			    console.error('错误信息:', err.errMsg);
+	   		   })
+	   },
+	   setPhoneAct(type,phone,unionId){
+	   	  let params={
+			  phone:phone,
+			  unionId:unionId,
+			};
+			if(type==3) {
+				params={
+				  phone:phone,
+				  unionId:unionId,
+				  appleKey: this.appleKey
+				};
+			}
+	   	  setPhone(params).then(res => {
+	   	  		uni.hideLoading();
+	   	  		if(res.code==200){
+	   	  			   uni.setStorageSync('AppToken',res.token);
+	   	  			   uni.setStorageSync('userInfo',JSON.stringify(res.user));
+	   	  			   uni.closeAuthView();
+					   uni.$emit('refreshIM');
+	   	  			   // #ifdef APP-PLUS
+	   	  			 
+	   	  			   // #endif 
+					   this.goPage()
+	   	  		}
+	   	  		else{
+	   	  			uni.showToast({title: res.msg,icon: 'none'});
+					uni.closeAuthView();
+	   	  		}
+	   	  	},
+	   	  	rej => {}
+	   	  );
+	    },
+	   getRegistrationID(){
+		   this.registrationID=uni.getStorageSync("registrationID");
+		    if(this.registrationID==null || this.registrationID==""){
+		    	uni.getPushClientId({success: res => {
+		    			uni.setStorageSync("registrationID",res.cid);
+						this.registrationID = res.cid
+		    		}
+		    	});
+		    }
+	   },
+	   goBack(){
+		  console.log("qxj goBack");
+		  uni.$emit('showHealthButler');
+		  // this.$navBack();
+			uni.redirectTo({
+				url: "/pages/auth/loginIndex"
+			})
+	   },
+	   handleAgree() { // 同意
+	      this.agree = !this.agree
+		  if(this.isIos) {
+			  if(this.agree) {
+				plus.runtime.agreePrivacy()
+				this.getRegistrationID();
+			  } else {
+				plus.runtime.disagreePrivacy();
+			  }
+		  }
+	   },
+	   goToWeb(index){
+			uni.setStorageSync('url',index==0?"https://userapp.his.cdwjyyh.com/web/userAgreement":"https://userapp.his.cdwjyyh.com/web/privacyPolicy");
+			uni.navigateTo({
+				url:"/pages/index/h5"
+			})
+	   },
+	   goPage() {
+		    let pages = getCurrentPages();
+		    let url = pages[ pages.length - 1];
+			let openUrl = uni.getStorageSync("openUrl");
+			if(openUrl) {
+				uni.navigateTo({
+					url: openUrl,
+					success: function(res) {
+					    uni.removeStorageSync("openUrl")
+					}
+				})
+			} else {
+				uni.reLaunch({
+					url: '/pages/home/index',
+					animationType: 'none',
+					animationDuration: 2000
+				});
+				return;
+				if(pages.length == 1) {
+					uni.reLaunch({
+						url: '/pages/home/index',
+						//url: '../course/video/living-app',
+						animationType: 'none',
+						animationDuration: 2000
+					});
+				} else {
+					//this.$navBack();
+				}
+			}
+			this.$updateMsgDot()
+			this.$setSource()
+	   }
+    },
+}
+</script>
+
+<style scoped lang="scss">
+	
+ page{
+ 	background-color: #ffffff;
+ }
+ .other-login-btn {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 80rpx;
+	background: rgba(229, 138, 0, 0.08);
+	border-radius: 40rpx;
+	font-size: 30rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: #FF5C03;
+ 	border: 2rpx solid #FF5C03;
+	margin-top: 30rpx;
+	&::after {
+		border: none;
+	}
+ }
+ .content{
+ 	 display: flex;
+ 	 flex-direction: column;
+ 	 align-items: center;
+ 	 height: calc(100vh);
+ 	 width: 100%;
+	 position: relative;
+	 // justify-content: space-between;
+	 //padding-top: calc(100% - 32vh);
+ }
+ .backImg{
+	 position: absolute;
+	 left:30rpx;
+	 top:40px;
+	 height: 30rpx;
+	 width: 30rpx;
+ }
+ 
+ .pageTop{
+	 display: flex;
+	 flex-direction: column;
+	 width: 100%;
+ }
+ 
+ .content .head{
+ 	text-align: center;
+ 	width: 100%;
+	height: 100rpx;
+	// background:url(/static/image/login/top_bg.png) no-repeat 0 center;
+	background-size: cover;
+    box-sizing: border-box;
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #666;
+ }
+
+ .content .head image{
+ 	width: 150rpx;
+	height: 150rpx;
+ 	border-radius: 10rpx;
+ 	box-shadow:0px 0px 20rpx rgba(0,0,0,0.2);
+ }
+.title{
+ 	color: #141414;
+ 	margin:50upx 0upx 30upx 0rpx;
+ 	font-size: 38rpx;
+	font-weight: 500;
+ }
+ .desc{
+ 	color: #686866;
+ 	padding:0 0 30rpx 0rpx;
+ 	font-size: 28rpx;
+ }
+ .loginBox{
+ 	padding:0 10px 30rpx;
+	width: calc(100%) ;
+	background: #FDFDFD;
+	z-index: 10;
+	position: relative;
+	.login-item p{
+		text-align: left;
+	}
+	.line{
+		 height: 0.5rpx;
+		 background-color: #efefef;
+		 margin-top: 10rpx;
+	}
+	.input-account{
+		margin-top: 20rpx;
+		margin-bottom: 0rpx;
+		border-radius:40rpx;
+		border:solid 0rpx #efefef;
+		height: 80rpx;	
+		width: 100%;
+		// background:url(/static/account.png) no-repeat 0 center;
+		background-size: 30rpx 30rpx;
+		background-position: 30rpx;
+	}
+	.input-pwd{
+		margin-top: 40rpx;
+		margin-bottom: 20rpx;
+		border-radius:40rpx;
+		border:solid 0rpx #efefef;
+		height: 80rpx;	
+		width: 100%;
+		// background:url(/static/password.png) no-repeat 0 center;
+		background-size: 30rpx 30rpx;
+		background-position: 30rpx;
+	}
+	input{
+		margin-left: 80rpx;
+		height: 80rpx;
+		line-height: 80rpx
+	}
+	.reg-box {
+		 padding-bottom:20rpx;
+		 margin:0 10px;
+		 .reg-btn{
+		 	 font-size:16px ;
+		 	 color: #FF5C03;
+		 }
+	}
+ }
+
+ .btns{
+ 	margin: 60rpx 0rpx;
+ }
+ 
+ .login-btn {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 80rpx;
+	background: linear-gradient(to right, #FF5C03 0%, #FF5C03 100%);
+	background: -moz-linear-gradient(to right, #FF5C03 0%, #FF5C03 100%);
+	box-shadow: 0px 7rpx 6rpx 0px rgba(229, 138, 0, 0.22);
+	border-radius: 40rpx;
+	font-size: 30rpx;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: rgba(255, 255, 255, 1);
+ }
+ 
+ .pageBottom{
+	height: 220rpx;
+	width: 75%;
+	display: flex;
+	flex-direction: column;
+	position: absolute;
+	bottom: 100rpx;
+ }  
+ 
+ .tips{
+ 	color: #999;	 
+	font-size: 32rpx;
+ }  
+ .menu{
+	 margin-top: 30rpx;
+	 image{
+	 	width: 96rpx;
+	    height: 96rpx;
+	 }
+ }
+  
+  
+ .checkbox {
+	margin: 20rpx;
+ 	margin-top: 36rpx;
+	display: flex;
+	flex-direction:row;
+	align-items: flex-start;
+	justify-content: flex-start;
+ 	font-family: PingFang SC, PingFang SC;
+ 	font-weight: 400;
+ 	font-size: 26rpx;
+ 	color: #999999;
+ 	line-height: 38rpx;
+ 	text-align: left;
+ 	text {
+ 		color:#FF5C03;
+ 	}
+ 	&-icon {
+ 		flex-shrink: 0;
+ 		margin-right: 12rpx;
+ 		image {
+ 			height: 24rpx;
+ 			width: 24rpx;
+ 		}
+ 	}
+ }
+</style>

+ 2 - 2
pages/common/launch.vue

@@ -3,9 +3,9 @@
 		<view class="loadding" v-if="loadding==true">
 			<view class="circlebox">
 				<view class="circle"></view>
-				<image src="/static/logo.jpg"></image>
+				<image src="/static/logo.png"></image>
 			</view>
-			<text class="text">中康智慧</text>
+			<text class="text">百域承品</text>
 		</view>
 	</view>
 </template>

+ 4 - 4
pages/healthy/detail.vue

@@ -18,14 +18,14 @@
 				<view class="peop-box" @click="showUsers">
 					<view class="head-box">
 						<view class="head" v-for="(subitem,j) in views" :key="j">
-							<image :src="subitem.avatar==null?'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
+							<image :src="subitem.avatar==null?'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
 						</view>
 					</view>
-					<image class="arrow" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow_gray.png" mode=""></image>
+					<image class="arrow" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png" mode=""></image>
 				</view>
 			</view>
 			<!-- <view class="share-btn">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/share.png" mode=""></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/share.png" mode=""></image>
 				<text>分享</text>
 				<button  class="share" data-name="shareBtn" open-type="share">分享</button>
 			</view> -->
@@ -33,7 +33,7 @@
 		<!-- 咨询按钮 -->
 		<view class="inquiry">
 			<view class="content">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/consult.png" mode=""></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/consult.png" mode=""></image>
 				<text class="text">咨询</text>
 				<button class="contact-btn" open-type="contact"></button>
 			</view>

+ 2 - 2
pages/healthy/idea.vue

@@ -21,12 +21,12 @@
 				<view class="period">备注 {{item.remark!=null?item.remark:''}}</view>
 			</view>
 			<view v-if="docs.length == 0" class="no-data-box" @click="getMyDocList()">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png" mode="aspectFit"></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" mode="aspectFit"></image>
 				<view class="empty-title">暂无数据</view>
 			</view>
 		</view>
 		<view class="btn-box">
-			<view class="sub-btn" @click="addDoc">创建健康档案</view>
+			<view class="sub-btn" @click="addDoc">创建档案</view>
 		</view>
 		<!-- <tabbar actindex="2"></tabbar> -->
 	</view>

+ 5 - 5
pages/healthy/index.vue

@@ -3,11 +3,11 @@
 		<view class="top-content">
 			<!-- 这里是状态栏 -->
 			<view class="status_bar" :style="{height: statusBarHeight}"></view>
-			<view class="top-title">健康百科</view>
+			<view class="top-title">百域百科</view>
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="searchValue" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -32,11 +32,11 @@
 							<view class="readers">
 								<view class="head-box" v-if="item.viewsList!=null&&item.viewsList.length>0">
 									<view class="head" v-for="(subitem,j) in item.viewsList" :key="j" v-if="subitem!=null">
-										<image  :src="subitem.avatar==null?'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
+										<image  :src="subitem.avatar==null?'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
 									</view>
 								</view>
 								<view class="readings">
-									<image class="eye" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/eye.png" ></image>
+									<image class="eye" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/eye.png" ></image>
 									<text class="num">{{item.views}}</text>
 								</view>
 							</view>
@@ -80,7 +80,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					},
 					textNoMore:'已经到底了'

+ 2 - 2
pages/healthy/readUsers.vue

@@ -4,7 +4,7 @@
 		<view class="user-list">
 			<view class="item" v-for="(item,index) in dataList" :key="index">
 				<view class="img-box">
-					<image :src="item.avatar==null?'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/detault_head.jpg':item.avatar" mode=""></image>
+					<image :src="item.avatar==null?'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':item.avatar" mode=""></image>
 				</view>
 				<text class="name">{{item.nickname}}</text>
 			</view>
@@ -32,7 +32,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					}
 				},

+ 2 - 1
pages/home/components/HotProduct.vue

@@ -21,7 +21,8 @@
                                     <view class="y-f">
                                         <text class="seckill-current" v-if="user.isShow==1">¥{{  mgoods.price.toFixed(2)  }}</text>
                                         <text class="seckill-current" v-else>¥{{  mgoods.otPrice.toFixed(2)  }}</text>
-                                        <text class="original" v-if="user.isShow==1">销量{{ mgoods.sales }}{{mgoods.unitName}}</text>
+										<!-- {{mgoods.unitName}} -->
+                                        <text class="original" v-if="user.isShow==1">销量{{ mgoods.sales }}</text>
                                     </view>
                                 </view>
                                 <view class="title">

+ 6 - 6
pages/home/doctorCase.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text"  v-model="searchVal" placeholder="输入关键字搜索"  confirm-type="搜索" @confirm="goSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -19,7 +19,7 @@
 					>
 						<view class="text">
 							{{ item.departmentName }}
-							<image v-show="deptId == item.departmentId" class="tab-bg" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/tab_bg.png" mode=""></image>
+							<image v-show="deptId == item.departmentId" class="tab-bg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/tab_bg.png" mode=""></image>
 						</view>
 					</view>
 				</view>
@@ -56,8 +56,8 @@
 						<!-- 语音回答 -->
 						<view class="voice-inner" v-if="item.orderType == '2'">
 							<free-audio 
-								startPic='https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/play.png' 
-								endPic='https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pause.png'
+								startPic='https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/play.png' 
+								endPic='https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pause.png'
 								activeColor="#2BC7B9"
 								:audioId="'audio'+index"
 								:url='item.replyAudioUrl'
@@ -65,7 +65,7 @@
 						</view>
 					</view>
 					<view class="read-box">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/eye.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/eye.png" mode=""></image>
 						<text class="text">{{item.views}}人看过</text>
 					</view>
 				</view>
@@ -101,7 +101,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					}
 				},

+ 112 - 89
pages/home/index.vue

@@ -1,21 +1,23 @@
 <template>
 	<view class="content">
 		<!-- 背景图片 -->
-		<image class="bg" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/hp_top_bg.png" mode=""></image>
+		<image class="bg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/hp_top_bg.png"
+			mode=""></image>
 		<view>
 			<view class="top-inner">
 				<view class="fixed-top-box" :style="{ background: bgColor }">
 					<!-- 这里是状态栏 -->
 					<view class="status_bar" :style="{height: statusBarHeight}"></view>
 					<view class="top-title">
-						<view class="name">中康智慧</view>
+						<view class="name">百域承品</view>
 						<!-- <view class="dot">•</view><view class="sub-name">七彩互联网医院</view> -->
 					</view>
 					<!-- 搜索框、购物车、客服 -->
 					<view class="func-cont">
 						<view class="search-cont" :style="{width:userinfoa.isShow==0 || isuser==true?'633rpx':''}">
 							<image class="icon-search"
-								src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode="">
+								src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png"
+								mode="">
 							</image>
 							<input type="text" value="" placeholder="请输入产品名称"
 								placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;"
@@ -25,20 +27,19 @@
 						<uni-badge size="small" :text="cartCount" absolute="rightTop" type="error"
 							v-show="userinfoa.isShow==1&&isuser==false">
 							<view class="img-item" @click="goAuthUrl('../shopping/cart')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/cart_wihte.png"
+								<image
+									src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/cart_wihte.png"
 									mode=""></image>
 							</view>
 						</uni-badge>
 						<view class="img-item" style="position: relative;">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/customer.png" mode="">
+							<image
+								src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/customer.png"
+								mode="">
 							</image>
 							<button class="contact-btn" open-type="contact"></button>
 						</view>
 					</view>
-					<!-- <view class="tips">
-						<view class="left"></view>
-						<view class="right"  @click="navTo('./cert')">资质证明</view>
-					</view> -->
 				</view>
 			</view>
 			<!-- 头部间距 -->
@@ -66,44 +67,43 @@
 			</view>
 
 		</view>
-
-		<!-- 在线问诊、处方查询 -->
-		<!-- <view class="online-inquiry">
-			<view class="item" @click="navTo('/pages_doctor/doctorQr')">
-				<image class="bg-img" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/online_treat.png" mode=""></image>
-				<view class="inner">
-					<text class="title">医师咨询</text>
-					<text class="sub-title">权威医生 快速回复</text>
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/doctor.png" mode=""></image>
-				</view>
-			</view>
-			<view class="item" @click="goAuthUrl('/pages_user/user/prescribeOrder')">
-				<image class="bg-img" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/chu_query.png" mode=""></image>
-				<view class="inner">
-					<text class="title">处方查询</text>
-					<text class="sub-title">快速查询处方单</text>
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/cu_search.png" mode=""></image>
-				</view>
+		<view class="online-inquiry">
+			<view class="item" @click="navTo('../home/productList')">
+				<!-- <image  class="bg-img" src="../../static/images/banner1.png" mode=""></image> -->
+				<image class="bg-img"
+					src="https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20250320/f2d3ba32a9344dc79b4df7c228189243.png"
+					mode=""></image>
+				<!-- <view class="inner">
+					<text class="title">用药榜</text>
+					<text class="sub-title"></text>
+					<image src="https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20250320/f2d3ba32a9344dc79b4df7c228189243.png" mode=""></image>
+				</view> -->
 			</view>
-		</view> -->
-		<view class="open-class">
+			<!-- @click="navTo('/pages_course/livingList')" -->
+			<!-- <view class="item" @click="toLive">
+				<image class="bg-img"
+					src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/banner2.png" mode="">
+				</image>
+			</view> -->
+		</view>
+		<!-- <view class="open-class bgf radius12">
 			<view class="title-box">
-				<text class="title">健康生活方式大讲堂</text>
-				<view class="more" @click="goClassList">
+				<text class="title">百域大讲堂</text>
+				<view class="more" @click="goClassList(1)">
 					<text>查看全部</text>
-					<image src="/static/assets/toright.png"></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/toright.png"></image>
 				</view>
 			</view>
-			<u-scroll-list :indicator="false">
-				<view class="class-item" @click="goClass(item.courseId)" v-for="(item, index) in classList"
+			<view class="justify-start">
+				<view class="class-item" @click="goClass(item.courseId,1)" v-for="(item, index) in classList"
 					:key="index">
 					<view class="img-box">
-						<image :src="item.imgUrl || '/static/assets/no-img.png'"  ></image>
+						<image :src="item.imgUrl || 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no-img.png'"  ></image>
 					</view>
 					<view>{{item.courseName}}</view>
 				</view>
-			</u-scroll-list>
-		</view>
+			</view>
+		</view> -->
 		<view class="modules">
 			<view class="module">
 				<!--养生有道-->
@@ -122,7 +122,7 @@
 						<view class="title">养生讲堂</view>
 						<view class="more"  @click="navTo('/pages_index/index/doctorArticleList')" >
 							<view class="text">更多</view>
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow_gray.png"></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png"></image>
 						</view>
 					</view>
 					<scroll-view :scroll-x="true" style="white-space: nowrap;">
@@ -155,7 +155,7 @@
 			    		<view class="title">养生干货</view>
 			    		<view class="more" @click="navTo('/pages_index/index/articleList')">
 			    			<view class="text">更多</view>
-			    			<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow_gray.png"></image>
+			    			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png"></image>
 			    		</view>
 			    	</view>
 			    	<view class="article-box" v-if="articles.length>0">
@@ -183,13 +183,13 @@
 			<!-- 热门榜单 -->
 			<!-- <NewProduct :detail="newProductList" /> -->
 			<HotProduct :detail="hotProductList" />
-			<!-- 健康百科 -->
+			<!-- 百域百科 -->
 			<!-- <view class="pub-item" style="margin-top: 20rpx;" >
 				<view class="pub-title-box">
-					<text class="left">健康百科</text>
+					<text class="left">百域百科</text>
 					<view class="right" @click="switchTo('../healthy/index')">
 						<text class="text">更多</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>
 				<view class="inner">
@@ -202,11 +202,11 @@
 								@click="articleCateChange(item)">
 								<view class="text">
 									{{ item.cateName }}
-									<image v-show="item.cateId == cateId" class="tab-bg" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/tab_bg.png" mode=""></image>
+									<image v-show="item.cateId == cateId" class="tab-bg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/tab_bg.png" mode=""></image>
 								</view>
 							</view>
 						</view>
-						<image class="right-mask" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/mask.png" mode=""></image>
+						<image class="right-mask" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/mask.png" mode=""></image>
 					</view>
 					 
 					<view class="know-list">
@@ -217,11 +217,11 @@
 									<view class="readers">
 										<view class="head-box" v-if="item.viewsList!=null&&item.viewsList.length>0">
 											<view class="head" v-for="(subitem,j) in item.viewsList" :key="j" v-if="subitem!=null" >
-												<image :src="subitem.avatar==null?'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
+												<image :src="subitem.avatar==null?'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
 											</view>
 										</view>
 										<view class="readings">
-											<image class="eye" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/eye.png" mode=""></image>
+											<image class="eye" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/eye.png" mode=""></image>
 											<text class="num">{{item.views}}</text>
 										</view>
 									</view>
@@ -235,7 +235,7 @@
 					</view>
 				</view>
 			</view> -->
-			<!-- 精选品 -->
+			<!-- 精选品 -->
 			<TuiProduct ref="tuiProduct" />
 
 		</view>
@@ -244,7 +244,7 @@
 		<!-- 限时消息 -->
 		<!-- <view class="message-box" >
 			<view class="left">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close24.png" mode="" @click="closeMsg"></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close24.png" mode="" @click="closeMsg"></image>
 				<view class="text ellipsis">关注公众号了解更新</view>
 			</view>
 			<view class="btn">查看</view>
@@ -263,13 +263,17 @@
 		</view>
 		<z-modal :show="tuiModalControl" placeholderText="请输入邀请码" :btnGroup="btnGroup" :contentType="2"
 			titleText="填写邀请码" @cancle="cancleTui" @sure="submitTui"></z-modal>
+			
+			
+			<Server/>
 		<!-- <tabbar :actindex="0"></tabbar> -->
 	</view>
 </template>
 
 <script>
 	import {
-		courseList
+		courseList,
+		courseListB
 	} from '@/api/class.js'
 	import zModal from '@/components/z-modal/z-modal.vue'
 	import {
@@ -286,7 +290,7 @@
 		getTuiArticle,
 		getTuiDoctorOrder,
 		getCartCount,
-		getpro
+		// getpro
 	} from '@/api/index'
 	import {
 		getDoctorArticleList
@@ -297,12 +301,14 @@
 	import {
 		getStoreConfig
 	} from '@/api/common'
-	// import tabBg from "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/tab_bg.png"
+	// import tabBg from "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/tab_bg.png"
 	import freeAudio from '@/components/chengpeng-audio/free-audio.vue'
 	import Menu from '@/components/Menu.vue'
 	import HotProduct from './components/HotProduct.vue'
 	import NewProduct from './components/NewProduct.vue'
 	import TuiProduct from '@/components/tuiProduct.vue'
+	
+	import Server from '@/components/Server.vue'
 	import {
 		getUserInfo,
 		bindPromoter
@@ -314,7 +320,8 @@
 			Menu,
 			HotProduct,
 			NewProduct,
-			TuiProduct
+			TuiProduct,
+			Server
 		},
 		data() {
 			return {
@@ -362,7 +369,7 @@
 				articles: [], //养生干货
 				// 状态栏的高度
 				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
-				tabBg: "https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/tab_bg.png", // tab切换背景
+				tabBg: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/tab_bg.png", // tab切换背景
 				// 问诊案例类型
 				orderTypes: [{
 					name: '全部',
@@ -427,9 +434,10 @@
 				],
 				userinfoa: [],
 				isuser: false,
-				menvKey: []
+				menvKey: [],
+				classListb: {}
 			}
-			this.getStoreActivity();
+			// this.getStoreActivity();
 		},
 		onLoad(option) {
 			if (option.userCode != null) {
@@ -449,7 +457,7 @@
 					this.getUserInfo();
 				}
 			}
-			this.getStoreActivity()
+			// this.getStoreActivity()
 		},
 		// 暂停所有音频(一般用于页面切换时停止正在播放的音频)
 		onUnload() { //普通页面在 onUnload 生命周期中执行
@@ -468,21 +476,23 @@
 		},
 		onShareAppMessage(res) {
 			return {
-				title: '中康智慧-您的专属健康解决方案',
+				title: '百域承品-您的专属解决方案',
 				path: `/pages/common/launch`,
-				imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				// imageUrl: this.$store.state.imgpath +'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			imageUrl: '/static/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 			}
 		},
 		onReachBottom() {
-			console.log("onReachBottom")
-			//this.$refs.tuiProduct.getTuiProducts();
+			// console.log("onReachBottom")
+			this.$refs.tuiProduct.getTuiProducts();
 		},
 		//分享到朋友圈
 		onShareTimeline(res) {
 			return {
-				title: '中康智慧-您的专属健康解决方案',
+				title: '百域承品-您的专属解决方案',
 				query: '', //页面参数
-				imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				imageUrl: '/static/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				// imageUrl: this.$store.state.imgpath +'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 			}
 		},
 		computed: {
@@ -491,6 +501,9 @@
 				var top = this.top / 30;
 				return 'rgba(43,199,185, ' + top + ')';
 			},
+			imgPath() {
+				return this.$store.state.imgpath
+			},
 		},
 		onShow() {
 			this.getMenu();
@@ -513,12 +526,19 @@
 			this.getCanvas();
 			this.getDoctorArticleList();
 			this.getArticleList();
-			this.getshowmanv()
+			// this.getshowmanv()
 		},
 		methods: {
+			toLive() {
+				uni.showToast({
+					icon: 'none',
+					title: '暂未开放,敬请期待'
+				})
+			},
 			getCourseList() {
 				courseList().then(res => {
 					if (res.code == 200) {
+						console.log('公域', res.data)
 						this.classList = res.data.slice(0, 3)
 					} else {
 						uni.hideLoading();
@@ -528,27 +548,27 @@
 						});
 					}
 				})
-
 			},
-			goClass(id) {
+			goClass(id, type) {
+				// console.log(id)
 				uni.navigateTo({
-					url: `/pages_manage/learn?courseId=${id}`
+					url: '/pages_course/learn?courseId=' + id + '&type=' + type
 				})
 			},
-			goClassList() {
+			goClassList(type) {
 				uni.navigateTo({
-					url: '/pages_manage/teacherClassroom'
-				})
-			},
-			getshowmanv() {
-				const data = {
-					key: "store.appShow"
-				}
-				getpro(data).then(res => {
-					this.menvKey = JSON.parse(res.data)
-					console.log('排序', this.menvKey[0])
+					url: '/pages_course/teacherClassroom?type=' + type
 				})
 			},
+			// getshowmanv() {
+			// 	const data = {
+			// 		key: "store.appShow"
+			// 	}
+			// 	getpro(data).then(res => {
+			// 		this.menvKey = JSON.parse(res.data)
+			// 		// console.log('排序', this.menvKey[0])
+			// 	})
+			// },
 			getUserInfo() {
 				getUserInfo().then(
 					res => {
@@ -573,7 +593,7 @@
 				this.tuiModalControl = false
 			},
 			submitTui(e) {
-				console.log(e)
+				// console.log(e)
 				if (e.inputText == null || e.inputText == "") {
 					uni.showToast({
 						icon: 'none',
@@ -692,13 +712,13 @@
 					if (res.code == 200) {
 						// for (var i = 0; i < res.data.length; i++) {
 						// 	const item=res.data[i];
-						// if(item.menuName.indexOf('健康百科')>=0 || item.menuName.indexOf('健康自测')>=0 
-						// || item.menuName.indexOf('健康档案')>=0 ||item.menuName.indexOf('用药咨询')>=0){
+						// if(item.menuName.indexOf('百域百科')>=0 || item.menuName.indexOf('百域自测')>=0 
+						// || item.menuName.indexOf('百域档案')>=0 ||item.menuName.indexOf('用药咨询')>=0){
 						// 	this.menus.push(item);
 						// }
 						// }
-						console.log('图标', res.data)
-						// const menuNames = ['健康百科', '健康自测', '健康档案', '药品商城', '领券中心', '会员'];
+						// console.log('图标', res.data)
+						// const menuNames = ['百域百科', '百域自测', '百域档案', '产品商城', '领券中心', '会员'];
 						this.menus = res.data
 						// this.menus = res.data.filter(item => menuNames.some(menuName => item.menuName.includes(menuName)) );
 					} else {
@@ -709,8 +729,9 @@
 			getCanvas() {
 				getCanvas().then(res => {
 					if (res.code == 200) {
-						console.log(res.data)
-						this.canvas = JSON.parse(res.data.json)
+						if (res.data && res.data.json) {
+							this.canvas = JSON.parse(res.data.json)
+						}
 					}
 				});
 			},
@@ -1189,6 +1210,7 @@
 					top: 0;
 					left: 0;
 					z-index: 1;
+					border-radius: 15rpx;
 				}
 
 				.inner {
@@ -1932,7 +1954,7 @@
 				}
 			}
 
-			// 精选
+			// 精选
 			.feat-title {
 				margin-top: 30upx;
 				padding: 10upx 0 33upx;
@@ -2034,11 +2056,11 @@
 			}
 		}
 
-		// 健康生活大讲堂
+		// 生活大讲堂
 		.open-class {
 			padding: 20rpx;
 			margin: 20rpx 15rpx 0rpx;
-			background-color: #f0f4f7;
+			// background-color: #f0f4f7;
 
 			.title-box {
 				display: flex;
@@ -2070,10 +2092,10 @@
 				margin-top: 24rpx;
 				background-color: #fff;
 				border-radius: 16rpx;
-				padding: 8rpx 10rpx 16rpx;
+				padding: 0 16rpx;
 				margin-right: 14rpx;
 				width: 250rpx;
-				height: 300rpx;
+				height: 280rpx;
 				font-size: 26rpx;
 				font-weight: 500;
 
@@ -2082,6 +2104,7 @@
 					border-radius: 16rpx;
 					overflow: hidden;
 					margin-bottom: 12rpx;
+
 					image {
 						width: 100%;
 						height: 100%;

+ 1 - 1
pages/home/new/articleDetails.vue

@@ -15,7 +15,7 @@
 		<!-- 咨询按钮 -->
 		<view class="inquiry">
 			<view class="content">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/consult.png" mode=""></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/consult.png" mode=""></image>
 				<text class="text">咨询</text>
 				<button class="contact-btn" open-type="contact"></button>
 			</view>

+ 2 - 2
pages/home/new/articleList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -27,7 +27,7 @@
 						<view class="info-box">
 							<view class="readers">
 								<view class="readings">
-									<image class="eye" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/eye.png" ></image>
+									<image class="eye" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/eye.png" ></image>
 									<text class="num">{{item.views}}</text>
 								</view>
 							</view>

+ 2 - 2
pages/home/new/chineseMedicineDetails.vue

@@ -61,7 +61,7 @@
 				return {
 					title: this.item.medicineName,
 					path: '/pages_index/chineseMedicineDetails?id='+this.id,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -71,7 +71,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: this.item.title,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/chineseMedicineList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -38,7 +38,7 @@
 					<view class="r-item" @click="showDetail(item)" v-for="item in dataList">
 						<view class="r-left">{{item.medicineName}}</view>
 						<view class="r-right">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/fire.png"></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/fire.png"></image>
 						</view>
 					</view>
 				</view>

+ 2 - 2
pages/home/new/diseaseDetails.vue

@@ -45,7 +45,7 @@
 				return {
 					title: this.item.diseaseName,
 					path: '/pages_index/diseaseDetails?id='+this.diseaseId,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -55,7 +55,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: this.item.diseaseName,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/diseaseList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -27,7 +27,7 @@
 						<view class="title ellipsis1">{{ item.diseaseName }}</view>
 					</view>
 					<view class="right">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow_gray.png"></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png"></image>
 					</view>
 				</view>
 			</view>

+ 2 - 2
pages/home/new/famousPrescribeDetails.vue

@@ -61,7 +61,7 @@
 				return {
 					title: this.item.prescribeName,
 					path: '/pages_index/famousPrescribeDetails?id='+this.id,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -71,7 +71,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: this.item.title,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/famousPrescribeList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -41,7 +41,7 @@
 					<view class="r-item" @click="showDetail(item)" v-for="item in dataList">
 						<view class="r-left">{{item.prescribeName}}</view>
 						<view class="r-right">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/fire.png"></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/fire.png"></image>
 						</view>
 					</view>
 				</view>

+ 2 - 2
pages/home/new/medicatedFoodDetails.vue

@@ -39,7 +39,7 @@
 				return {
 					title: this.item.foodName,
 					path: '/pages_index/medicatedFoodDetails?id='+this.id,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -49,7 +49,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: this.item.title,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 1 - 1
pages/home/new/medicatedFoodList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>

+ 2 - 2
pages/home/new/questionsDetails.vue

@@ -36,7 +36,7 @@
 				return {
 					title: this.item.vesselName,
 					path: '/pages_index/questionsDetails?id='+this.id,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -46,7 +46,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: this.item.title,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/questionsList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入服务包搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -27,7 +27,7 @@
 						<view class="info-box">
 							<view class="readers">
 								<view class="readings">
-									<image class="eye" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/eye.png" ></image>
+									<image class="eye" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/eye.png" ></image>
 									<text class="num">{{item.views}}</text>
 								</view>
 							</view>

+ 6 - 6
pages/home/new/test.vue

@@ -6,7 +6,7 @@
 					<text class="patient-title">选择体验者</text>
 					<view class="right" >
 						<text class="value">请点击添加</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>
 				<view class="patient" @click="addPatient()" v-if="patient!=null">
@@ -20,7 +20,7 @@
 						</view>
 					</view>
 					<view class="right" >
-						<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>
 			</view>
@@ -59,7 +59,7 @@
 			<view class="patient-box" @click="addPatient()" v-if="patient==null">
 				<text class="patient-title">选择体验者</text>
 				<view class="right" >
-					<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>
 			<view class="patient" @click="addPatient()" v-if="patient!=null">
@@ -73,7 +73,7 @@
 					</view>
 				</view>
 				<view class="right" >
-					<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>
 		</view>
@@ -135,7 +135,7 @@
 				return {
 					title: "健康体质检测",
 					path: '/pages_index/test?tempId='+this.tempId,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -145,7 +145,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: "健康体质检测",
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/testDetails.vue

@@ -49,7 +49,7 @@
 				return {
 					title: "健康自测",
 					path: '/pages_index/testDetails?tempId='+this.tempId,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -59,7 +59,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: "健康自测",
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/testList.vue

@@ -63,7 +63,7 @@
 				return {
 					title: "健康自测",
 					path: '/pages_index/testList',
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -73,7 +73,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: "健康自测",
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/vesselDetails.vue

@@ -41,7 +41,7 @@
 				return {
 					title: this.item.vesselName,
 					path: '/pages_index/vesselDetails?id='+this.id,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -51,7 +51,7 @@
 			if(this.utils.isLogin()){
 				return {
 					title: this.item.vesselName,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			

+ 2 - 2
pages/home/new/vesselList.vue

@@ -4,7 +4,7 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" v-model="keyword" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -37,7 +37,7 @@
 					<view class="r-item" @click="showDetail(item)" v-for="item in dataList">
 						<view class="r-left">{{item.vesselName}}</view>
 						<view class="r-right">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/fire.png"></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/fire.png"></image>
 						</view>
 					</view>
 				</view>

+ 13 - 13
pages/home/productList.vue

@@ -4,12 +4,12 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
-					<input type="text" @confirm="goSearch"   :value="form.productName" placeholder="输入品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
+					<input type="text" @confirm="goSearch"   :value="form.productName" placeholder="输入品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 				<view class="icon-search">
-					<image @click="showChange(2)" v-if="showType==1"  src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search1.png" mode=""></image>
-					<image @click="showChange(1)" v-if="showType==2"  src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search2.png" mode=""></image>
+					<image @click="showChange(2)" v-if="showType==1"  src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search1.png" mode=""></image>
+					<image @click="showChange(1)" v-if="showType==2"  src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search2.png" mode=""></image>
 				</view>
 			</view>
 			<!-- 排序框 -->
@@ -20,19 +20,19 @@
 				<view class="item" @click="searchChange('2')">
 					<text class="label">价格</text>
 					<view class="sort-img">
-						<image v-if="form.priceOrder==null||form.priceOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up.png" mode="" @click="priceUp(true)"></image>
-						<image v-if="form.priceOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up2.png" mode="" @click="priceUp(false)"></image>
-						<image v-if="form.priceOrder==null||form.priceOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down.png" mode="" @click="priceDown(true)"></image>
-						<image v-if="form.priceOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down2.png" mode="" @click="priceDown(false)"></image>
+						<image v-if="form.priceOrder==null||form.priceOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up.png" mode="" @click="priceUp(true)"></image>
+						<image v-if="form.priceOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up2.png" mode="" @click="priceUp(false)"></image>
+						<image v-if="form.priceOrder==null||form.priceOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down.png" mode="" @click="priceDown(true)"></image>
+						<image v-if="form.priceOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down2.png" mode="" @click="priceDown(false)"></image>
 					</view>
 				</view>
 				<view class="item" @click="searchChange('3')">
 					<text class="label">销量</text>
 					<view class="sort-img">
-						<image v-if="form.salesOrder==null||form.salesOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up.png" mode="" @click="saleUp(true)"></image>
-						<image v-if="form.salesOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up2.png" mode="" @click="saleUp(false)"></image>
-						<image v-if="form.salesOrder==null||form.salesOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down.png" mode="" @click="saleDown(true)"></image>
-						<image v-if="form.salesOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down2.png" mode="" @click="saleDown(false)"></image>
+						<image v-if="form.salesOrder==null||form.salesOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up.png" mode="" @click="saleUp(true)"></image>
+						<image v-if="form.salesOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up2.png" mode="" @click="saleUp(false)"></image>
+						<image v-if="form.salesOrder==null||form.salesOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down.png" mode="" @click="saleDown(true)"></image>
+						<image v-if="form.salesOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down2.png" mode="" @click="saleDown(false)"></image>
 					</view>
 				</view>
 				<view class="item" :class="form.newOrder=='desc'?'active':''" @click="searchChange('4')">
@@ -110,7 +110,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					},
 					textNoMore:"已经到底了",

+ 3 - 3
pages/home/productSearch.vue

@@ -3,14 +3,14 @@
 		<!-- 搜索框 -->
 		<view class="search-cont">
 			<view class="inner">
-				<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
-				<input type="text" value="" placeholder="输入品名称" confirm-type="搜索" @confirm="goSearch" :focus='setFocus' placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
+				<input type="text" value="" placeholder="输入品名称" confirm-type="搜索" @confirm="goSearch" :focus='setFocus' placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 			</view>
 		</view>
 		<!-- 搜索历史 -->
 		<view class="title-box">
 			<text class="title">历史搜索</text>
-			<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/del.png" mode="" @click="clearHistory"></image>
+			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/del.png" mode="" @click="clearHistory"></image>
 		</view>
 		<view class="data-list">
 			<view class="item" v-for="(item,index) in searchHistory" :key="index" @click="doSearch(item)">

+ 1 - 1
pages/index/index.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="content">
-		<image class="logo" src="/static/logo.jpg"></image>
+		<image class="logo" src="/static/logo.png"></image>
 		<view class="text-area">
 			<text class="title">{{title}}</text>
 		</view>

+ 4 - 4
pages/shopping/cart.vue

@@ -22,12 +22,12 @@
 						</view>
 						<view class="num-box">
 							<view class="img-box" @click="delNum(item)">
-								<image v-if="item.cartNum <= 1" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian.png" mode=""></image>
-								<image v-else src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian2.png" mode=""></image>
+								<image v-if="item.cartNum <= 1" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian.png" mode=""></image>
+								<image v-else src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian2.png" mode=""></image>
 							</view>
 							<input  type="number" @change="changeNum($event,item)" :value="item.cartNum"   />
 							<view class="img-box" @click="addNum(item)">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/add.png" mode=""></image>
+								<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/add.png" mode=""></image>
 							</view>
 						</view>
 					</view>
@@ -36,7 +36,7 @@
 		</view>
 	 
 		<view v-if="carts.length == 0" class="no-data-box">
-			<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png" mode="aspectFit"></image>
+			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" mode="aspectFit"></image>
 			<view class="empty-title">暂无数据</view>
 		</view>
 		<!-- 猜你喜欢 -->

+ 9 - 9
pages/shopping/confirmOrder.vue

@@ -10,7 +10,7 @@
 					</vie>
 				</view>
 				<view class="arrow-box">
-					<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>
 			<view class="address-box" v-if="address!=null" @click="openAddress()">
@@ -24,10 +24,10 @@
 					</view>
 				</view>
 				<view class="arrow-box">
-					<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>
-			<!-- 品列表 -->
+			<!-- 品列表 -->
 			<view class="goods-list">
 				<view v-for="(item,index) in carts" :key="index" class="item">
 					<view class="img-box">
@@ -61,7 +61,7 @@
 			<!-- 积分 -->
 			<view class="points">
 				<view class="left">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/points.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/points.png" mode=""></image>
 					<text class="text">可用积分</text>
 				</view>
 				<view class="right">
@@ -75,7 +75,7 @@
 				</view>
 				<view class="right">
 					<text class="text">{{couponText}}</text>
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow4.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow4.png" mode=""></image>
 				</view>
 			</view>
 			<view class="points">
@@ -109,8 +109,8 @@
 				 <div class="coupon-list" v-if="couponsList.length > 0">
 				   <div class="item acea-row row-center-wrapper"  v-for="(item, index) in couponsList" :key="index">
 				     <div class="money" >
-				       <image v-if="item.status==0" class="img" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/coupon1.png" mode="widthFix"></image>
-				 	  <image v-if="item.status!=0" class="img" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/coupon2.png" mode="widthFix"></image>
+				       <image v-if="item.status==0" class="img" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/coupon1.png" mode="widthFix"></image>
+				 	  <image v-if="item.status!=0" class="img" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/coupon2.png" mode="widthFix"></image>
 				 	  <div style="z-index: 999;">
 				         ¥<span class="num">{{ item.couponPrice }}</span>
 				       </div>
@@ -128,7 +128,7 @@
 				   </div>
 				 </div>
 				 <view v-if="couponsList.length == 0" class="no-data-box" >
-				 	<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png" mode="aspectFit"></image>
+				 	<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" mode="aspectFit"></image>
 				 	<view class="empty-title">暂无数据</view>
 				 </view>
 			 </view>
@@ -393,7 +393,7 @@
 			min-height: 171upx;
 			background: #FFFFFF;
 			border-radius: 16upx;
-			background-image: url("https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/address_bg.png");
+			background-image: url("https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/address_bg.png");
 			background-repeat: no-repeat;
 			background-size: 100% 30upx;
 			background-position: left bottom;

+ 9 - 9
pages/shopping/index.vue

@@ -3,12 +3,12 @@
 		<view class="top-content">
 			<view class="status_bar" :style="{height: statusBarHeight}"></view>
 			<!-- 这里是状态栏 -->
-			<view class="top-title">健康产品</view>
+			<view class="top-title">百域产品</view>
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
-					<input type="text" disabled   confirm-type="搜索" @click="toSearch" placeholder="输入品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
+					<input type="text" disabled   confirm-type="搜索" @click="toSearch" placeholder="输入品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
 		</view>
@@ -23,7 +23,7 @@
 			</view>
 			<view class="medic">
 				<!-- 轮播图 -->
-				<view class="banner-box">
+				<!-- <view class="banner-box">
 					<swiper
 						class="swiper" 
 						:indicator-dots="true" 
@@ -37,8 +37,8 @@
 							<image :src="item.imageUrl" mode=""></image>
 						</swiper-item>
 					</swiper>
-				</view>
-				<!-- 品列表 -->
+				</view> -->
+				<!-- 品列表 -->
 				<view class="medic-list">
 						<!-- <view class="item" v-for="(item,index) in subCates" :key="index">
 							<view class="title">{{item.cateName}}</view> -->
@@ -70,7 +70,7 @@
 				subCates:[],
 				// 状态栏的高度
 				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
-				// 选中品分类
+				// 选中品分类
 				cateSelect: 0,
 				// 轮播图
 				advs: [],
@@ -160,7 +160,7 @@
 					rej => {}
 				);
 			},
-			// 品分类选择
+			// 品分类选择
 			choseCate(item) {
 				this.cateSelect = item.cateId;
 				this.getSubCate()
@@ -179,7 +179,7 @@
 				 
 				console.log(this.subCates);
 			},
-			// 查看品详情
+			// 查看品详情
 			showProductList(item) {
 				uni.navigateTo({
 					url: '/pages_shopping/shopping/productList?cateId='+item.cateId+"&pid="+item.pid

+ 1 - 1
pages/shopping/payOrder.vue

@@ -14,7 +14,7 @@
 				<view class="title">支付方式</view>
 				<view class="item">
 					<view class="left">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/wecha_pay.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/wecha_pay.png" mode=""></image>
 						<text class="text">微信支付</text>
 					</view>
 					<label>

+ 10 - 10
pages/shopping/paymentOrder.vue

@@ -18,7 +18,7 @@
 				<radio-group  @change="payTypeChange" v-if="order.isEditMoney!=null&&order.isEditMoney==1">
 					<view class="item"  >
 						<view class="left"  >
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/wecha_pay.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/wecha_pay.png" mode=""></image>
 							<text class="text">微信支付</text>
 						</view>
 						<label>
@@ -27,7 +27,7 @@
 					</view>
 					<view class="item"  >
 						<view class="left">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pay_de.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pay_de.png" mode=""></image>
 							<text class="text">物流代收</text>
 						</view>
 						<label>
@@ -39,7 +39,7 @@
 				<radio-group @change="payTypeChange" v-else-if="order.orderCreateType!=null&& order.orderCreateType==3">
 					<view class="item"  >
 						<view class="left" >
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/wecha_pay.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/wecha_pay.png" mode=""></image>
 							<text class="text">微信支付</text>
 						</view>
 						<label>
@@ -48,7 +48,7 @@
 					</view>
 					<view class="item" >
 						<view class="left">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pay_de.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pay_de.png" mode=""></image>
 							<text class="text">物流代收</text>
 						</view>
 						<label>
@@ -58,7 +58,7 @@
 					<!-- <view class="item" v-if="user!=null&&user.level==1 "> -->
 					<view class="item" >
 						<view class="left">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pay_1.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pay_1.png" mode=""></image>
 							<text class="text">货到付款</text>
 						</view>
 						<label>
@@ -69,7 +69,7 @@
 				<radio-group @change="payTypeChange" v-else-if="order.orderCreateType!=null&& order.orderCreateType==2">
 					<view class="item" v-if="payType==1||payType==4" >
 						<view class="left" >
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/wecha_pay.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/wecha_pay.png" mode=""></image>
 							<text class="text">微信支付</text>
 						</view>
 						<label>
@@ -78,7 +78,7 @@
 					</view>
 					<view class="item" v-if="payType==2||payType==4">
 						<view class="left" >
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pay_de.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pay_de.png" mode=""></image>
 							<text class="text">物流代收</text>
 						</view>
 						<label>
@@ -88,7 +88,7 @@
 					<!-- <view class="item" v-if="user!=null&&user.level==1 "> -->
 					<view class="item" v-if="payType==1||payType==4" >
 						<view class="left">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pay_1.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pay_1.png" mode=""></image>
 							<text class="text">货到付款</text>
 						</view>
 						<label>
@@ -99,7 +99,7 @@
 				<radio-group @change="payTypeChange" v-else-if="order.orderCreateType!=null&&(order.orderCreateType==1)">
 					<view class="item"  >
 						<view class="left" >
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/wecha_pay.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/wecha_pay.png" mode=""></image>
 							<text class="text">微信支付</text>
 						</view>
 						<label>
@@ -179,7 +179,7 @@
 		// 	return {
 		// 		title: "帮TA支付",
 		// 		path: '/pages_user/user/otherPaymentOrder?orderId='+this.orderId,
-		// 		imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+		// 		imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 		// 	}
 			
 		// },

+ 16 - 16
pages/shopping/prescribe.vue

@@ -3,7 +3,7 @@
 		<view class="fixed-top-box">
 			<view class="status_bar" :style="{height: statusBarHeight}"></view>
 			<view class="back-box" @click="back">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/back_white.png" mode=""></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/back_white.png" mode=""></image>
 				<text class="title">填写处方信息</text>
 				<text></text>
 			</view>
@@ -13,28 +13,28 @@
 			<!-- 步骤 -->
 			<view class="steps-box">
 				<view class="item active">填写信息</view>
-				<image class="arrow" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow4.png" mode=""></image>
+				<image class="arrow" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow4.png" mode=""></image>
 				<view class="item">医生开方</view>
-				<image class="arrow" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow4.png" mode=""></image>
+				<image class="arrow" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow4.png" mode=""></image>
 				<view class="item">支付订单</view>
-				<image class="arrow" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow4.png" mode=""></image>
+				<image class="arrow" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow4.png" mode=""></image>
 				<view class="item">厂家发货</view>
 			</view>
 			<!-- 提示 -->
-			<view class="tip-box">
+			<!-- <view class="tip-box">
 				<view class="top">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/safe2.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/safe2.png" mode=""></image>
 					<text class="text">依据国家规定、处方药需凭处方购买</text>
 				</view>
 				<view class="time-tip">填写问诊人信息、处方信息</view>
-			</view>
+			</view> -->
 			<view class="info-box">
 				<!-- 选择问诊人 -->
 				<view class="chose-people">
 					<view class="title-box">
 						<text class="title">选择问诊人</text>
 						<view class="add-box" @click="addPeople()">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/add26.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/add26.png" mode=""></image>
 							<text >添加</text>
 						</view>
 					</view>
@@ -47,7 +47,7 @@
 								<text class="ege">{{utils.getAge(item.birthday)}}岁</text>
 							</view>
 							<!-- 选中的对号角标 -->
-							<image v-if="patientId == item.patientId" class="active-img" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/sel_right50.png" mode=""></image>
+							<image v-if="patientId == item.patientId" class="active-img" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/sel_right50.png" mode=""></image>
 						</view>
 					</view>
 				</view>
@@ -74,11 +74,11 @@
 						<view class="img" v-for="(item,index) in imgList" :key="index"  >
 							<image :src="item" mode="aspectFill"  @click="previewImage(index)"></image>
 							<view class="del" @click="delImg(index)" >
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/del2.png"></image>
+								<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/del2.png"></image>
 							</view>
 						</view>
 						<view class="chose-img" @tap="chooseImage(1)" v-if="imgList.length<4">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/adds.png"></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/adds.png"></image>
 						</view>
 					</view>
 					
@@ -104,7 +104,7 @@
 				<!-- 是否使用过此药 -->
 				<view class="check-box">
 					<view class="left">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/yao.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/yao.png" mode=""></image>
 						<text class="text">是否有过敏史</text>
 					</view>
 					<radio-group style="display: flex;align-items: center;">
@@ -120,7 +120,7 @@
 				</view>
 				<view class="check-box">
 					<view class="left">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/yao.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/yao.png" mode=""></image>
 						<text class="text">肝功能是否异常</text>
 					</view>
 					<radio-group style="display: flex;align-items: center;">
@@ -136,7 +136,7 @@
 				</view>
 				<view class="check-box">
 					<view class="left">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/yao.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/yao.png" mode=""></image>
 						<text class="text">肾功能是否异常</text>
 					</view>
 					<radio-group style="display: flex;align-items: center;">
@@ -152,7 +152,7 @@
 				</view>
 				<view class="check-box">
 					<view class="left">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/yao.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/yao.png" mode=""></image>
 						<text class="text">是否是备孕/怀孕/哺乳期</text>
 					</view>
 					<radio-group style="display: flex;align-items: center;">
@@ -221,7 +221,7 @@
 				return {
 					title: "填写处方信息",
 					path: "/pages/shopping/prescribe?orderId="+this.orderId,
-					imageUrl: 'https://zkzh-2024.oss-cn-beijing.aliyuncs.com/fs/20241127/5b9750f911804728b153ebe5c0051a6f.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 		},

+ 23 - 22
pages/shopping/productDetails.vue

@@ -14,10 +14,10 @@
 				@change="swiperChange">
 				<swiper-item  class="swiper-item" v-for="(item,index) in  banner" :key="index">
 					<image :src="item" mode="aspectFill"></image>
-					<view class="cf-box" v-if="product.productType==2">
+					<!-- <view class="cf-box" v-if="product.productType==2">
 						<view class="title">处方药</view>
 						<view class="subTitle">请在医师指导下使用</view>
-					</view>
+					</view> -->
 				</swiper-item>
 			</swiper>
 			<!-- 底部遮罩 -->
@@ -39,31 +39,32 @@
 				</view>
 				<view class="share-box" v-if="userinfo.isShow==1&&isuser==false">
 					<text class="text">分享</text>
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/share1.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/share1.png" mode=""></image>
 					<button  class="share" data-name="shareBtn" open-type="share">分享</button>
 				</view>
 			</view>
 			<view class="name-box">
-				<view class="tag">{{utils.getDictLabelName("storeProductType",product.productType)}}</view>{{product.productName}}
+				<!-- <view class="tag">{{utils.getDictLabelName("storeProductType",product.productType)}}</view> -->
+				{{product.productName}}
 			</view>
 			<view class="intro" v-if="product.productInfo!=null" v-html="product.productInfo.replace(/\n/g,'<br>')">
 			</view>
-			<view class="safe-box">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/safe.png" mode=""></image>
+			<!-- <view class="safe-box">
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/safe.png" mode=""></image>
 				<text class="text" v-if="userinfo.isShow==1&&isuser==false">免邮发货</text>
 				<view class="line" v-if="userinfo.isShow==1&&isuser==false"></view>
 				<view class="line"></view>
 				<text class="text">药师服务</text>
 				<view class="line"></view>
 				<text class="text">隐私保护</text>
-			</view>
+			</view> -->
 		</view>
 		<!-- 购买人数、库存 -->
 		<view class="inventor" v-if="userinfo.isShow==1&&isuser==false">
 			<view class="left">
 				<!-- <view class="head-box">
 					<view class="head" v-for="(item,j) in 5" :key="j">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/head.jpg" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/head.jpg" mode=""></image>
 					</view>
 				</view> --> 
 				<view class="num-box">
@@ -79,7 +80,7 @@
 		</view>
 		<!-- 功效 -->
 		<!-- <view class="effect">
-			<view class="label">品说明书</view>
+			<view class="label">品说明书</view>
 			<view class="label">查看</view>
 			
 		</view> -->
@@ -94,17 +95,17 @@
 		<view class="btn-foot" v-if="userinfo.isShow==1&&isuser==false">
 			<view class="menu-box">
 				<view class="item" @click="goHome">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/back_home.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/back_home.png" mode=""></image>
 					<text class="label">首页</text>
 				</view>
 				<view class="item" style="position: relative;">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/consult_small.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/consult_small.png" mode=""></image>
 					<text class="label">咨询</text>
 					<button class="contact-btn" open-type="contact"></button>
 				</view>
 				<view class="item" @click="navgetTo('./cart')">
 					<uni-badge size="small" :text="cartCount" absolute="rightTop" type="error">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/cart36.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/cart36.png" mode=""></image>
 					</uni-badge>
 					<text class="label">购物车</text>
 				</view>
@@ -114,7 +115,7 @@
 				<view class="btn buy" @click="addCart('buy')">{{buyText}}</view>
 			</view>
 		</view>
-		<!-- 选择品规格弹窗 -->
+		<!-- 选择品规格弹窗 -->
 		<popupBottom ref="popup" :visible.sync="specVisible" title=" "  radius="32"  maxHeight="1024">
 		    <view class="product-spec">
 				<!-- 商品信息 -->
@@ -142,7 +143,7 @@
 							<view class="input-box">
 								<input type="text" v-model="storeName" placeholder="请选择门店" class="form-input" disabled="disabled" />
 							</view>
-							<image class="arrow" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow_gray.png" mode=""></image>
+							<image class="arrow" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png" mode=""></image>
 						</view>
 					</picker>
 				</view> -->
@@ -167,12 +168,12 @@
 					<view class="label">数量</view>
 					<view class="num-box">
 						<view class="img-box" @click="lessNum()">
-							<image v-if="specNum <= 1" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian.png" mode=""></image>
-							<image v-else src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian2.png" mode=""></image>
+							<image v-if="specNum <= 1" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian.png" mode=""></image>
+							<image v-else src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian2.png" mode=""></image>
 						</view>
 						<input   type="number" @change="changeNum" v-model="specNum"   />
 						<view class="img-box" @click="addNum()">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/add.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/add.png" mode=""></image>
 						</view>
 					</view>
 				</view>
@@ -181,10 +182,10 @@
 		</popupBottom>
 		
 		<view class="loadding" v-if="loadding==true">
-			<image src="../../static/logo.jpg"></image>
+			<image src="../../static/logo.png"></image>
 			<text class="text">加载中...</text>
 		</view>
-		<u-modal :show="showModal" title="温馨提示" content="处方药须凭处方在药师指导下购买和使用" @confirm="hideModal()"></u-modal>
+		<!-- <u-modal :show="showModal" title="温馨提示" content="处方药须凭处方在药师指导下购买和使用" @confirm="hideModal()"></u-modal> -->
 	</view>
 </template>
 
@@ -277,7 +278,7 @@
 				return {
 					title: this.product.productName,
 					path: '/pages/shopping/productDetails?productId='+this.product.productId+"&userId="+user.userId,
-					imageUrl: '/static/logo.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: '/static/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 		},
@@ -288,7 +289,7 @@
 				return {
 					title: this.product.productName,
 					query:'productId='+this.product.productId+"&userId="+user.userId,//页面参数
-					imageUrl: '/static/logo.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+					imageUrl: '/static/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 				}
 			}
 			
@@ -584,7 +585,7 @@
 			left: 0;
 			bottom: 0;
 			z-index: 9;
-			background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/black_mask.png);
+			background-image: url(https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/black_mask.png);
 			background-size: 20upx 44upx;
 			background-repeat: repeat-x;
 		}

+ 1 - 1
pages/shopping/success.vue

@@ -3,7 +3,7 @@
 		<view class="inner">
 			<view class="top">
 				<text class="title">支付成功</text>
-				 <image class="icon" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/success.png" ></image>
+				 <image class="icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/success.png" ></image>
 				 <view   class="btn-box">
 				 	<view class="btn cancel" @click="goOrderDetails(order.id)"> 查看订单</view>
 				 </view>

+ 281 - 167
pages/user/index.vue

@@ -1,35 +1,36 @@
 <template>
 	<view>
 		<view class="top-cont">
-			<view class="top-inner">			
+			<view class="top-inner">
 				<!-- 这里是状态栏 -->
 				<view class="status_bar" :style="{height: statusBarHeight}"></view>
 				<view class="user-info">
 					<view class="left">
 						<view class="head-img">
-							<image :src="user.avatar==null?'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/detault_head.jpg':user.avatar" mode="aspectFill"></image>
+							<image
+								:src="user.avatar==null?'https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':user.avatar"
+								mode="aspectFill"></image>
 						</view>
-						<view class="name-phone"  v-if="UserInfo">
+						<view class="name-phone" v-if="UserInfo">
 							<view class="name">{{user.nickname}}
-								<text class="fs24 ml12 base-color mb20 " v-if="user.isShow==1"
-								>会员</text>
-								<text class="fs24 ml12 mb20 " style="color: #666;" v-else
-								>非会员</text>
+								<text class="fs24 ml12 base-color mb20 " v-if="user.isShow==1">会员</text>
+								<text class="fs24 ml12 mb20 " style="color: #666;" v-else>非会员</text>
 							</view>
 							<view class="phone">{{utils.parsePhone(user.phone)}}</view>
 						</view>
-						<view class="fs40 bold name-phone center " @click='getOrderCount()' 
-						v-else>立即登录</view>
+						<view class="fs40 bold name-phone center " @click='getOrderCount()' v-else>立即登录</view>
 					</view>
 					<view class="right">
 						<uni-badge size="small" :text="msgNum" absolute="rightTop" type="error">
 							<view class="set" @click="navgetTo('/pages_user/user/personInfo')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/icon-set.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon-set.png"
+									mode=""></image>
 							</view>
 						</uni-badge>
 						<!-- <uni-badge size="small" :text="msgNum" absolute="rightTop" type="error">
 							<view class="msg-box" @click="navgetTo('/pages_user/user/message')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/icon-msg.png" mode=""></image>
+								<image src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon-msg.png" mode=""></image>
 							</view>
 							
 						</uni-badge> -->
@@ -42,37 +43,49 @@
 							<text class="title">我的订单</text>
 							<view class="all-order" @click="showOrder('')">
 								<text class="text">全部订单</text>
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow4.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow4.png"
+									mode=""></image>
 							</view>
 						</view>
 						<view class="status-box">
 							<uni-badge size="small" :text=count0 absolute="rightTop" type="error">
 								<view class="item" @click="showOrder('0')">
-									<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/payment.png" mode=""></image>
+									<image
+										src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/payment.png"
+										mode=""></image>
 									<text class="text">待付款</text>
 								</view>
 							</uni-badge>
 							<uni-badge size="small" :text=count1 absolute="rightTop" type="error">
-							<view class="item" @click="showOrder('1')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/send_goods.png" mode=""></image>
-								<text class="text">待发货</text>
-							</view>
+								<view class="item" @click="showOrder('1')">
+									<image
+										src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/send_goods.png"
+										mode=""></image>
+									<text class="text">待发货</text>
+								</view>
 							</uni-badge>
 							<uni-badge size="small" :text=count2 absolute="rightTop" type="error">
-							<view class="item" @click="showOrder('2')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/sou_goods.png" mode=""></image>
-								<text class="text">待收货</text>
-							</view>
+								<view class="item" @click="showOrder('2')">
+									<image
+										src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/sou_goods.png"
+										mode=""></image>
+									<text class="text">待收货</text>
+								</view>
 							</uni-badge>
 							<view class="item" @click="showOrder('3')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/completed.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/completed.png"
+									mode=""></image>
 								<text class="text">已完成</text>
 							</view>
 							<uni-badge size="small" :text=afterSalesCount absolute="rightTop" type="error">
-							<view class="item" @click="navgetTo('/pages_user/user/refundOrderList')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/after_sales.png" mode=""></image>
-								<text class="text">售后/退款</text>
-							</view>
+								<view class="item" @click="navgetTo('/pages_user/user/refundOrderList')">
+									<image
+										src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/after_sales.png"
+										mode=""></image>
+									<text class="text">售后/退款</text>
+								</view>
 							</uni-badge>
 						</view>
 					</view>
@@ -83,56 +96,110 @@
 					<view class="used-tools">
 						<view class="title">常用工具</view>
 						<view class="tools-list">
+
 							<view class="item" @click="navgetTo('/pages_user/user/address')" v-if="user.isShow==1">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/address.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/address.png"
+									mode=""></image>
 								<text class="text">收货地址</text>
 							</view>
 							<view class="item no-marin-bottom" @click="navgetTo('/pages_user/user/integral')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/integral.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/integral.png"
+									mode=""></image>
 								<text class="text">积分管理</text>
 							</view>
-							<view class="item no-marin-bottom"  @click="navgetTo('/pages_shopping/shopping/myCoupon')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/mycoupon.png" mode=""></image>
+							<view class="item no-marin-bottom" @click="navgetTo('/pages_shopping/shopping/myCoupon')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/mycoupon.png"
+									mode=""></image>
 								<text class="text">优惠券</text>
 							</view>
-							<view class="item no-marin-bottom" @click="navgetTo('/pages_user/user/storeProductRelation')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/footprint.png" mode=""></image>
+							<view class="item no-marin-bottom"
+								@click="navgetTo('/pages_user/user/storeProductRelation')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/footprint.png"
+									mode=""></image>
 								<text class="text">我的足迹</text>
 							</view>
-							<view class="item no-marin-bottom" @click="openH5('/h5/userAgreement')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/service_file.png" mode=""></image>
-								<text class="text">用户协议</text>
-							</view>
-							<view class="item no-marin-bottom align-top"  @click="openH5('/h5/privacyPolicy')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/advice.png" mode=""></image>
-								<text class="text">隐私保护</text>
-							</view>
+							
 							<view class="item no-marin-bottom">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/customer1.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/customer1.png"
+									mode=""></image>
 								<text class="text">专属客服</text>
 								<button class="contact-btn" open-type="contact"></button>
 							</view>
 							<!-- <view v-if="user.isPromoter==0" class="item no-marin-bottom"  @click="navgetTo('/pages_user/user/userTuiAdd')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/my_promotion.png" mode=""></image>
-								<text class="text">申请健康大使</text>
+								<image src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/my_promotion.png" mode=""></image>
+								<text class="text">申请百域大使</text>
 							</view> -->
 							<!-- <view v-if="user.isPromoter==1" class="item no-marin-bottom"  @click="navgetTo('/pages_user/user/userTui')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/my_promotion.png" mode=""></image>
+								<image src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/my_promotion.png" mode=""></image>
 								<text class="text">我的推广</text>
 							</view> -->
-							<view class="item no-marin-bottom"  @click="navgetTo('/pages/home/cert')">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/qualification.png" mode=""></image>
+							<!-- <view class="item no-marin-bottom" @click="navgetTo('/pages/home/cert')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/qualification.png"
+									mode=""></image>
 								<text class="text">资质证书</text>
+							</view> -->
+							<!-- v-if="user.bindCompanyUserId" -->
+							<view  class="item no-marin-bottom" @click="navgetTo('/pages_shopping/live/order')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/live.png"
+									mode=""></image>
+								<text class="text">直播订单</text>
+							</view>
+							
+							<!-- 销售可见 -->
+							<!-- <view  v-if="user.bindCompanyUserId" class="item no-marin-bottom" @click="toManager()">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/products_icon.png"
+									mode=""></image>
+								<text class="text">制单管理</text>
+							</view>
+							<view v-if="user.bindCompanyUserId" class="item no-marin-bottom" @click="toManagerCourse()">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/sale_file.png"
+									mode=""></image>
+								<text class="text">销售管理</text>
+							</view> -->
+							
+							<!-- <view v-if="user.bindCompanyUserId" class="item no-marin-bottom" @click="openH5('/h5/userAgreement')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/service_file.png"
+									mode=""></image>
+								<text class="text">用户协议</text>
+							</view> -->
+							<!-- <view v-if="user.bindCompanyUserId" class="item no-marin-bottom align-top" @click="openH5('/h5/privacyPolicy')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/advice.png"
+									mode=""></image>
+								<text class="text">隐私保护</text>
+							</view> -->
+							
+							
+							<!-- 测试用下面的 -->
+							<view  class="item no-marin-bottom align-top" @click="navgetTo('/pages_course/livingList')">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/integral.png"
+									mode=""></image>
+								<text class="text">直播</text>
 							</view>
-	
+							
 							<view class="item no-marin-bottom" @click="toManager()">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/Document.png" mode=""></image>
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/products_icon.png"
+									mode=""></image>
 								<text class="text">制单管理</text>
 							</view>
-							 <view class="item no-marin-bottom" @click="toManagerCourse()">
-							 	<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/sale_file.png" mode=""></image>
-							 	<text class="text">销售管理</text>
-							 </view>
+							<view class="item no-marin-bottom" @click="toManagerCourse()">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/sale_file.png"
+									mode=""></image>
+								<text class="text">销售管理</text>
+							</view>
 						</view>
 					</view>
 				</view>
@@ -141,52 +208,59 @@
 					<view class="tel_btn" @click="callService()"></view>
 				</view> -->
 				<view style="padding-bottom: 20rpx;" v-if="UserInfo">
-					<view @tap="loginOUt" class="log-out x-c" >退出登录</view>
+					<view @tap="loginOUt" class="log-out x-c">退出登录</view>
 				</view>
 				<view class="like-product">
-					<likeProduct  ref="product" />
+					<likeProduct ref="product" />
 				</view>
-				
+
 				<!-- 退出登录按钮 -->
-				
+
 			</view>
-			
+
 		</view>
+		<Server/>
 	</view>
 </template>
 
 <script>
-	import {getOrderCount} from '@/api/storeOrder'
-	import {getUserInfo} from '@/api/user'
+	import {
+		getOrderCount
+	} from '@/api/storeOrder'
+	import {
+		getUserInfo
+	} from '@/api/user'
 	import likeProduct from '@/components/likeProduct.vue'
+	import Server from '@/components/Server.vue'
 	export default {
 		components: {
-			likeProduct
+			likeProduct,
+			Server
 		},
 		data() {
 			return {
-				count0:0,
-				count1:0,
-				count2:0,
-				afterSalesCount:0,
-				user:{
-					isPromoter:0,
-					isWeixinAuth:0,
-					phone:"",
-					nickname:"用户昵称",
-					avatarUrl:"https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/detault_head.png"
+				count0: 0,
+				count1: 0,
+				count2: 0,
+				afterSalesCount: 0,
+				user: {
+					isPromoter: 0,
+					isWeixinAuth: 0,
+					phone: "",
+					nickname: "用户昵称",
+					avatarUrl: "https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.png"
 				},
 				// 状态栏的高度
 				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
 				// 消息数量
 				msgNum: 0,
-				UserInfo:uni.getStorageSync('AppToken')
+				UserInfo: uni.getStorageSync('AppToken')
 			};
 		},
 		watch: {
-		    UserInfo() {
-		        return uni.getStorageSync('AppToken')
-		    }
+			UserInfo() {
+				return uni.getStorageSync('AppToken')
+			}
 		},
 		onLoad() {
 			console.log("onload")
@@ -194,9 +268,9 @@
 		onShow() {
 			console.log("onshow")
 			this.UserInfo = uni.getStorageSync('AppToken') // 强制更新登录状态
-			if(this.UserInfo){
+			if (this.UserInfo) {
 				this.getUserInfo()
-			}else{
+			} else {
 				// this.isuser=true
 			}
 			// this.getUserInfo();
@@ -206,17 +280,22 @@
 			console.log("onReachBottom")
 			this.$refs.product.getGoodsProducts();
 		},
+		computed: {
+			imgPath() {
+				return this.$store.state.imgpath
+			},
+		},
 		methods: {
-			callService(){
-				let orderKey='5d81cf01-6f8d-4e1a-ae7a-dbc26c965b01';
+			callService() {
+				let orderKey = '5d81cf01-6f8d-4e1a-ae7a-dbc26c965b01';
 				uni.navigateTo({
-					url: '/pages_company/order/confirmOrder?orderKey='+orderKey
+					url: '/pages_company/order/confirmOrder?orderKey=' + orderKey
 				})
 				return;
-				
-				 uni.makePhoneCall({
-					phoneNumber:"4000717770",
-					success:function(){
+
+				uni.makePhoneCall({
+					phoneNumber: "4000717770",
+					success: function() {
 						console.log('拨打电话成功');
 					},
 					fail() {
@@ -224,67 +303,64 @@
 					}
 				})
 			},
-			 
-			getOrderCount(){
+
+			getOrderCount() {
 				getOrderCount().then(
 					res => {
-						if(res.code==200){
-							this.count0=res.count0;
-							this.count1=res.count1; 
-							this.count2=res.count2; 
-							this.afterSalesCount=res.afterSalesCount; 
-						} 
+						if (res.code == 200) {
+							this.count0 = res.count0;
+							this.count1 = res.count1;
+							this.count2 = res.count2;
+							this.afterSalesCount = res.afterSalesCount;
+						}
 					},
 					rej => {}
 				);
 			},
-			toManager(){
-				if(this.utils.checkCompanyUserLoginState()){
+			toManager() {
+				if (this.utils.checkCompanyUserLoginState()) {
 					uni.navigateTo({
 						url: '/pages_company/index'
 					})
-				}
-				else{
+				} else {
 					uni.navigateTo({
 						url: '/pages_company/auth/login'
 					})
 				}
-				
+
 			},
-			toManagerCourse(){
-				if(uni.getStorageSync('ManageToken')){
+			toManagerCourse() {
+				if (uni.getStorageSync('ManageToken')) {
 					uni.navigateTo({
 						url: '/pages_manage/index'
 					})
-				}
-				else{
+				} else {
 					uni.navigateTo({
 						url: '/pages_manage/login'
 					})
 				}
-				
+
 			},
-			openH5(url){
+			openH5(url) {
 				var requestPath = uni.getStorageSync('requestPath');
-				uni.setStorageSync('url',requestPath+url);
+				uni.setStorageSync('url', requestPath + url);
 				uni.navigateTo({
 					url: '../home/h5'
 				})
 			},
-			getUserInfo(){
+			getUserInfo() {
 				getUserInfo().then(
 					res => {
-						if(res.code==200){
-							if(res.user!=null){
-								this.user=res.user;
-							}
-							else{
+						if (res.code == 200) {
+							if (res.user != null) {
+								this.user = res.user;
+							} else {
 								this.utils.loginOut();
 							}
-							
-						}else{
+
+						} else {
 							uni.showToast({
-								icon:'none',
+								icon: 'none',
 								title: "请求失败",
 							});
 						}
@@ -295,7 +371,7 @@
 			// 跳转页面
 			navgetTo(url) {
 				this.utils.isLogin().then(res => {
-					if(res){
+					if (res) {
 						uni.navigateTo({
 							url: url
 						})
@@ -308,7 +384,7 @@
 					url: '/pages_user/user/storeOrder?status=' + status
 				})
 			},
-			loginOUt(){
+			loginOUt() {
 				this.utils.loginOut();
 				this.getUserInfo();
 			}
@@ -317,51 +393,59 @@
 </script>
 
 <style lang="scss" scoped>
-	.top-cont{
+	.top-cont {
 		width: 100%;
 		height: 494upx;
 		position: relative;
-		background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/personl_top_bg.png);
+		background-image: url(https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/personl_top_bg.png);
 		background-repeat: repeat-x;
 		background-size: 40upx 100%;
-		.top-inner{
+
+		.top-inner {
 			width: 100%;
 			height: 100%;
 			position: absolute;
 			top: 0;
 			left: 0;
 			z-index: 2;
-			.user-info{
+
+			.user-info {
 				padding: 88upx 30upx 0 30upx;
 				display: flex;
 				align-items: center;
 				justify-content: space-between;
-				.left{
+
+				.left {
 					position: relative;
 					display: flex;
-					.head-img{
+
+					.head-img {
 						width: 120upx;
 						height: 120upx;
 						border-radius: 50%;
 						overflow: hidden;
 						margin-right: 30upx;
 						border: 4upx solid #FFFFFF;
-						box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
-						image{
+						box-shadow: 0px 5px 15px 2px rgba(0, 0, 0, 0.1);
+
+						image {
 							width: 100%;
 							height: 100%;
 						}
 					}
-					.name-phone{
+
+					.name-phone {
 						padding-top: 15upx;
-						.name{
+
+						.name {
 							font-size: 40upx;
 							font-family: PingFang SC;
 							font-weight: bold;
 							color: #111111;
 							line-height: 1;
 						}
-						.phone{
+
+						.phone {
 							font-size: 28upx;
 							font-family: PingFang SC;
 							font-weight: 500;
@@ -371,34 +455,41 @@
 						}
 					}
 				}
-				.right{
+
+				.right {
 					display: flex;
 					align-items: center;
 					justify-content: center;
-					.msg-box{
+
+					.msg-box {
 						margin-left: 10upx;
 						width: 44upx;
 						height: 44upx;
-						image{
+
+						image {
 							width: 100%;
 							height: 100%;
 						}
 					}
-					.set{
-						
+
+					.set {
+
 						width: 44upx;
 						height: 44upx;
-						image{
+
+						image {
 							width: 100%;
 							height: 100%;
 						}
 					}
 				}
-				
+
 			}
-			.my-order{
+
+			.my-order {
 				padding: 50upx 20upx 0;
-				.inner{
+
+				.inner {
 					box-sizing: border-box;
 					height: 245upx;
 					// height: 105upx;
@@ -408,21 +499,25 @@
 					display: flex;
 					flex-direction: column;
 					justify-content: space-between;
-					.title-box{
+
+					.title-box {
 						display: flex;
 						align-items: center;
 						justify-content: space-between;
-						.title{
+
+						.title {
 							font-size: 34upx;
 							font-family: PingFang SC;
 							font-weight: bold;
 							color: #222222;
 							line-height: 1;
 						}
-						.all-order{
+
+						.all-order {
 							display: flex;
 							align-items: center;
-							.text{
+
+							.text {
 								font-size: 26upx;
 								font-family: PingFang SC;
 								font-weight: 500;
@@ -430,28 +525,33 @@
 								line-height: 1;
 								margin-right: 8upx;
 							}
-							image{
+
+							image {
 								width: 14upx;
 								height: 24upx;
 							}
 						}
 					}
-					.status-box{
+
+					.status-box {
 						display: flex;
 						align-items: center;
 						justify-content: space-between;
 						padding: 0 10upx;
-						.item{
+
+						.item {
 							display: flex;
 							flex-direction: column;
 							align-items: center;
 							justify-content: center;
-							image{
+
+							image {
 								width: 40upx;
 								height: 40upx;
 								margin-bottom: 18upx;
 							}
-							.text{
+
+							.text {
 								font-size: 26upx;
 								font-family: PingFang SC;
 								font-weight: 500;
@@ -462,34 +562,39 @@
 					}
 				}
 			}
-			
+
 		}
 	}
-	.content{
+
+	.content {
 		margin-top: 20upx;
 		padding: 0 20upx;
 		display: flex;
 		align-items: center;
 		justify-content: center;
-		.used-tools{
+
+		.used-tools {
+			width: 100%;
 			box-sizing: border-box;
 			background: #FFFFFF;
 			border-radius: 16upx;
 			padding: 40upx 30upx;
-			
-			.title{
+
+			.title {
 				font-size: 34upx;
 				font-family: PingFang SC;
 				font-weight: bold;
 				color: #222222;
 				line-height: 1;
 			}
-			.tools-list{
+
+			.tools-list {
 				margin-top: 50upx;
 				display: flex;
 				flex-wrap: wrap;
 				width: 100%;
-				.item{
+
+				.item {
 					box-sizing: border-box;
 					width: 25%;
 					display: flex;
@@ -498,11 +603,13 @@
 					justify-content: center;
 					margin-bottom: 50upx;
 					position: relative;
-					image{
+
+					image {
 						width: 44upx;
 						height: 44upx;
 					}
-					.text{
+
+					.text {
 						font-size: 24upx;
 						font-family: PingFang SC;
 						font-weight: 500;
@@ -510,7 +617,8 @@
 						line-height: 1;
 						margin-top: 20upx;
 					}
-					.contact-btn{
+
+					.contact-btn {
 						display: inline-block;
 						position: absolute;
 						top: 0;
@@ -523,7 +631,8 @@
 			}
 		}
 	}
-	.log-out{
+
+	.log-out {
 		height: 80upx;
 		line-height: 80upx;
 		text-align: center;
@@ -535,39 +644,44 @@
 		border-radius: 16upx;
 		margin-top: 20upx;
 	}
-	.sub-btn{
+
+	.sub-btn {
 		position: absolute;
 		width: 100%;
 		height: 100%;
 		opacity: 0;
 	}
-	.like-product{
+
+	.like-product {
 		padding: 0 20rpx;
 	}
-	.banner{
+
+	.banner {
 		padding: 20rpx 20rpx 0rpx 20rpx;
 		height: 200rpx;
 		position: relative;
 		display: flex;
 		align-items: center;
 		justify-content: center;
-		image{
-			width:100%;
+
+		image {
+			width: 100%;
 			height: 100%;
 		}
-		.tel_btn{
+
+		.tel_btn {
 			width: 100%;
 			height: 100%;
-			top:0upx;
+			top: 0upx;
 			position: absolute;
-			opacity:0.0;
+			opacity: 0.0;
 		}
 	}
-	
-	.log-out{
-		height: 100rpx;line-height: 100rpx;
+
+	.log-out {
+		height: 100rpx;
+		line-height: 100rpx;
 		margin: 10px;
 		border-radius: 20rpx;
 	}
-	
-</style>
+</style>

+ 2 - 2
pages_company/coupon.vue

@@ -14,7 +14,7 @@
 	</view>
     <view class="tui-coupon-list">
       <view class="tui-coupon-item tui-top20" v-for="(item, index) in couponsList" :key="index">
-         <image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/bg_coupon_3x.png" class="tui-coupon-bg" mode="widthFix"></image>
+         <image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/bg_coupon_3x.png" class="tui-coupon-bg" mode="widthFix"></image>
 		<view class="tui-coupon-item-left">
           <view class="tui-coupon-price-box" :class="{ 'tui-color-grey': item.receiveCount>0 }">
             <view class="tui-coupon-price-sign">¥</view>
@@ -48,7 +48,7 @@
 	<Loading :loaded="loadend" :loading="loading"></Loading>
 	<!--暂无优惠券-->
 	<view v-if="couponsList.length == 0 && page > 1" class="no-data-box" >
-		<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png" mode="aspectFit"></image>
+		<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" mode="aspectFit"></image>
 		<view class="empty-title">暂无数据</view>
 	</view>
   </view>

+ 1 - 1
pages_company/couponDetails.vue

@@ -2,7 +2,7 @@
   <view class="container">
     <view class="tui-coupon-list">
       <view class="tui-coupon-item tui-top20"  >
-         <image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/bg_coupon_3x.png" class="tui-coupon-bg" mode="widthFix"></image>
+         <image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/bg_coupon_3x.png" class="tui-coupon-bg" mode="widthFix"></image>
 		<view class="tui-coupon-item-left">
           <view class="tui-coupon-price-box"  >
             <view class="tui-coupon-price-sign">¥</view>

+ 146 - 89
pages_company/index.vue

@@ -8,8 +8,8 @@
 						<view class="phone" v-if="user!=null">{{utils.parsePhone(user.phonenumber)}}</view>
 					</view>
 				</view>
-				<view class="msg-box"  >
-					 {{user.deptName}}
+				<view class="msg-box" v-if="user.deptName">
+					{{user.deptName}}
 				</view>
 			</view>
 			<!-- 常用工具 -->
@@ -17,49 +17,75 @@
 				<view class="title">常用工具</view>
 				<view class="tools-list">
 					<view class="item" @click="toCreateOrder()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/order.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/order.png"
+							mode=""></image>
 						<text class="text">商品制单</text>
 					</view>
 					<view class="item" @click="toCreateCoupon()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/icon_coupon.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon_coupon.png"
+							mode=""></image>
 						<text class="text">制单优惠券</text>
 					</view>
 					<view class="item" @click="toPay()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/money.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/money.png"
+							mode=""></image>
 						<text class="text">微信收款</text>
 					</view>
-					<view class="item" @click="alipay()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/money.png" mode=""></image>
+					<!-- <view class="item" @click="alipay()">
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/money.png" mode=""></image>
 						<text class="text">支付宝收款</text>
-					</view>
+					</view> -->
 					<view class="item" @click="toOrder()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/order.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/order.png"
+							mode=""></image>
 						<text class="text">我的订单</text>
 					</view>
 					<view class="item" @click="toPackage()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/package.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/package.png"
+							mode=""></image>
 						<text class="text">商品套餐</text>
 					</view>
 					<view class="item" @click="toCoupon()">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/icon_coupon.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon_coupon.png"
+							mode=""></image>
 						<text class="text">套餐优惠券</text>
 					</view>
-					 
+					<view class="item" @click="toPaywechat()">
+						<image src="https://kuanyitang-1317640934.cos.ap-shanghai.myqcloud.com/app/image/wechat.png"
+							mode=""></image>
+						<text class="text">微信收款码</text>
+					</view>
+					<!-- <view class="item" @click="navTo('/pages_company/voice')">
+						<u-icon name="mic" size="28"></u-icon>
+						<view class="text">声音录制</view>
+					</view>
+					<view class="item" @click="navTo('/pages_company/voiceList')">
+						<u-icon name="mic" size="28"></u-icon>
+						<view class="text">声音采集</view>
+					</view> -->
+					<view class="item" @click="toShareLive()">
+						<image :src="imgPath+ '/userapp/images/live_icon.png'" mode=""></image>
+						<text class="text">分享直播间</text>
+					</view>
 				</view>
 			</view>
 			<!-- 退出登录按钮 -->
 			<view class="log-out" @click="logout">退出登录</view>
 		</view>
-		
+
 	</view>
 </template>
 
 <script>
-	import {getUserInfo,getQrImg} from '@/api/companyUser'
+	import {
+		getUserInfo,
+		getQrImg
+	} from '@/api/companyUser'
 	export default {
 		data() {
 			return {
-				 user:null,
+				imgPath: this.$store.state.imgpath,
+				user: null,
 			};
 		},
 		onLoad() {
@@ -70,8 +96,18 @@
 			this.getUserInfo()
 		},
 		methods: {
-			
-			alipay(){
+			toShareLive() {
+				uni.navigateTo({
+					url: '/pages_company/shareLive?companyId=' + this.user.companyId + "&companyUserId=" + this
+						.user.userId
+				})
+			},
+			toPaywechat() {
+				uni.navigateTo({
+					url: '/pages_company/wechatcode?companyId=' + this.user.companyId
+				})
+			},
+			alipay() {
 				// var url="http://alipay.yjf.runtzh.com/#/?companyId="+this.user.companyId+"&companyUserId="+this.user.userId
 				// uni.setClipboardData({
 				// 	data:url,
@@ -80,69 +116,78 @@
 				// 			title:'收款地址已复制到剪切板',
 				// 			icon:'none'
 				// 		})
-						
+
 				// 	}
 				// });
-				
+
+				uni.navigateTo({
+					url: '/pages_company/alipayImg'
+				})
+			},
+			navTo(url) {
 				uni.navigateTo({
-					url:'/pages_company/alipayImg'
+					url: url
 				})
 			},
-			toCard(){
+			toCard() {
 				uni.navigateTo({
-					url:'/pages_company/card?cardId='+this.user.cardId
+					url: '/pages_company/card?cardId=' + this.user.cardId
 				})
 			},
-			toCreateOrder(){
+			toCreateOrder() {
 				uni.navigateTo({
-					url:'/pages_company/order/productList'
+					url: '/pages_company/order/productList?companyId=' + this.user.companyId + "&companyUserId=" + this.user.userId
 				})
 			},
-			toPay(){
+			toPay() {
 				uni.navigateTo({
-					url:'/pages_user/user/pay?companyId='+this.user.companyId+"&companyUserId="+this.user.userId
+					url: '/pages_user/user/pay?companyId=' + this.user.companyId + "&companyUserId=" + this.user
+						.userId
 				})
 			},
-			toOrder(){
+			toOrder() {
 				uni.navigateTo({
-					url:'/pages_company/storeOrder?companyId='+this.user.companyId+"&companyUserId="+this.user.userId
+					url: '/pages_company/storeOrder?companyId=' + this.user.companyId + "&companyUserId=" + this
+						.user.userId
 				})
 			},
-			toPackage(){
+			toPackage() {
 				uni.navigateTo({
-					url:'/pages_company/storeProductPackage?companyId='+this.user.companyId+"&companyUserId="+this.user.userId
+					url: '/pages_company/storeProductPackage?companyId=' + this.user.companyId +
+						"&companyUserId=" + this.user.userId
 				})
 			},
-			toCoupon(){
+			toCoupon() {
 				uni.navigateTo({
-					url:'/pages_company/coupon'
+					url: '/pages_company/coupon'
 				})
 			},
-			toCreateCoupon(){
+			toCreateCoupon() {
 				uni.navigateTo({
-					url:'/pages_company/order/coupon'
+					url: '/pages_company/order/coupon'
 				})
 			},
-			toCreateOrderCoupon(){
+			toCreateOrderCoupon() {
 				uni.navigateTo({
-					url:'/pages_company/order/coupon'
+					url: '/pages_company/order/coupon'
 				})
 			},
-			getUserInfo(){
-				var data={token:uni.getStorageSync('CompanyUserToken')}
+			getUserInfo() {
+				var data = {
+					token: uni.getStorageSync('CompanyUserToken')
+				}
 				getUserInfo(data).then(
 					res => {
-						if(res.code==200){
-							  this.user=res.data;
-						}
-						else if(res.code==403){
-							uni.setStorageSync('CompanyUserToken',null);
+						if (res.code == 200) {
+							this.user = res.data;
+						} else if (res.code == 403) {
+							uni.setStorageSync('CompanyUserToken', null);
 							uni.navigateBack({
-								delta:-1
-							})			
-						}else{
+								delta: -1
+							})
+						} else {
 							uni.showToast({
-								icon:'none',
+								icon: 'none',
 								title: res.msg,
 							});
 						}
@@ -150,29 +195,28 @@
 					rej => {}
 				);
 			},
-			logout(){
-			 	uni.showModal({
-			 		title:"提示",
-			 		content:"确认退出登录吗?",
-			 		showCancel:true,
-			 		cancelText:'取消',
-			 		confirmText:'确定',
-			 		success:res=>{
-			 			if(res.confirm){
-			 				uni.setStorageSync('CompanyUserToken',null);
-			 				uni.navigateBack({
-			 					delta:-1
-			 				})							
-			 			}else{
-			 			}
-			 		}
-			 	})
-			 },
-			 
+			logout() {
+				uni.showModal({
+					title: "提示",
+					content: "确认退出登录吗?",
+					showCancel: true,
+					cancelText: '取消',
+					confirmText: '确定',
+					success: res => {
+						if (res.confirm) {
+							uni.setStorageSync('CompanyUserToken', null);
+							uni.navigateBack({
+								delta: -1
+							})
+						} else {}
+					}
+				})
+			},
+
 			// 跳转页面
 			navgetTo(url) {
 				this.utils.isLogin().then(res => {
-					if(res){
+					if (res) {
 						uni.navigateTo({
 							url: url
 						})
@@ -184,40 +228,47 @@
 </script>
 
 <style lang="scss">
-	.content{
+	.content {
 		margin: 20upx 0upx;
 		padding: 0 20upx;
-		.user-info{
+
+		.user-info {
 			padding: 30upx;
 			display: flex;
 			align-items: center;
 			justify-content: space-between;
-			.left{
+
+			.left {
 				position: relative;
 				display: flex;
-				.head-img{
+
+				.head-img {
 					width: 120upx;
 					height: 120upx;
 					border-radius: 50%;
 					overflow: hidden;
 					margin-right: 30upx;
 					border: 4upx solid #FFFFFF;
-					box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
-					image{
+					box-shadow: 0px 5px 15px 2px rgba(0, 0, 0, 0.1);
+
+					image {
 						width: 100%;
 						height: 100%;
 					}
 				}
-				.name-phone{
+
+				.name-phone {
 					padding-top: 15upx;
-					.name{
+
+					.name {
 						font-size: 36upx;
 						font-family: PingFang SC;
 						font-weight: bold;
 						color: #111111;
 						line-height: 1;
 					}
-					.phone{
+
+					.phone {
 						font-size: 28upx;
 						font-family: PingFang SC;
 						font-weight: 500;
@@ -227,10 +278,9 @@
 					}
 				}
 			}
-			.msg-box{
+
+			.msg-box {
 				padding: 5rpx 15upx;
-				height: 30upx;
-				line-height: 30upx;
 				font-size: 22upx;
 				font-family: PingFang SC;
 				font-weight: 500;
@@ -239,25 +289,28 @@
 				background-color: #2BC7B9;
 			}
 		}
-		.used-tools{
+
+		.used-tools {
 			box-sizing: border-box;
 			background: #FFFFFF;
 			border-radius: 16upx;
 			padding: 40upx 30upx;
-			
-			.title{
+
+			.title {
 				font-size: 32upx;
 				font-family: PingFang SC;
 				font-weight: bold;
 				color: #222222;
 				line-height: 1;
 			}
-			.tools-list{
+
+			.tools-list {
 				margin-top: 50upx;
 				display: flex;
 				flex-wrap: wrap;
 				width: 100%;
-				.item{
+
+				.item {
 					box-sizing: border-box;
 					width: 25%;
 					display: flex;
@@ -266,11 +319,13 @@
 					justify-content: center;
 					margin-bottom: 50upx;
 					position: relative;
-					image{
+
+					image {
 						width: 44upx;
 						height: 44upx;
 					}
-					.text{
+
+					.text {
 						font-size: 24upx;
 						font-family: PingFang SC;
 						font-weight: 500;
@@ -278,7 +333,8 @@
 						line-height: 1;
 						margin-top: 20upx;
 					}
-					.contact-btn{
+
+					.contact-btn {
 						display: inline-block;
 						position: absolute;
 						top: 0;
@@ -290,7 +346,8 @@
 				}
 			}
 		}
-		.log-out{
+
+		.log-out {
 			height: 80upx;
 			line-height: 80upx;
 			text-align: center;
@@ -303,4 +360,4 @@
 			margin-top: 20upx;
 		}
 	}
-</style>
+</style>

+ 3 - 3
pages_company/order/cart.vue

@@ -22,12 +22,12 @@
 						</view>
 						<view class="num-box">
 							<view class="img-box" @click="delNum(item)">
-								<image v-if="item.cartNum <= 1" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian.png" mode=""></image>
-								<image v-else src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian2.png" mode=""></image>
+								<image v-if="item.cartNum <= 1" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian.png" mode=""></image>
+								<image v-else src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian2.png" mode=""></image>
 							</view>
 							<input type="text"  @change="changeNum($event,item)" :value="item.cartNum"   />
 							<view class="img-box" @click="addNum(item)">
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/add.png" mode=""></image>
+								<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/add.png" mode=""></image>
 							</view>
 						</view>
 					</view>

+ 5 - 5
pages_company/order/confirmCompanyOrder.vue

@@ -1,7 +1,7 @@
 <template>
 	<view>
 		<view class="inner-box">
-			<!-- 品列表 -->
+			<!-- 品列表 -->
 			<view class="goods-list">
 				<view v-for="(item,index) in carts" :key="index" class="item" @click="showDetail(item)">
 					<view class="img-box">
@@ -85,18 +85,18 @@
 		//发送给朋友
 		onShareAppMessage(res) {
 			return {
-				title: "中康智慧-您的专属健康解决方案",
+				title: "百域承品-您的专属解决方案",
 				path: '/pages_company/order/confirmOrder?orderKey='+this.orderKey,
-				imageUrl: '/static/logo.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				imageUrl: '/static/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 			}
 			
 		},
 		//分享到朋友圈
 		onShareTimeline(res) {
 			return {
-				title:"中康智慧-您的专属健康解决方案",
+				title:"百域承品-您的专属解决方案",
 				query:'orderKey='+this.orderKey,
-				imageUrl:  '/static/logo.jpg' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				imageUrl:  '/static/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
 			}
 		},
 		methods: {

+ 2 - 2
pages_company/order/confirmOrder.vue

@@ -1,7 +1,7 @@
 <template>
 	<view>
 		<view class="inner-box">
-			<!-- 品列表 -->
+			<!-- 品列表 -->
 			<view class="goods-list">
 				<view v-for="(item,index) in carts" :key="index" class="item" @click="showDetail(item)">
 					<view class="img-box">
@@ -50,7 +50,7 @@
 		</view>
 		<view class="message-box" v-if="messageShow">
 			<view class="left">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close24.png" mode="" @click="closeOrder()" ></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close24.png" mode="" @click="closeOrder()" ></image>
 				<view class="text ellipsis">您有{{count0}}个待支付订单</view>
 			</view>
 			<view class="btn" @click="showOrder()">查看</view>

+ 2 - 2
pages_company/order/coupon.vue

@@ -2,7 +2,7 @@
   <view ref="container">
     <view class="tui-coupon-list">
       <view class="tui-coupon-item tui-top20" v-for="(item, index) in couponsList" :key="index">
-         <image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/bg_coupon_3x.png" class="tui-coupon-bg" mode="widthFix"></image>
+         <image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/bg_coupon_3x.png" class="tui-coupon-bg" mode="widthFix"></image>
 		<view class="tui-coupon-item-left">
           <view class="tui-coupon-price-box" :class="{ 'tui-color-grey': item.receiveCount>0 }">
             <view class="tui-coupon-price-sign">¥</view>
@@ -36,7 +36,7 @@
 	<Loading :loaded="loadend" :loading="loading"></Loading>
 	<!--暂无优惠券-->
 	<view v-if="couponsList.length == 0 && page > 1" class="no-data-box" >
-		<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png" mode="aspectFit"></image>
+		<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" mode="aspectFit"></image>
 		<view class="empty-title">暂无数据</view>
 	</view>
   </view>

+ 711 - 598
pages_company/order/productDetails.vue

@@ -1,18 +1,12 @@
 <template>
 	<view class="content">
+
 		<!-- 商品轮播图片 -->
 		<view class="shop-banner" @click="showImg()">
-			<swiper
-				class="swiper" 
-				:indicator-dots="false" 
-				:circular="true" 
-				:autoplay="true" 
-				:interval="3000" 
-				:duration="1000"
-				indicator-color="rgba(255, 255, 255, 0.6)"
-				indicator-active-color="#ffffff"
+			<swiper class="swiper" :indicator-dots="false" :circular="true" :autoplay="true" :interval="3000"
+				:duration="1000" indicator-color="rgba(255, 255, 255, 0.6)" indicator-active-color="#ffffff"
 				@change="swiperChange">
-				<swiper-item  class="swiper-item" v-for="(item,index) in  banner" :key="index">
+				<swiper-item class="swiper-item" v-for="(item,index) in  banner" :key="index">
 					<image :src="item" mode="aspectFill"></image>
 				</swiper-item>
 			</swiper>
@@ -27,32 +21,34 @@
 				<view class="price">
 					<text class="label">会员价</text>
 					<text class="unit">¥</text>
-					<text class="num" >{{product.price}}</text>
+					<text class="num">{{product.price}}</text>
 					<text class="label">零售价</text>
-					<text class="old" >¥{{product.otPrice}}</text>
+					<text class="old">¥{{product.otPrice}}</text>
 				</view>
 			</view>
+			
 			<view class="name-box">
-				<view class="tag">{{utils.getDictLabelName("storeProductType",product.productType)}}</view>{{product.productName}}
+				<!-- <view class="tag">{{utils.getDictLabelName("storeProductType",product.productType)}}</view> -->
+				{{product.productName}}
 			</view>
 			<view class="intro">
 				{{product.productInfo}}
 			</view>
-			<view class="safe-box">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/safe.png" mode=""></image>
+			<!-- <view class="safe-box">
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/safe.png" mode=""></image>
 				<text class="text">免邮发货</text>
 				<view class="line"></view>
 				<text class="text">药师服务</text>
 				<view class="line"></view>
 				<text class="text">隐私保护</text>
-			</view>
+			</view> -->
 		</view>
 		<!-- 购买人数、库存 -->
 		<view class="inventor">
 			<view class="left">
 				<!-- <view class="head-box">
 					<view class="head" v-for="(item,j) in 5" :key="j">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/head.jpg" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/head.jpg" mode=""></image>
 					</view>
 				</view> -->
 				<view class="num-box">
@@ -68,7 +64,7 @@
 		</view>
 		<!-- 功效 -->
 		<!-- <view class="effect">
-			<view class="label">品说明书</view>
+			<view class="label">品说明书</view>
 			<view class="label">查看</view>
 			
 		</view> -->
@@ -76,24 +72,27 @@
 		<view class="det-box">
 			<view class="title">图文详情</view>
 			<view class="inner">
-				<view  v-html="product.description" style="font-size:0"></view>
+				<view v-html="product.description" style="font-size:0"></view>
 			</view>
 		</view>
 		<!-- 底部按钮 -->
 		<view class="btn-foot">
 			<view class="menu-box">
 				<view class="item" @click="goHome">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/back_home.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/back_home.png"
+						mode=""></image>
 					<text class="label">首页</text>
 				</view>
 				<view class="item" style="position: relative;">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/consult_small.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/consult_small.png"
+						mode=""></image>
 					<text class="label">咨询</text>
 					<button class="contact-btn" open-type="contact"></button>
 				</view>
 				<view class="item" @click="navgetTo('./cart')">
 					<uni-badge size="small" :text="cartCount" absolute="rightTop" type="error">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/cart36.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/cart36.png"
+							mode=""></image>
 					</uni-badge>
 					<text class="label">购物车</text>
 				</view>
@@ -103,13 +102,15 @@
 				<!-- <view class="btn buy" @click="addCart('buy')">{{buyText}}</view> -->
 			</view>
 		</view>
-		<!-- 选择品规格弹窗 -->
-		<popupBottom ref="popup" :visible.sync="specVisible" title=" "  radius="32"  maxHeight="1024">
-		    <view class="product-spec">
+		<!-- 选择品规格弹窗 -->
+		<popupBottom ref="popup" :visible.sync="specVisible" title=" " radius="32" maxHeight="1024">
+			<view class="product-spec">
 				<!-- 商品信息 -->
 				<view class="pro-info">
 					<view class="img-box">
-						<image :src="productValueSelect.image==null||productValueSelect.image==''?product.image:productValueSelect.image" mode="aspectFill"></image>
+						<image
+							:src="productValueSelect.image==null||productValueSelect.image==''?product.image:productValueSelect.image"
+							mode="aspectFill"></image>
 					</view>
 					<view class="info-text">
 						<view class="price">
@@ -127,11 +128,8 @@
 					<view v-for="(item,index) in attrs" :key="index">
 						<view class="title">{{item.attrName}}</view>
 						<view class="spec-list">
-							<view 
-								v-for="(subItem,subindex) in item.values" 
-								:key="subindex" 
-								:class="subindex==item.index?'item active':'item'" 
-								@click="choseSpec(index,subindex)">
+							<view v-for="(subItem,subindex) in item.values" :key="subindex"
+								:class="subindex==item.index?'item active':'item'" @click="choseSpec(index,subindex)">
 								{{ subItem }}
 							</view>
 						</view>
@@ -142,52 +140,65 @@
 					<view class="label">数量</view>
 					<view class="num-box">
 						<view class="img-box" @click="lessNum()">
-							<image v-if="specNum <= 1" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian.png" mode=""></image>
-							<image v-else src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/jian2.png" mode=""></image>
+							<image v-if="specNum <= 1"
+								src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian.png"
+								mode=""></image>
+							<image v-else
+								src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/jian2.png"
+								mode=""></image>
 						</view>
-						<input type="text" @change="changeNum" v-model="specNum"    />
+						<input type="text" @change="changeNum" v-model="specNum" />
 						<view class="img-box" @click="addNum()">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/add.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/add.png"
+								mode=""></image>
 						</view>
 					</view>
 				</view>
 				<view class="sub-btn" @click="submit">确定</view>
 			</view>
 		</popupBottom>
-	  
+
 		<view class="loadding" v-if="loadding==true">
-	    	<image src="../../static/logo.jpg"></image>
-	    	<text class="text">加载中...</text>
-	    </view>
-	
+			<image src="../../static/logo.png"></image>
+			<text class="text">加载中...</text>
+		</view>
+
 	</view>
 </template>
 
 <script>
-	import {getDicts} from '@/api/index'
-	import {getProductDetails,getCartCount,addCart} from '@/api/product'
+	import {
+		getDicts
+	} from '@/api/index'
+	import {
+		getProductDetails,
+		getCartCount,
+		addCart
+	} from '@/api/product'
 	import popupBottom from '@/components/px-popup-bottom/px-popup-bottom.vue'
 	export default {
 		components: {
-			item:{},
+			item: {},
 			popupBottom
 		},
 		data() {
 			return {
-				buyText:"立即购买",
-				type:null,
-				productValueSelect:{
-					price:0,
+				buyText: "立即购买",
+				type: null,
+				productValueSelect: {
+					price: 0,
 				},
-				banner:[],
-				productId:null,
-				attrs:[],
-				values:[],
-				product:{
-					price:0,
-					otPrice:0,
+				banner: [],
+				productId: null,
+				companyId:null,
+				companyUserId:null,
+				attrs: [],
+				values: [],
+				product: {
+					price: 0,
+					otPrice: 0,
 				},
-				 
+
 				// 当前轮播的图片
 				activeBanner: 1,
 				// 购物车数量
@@ -196,68 +207,90 @@
 				specVisible: false,
 				// 规格数量
 				specNum: 1,
-				loadding:true,
+				loadding: true,
 			};
 		},
 		onLoad(options) {
+			console.log("options>>",options)
 			this.getDicts();
-			this.productId = options.productId;
-			if(this.utils.checkToken()){
+			this.productId = options.productId||'';
+			this.companyId = options.companyId||'';
+			this.companyUserId = options.companyUserId||'';
+			if (this.utils.checkToken()) {
 				this.getCartCount();
 			}
 		},
 		onShow() {
 			this.getProductDetails();
+		},//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.product.productName,
+				path: `/pages_company/order/productDetails?productId=${this.productId}`+"&companyId="+this.companyId+"&companyUserId="+this.companyUserId,
+				imageUrl: this.product.image //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.product.productName,
+				query:'productId='+this.productId+"&companyId="+this.companyId+"&companyUserId="+this.companyUserId,//页面参数
+				imageUrl: this.product.image //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
 		},
-		 
+
 		methods: {
-			getDicts:function(){
+			getDicts: function() {
 				getDicts().then(
 					res => {
-						if(res.code==200){
-							uni.setStorageSync('dicts',JSON.stringify(res));
-						} 
-						 
+						if (res.code == 200) {
+							uni.setStorageSync('dicts', JSON.stringify(res));
+						}
+
 					},
 					rej => {}
 				);
 			},
 			showImg() {
-				 //预览图片
-				 uni.previewImage({
-				 	urls: this.banner,
-				 	current: this.banner[0]
-				 });
+				//预览图片
+				uni.previewImage({
+					urls: this.banner,
+					current: this.banner[0]
+				});
 			},
-			doAddCart(type){
-				if(this.specNum==0){
+			doAddCart(type) {
+				if (this.specNum == 0) {
 					uni.showToast({
-						icon:'none',
+						icon: 'none',
 						title: "库存不足",
 					});
 					return;
 				}
-				var isBuy=type=="buy"?1:0;
-				let data = {isBuy:isBuy,cartNum:this.specNum,productId:this.productValueSelect.productId,attrValueId:this.productValueSelect.id};
+				var isBuy = type == "buy" ? 1 : 0;
+				let data = {
+					isBuy: isBuy,
+					cartNum: this.specNum,
+					productId: this.productValueSelect.productId,
+					attrValueId: this.productValueSelect.id
+				};
 				addCart(data).then(
 					res => {
-						if(res.code==200){
-							if(type=="buy"){
+						if (res.code == 200) {
+							if (type == "buy") {
 								uni.navigateTo({
-									url: '/pages/shopping/confirmOrder?type='+this.type+"&cartIds="+res.id
+									url: '/pages/shopping/confirmOrder?type=' + this.type + "&cartIds=" + res
+										.id
 								})
-							}
-							else
-							{
+							} else {
 								this.getCartCount()
 								uni.showToast({
-									icon:'success',
+									icon: 'success',
 									title: "添加成功",
 								});
 							}
-						}else{
+						} else {
 							uni.showToast({
-								icon:'none',
+								icon: 'none',
 								title: res.msg,
 							});
 							this.getProductDetails()
@@ -266,62 +299,64 @@
 					rej => {}
 				);
 			},
-			getProductDetails(){
-				let data = {productId:this.productId};
+			getProductDetails() {
+				let data = {
+					productId: this.productId
+				};
 				//uni.showLoading({title:""});
 				getProductDetails(data).then(res => {
-					    this.loadding=false
-						if(res.code==200){
-							this.product=res.product;
-							if(this.product.productType==1){
-								this.buyText="立即购买"
-							}
-							else if(this.product.productType==2){
-								this.buyText="提交需求"
-							}
-							this.product.otPrice=this.product.otPrice.toFixed(2);
-							this.product.price=this.product.price.toFixed(2);
-							if(this.product.sliderImage!=null){
-								this.banner=this.product.sliderImage.split(',');
+						this.loadding = false
+						if (res.code == 200) {
+							this.product = res.product;
+							if (this.product.productType == 1) {
+								this.buyText = "立即购买"
+							} else if (this.product.productType == 2) {
+								this.buyText = "提交需求"
 							}
-							else{
-								this.banner=[]
+							this.product.otPrice = this.product.otPrice.toFixed(2);
+							this.product.price = this.product.price.toFixed(2);
+							if (this.product.sliderImage != null) {
+								this.banner = this.product.sliderImage.split(',');
+							} else {
+								this.banner = []
 							}
-							this.attrs=res.productAttr;
-							this.attrs.forEach((item,index,arr)=>{
-							     item.values=item.attrValues.split(',');
-								 item.index=0
+							this.attrs = res.productAttr;
+							this.attrs.forEach((item, index, arr) => {
+								item.values = item.attrValues.split(',');
+								item.index = 0
 							})
-							this.values=res.productValues;
-							this.choseSpec(0,0)
-							 
-						}else{
+							this.values = res.productValues;
+							this.choseSpec(0, 0)
+
+						} else {
 							uni.showToast({
-								icon:'none',
+								icon: 'none',
 								title: res.msg,
 							});
-							setTimeout(function(){
+							setTimeout(function() {
 								uni.reLaunch({
 									url: '/pages/home/index',
 								})
-							},2000)
-							
+							}, 2000)
+
 						}
 					},
 					rej => {}
 				);
 			},
-			getCartCount(){
-				let data = {productId:this.productId};
+			getCartCount() {
+				let data = {
+					productId: this.productId
+				};
 				getCartCount(data).then(
 					cartRes => {
-						if(cartRes.code==200){
-							 this.cartCount=cartRes.data;
+						if (cartRes.code == 200) {
+							this.cartCount = cartRes.data;
 						}
 					},
 					rej => {}
 				);
-				
+
 			},
 			// swiper变化事件
 			swiperChange(event) {
@@ -336,7 +371,7 @@
 			// 跳转页面
 			navgetTo(url) {
 				this.utils.isLogin().then(res => {
-					if(res){
+					if (res) {
 						uni.navigateTo({
 							url: url
 						})
@@ -346,611 +381,689 @@
 			// 加入购物车
 			addCart(type) {
 				this.utils.isLogin().then(res => {
-					if(res){
-						this.type=type;
+					if (res) {
+						this.type = type;
 						this.specVisible = true
 					}
 				})
 			},
 			// 规格选择
-			choseSpec(index,subIndex) {
+			choseSpec(index, subIndex) {
 				this.attrs[index].index = subIndex;
 				this.$forceUpdate();
 				let productAttr = this.attrs;
 				let values = [];
 				for (let i = 0; i < productAttr.length; i++) {
-				  for (let j = 0; j < productAttr[i].values.length; j++) {
-				    if (productAttr[i].index === j) {
-				      values.push(productAttr[i].values[j]);
-				    }
-				  }
+					for (let j = 0; j < productAttr[i].values.length; j++) {
+						if (productAttr[i].index === j) {
+							values.push(productAttr[i].values[j]);
+						}
+					}
 				}
-				var selectVal=values.sort().join(",");
+				var selectVal = values.sort().join(",");
 				console.log(selectVal)
-				var valueSelect=this.values.filter((item)=>{
-				     return item.sku==selectVal;
+				var valueSelect = this.values.filter((item) => {
+					return item.sku == selectVal;
 				})
-				if(valueSelect!=null&&valueSelect.length==1){
-					this.productValueSelect=valueSelect[0];
+				if (valueSelect != null && valueSelect.length == 1) {
+					this.productValueSelect = valueSelect[0];
 				}
-				
+
 				this.updateSpecNum();
-				
+
 			},
 			changeNum(e) {
 				this.specNum = e.detail.value.replace(/\D/g, '')
-				if(this.specNum < 1) {
+				if (this.specNum < 1) {
 					this.specNum = 1
 				}
-				if(this.specNum>=this.productValueSelect.stock){
-					this.specNum=this.productValueSelect.stock
+				if (this.specNum >= this.productValueSelect.stock) {
+					this.specNum = this.productValueSelect.stock
 				}
 			},
 			//更新数量
-			updateSpecNum(){
-				if(this.productValueSelect.stock==0){
-					this.specNum=0;
-				}
-				else{
-					this.specNum=1;
+			updateSpecNum() {
+				if (this.productValueSelect.stock == 0) {
+					this.specNum = 0;
+				} else {
+					this.specNum = 1;
 				}
 			},
 			// 数量减法
 			lessNum(index) {
 				this.specNum--
-				if(this.specNum < 1) {
+				if (this.specNum < 1) {
 					this.specNum = 1
 				}
-				if(this.specNum>=this.productValueSelect.stock){
-					this.specNum=this.productValueSelect.stock
+				if (this.specNum >= this.productValueSelect.stock) {
+					this.specNum = this.productValueSelect.stock
 				}
 			},
 			// 数量加法
 			addNum(index) {
 				this.specNum++
-				if(this.specNum>=this.productValueSelect.stock){
-					this.specNum=this.productValueSelect.stock
+				if (this.specNum >= this.productValueSelect.stock) {
+					this.specNum = this.productValueSelect.stock
 				}
 			},
 			// 确定选择该规格
 			submit() {
 				this.specVisible = false
 				this.doAddCart(this.type);
-				 
+
 			}
 		}
 	}
 </script>
 
 <style lang="scss">
-	.shop-banner{
-		height: 756upx;
-		background-color: #FFFFFF;
-		position: relative;
-		.swiper-item{
-			box-sizing: border-box;
-		}
-		.swiper,
-		.swiper-item,
-		.swiper-item image{
-			width: 100%;
-			height: 100%;
-		}
-		.banner-mask{
-			width: 100%;
-			height: 44upx;
-			// background: linear-gradient(0deg, rgba(0, 0, 0, 0.04), rgba(0, 0, 0, 0));
-			// opacity: 0.8;
-			position: absolute;
-			left: 0;
-			bottom: 0;
-			z-index: 9;
-			background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/black_mask.png);
-			background-size: 20upx 44upx;
-			background-repeat: repeat-x;
-		}
-		.num-box{
-			width: 80upx;
-			height: 44upx;
-			line-height: 44upx;
-			text-align: center;
-			font-size: 24upx;
-			font-family: PingFang SC;
-			font-weight: 500;
-			color: #FFFFFF;
-			background: rgba(0, 0, 0, .3);
-			border-radius: 22upx;
-			position: absolute;
-			right: 30upx;
-			bottom: 30upx;
-			z-index: 10;
+	.content {
+
+
+		.shop-banner {
+			height: 756upx;
+			background-color: #FFFFFF;
+			position: relative;
+
+			.swiper-item {
+				box-sizing: border-box;
+			}
+
+			.swiper,
+			.swiper-item,
+			.swiper-item image {
+				width: 100%;
+				height: 100%;
+			}
+
+			.banner-mask {
+				width: 100%;
+				height: 44upx;
+				// background: linear-gradient(0deg, rgba(0, 0, 0, 0.04), rgba(0, 0, 0, 0));
+				// opacity: 0.8;
+				position: absolute;
+				left: 0;
+				bottom: 0;
+				z-index: 9;
+				background-image: url(https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/black_mask.png);
+				background-size: 20upx 44upx;
+				background-repeat: repeat-x;
+			}
+
+			.num-box {
+				width: 80upx;
+				height: 44upx;
+				line-height: 44upx;
+				text-align: center;
+				font-size: 24upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #FFFFFF;
+				background: rgba(0, 0, 0, .3);
+				border-radius: 22upx;
+				position: absolute;
+				right: 30upx;
+				bottom: 30upx;
+				z-index: 10;
+			}
 		}
-	}
-	.det-info{
-		background: #FFFFFF;
-		padding: 36upx 30upx 25upx;
-		.price-box{
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			.price{
+
+		.det-info {
+			position: relative;
+			background: #FFFFFF;
+			padding: 36upx 30upx 25upx;
+
+			
+
+			.price-box {
 				display: flex;
-				align-items: flex-end;
-				.label{
-					color: #333;
-					font-size: 28upx;
-					font-family: PingFang SC;
-					line-height: 1.3;
-					margin-right: 5upx;
-				}
-				.unit{
-					font-size: 28upx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #FF6633;
-					line-height: 1.3;
+				align-items: center;
+				justify-content: space-between;
+
+				.price {
+					display: flex;
+					align-items: flex-end;
+
+					.label {
+						color: #333;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						line-height: 1.3;
+						margin-right: 5upx;
+					}
+
+					.unit {
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #FF6633;
+						line-height: 1.3;
+					}
+
+					.num {
+						font-size: 40upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #FF6633;
+						margin: 0 20upx 0 10upx;
+						line-height: 1;
+					}
+
+					.old {
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						text-decoration: line-through;
+						color: #BBBBBB;
+						line-height: 1.3;
+					}
 				}
-				.num{
-					font-size: 40upx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #FF6633;
-					margin: 0 20upx 0 10upx;
-					line-height: 1;
+
+				.share-box {
+					width: 120upx;
+					height: 46upx;
+					border: 1px solid #2BC7B9;
+					border-radius: 23upx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					position: relative;
+
+					.text {
+						font-size: 26upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #2BC7B9;
+					}
+
+					image {
+						margin-left: 2rpx;
+						width: 25upx;
+						height: 24upx;
+					}
+
+					.share {
+						display: inline-block;
+						position: absolute;
+						top: 0;
+						left: 0;
+						width: 100%;
+						height: 100%rpx;
+						opacity: 0;
+					}
 				}
-				.old{
-					font-size: 28upx;
+
+				.spec {
+					font-size: 24upx;
 					font-family: PingFang SC;
 					font-weight: 500;
-					text-decoration: line-through;
-					color: #BBBBBB;
-					line-height: 1.3;
+					color: #999999;
+					line-height: 36upx;
 				}
 			}
-			.share-box{
-				width: 120upx;
-				height: 46upx;
-				border: 1px solid #2BC7B9;
-				border-radius: 23upx;
-				display: flex;
-				align-items: center;
-				justify-content: center;
-				position: relative;
-				.text{
-					font-size: 26upx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #2BC7B9;
-				}
-				image{
-					margin-left: 2rpx;
-					width: 25upx;
-					height: 24upx;
-				}
-				.share{
+
+			.name-box {
+				font-size: 32upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #111111;
+				line-height: 44upx;
+				margin-top: 32upx;
+
+				.tag {
 					display: inline-block;
-					position: absolute;
-					top: 0;
-					left: 0;
-					width: 100%;
-					height: 100%rpx;
-					opacity: 0;
+					padding: 0 6upx;
+					height: 30upx;
+					background: linear-gradient(90deg, #2BC7B9 0%, #2BC7A4 100%);
+					border-radius: 4upx;
+					margin-right: 10upx;
+					font-size: 22upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #FFFFFF;
+					line-height: 30upx;
+					float: left;
+					margin-top: 7upx;
 				}
 			}
-			.spec{
-				font-size: 24upx;
+
+			.intro {
+				font-size: 26upx;
 				font-family: PingFang SC;
 				font-weight: 500;
 				color: #999999;
 				line-height: 36upx;
+				padding: 18upx 0 23upx;
+				border-bottom: 1px solid #f7f7f7;
 			}
-		}
-		.name-box{
-			font-size: 32upx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			color: #111111;
-			line-height: 44upx;
-			margin-top: 32upx;
-			.tag{
-				display: inline-block;
-				padding: 0 6upx;
-				height: 30upx;
-				background: linear-gradient(90deg, #2BC7B9 0%, #2BC7A4 100%);
-				border-radius: 4upx;
-				margin-right: 10upx;
-				font-size: 22upx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #FFFFFF;
-				line-height: 30upx;
-				float: left;
-				margin-top: 7upx;
-			}
-		}
-		.intro{
-			font-size: 26upx;
-			font-family: PingFang SC;
-			font-weight: 500;
-			color: #999999;
-			line-height: 36upx;
-			padding: 18upx 0 23upx;
-			border-bottom: 1px solid #f7f7f7;
-		}
-		.safe-box{
-			display: flex;
-			align-items: center;
-			padding-top: 24upx;
-			image{
-				width: 20upx;
-				height: 24upx;
-				margin-right: 20upx;
-			}
-			.text{
-				font-size: 22upx;
-				font-family: PingFang SC;
-				font-weight: 500;
-				color: #999999;
-				line-height: 1;
-			}
-			.line{
-				width: 1px;
-				height: 23upx;
-				background: #EDEEEF;
-				margin: 0 20upx;
+
+			.safe-box {
+				display: flex;
+				align-items: center;
+				padding-top: 24upx;
+
+				image {
+					width: 20upx;
+					height: 24upx;
+					margin-right: 20upx;
+				}
+
+				.text {
+					font-size: 22upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					line-height: 1;
+				}
+
+				.line {
+					width: 1px;
+					height: 23upx;
+					background: #EDEEEF;
+					margin: 0 20upx;
+				}
 			}
 		}
-	}
-	.inventor{
-		height: 88upx;
-		padding: 0 39upx 0 30upx;
-		margin-top: 10upx;
-		background: #FFFFFF;
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		.left{
+
+		.inventor {
+			height: 88upx;
+			padding: 0 39upx 0 30upx;
+			margin-top: 10upx;
+			background: #FFFFFF;
 			display: flex;
 			align-items: center;
-			.head-box{
-				margin-right: 27upx;
+			justify-content: space-between;
+
+			.left {
 				display: flex;
 				align-items: center;
-				.head{
-					width: 48upx;
-					height: 48upx;
-					border-radius: 50%;
-					overflow: hidden;
-					box-shadow: 0 0 0 1px #fff;
-					margin-right: -10upx;
-					image{
-						width: 100%;
-						height: 100%;
+
+				.head-box {
+					margin-right: 27upx;
+					display: flex;
+					align-items: center;
+
+					.head {
+						width: 48upx;
+						height: 48upx;
+						border-radius: 50%;
+						overflow: hidden;
+						box-shadow: 0 0 0 1px #fff;
+						margin-right: -10upx;
+
+						image {
+							width: 100%;
+							height: 100%;
+						}
+					}
+				}
+
+				.num-box {
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+
+					.text {
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #999999;
 					}
 				}
 			}
-			.num-box{
+
+			.right {
 				font-size: 24upx;
 				font-family: PingFang SC;
 				font-weight: 500;
 				color: #999999;
-				.text{
+
+				.text {
 					font-size: 24upx;
 					font-family: PingFang SC;
 					font-weight: 500;
-					color: #999999;
+					color: #666666;
 				}
 			}
 		}
-		.right{
-			font-size: 24upx;
+
+		.effect {
+			box-sizing: border-box;
+			padding: 20upx 30upx;
+			background: #FFFFFF;
+			font-size: 28upx;
 			font-family: PingFang SC;
 			font-weight: 500;
-			color: #999999;
-			.text{
-				font-size: 24upx;
+			color: #666666;
+			line-height: 1.8;
+			margin-top: 10upx;
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			justify-content: space-between;
+
+			.label {
+				font-size: 28upx;
 				font-family: PingFang SC;
 				font-weight: 500;
-				color: #666666;
+				color: #111111;
+				line-height: 1.8;
 			}
 		}
-	}
-	.effect{
-		box-sizing: border-box;
-		padding: 20upx 30upx;
-		background: #FFFFFF;
-		font-size: 28upx;
-		font-family: PingFang SC;
-		font-weight: 500;
-		color: #666666;
-		line-height: 1.8;
-		margin-top: 10upx;
-		display: flex; 
-		flex-direction: row;
-		align-items: center;
-		justify-content: space-between;
-		.label{
-			font-size: 28upx;
-			font-family: PingFang SC;
-			font-weight: 500;
-			color: #111111;
-			line-height: 1.8;
-		}
-	}
-	.det-box{
-		margin-top: 10upx;
-		padding: 40upx 30upx 130upx 30upx;
-		background-color: #FFFFFF;
-		.title{
-			font-size: 30upx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			color: #333333;
-			line-height: 1;
-			margin-bottom: 25upx;
+
+		.det-box {
+			margin-top: 10upx;
+			padding: 40upx 30upx 130upx 30upx;
+			background-color: #FFFFFF;
+
+			.title {
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #333333;
+				line-height: 1;
+				margin-bottom: 25upx;
+			}
+
 		}
-		
-	}
-	
-	.btn-foot{
-		box-sizing: border-box;
-		width: 100%;
-		height: 121upx;
-		background: #FFFFFF;
-		padding: 0 32upx 0 28upx;
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		position: fixed;
-		left: 0;
-		bottom: 0;
-		z-index: 99;
-		.menu-box{
+
+		.btn-foot {
+			box-sizing: border-box;
+			width: 100%;
+			height: 121upx;
+			background: #FFFFFF;
+			padding: 0 32upx 0 28upx;
 			display: flex;
 			align-items: center;
-			.item{
+			justify-content: space-between;
+			position: fixed;
+			left: 0;
+			bottom: 0;
+			z-index: 99;
+
+			.menu-box {
 				display: flex;
 				align-items: center;
-				flex-direction: column;
-				margin-right: 48upx;
-				&:last-child{
-					margin-right: 0;
+
+				.item {
+					display: flex;
+					align-items: center;
+					flex-direction: column;
+					margin-right: 48upx;
+
+					&:last-child {
+						margin-right: 0;
+					}
+
+					image {
+						width: 36upx;
+						height: 36upx;
+						margin-bottom: 10upx;
+					}
+
+					.label {
+						font-size: 20upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						text-align: center;
+					}
 				}
-				image{
-					width: 36upx;
-					height: 36upx;
-					margin-bottom: 10upx;
+
+				:deep(.uni-badge--x) {
+					display: flex;
+					align-items: center;
+					justify-content: center;
 				}
-				.label{
-					font-size: 20upx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #666666;
-					text-align: center;
+
+				:deep(.uni-badge) {
+					border: none;
+					background-color: #FF3636;
+					font-family: Roboto;
 				}
 			}
-			:deep(.uni-badge--x){
+
+			.btn-box {
 				display: flex;
 				align-items: center;
-				justify-content: center;
-			}
-			:deep(.uni-badge){
-				border: none;
-				background-color: #FF3636;
-				font-family: Roboto;
-			}
-		}
-		.btn-box{
-			display: flex;
-			align-items: center;
-			.btn{
-				width: 200upx;
-				height: 88upx;
-				line-height: 88upx;
-				text-align: center;
-				border-radius: 44upx;
-				margin-left: 20upx;
-				font-size: 30upx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #FFFFFF;
-				&:first-child{
-					margin-left: 0;
-				}
-				&.cart{
-					background: #FF6633;
-				}
-				&.buy{
-					background: #2BC7B9;
+
+				.btn {
+					width: 200upx;
+					height: 88upx;
+					line-height: 88upx;
+					text-align: center;
+					border-radius: 44upx;
+					margin-left: 20upx;
+					font-size: 30upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #FFFFFF;
+
+					&:first-child {
+						margin-left: 0;
+					}
+
+					&.cart {
+						background: #FF6633;
+					}
+
+					&.buy {
+						background: #2BC7B9;
+					}
 				}
 			}
 		}
-	}
-	.product-spec{
-		.pro-info{
-			display: flex;
-			align-items: center;
-			.img-box{
-				width: 200upx;
-				height: 200upx;
-				background: #FFFFFF;
-				border-radius: 16upx;
-				overflow: hidden;
-				margin-right: 30upx;
-				image{
-					width: 100%;
-					height: 100%;
-				}
-			}
-			.info-text{
-				height: 200upx;
+
+		.product-spec {
+			.pro-info {
 				display: flex;
-				flex-direction: column;
-				justify-content: space-between;
-				.price{
-					display: flex;
-					align-items: flex-end;
-					.unit{
-						font-size: 32upx;
-						font-family: PingFang SC;
-						font-weight: bold;
-						color: #FF6633;
-						line-height: 1.2;
-						margin-right: 10upx;
-					}
-					.num{
-						font-size: 50upx;
-						font-family: PingFang SC;
-						font-weight: bold;
-						color: #FF6633;
-						line-height: 1;
+				align-items: center;
+
+				.img-box {
+					width: 200upx;
+					height: 200upx;
+					background: #FFFFFF;
+					border-radius: 16upx;
+					overflow: hidden;
+					margin-right: 30upx;
+
+					image {
+						width: 100%;
+						height: 100%;
 					}
 				}
-				.desc-box{
+
+				.info-text {
+					height: 200upx;
 					display: flex;
 					flex-direction: column;
-					padding-bottom: 9upx;
-					.text{
-						font-size: 26upx;
-						font-family: PingFang SC;
-						font-weight: 500;
-						color: #999999;
-						margin-top: 27upx;
-						line-height: 1;
-						&:first-child{
-							margin-top: 0;
+					justify-content: space-between;
+
+					.price {
+						display: flex;
+						align-items: flex-end;
+
+						.unit {
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FF6633;
+							line-height: 1.2;
+							margin-right: 10upx;
+						}
+
+						.num {
+							font-size: 50upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FF6633;
+							line-height: 1;
+						}
+					}
+
+					.desc-box {
+						display: flex;
+						flex-direction: column;
+						padding-bottom: 9upx;
+
+						.text {
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							margin-top: 27upx;
+							line-height: 1;
+
+							&:first-child {
+								margin-top: 0;
+							}
 						}
 					}
 				}
 			}
-		}
-		.spec-box{
-			padding-top: 50upx;
-			.title{
-				font-size: 34upx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #111111;
-				line-height: 1;
-			}
-			.spec-list{
-				display: flex;
-				flex-wrap: wrap;
-				margin-top: 30upx;
-				.item{
-					box-sizing: border-box;
-					height: 64upx;
-					padding: 0 30upx;
-					line-height: 64upx;
-					font-size: 28upx;
+
+			.spec-box {
+				padding-top: 50upx;
+
+				.title {
+					font-size: 34upx;
 					font-family: PingFang SC;
-					font-weight: 500;
+					font-weight: bold;
 					color: #111111;
-					background: #F7F7F7;
-					border: 1px solid #F7F7F7;
-					border-radius: 32upx;
-					margin-right: 20upx;
-					margin-bottom: 30upx;
-					&.active{
-						background: #F1FFFE;
-						border: 1px solid #8AD5CE;
-						color: #2BC7B9;
+					line-height: 1;
+				}
+
+				.spec-list {
+					display: flex;
+					flex-wrap: wrap;
+					margin-top: 30upx;
+
+					.item {
+						box-sizing: border-box;
+						height: 64upx;
+						padding: 0 30upx;
+						line-height: 64upx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						background: #F7F7F7;
+						border: 1px solid #F7F7F7;
+						border-radius: 32upx;
+						margin-right: 20upx;
+						margin-bottom: 30upx;
+
+						&.active {
+							background: #F1FFFE;
+							border: 1px solid #8AD5CE;
+							color: #2BC7B9;
+						}
 					}
 				}
 			}
-		}
-		.price-num{
-			display: flex;
-			align-items: center;
-			justify-content: space-between;
-			margin-top: 14upx;
-			.label{
-				font-size: 34upx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #111111;
-			}
-			.num-box{
+
+			.price-num {
 				display: flex;
 				align-items: center;
-				.img-box{
-					width: 60upx;
-					height: 60upx;
-					// border-radius: 4upx;
-					border: 1px solid #dddddd;
+				justify-content: space-between;
+				margin-top: 14upx;
+
+				.label {
+					font-size: 34upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+
+				.num-box {
 					display: flex;
 					align-items: center;
-					justify-content: center;
-					image{
-						width: 25rpx;
-						height: 25rpx;
+
+					.img-box {
+						width: 60upx;
+						height: 60upx;
+						// border-radius: 4upx;
+						border: 1px solid #dddddd;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+
+						image {
+							width: 25rpx;
+							height: 25rpx;
+						}
+					}
+
+					input {
+						width: 60upx;
+						height: 60upx;
+						line-height: 60upx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						// border-radius: 4upx;
+						border-top: 1px solid #dddddd;
+						border-bottom: 1px solid #dddddd;
+						text-align: center;
+						// margin: 0 16upx;
 					}
-				}
-				input{
-					width: 60upx;
-					height: 60upx;
-					line-height: 60upx;
-					font-size: 28upx;
-					font-family: PingFang SC;
-					font-weight: 500;
-					color: #111111;
-					// border-radius: 4upx;
-					border-top: 1px solid #dddddd;
-					border-bottom: 1px solid #dddddd;
-					text-align: center;
-					// margin: 0 16upx;
 				}
 			}
+
+			.sub-btn {
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #FFFFFF;
+				background: #2BC7B9;
+				border-radius: 44upx;
+				margin-top: 30upx;
+				// margin-bottom: 30upx;
+
+			}
 		}
-		.sub-btn{
+
+		.contact-btn {
+			display: inline-block;
+			position: absolute;
+			top: 0;
+			left: 0;
 			width: 100%;
-			height: 88upx;
-			line-height: 88upx;
-			text-align: center;
-			font-size: 30upx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			color: #FFFFFF;
-			background: #2BC7B9;
-			border-radius: 44upx;
-			margin-top: 30upx;
-			// margin-bottom: 30upx;
-			
-		}
-	}
-	.contact-btn{
-		display: inline-block;
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		opacity: 0;
-		z-index: 9999;
-	}
-	
-	.loadding{
-		background-color: #fff;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		z-index: 9999;
-		image{
-			border-radius: 50%;
-			animation: load linear 1s infinite;
-			width: 120rpx;
-			height:120rpx;
+			height: 100%;
+			opacity: 0;
+			z-index: 9999;
 		}
-		.text{
-			font-size: 28rpx;
-			margin-top: 20rpx;
+
+		.loadding {
+			background-color: #fff;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 9999;
+
+			image {
+				border-radius: 50%;
+				animation: load linear 1s infinite;
+				width: 120rpx;
+				height: 120rpx;
+			}
+
+			.text {
+				font-size: 28rpx;
+				margin-top: 20rpx;
+			}
 		}
 	}
-	
-</style>
+</style>

+ 16 - 15
pages_company/order/productList.vue

@@ -4,13 +4,13 @@
 			<!-- 搜索框 -->
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
-					<input type="text" @confirm="goSearch"   :value="form.productName" placeholder="输入品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
+					<input type="text" @confirm="goSearch"   :value="form.productName" placeholder="输入品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 				<view class="icon-search">
-					<image @click="showChange(2)" v-if="showType==1"  src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search1.png" mode=""></image>
-					<image @click="showChange(1)" v-if="showType==2"  src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search2.png" mode=""></image>
-					<image @click="openCart()"   src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/carts.png" mode=""></image>
+					<image @click="showChange(2)" v-if="showType==1"  src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search1.png" mode=""></image>
+					<image @click="showChange(1)" v-if="showType==2"  src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search2.png" mode=""></image>
+					<image @click="openCart()"   src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/carts.png" mode=""></image>
 				</view>
 			</view>
 			<!-- 排序框 -->
@@ -21,19 +21,19 @@
 				<view class="item" @click="searchChange('2')">
 					<text class="label">价格</text>
 					<view class="sort-img">
-						<image v-if="form.priceOrder==null||form.priceOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up.png" mode="" @click="priceUp(true)"></image>
-						<image v-if="form.priceOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up2.png" mode="" @click="priceUp(false)"></image>
-						<image v-if="form.priceOrder==null||form.priceOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down.png" mode="" @click="priceDown(true)"></image>
-						<image v-if="form.priceOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down2.png" mode="" @click="priceDown(false)"></image>
+						<image v-if="form.priceOrder==null||form.priceOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up.png" mode="" @click="priceUp(true)"></image>
+						<image v-if="form.priceOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up2.png" mode="" @click="priceUp(false)"></image>
+						<image v-if="form.priceOrder==null||form.priceOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down.png" mode="" @click="priceDown(true)"></image>
+						<image v-if="form.priceOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down2.png" mode="" @click="priceDown(false)"></image>
 					</view>
 				</view>
 				<view class="item" @click="searchChange('3')">
 					<text class="label">销量</text>
 					<view class="sort-img">
-						<image v-if="form.salesOrder==null||form.salesOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up.png" mode="" @click="saleUp(true)"></image>
-						<image v-if="form.salesOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_up2.png" mode="" @click="saleUp(false)"></image>
-						<image v-if="form.salesOrder==null||form.salesOrder=='asc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down.png" mode="" @click="saleDown(true)"></image>
-						<image v-if="form.salesOrder=='desc'" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/price_arrow_down2.png" mode="" @click="saleDown(false)"></image>
+						<image v-if="form.salesOrder==null||form.salesOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up.png" mode="" @click="saleUp(true)"></image>
+						<image v-if="form.salesOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up2.png" mode="" @click="saleUp(false)"></image>
+						<image v-if="form.salesOrder==null||form.salesOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down.png" mode="" @click="saleDown(true)"></image>
+						<image v-if="form.salesOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down2.png" mode="" @click="saleDown(false)"></image>
 					</view>
 				</view>
 				<view class="item" :class="form.newOrder=='desc'?'active':''" @click="searchChange('4')">
@@ -112,7 +112,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					},
 					textNoMore:"已经到底了",
@@ -238,8 +238,9 @@
 			},
 			// 查看详情
 			showDetail(item) {
+				console.log("在这里",item)
 				uni.navigateTo({
-					url: 'productDetails?productId='+item.productId
+					url: 'productDetails?productId='+item.productId+"&companyId="+item.companyId+"&companyUserId="+item.companyUserId
 				})
 			},
 			openCart() {

+ 7 - 7
pages_company/order/productShowDetails.vue

@@ -39,21 +39,21 @@
 			<view class="intro">
 				{{product.productInfo}}
 			</view>
-			<view class="safe-box">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/safe.png" mode=""></image>
+			<!-- <view class="safe-box">
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/safe.png" mode=""></image>
 				<text class="text">免邮发货</text>
 				<view class="line"></view>
 				<text class="text">药师服务</text>
 				<view class="line"></view>
 				<text class="text">隐私保护</text>
-			</view>
+			</view> -->
 		</view>
 		<!-- 购买人数、库存 -->
 		<view class="inventor">
 			<view class="left">
 				<!-- <view class="head-box">
 					<view class="head" v-for="(item,j) in 5" :key="j">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/head.jpg" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/head.jpg" mode=""></image>
 					</view>
 				</view> -->
 				<view class="num-box">
@@ -69,7 +69,7 @@
 		</view>
 		<!-- 功效 -->
 		<!-- <view class="effect">
-			<view class="label">品说明书</view>
+			<view class="label">品说明书</view>
 			<view class="label">查看</view>
 			
 		</view> -->
@@ -82,7 +82,7 @@
 		</view>
 		
 		<view class="loadding" v-if="loadding==true">
-			<image src="../../static/logo.jpg"></image>
+			<image src="../../static/logo.png"></image>
 			<text class="text">加载中...</text>
 		</view>
 		
@@ -199,7 +199,7 @@
 			left: 0;
 			bottom: 0;
 			z-index: 9;
-			background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/black_mask.png);
+			background-image: url(https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/black_mask.png);
 			background-size: 20upx 44upx;
 			background-repeat: repeat-x;
 		}

+ 450 - 0
pages_company/shareLive.vue

@@ -0,0 +1,450 @@
+<template>
+	<view>
+		<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption"
+			:up="upOption">
+			<view class="live-list">
+				<view v-for="(item,index) in dataList" :key="index" class="item">
+					<view class="bottom-box">
+						<view class="left">
+							<image class="img" v-if="item.liveImgUrl" :src="item.liveImgUrl"></image>
+							<text class="ml30 label">{{item.liveName}}</text>
+						</view>
+						<view class="btn-box">
+							<view class="btn pay" @click.stop="showDetail(item)">
+								分享直播间
+							</view>
+
+							<u-popup :show="show" @close="close">
+								<view class="pop">
+									<!-- 确保这里正确绑定方法 -->
+									<view class="item" @click="generateAndCopyLink(currentItem)">
+										<image class="w72 h72 mr20" src="/static/share_link.png"></image>
+										<text>复制链接</text>
+									</view>
+									<view class="item">
+										<button open-type="share" class="button"
+											:data-item="JSON.stringify(currentItem)" @click="setShareItem(currentItem)">
+											<image class="w72 h72 mr20" :src="imgPath+'/userapp/images/weixin1.png'">
+											</image>
+											<text>分享直播间</text>
+										</button>
+									</view>
+									<view class="cancel" @click="close">取消</view>
+								</view>
+							</u-popup>
+						</view>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {
+		getGotoWxAppLiveLink,
+		liveShareList
+	} from '@/api/living.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+				show: false,
+				userinfo: {},
+				currentShareItem: null,
+				currentItem: null, // 添加当前项存储
+				// searchKey: "",
+				mescroll: null,
+				// 上拉加载的配置
+				upOption: {
+					onScroll: true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon: '/static/images/no_data.png',
+						tip: '暂无数据'
+					}
+				},
+				item: null,
+				companyId: null,
+				companyUserId: null,
+				// 列表数据
+				dataList: [],
+			};
+		},
+		onLoad(options) {
+			console.log("分享直播间options", options)
+			var that = this;
+			// uni.$on('refreshOrder', () => {
+			that.mescroll.resetUpScroll()
+			// })
+			this.companyId = options.companyId;
+			this.companyUserId = options.companyUserId;
+			this.userinfo = JSON.parse(uni.getStorageSync("userInfo"))
+		},
+		computed: {
+			appid() {
+				return this.$store.state.appid
+			},
+			imgPath() {
+				return this.$store.state.imgpath
+			}
+		},
+		onShareAppMessage() {
+			const item = this.currentShareItem || {};
+			console.log("item.liveId", item.liveId)
+			console.log("this.companyUserId", this.companyUserId)
+			return {
+				title: '邀请你来观看直播:' + item.liveName,
+				path: `/pages_course/living?companyId=${this.companyId}&companyUserId=${this.companyUserId}&liveId=${item.liveId}`,
+				// imageUrl: this.products.image,
+				imageUrl: '/static/logo.png',
+				success(res) {
+					console.log("分享成功", res);
+				},
+				fail(err) {
+					console.error("分享失败", err);
+				}
+			};
+		},
+		methods: {
+			async generateAndCopyLink(item) {
+			    console.log("复制链接被点击>>>", item);
+			
+			    if (!item) {
+			        uni.showToast({
+			            title: '请先选择直播项目',
+			            icon: 'none'
+			        });
+			        return;
+			    }
+			
+			    try {
+			        // 等待获取短链接
+			        const shareLink = await this.getGotoWxAppLiveLink(item);
+			        console.log("获取到的分享链接:", shareLink);
+			        
+			        if (!shareLink) {
+			            uni.showToast({
+			                title: '暂无链接',
+			                icon: 'none'
+			            });
+			            return;
+			        }
+			        
+			        // 复制到剪贴板
+			        await this.copyToClipboard(shareLink);
+					this.close()
+			        
+			    } catch (error) {
+			        console.error('获取短链接失败:', error);
+			        uni.showToast({
+			            title: '暂无链接',
+			            icon: 'none'
+			        });
+			    }
+			},
+
+			getGotoWxAppLiveLink(item) {
+			    return new Promise((resolve, reject) => {
+			        if (!this.companyId) {
+			            reject(new Error('companyId 不存在'));
+			            return;
+			        }
+			
+			        if (!item || !item.liveId) {
+			            reject(new Error('直播项目信息不完整'));
+			            return;
+			        }
+			        
+			        const data = {
+			            appid: this.appid,
+			            linkStr: `/pages_course/living?companyId=${this.companyId}&companyUserId=${this.companyUserId}&liveId=${item.liveId}`
+			        }
+			        
+			        console.log("请求短链接参数:", data);
+			        
+			        getGotoWxAppLiveLink(data).then(res => {
+			            console.log("短链接口返回:", res);
+			            if (res.code == 200) {
+			                // 正确使用 resolve 返回数据
+			                resolve(res.data || res.result || res.url || res);
+			            } else {
+			                uni.showToast({
+			                    icon: 'none',
+			                    title: "获取链接失败",
+			                });
+			                reject(new Error('请求失败: ' + (res.message || res.msg || '未知错误')));
+			            }
+			        }).catch(err => {
+			            console.error("获取链接异常:", err);
+			            reject(err);
+			        });
+			    });
+			},
+
+			// 复制到剪贴板
+			copyToClipboard(text) {
+			    return new Promise((resolve, reject) => {
+			        
+			        if (!text) {
+			            uni.showToast({
+			                title: '暂无链接',
+			                icon: 'none'
+			            });
+			            reject(new Error('链接为空'));
+			            return;
+			        }
+			        
+			        uni.setClipboardData({
+			            data: text,
+			            success: () => {
+			                uni.showToast({
+			                    title: '链接已复制',
+			                    icon: 'success'
+			                });
+			                resolve();
+							
+			            },
+			            fail: (err) => {
+			                uni.showToast({
+			                    title: '复制失败',
+			                    icon: 'none'
+			                });
+			                reject(err);
+			            }
+			        });
+			    });
+			},
+
+			close() {
+				this.show = false
+				this.currentItem = null; // 关闭时清空当前项
+			},
+
+			// 记录当前要分享的item
+			setShareItem(item) {
+				console.log("setShareItem接收到的参数:", item);
+
+				// 如果item是字符串,需要解析;如果是对象,直接使用
+				if (typeof item === 'string') {
+					try {
+						this.currentShareItem = JSON.parse(item);
+					} catch (error) {
+						console.error("JSON解析失败:", error);
+						this.currentShareItem = null;
+					}
+				} else if (typeof item === 'object' && item !== null) {
+					// 如果已经是对象,直接赋值
+					this.currentShareItem = item;
+				} else {
+					console.error("setShareItem接收到无效的参数:", item);
+					this.currentShareItem = null;
+				}
+
+				console.log("设置后的currentShareItem:", this.currentShareItem);
+			},
+
+			// goSearch(e) {
+			// 	this.searchKey = e.detail.value;
+			// 	this.mescroll.resetUpScroll()
+			// },
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				if (!this.companyId) return;
+				// var data = {
+				// 	pageNum: page.num,
+				// 	pageSize: page.size,
+				// };
+				liveShareList( page.size, page.num).then(res => {
+					if (res.code == 200) {
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list;
+
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			showDetail(item) {
+				console.log(item)
+				this.currentItem = item; // 存储当前点击的item
+				this.show = !this.show
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.search-cont {
+		padding: 16rpx 30rpx;
+		background-color: #FFFFFF;
+
+		.inner {
+			box-sizing: border-box;
+			width: 100%;
+			height: 72rpx;
+			background: #F7F7F7;
+			border-radius: 36rpx;
+			display: flex;
+			align-items: center;
+			padding: 0 30rpx;
+
+			.icon-search {
+				width: 28rpx;
+				height: 28rpx;
+				margin-right: 20rpx;
+			}
+
+			input {
+				height: 60rpx;
+				line-height: 60rpx;
+				flex: 1;
+			}
+		}
+	}
+
+	.live-list {
+		padding: 20rpx;
+
+		.item {
+			background: #FFFFFF;
+			border-radius: 16rpx;
+			padding: 20rpx 30rpx;
+			margin-bottom: 20rpx;
+
+			.bottom-box {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				.left {
+					display: flex;
+					align-items: center;
+
+					.img {
+						width: 140rpx;
+						height: 140rpx;
+					}
+
+					.label {
+						max-width: 300rpx;
+						font-size: 28rpx;
+						font-weight: 500;
+						color: #999999;
+						line-height: 1;
+					}
+
+
+
+					.price-box {
+						display: flex;
+						align-items: flex-end;
+
+						.unit {
+							font-size: 24rpx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #FF6633;
+							line-height: 1.2;
+							margin-right: 4rpx;
+						}
+
+						.num {
+							font-size: 32rpx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FF6633;
+							line-height: 1;
+						}
+					}
+				}
+
+				.btn-box {
+					box-sizing: border-box;
+					display: flex;
+					align-items: center;
+
+					.btn {
+						font-size: 28rpx;
+						color: #F7F7F7;
+						padding: 12rpx 20rpx;
+						background-color: #2BC7B9;
+						font-weight: 500;
+						border-radius: 15rpx;
+					}
+
+					button {
+						background-color: transparent !important;
+						width: 100% !important;
+						display: flex;
+						justify-content: flex-start;
+						padding: 0;
+						font-size: 30rpx;
+					}
+
+					button:after {
+						border: none !important;
+						border-radius: 10px;
+						box-sizing: border-box;
+					}
+
+
+
+
+					.pop {
+						display: flex;
+						flex-direction: column;
+						background-color: #f1f1f1;
+						padding: 40rpx 30rpx;
+
+						.item {
+							display: flex;
+							align-items: center;
+							padding: 20rpx;
+							font-size: 30rpx;
+						}
+
+						.cancel {
+							width: 100%;
+							height: 100rpx;
+							line-height: 100rpx;
+							text-align: center;
+							background-color: #FFFFFF;
+							border-radius: 50rpx;
+							font-weight: 500;
+							font-size: 34rpx;
+
+						}
+					}
+				}
+			}
+
+		}
+	}
+</style>

+ 4 - 4
pages_company/storeOrder.vue

@@ -2,7 +2,7 @@
 	<view>
 		<view class="search-cont">
 			<view class="inner">
-				<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+				<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 				<input type="text" value="" placeholder="输入订单号" confirm-type="搜索" @confirm="goSearch"   placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 			</view>
 		</view>
@@ -20,7 +20,7 @@
 							</text>
 						</view>
 					</view>
-					<!-- 品列表 -->
+					<!-- 品列表 -->
 					<view class="drug-list"  >
 						<view v-for="(subItem,index) in item.items" :key="index" class="drug-item">
 							<view class="img-box">
@@ -83,7 +83,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					}
 				},
@@ -251,7 +251,7 @@
 						font-family: PingFang SC;
 						font-weight: 500;
 						color: #FFFFFF;
-						background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/recom.png);
+						background-image: url(https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/recom.png);
 						background-repeat: no-repeat;
 						background-size: 100% 100%;
 						margin-right: 8upx;

+ 12 - 12
pages_company/storeOrderDetail.vue

@@ -2,13 +2,13 @@
 	<view>
 		<view class="top-cont">
 			<!-- 背景图片 -->
-			<image class="bg" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/order_top_bg.png" mode=""></image>
+			<image class="bg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/order_top_bg.png" mode=""></image>
 			<view class="top-inner">			
 				<!-- 这里是状态栏 -->
 				<view class="fixed-top-box">
 					<view class="status_bar" :style="{height: statusBarHeight}"></view>
 					<view class="back-box" @click="back">
-						<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/back_white.png" mode=""></image>
+						<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/back_white.png" mode=""></image>
 						<text class="title">订单详情</text>
 						<text></text>
 					</view>
@@ -23,7 +23,7 @@
 					<!-- 待付款 -->
 					<view v-if="order.status == 0" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pag96.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pag96.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">待付款</text>
@@ -33,7 +33,7 @@
 					<!-- 待发货 -->
 					<view v-if="order.status == 1" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/pag96.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/pag96.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">待发货</text>
@@ -43,7 +43,7 @@
 					<!-- 已发货、待收货 -->
 					<view v-if="order.status == 2" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/receipt.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/receipt.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">待收货</text>
@@ -53,7 +53,7 @@
 					<!-- 已完成 -->
 					<view v-if="order.status == 3" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/finish96.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/finish96.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">已完成</text>
@@ -64,7 +64,7 @@
 					<!--交易取消 -->
 					<view v-if="order.status == -3" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close_trade.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close_trade.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">交易关闭</text>
@@ -73,7 +73,7 @@
 					</view>
 					<view v-if="order.status == -1" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close_trade.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close_trade.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">申请售后</text>
@@ -82,7 +82,7 @@
 					</view>
 					<view v-if="order.status == -2" class="inner">
 						<view class="img-box">
-							<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close_trade.png" mode=""></image>
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close_trade.png" mode=""></image>
 						</view>
 						<view class="status-box">
 							<text class="status">退款成功</text>
@@ -93,7 +93,7 @@
 				<!-- 下单人信息 -->
 				<view class="order-placer">
 					<view class="inner">
-						<image class="location" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/location.png" mode=""></image>
+						<image class="location" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/location.png" mode=""></image>
 						<view class="info">
 							<view class="name-phone">
 								<text class="text">{{order.realName}}</text>
@@ -106,7 +106,7 @@
 					</view>
 				</view>
 				<view class="content">
-					<!-- 品列表 -->
+					<!-- 品列表 -->
 					<view class="goods-list">
 						<view   v-if="order.isPackage!=1" v-for="(item,index) in items" :key="index" class="item">
 							<view class="img-box">
@@ -206,7 +206,7 @@
 							<text class="label">电子处方</text>
 							<view class="check-box" @click="showImg()">
 								<text class="text">查看</text>
-								<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/arrow4.png" mode=""></image>
+								<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow4.png" mode=""></image>
 							</view>
 						</view>
 					</view>

+ 5 - 4
pages_company/storeProductPackage.vue

@@ -3,7 +3,7 @@
 		<view class="top-fixed">
 			<view class="search-cont">
 				<view class="inner">
-					<image class="icon-search" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/search.png" mode=""></image>
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
 					<input type="text" @confirm="goSearch"   :value="form.title" placeholder="输入套餐名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
 				</view>
 			</view>
@@ -25,7 +25,7 @@
 					<view class="ordersn-box">
 						<view class="title">{{item.title}}</view>
 					</view>
-					<!-- 品列表 -->
+					<!-- 品列表 -->
 					<view class="drug-list"  >
 						<view v-for="(subItem,subIndex) in item.productList" :key="subIndex" class="drug-item" :class="item.displayMore==0?'hide':'show'">
 							<view class="img-box">
@@ -93,7 +93,7 @@
 					},
 					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
 					empty: {
-						icon:'https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/no_data.png',
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
 						tip: '暂无数据'
 					}
 				},
@@ -178,6 +178,7 @@
 				});
 			},
 			showDetail(item) {
+				console.log("加入",item)
 				uni.navigateTo({
 					url: './storeProductPackageDetails?packageId=' + item.packageId+"&companyId="+this.companyId+"&companyUserId="+this.companyUserId
 				})
@@ -291,7 +292,7 @@
 						font-family: PingFang SC;
 						font-weight: 500;
 						color: #FFFFFF;
-						background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/recom.png);
+						background-image: url(https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/recom.png);
 						background-repeat: no-repeat;
 						background-size: 100% 100%;
 						margin-right: 8upx;

+ 4 - 4
pages_company/storeProductPackageDetails.vue

@@ -80,11 +80,11 @@
 		<view class="btn-foot">
 			<view class="menu-box">
 				<view class="item" @click="goHome">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/back_home.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/back_home.png" mode=""></image>
 					<text class="label">首页</text>
 				</view>
 				<view class="item" style="position: relative;">
-					<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/consult_small.png" mode=""></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/consult_small.png" mode=""></image>
 					<text class="label">咨询</text>
 					<button class="contact-btn" open-type="contact"></button>
 				</view>
@@ -96,7 +96,7 @@
 		</view>
 		<view class="message-box" v-if="messageShow">
 			<view class="left">
-				<image src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/close24.png" mode="" @click="closeOrder()" ></image>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close24.png" mode="" @click="closeOrder()" ></image>
 				<view class="text ellipsis">您有{{count0}}个待支付订单</view>
 			</view>
 			<view class="btn" @click="showOrder()">查看</view>
@@ -284,7 +284,7 @@
 			left: 0;
 			bottom: 0;
 			z-index: 9;
-			background-image: url(https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/black_mask.png);
+			background-image: url(https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/black_mask.png);
 			background-size: 20upx 44upx;
 			background-repeat: repeat-x;
 		}

+ 122 - 0
pages_company/wechatcode.vue

@@ -0,0 +1,122 @@
+<template>
+	<view class="column centerV">
+		<view class="codeimg">
+			<view v-if="wechatImg!=null" class="centerV">
+				<image :src="wechatImg" style="width: 100%;" mode="aspectFit" :show-menu-by-longpress="true" ></image>
+				<view class="centerV">点击保存图片至本地!</view>
+			</view>
+			<view v-else>
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" style="width: 100%;"
+					mode="aspectFill"></image>
+				<view class="centerV">暂无二维码,请点击生成二维码</view>
+			</view>
+		</view>
+		<view class="centerV generate" @click="generatecode" v-if="wechatImg==null">点击生成</view>
+		<view class="centerV generate" @click="saveImage" v-else>保存图片</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getcomapycode,
+		generateComapycode
+	} from '@/api/companyUser'
+	export default {
+		data() {
+			return {
+				wechatImg: null,
+				companyId: ''
+			}
+		},
+		onLoad(option) {
+			this.companyId = option.companyId
+			this.getcomapycodes()
+		},
+		methods: {
+			saveImage() {
+				wx.downloadFile({
+				  url: this.wechatImg, //仅为示例,并非真实的资源
+				  success (res) {
+					  console.log(res)
+				    // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
+				    if (res.statusCode === 200) {
+						wx.saveImageToPhotosAlbum({
+							filePath: res.tempFilePath,
+							success: function(res) {
+								wx.showToast({
+									title: '已保存至相册',
+									icon: 'none',
+									duration: 1000
+								})
+							},
+							fail: function(err) {
+								console.log(err);
+								wx.showToast({
+									title: '保存失败',
+									icon: 'none',
+									duration: 1000
+								})
+							}
+						})
+				      wx.playVoice({
+				        filePath: res.tempFilePath
+				      })
+				    }
+				  }
+				})
+				
+			},
+			generatecode() {
+				const data = {
+					companyId: this.companyId,
+					appId: wx.getAccountInfoSync().miniProgram.appId
+				}
+				generateComapycode(data).then(res => {
+					if (res.code == 200) {
+						this.getcomapycodes()
+						console.log(res)
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg,
+						});
+					}
+				})
+			},
+			getcomapycodes() {
+				const data = {
+					companyId: this.companyId
+				}
+				getcomapycode(data).then(res => {
+					if (res.code == 200) {
+						// 核心js代码:
+						this.wechatImg = res.data
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: res.msg,
+						});
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.codeimg {
+		width: 80%;
+		margin: 40rpx 0;
+	}
+
+	.generate {
+		background-color: #2BC7B9;
+		width: 70%;
+		margin: 0 auto;
+		border-radius: 40rpx;
+		padding: 20rpx 0;
+		color: #fff;
+		margin-top: 30rpx;
+	}
+</style>

+ 101 - 95
pages_course/becomeVIP.vue

@@ -14,7 +14,7 @@
 		<view class="base-bg-orange colorf ptb20 plr40 radius60" 
 		v-if="(userInfos==null||userInfos=='')&&imgname=='乐氏本源'" @click="nato()">授权用户信息</view>
 		<view class="btns" v-else>
-			<button
+			<!-- <button
 				class="author-btn"
 				open-type="getUserInfo"
 				:disabled="userdisabled"
@@ -23,8 +23,8 @@
 				v-else
 				class="author-btn"
 				open-type="getPhoneNumber"
-				@getphonenumber="phoneLogin"  >{{isVip==1?'您已成为会员':'申请成为会员'}}</button>
-			<button class="author-btn" v-if="isVip==1 || isbecomevip==1" @click="handleAgree()">{{viptext}}</button>
+				@getphonenumber="phoneLogin"  >{{isVip==1?'您已成为会员':'申请成为会员'}}</button> -->
+			<button class="author-btn"  @click="handleAgree()">{{viptext}}</button>
 		</view>
 		
 		<!--#endif-->
@@ -86,7 +86,10 @@
 </template>
 
 <script>
-	import { loginByMp,registerCourses,loginByMiniApp,checkUserInfo,editUser} from '@/api/courseLook'
+	import { loginByMp,registerCourses,loginByMiniApp,handleFsUserWx} from '@/api/courseLook'
+	import {
+		getConfigByKey
+	} from "@/api/user.js"
 	export default {
 		data() {
 			return {
@@ -99,7 +102,6 @@
 				tagIds:[],
 				isbecomevip:0,
 				viptext:'申请成为会员',
-				userInfos:null,
 				userlogo:false,
 				userinfos:{
 					nickname:'',
@@ -108,7 +110,8 @@
 				headImg:'',
 				authType:0,//0微信登录 1手机号登录
 				userdisabled:false,
-				projectId:''
+				projectId:'',
+				H5course:{}
 			}
 		},
 		computed: {
@@ -129,21 +132,19 @@
 			},
 		},
 		onLoad(option) {
+			uni.$on('usercode',(data)=>{
+				console.log('huoqu ',data)
+				this.goLogin(data)
+			})
+			uni.$on('vipMsg',(data)=>{
+				console.log('vipMsg ',data)
+				this.viptext=data
+			})
 			console.log(option)
-			// let path = 'https://userapp.fbylive.com'//福本源
-			let path = 'https://userapp.zkhj6.com'//中康
-			// let path = 'https://user.test.ylrztop.com/api'//云融融智
-			// let path = 'https://userapp.ashyisheng.com'//蜂巢快药
-			// let path = 'https://userapp.whhm.ylrzcloud.com/prod-api'//惠名大药房
-			// let path = 'https://userapp.xdtongshuntang.top'//同顺堂
-			// let path = 'https://userapp.liangmiaoedu.com'//良苗
-			// let path = 'https://usercourse.beliyostore.com'//倍力优
-			// let path = 'https://userapp.bainian1000y.cn/prod-api'//百年康城
-			// let path = 'https://userapp.drkzyy.cn/prod-api'//青岛市德瑞康
-			// let path = 'https://companyapp.gjh2024.com/apis'//金康键
+			let path = 'https://userapp.moonxiang.com/prod-api'//存在文化
 			uni.setStorageSync('requestPath',path)
-			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
-				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			if(uni.getStorageSync('userInfo')&&uni.getStorageSync('userInfo')!='{}') {
+				this.userInfo = uni.getStorageSync('userInfo')
 			} else {
 				this.userInfo = {}
 			}
@@ -159,6 +160,11 @@
 			this.companyid = option.companyId || ''
 			this.companyUserId=option.companyUserId || 0
 			this.projectId=option.projectId
+			this.H5course.companyId=option.companyId
+			this.H5course.companyUserId=option.companyUserId
+			this.H5course.projectId=option.projectId
+			uni.setStorageSync('H5course',this.H5course)
+			console.log(this.H5course)
 			//#ifdef MP-WEIXIN
 			// if(this.$store.state.logoname!=='乐氏本源'&&!uni.getStorageSync('userInfos')){
 			// 	this.userlogo=true
@@ -169,14 +175,6 @@
 				})
 				return
 			}
-			// if(this.$store.state.logoname=='乐氏本源'){
-			// 	this.userInfos=uni.getStorageSync('userInfos')
-			// 	if(!uni.getStorageSync('userInfos')){
-			// 		uni.navigateTo({
-			// 			url:'/pages_course/webview'
-			// 		})
-			// 	}
-			// }
 			//#endif
 			if(option.tagids=="null"){
 				this.tagIds=[]
@@ -188,7 +186,7 @@
 				  this.tagIds =arr
 				// console.log(this.tagIds); 
 			}
-			this.isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"
+			// this.isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"
 			this.code = option.code
 				// #ifdef H5
 				if(this.code&&!this.isLogin) {
@@ -198,13 +196,15 @@
 				
 		},
 		onShow() {
-			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
-				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+			this.getWebviewUrl()
+			if(uni.getStorageSync('userInfo')&&uni.getStorageSync('userInfo')!='{}') {
+				this.userInfo = uni.getStorageSync('userInfo')
 			} else {
 				this.userInfo = {}
 			}
 			//#ifdef MP-WEIXIN
-			this.userInfos=uni.getStorageSync('userInfos')
+			this.userinfos=uni.getStorageSync('userInfo')
+			console.log(uni.getStorageSync('userinfos'))
 			let obj=uni.getStorageSync('TOKEN_WEXIN');
 			//#endif
 			// #ifdef H5
@@ -212,68 +212,83 @@
 			// #endif
 			this.isLogin = !!obj;
 			if(this.isLogin&&this.isVip!=1) {
-				this.checkUserInfoA()
+				this.registerCourse()
 			}
 			
 		},
 		methods: {
-			//检查用户昵称以及头像
-			checkUserInfoA(){
-				checkUserInfo().then(res=>{
-					if(res.code==200){
-						this.isLogin = true
-						this.userInfo= res.user
-						uni.setStorageSync('userInfo', JSON.stringify(res.user));
-						this.nameuser
-						if(this.nameuser==''){
-							this.userinfos.nickname=this.userInfo.nickname
-						}
-						this.registerCourse()
-					}else if(res.code==500){
-						if(res.authType==2){
-							uni.setStorageSync('authUrl',res.domain)
-							if(!uni.getStorageSync('userInfos')||uni.getStorageSync('userInfos')=={}){
-								uni.navigateTo({
-									url:'/pages_course/webview'
-								})
-								return
-							}
-							this.editUserA()
+			getWebviewUrl() {
+				var data = {
+					key: 'course.config'
+				}
+					getConfigByKey(data).then(res => {
+						if (res.code == 200) {
+							console.log("getConfigByKey====", JSON.parse(res.data))
+							let data = JSON.parse(res.data,)
+							uni.setStorageSync('setWebviewUrl',data.userCourseAuthDomain)
 						}else{
-							this.userlogo=true
+							uni.showToast({
+								icon:'none',
+								title: res.msg,
+							});
 						}
-					}else{
-						uni.showToast({
-							icon:'none',
-							title:res.msg,
-						});
-					}
-				})
+					})
 			},
-			//修改用户昵称以及头像
-			editUserA(){
-				this.userinfos=uni.getStorageSync('userInfos')?uni.getStorageSync('userInfos'):this.userinfos
-				const data={
-					nickname:this.userinfos.nickname,
-					avatar:this.userinfos.avatar,
+			goLogin(data) {
+				console.log('huoqu111',data)
+				if(data){
+					console.log('huoqu1222',data)
+					uni.showLoading({
+						title: '加载中'
+					})
+					uni.login({
+						provider: "weixin",
+						success: async loginRes => {
+							console.log(loginRes)
+							let code = loginRes.code // 获取开发code
+							handleFsUserWx({
+							   code: code,
+							   appId:this.appid,
+							   userId:data.userId
+							})
+							.then( res => {
+								if(res.code==200){
+									console.log(res)
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "登录成功",
+									});
+									this.userinfos=uni.getStorageSync('userinfos')
+									uni.getStorageSync('TOKEN_WEXIN');
+									this.userInfo=uni.getStorageSync('userInfo');
+									this.isLogin = true
+									setTimeout(()=>{
+										this.registerCourse()
+									},200)
+								}else if(res.code==406){
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: '该用户已成为其他销售会员',
+									});
+								}else{
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							   
+							 })
+						},
+					})
+				}else{
+					uni.navigateTo({
+						url:'/pages_course/webview?H5course='+uni.getStorageSync('H5course')
+					})
 				}
-				editUser(data).then(res=>{
-					if(res.code==200){
-						uni.showToast({
-							icon:'none',
-							title:'修改成功!',
-						});
-						setTimeout(()=>{
-							this.registerCourse()
-						},100)
-					}else{
-						uni.removeStorageSync('userInfos')
-						uni.showToast({
-							icon:'none',
-							title:res.msg+'请重新申请',
-						});
-					}
-				})
+				
 			},
 			shouquan(){
 				if(this.userinfos.nickname==''){
@@ -339,6 +354,7 @@
 						duration: 2000,
 					})
 				}else{
+					this.goLogin()
 					uni.showToast({
 						title: this.viptext,
 						icon: 'none',
@@ -525,17 +541,7 @@
 			},
 			getWechatCode() {
 				if (this.isWechat) {
-					// let appid = "wx961fadab9bcb792b"; //微信APPid(福本源)
-					// let appid = "wx93ce67750e3cfba3"; //微信APPid(云联融智)
-					// let appid = "wxea1da2b708ab3c2f"; //微信APPid(蜂巢快药)
-					// let appid = "wx3de90a39feb8107a"; //微信APPid(中康看课)
-					// let appid = "wxec49f9d783abf233"; //微信APPid(惠名大药房)
-					// let appid = "wx5a0f7e1932e2689e"; //微信APPid(同顺堂)
-					// let appid = "wxe0b82a0018449a62"; //微信APPid(良苗)
-					// let appid = "wx568ea6b70350c585"; //微信APPid(倍力优)
 					let appid = "wx0d021524695f1943"; //微信APPid(百年康城)
-					// let appid = "wx090c5f399d65456e"; //微信APPid(青岛市德瑞康)
-					// let appid = "wx52298c1781d5cc99"; //微信APPid(金慷建)
 					let code = this.getUrlCode().code; //是否存在code
 					let local = window.location.href;
 					if (code == null || code === "") {

+ 106 - 0
pages_course/components/ThreeItemSwiper.vue

@@ -0,0 +1,106 @@
+<template>
+	<view class="custom-swiper-wrapper">
+		<swiper class="custom-swiper" :current="activeIndex" @change="onSwiperChange" circular :duration="300"
+			indicator-dots="false" autoplay="false" display-multiple-items="1" :previous-margin="outerMargin"
+			:next-margin="outerMargin" indicator-color="rgba(255, 255, 255, 0.5)" indicator-active-color="#FFEB66">
+			<swiper-item v-for="(item, index) in (products||[])" :key="index">
+				<view class="item-container">
+					<view class="swiper-item" :class="{ 'swiper-item-active': index === currentCenterIndex }">
+						<image class="item-image" :src="item.imgUrl" mode="aspectFit"></image>
+						<view class="item-text" v-if="index === currentCenterIndex">
+							<view class="text-title">{{ item.prizeLevel }}等奖</view>
+							<view class="text-desc">{{ item.productName }}</view>
+						</view>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			products: {
+				type: Array,
+				default:() => [],
+			}
+		},
+		data() {
+			return {
+				activeIndex: 0, // 初始激活项索引(建议从1开始,避免循环时偏移)
+				outerMargin: '120rpx', // 轮播左右外部间距
+				
+			};
+		},
+		computed: {
+			currentCenterIndex() {
+				if (this.products.length === 0) return 0;
+				return this.activeIndex % this.products.length;
+			}
+		},
+		methods: {
+			onSwiperChange(e) {
+				this.activeIndex = e.detail.current;
+			},
+		},
+	};
+</script>
+
+<style scoped lang="scss">
+	.custom-swiper-wrapper {
+		width: 100%;
+		overflow: hidden;
+	}
+
+	.custom-swiper {
+		width: 100%;
+		height: 500rpx;
+	}
+
+	.item-container {
+		padding: 0 20rpx;
+	}
+
+	.swiper-item {
+		width: 100% !important;
+		height: 348rpx;
+		background: #FFFFFF;
+		box-shadow: 0rpx 12rpx 19rpx 2rpx rgba(219, 73, 22, 0.6);
+		border-radius: 24rpx;
+		border: 4rpx solid #FFCA96;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		box-sizing: border-box;
+		padding: 20rpx 0;
+		transition: all 0.3s ease;
+	}
+
+	.swiper-item-active {
+		transition: all 0.5s ease;
+		height: 420rpx;
+		z-index: 10;
+	}
+
+	.item-image {
+		width: 280rpx;
+		height: 280rpx;
+	}
+
+	.item-text {
+		text-align: center;
+	}
+
+	.text-title {
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #222222;
+		margin: 20rpx 0 10rpx;
+	}
+
+	.text-desc {
+		font-size: 24rpx;
+		color: #757575;
+	}
+</style>

+ 705 - 0
pages_course/components/commentBox.vue

@@ -0,0 +1,705 @@
+<template>
+	<view>
+		<template v-if="openCommentStatus==2">
+			<!-- <text v-for="(item, index) in activeDanmus" :key="item.commentId" class="danmu-item danmuMove"
+				:style="{
+				  top: item.top + 'px',
+				  ...item.style,
+				  'animation-duration': '8s'
+				 }" @animationend="animationend(item,index)">
+				{{ item.content }}
+			</text> -->
+		</template>
+		<view class="container-body" id="msglist" v-if="openCommentStatus==1">
+			<view class="listbox" v-for="(item, index) in msgs" :key="index" :id="'view' + index">
+				<text :class="userId&&item.userId == userId?'list-name my':'list-name'">
+					{{userId&&item.userId == userId ? '我' : item.nickName||'--'}}:
+				</text>
+				<text class="list-con">{{item.content||''}}</text>
+			</view>
+			<view class="empty" v-if="msgs&&msgs.length==0">暂无评论~</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { saveMsg,revokeMsg,getComments} from "@/api/courseAuto.js"
+	export default {
+		props: {
+			height:{
+				type: String,
+				default:'0px'
+			},
+			urlOption:{
+				type: Object,
+				default:{}
+			},
+			time:{
+				type: [String,Number],
+				default: 0
+			},
+			viewCommentNum:{
+				type: [String,Number],
+				default: 200
+			},
+			openCommentStatus:{
+				type: [String,Number],
+				default: 3
+			},
+			//  用户自己开启关闭弹幕展示 1,展示弹幕,0 关闭的弹幕
+			showDanmu:{
+				type: [String,Number],
+				default: 1
+			},
+		},
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				scrollTop: 0,
+				inputText:"",
+				isSocketOpen:false,
+				socket:null,
+				isSend:true,
+				commentList:[],
+				msgs: [],
+				pageNum: 1,
+				pageSize: 10,
+				userInfo: {},
+				userId: '',
+				pingpangTimes:null,
+				// 弹幕
+				danmuList: [],
+				tracks:[],
+				activeDanmus:[],
+				flagTime: 0,
+				danmuItemStyle:{
+					color: '#ffffff',
+					fontSize: '16px',
+					border: 'solid 1px #ffffff',
+					borderRadius: '5px',
+					padding: '2px 2px',
+					backgroundColor: 'rgba(255, 255, 255, 0.1)'
+				},
+				ctx: null,
+				danmuIndex:{}
+			}
+		},
+		mounted() {
+			this.getCommentsFun()
+			this.getUser();
+			this.initTracks()
+			if(!this.socket || !this.isSocketOpen) {
+				this.initSocket()
+			}
+		},
+		methods: {
+			back() {
+				uni.navigateBack()
+			},
+			getUser() {
+				const userInfo = uni.getStorageSync('userInfo');
+				if(userInfo&&JSON.stringify(userInfo)!='{}') {
+					this.userInfo = JSON.parse(userInfo)
+					this.userId = this.userInfo.userId || ''
+				}else {
+					this.userInfo = {}
+					this.userId = ''
+				}
+			},
+			getCommentsFun() {
+				let that = this
+				getComments({
+					pageNum: this.openCommentStatus==2 ? 1 : this.pageNum,
+					pageSize: this.openCommentStatus==2 ? this.viewCommentNum : this.pageSize,
+					courseId: this.urlOption.courseId,
+					videoId: this.urlOption.videoId,
+					openCommentStatus: this.openCommentStatus
+				}).then(res=>{
+					if(res.code==200){
+						if(this.openCommentStatus==2) {
+							this.danmuList = res.data.list.map(item=>({
+								commentId: item.commentId,
+								content: item.content,
+								time: item.time || this.time,
+								color: "#FFFFFF",
+								mode: item.mode || "scroll",
+								top: null,
+								style: {
+									color: item.isColor==1 ? item.color || this.danmuItemStyle.color : this.danmuItemStyle.color,//是否彩色1是0否
+									fontSize: item.fontSize || this.danmuItemStyle.fontSize, 
+									padding: this.danmuItemStyle.padding,
+									border:this.userInfo.userId ==item.userId ? item.color ? `solid 1px ${item.color}`: this.danmuItemStyle.border : 'none',
+									borderRadius: this.userInfo.userId==item.userId ? this.danmuItemStyle.borderRadius : 0,
+									backgroundColor: this.userInfo.userId==item.userId ? this.danmuItemStyle.backgroundColor : 'transparent'
+								},
+							}))
+							this.initDanmuIndex()
+							that.$emit('getMore',0)
+						} else if(this.openCommentStatus==1) {
+							this.danmuList = []
+							this.activeDanmus = []
+							this.danmuIndex = {};
+							let list = res.data.list.reverse()
+							if (that.pageNum == 1) {
+								that.commentList = list; 
+								that.handleScrollBottom();
+							} else {
+								that.commentList = that.commentList.concat(list);
+							}
+							that.msgs = [...list,...that.msgs]
+							if(that.commentList.length >= res.data.total || that.commentList.length >= Number(this.viewCommentNum||200)) {
+								that.$emit('getMore',1)
+							} else {
+								this.pageNum++
+								that.$emit('getMore',0)
+							}
+						} else {
+							that.danmuList = []
+							that.activeDanmus = []
+							that.danmuIndex = {};
+							that.commentList = [];
+							that.msgs = that.msgs;
+							that.$emit('getMore',0);
+						}
+					}
+					else{
+						that.danmuList = []
+						that.danmuIndex = {};
+						that.commentList = [];
+						that.msgs = that.msgs;
+						that.$emit('getMore',0);
+					}
+				})
+			},
+			saveMsg() {
+				if (this.inputText == "" || this.inputText.trim() == "") {
+					uni.showToast({
+						title: '请输入评论',
+						icon: "none"
+					})
+					return;
+				}
+				if (!this.isSend) {
+					return;
+				}
+				const param = {
+					userId: this.userId || '',
+					userType: 2, // 1-管理员,2-用户
+					courseId: this.urlOption.courseId,
+					videoId: this.urlOption.videoId,
+					type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+					content: this.inputText,
+					time: this.time,
+					fontSize: '16px',
+					mode: "scroll",
+					color: "#ffffff",
+				}
+				saveMsg(param).then(res=>{
+					if(res.code == 200) {
+						const status = res.status ? 0 : 1
+						this.sendMsg(param,status);
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: "none"
+						})
+					}
+				})
+			},
+			handleInput(val) {
+				this.inputText = val
+				if(!this.isSocketOpen) {
+					// 重新发起会话
+					this.initSocket('reStart')
+				} else {
+					this.saveMsg();
+				}
+			},
+			handleScrollBottom() {
+				setTimeout(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query.select('#msglist')
+						.boundingClientRect((res) => {
+							if(res) {
+								const scrollH = res.height;
+								this.scrollTop = res.height;
+								this.$emit('getScrollTop',this.scrollTop)
+							}
+						}).exec();
+				},500);
+			},
+			initSocket(type) { 
+				//创建一个socket连接
+				var userId = this.userInfo.userId;
+				var that = this;
+				if (this.socket) {
+					this.socket.close()
+					this.socket = null;
+				}
+				this.socket = uni.connectSocket({
+					url: getApp().globalData.wsDanmuUrl + "/app/webSocket/" + userId,
+					multiple: true,
+					success: res => {
+						console.log('WebSocket连接已打开1!');
+						that.isSocketOpen = true
+						// 保持心跳
+						if(that.pingpangTimes) {
+							clearInterval(that.pingpangTimes)
+							that.pingpangTimes= null
+						}
+						that.pingpangTimes=setInterval(()=>{
+							let data={
+								userId: that.userId || '',
+								userType: 2, // 1-管理员,2-用户
+								courseId: that.urlOption.courseId,
+								videoId: that.urlOption.videoId,
+								type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+								// msg: that.inputText,
+								cmd:'heartbeat'
+							};
+							that.socket.send({
+								data: JSON.stringify(data),
+								success: () => {
+									// console.log('WebSocket发送心条数据!');
+								},
+								fail: () => {
+									that.isSocketOpen=false
+								}
+							});
+						},15000)
+					},
+					error: res => {
+						console.log(res)
+					},
+				})
+				this.socket.onMessage((res) => {
+					console.log("收到消息parse",JSON.parse(res.data))
+					const redata = JSON.parse(res.data);
+					if(redata.cmd=="heartbeat"){
+						  //心跳
+						  // console.log("heartbeat")
+					}else if(redata.cmd=="sendMsg"){
+						that.isSend=true;
+						that.addMsg(redata);
+					}
+				})
+				//监听socket打开
+				this.socket.onOpen(() => {
+					console.log('WebSocket连接已打开2!');
+					that.isSocketOpen = true
+					that.isSend = true;
+					if(type=='reStart') {
+						// 重连的时候重新发消息
+						this.saveMsg()
+					}
+				})
+				//监听socket关闭
+				this.socket.onClose(() => {
+					that.isSocketOpen = false
+					that.socket = null
+					console.log('WebSocket连接已关闭!');
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+				//监听socket错误
+				this.socket.onError((err) => {
+					console.log("socket err:",err)
+					that.isSocketOpen = false
+					that.socket = null
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+			},
+			sendMsg(param,status) {
+				if(status == 1) {
+					this.isSend = true;
+					this.addMsg({msg: param.content,time: param.time},2)
+					return
+				}
+				if (this.isSocketOpen) {
+					var userId = this.userInfo.userId;
+					var data = {
+						userId: this.userId || '',
+						userType: 2, // 1-管理员,2-用户
+						courseId: this.urlOption.courseId,
+						videoId: this.urlOption.videoId,
+						type:1, // 评论类型 1:评论,2:回复,目前没有回复,默认传1就行了
+						msg: param.content,
+						cmd: 'sendMsg',
+						time: param.time,
+						fontSize: '16px',
+						mode: "scroll",
+						color: "#ffffff",
+					};
+					this.socket.send({
+						data: JSON.stringify(data),
+						success: () => {
+							console.log("发送成功")
+							this.isSend = false;
+						},
+						fail: () => {
+							console.log("发送失败")
+						}
+					});
+			
+				}
+			
+			},
+			addMsg(data,type) {
+				let obj  = {}
+				if (type==2) {
+					obj = {
+						content: data.msg,
+						courseId: this.urlOption.courseId,
+						type: 1,
+						userId: this.userId,
+						userType: 2,
+						videoId: this.urlOption.videoId,
+						nickName: '',
+						time: data.time,
+						fontSize: data.fontSize,
+						mode: data.mode,
+						color: data.color,
+					}
+				} else {
+					obj = {
+						content: data.msg,
+						courseId: this.urlOption.courseId,
+						type: data.type,
+						userId: data.userId,
+						userType: data.userType,
+						videoId: this.urlOption.videoId,
+						nickName: data.nickName,
+						time: data.time,
+						fontSize: data.fontSize,
+						mode: data.mode,
+						color: data.color,
+					}
+				}
+				if(this.openCommentStatus == 1){
+					this.msgs.push(obj)
+					this.handleScrollBottom();
+				} else if(this.openCommentStatus == 2) {
+					this.addDanmuMsg(obj)
+				}
+				this.inputText = ""
+				this.$emit("setInputText")
+			},
+			addDanmuMsg(content) {
+				const id = content.userId +'_' + new Date().getTime()
+				const mystyle = {
+					color: content.color || this.danmuItemStyle.color,
+					fontSize: content.fontSize || this.danmuItemStyle.fontSize,
+					border: content.color ? `solid 1px ${content.color}`: this.danmuItemStyle.border,
+					borderRadius: this.danmuItemStyle.borderRadius,
+					padding: this.danmuItemStyle.padding,
+					backgroundColor: this.danmuItemStyle.backgroundColor
+				}
+				const otherstyle = {
+					color: content.color || this.danmuItemStyle.color,
+					fontSize: content.fontSize || this.danmuItemStyle.fontSize,
+					padding: this.danmuItemStyle.padding,
+				}
+				const mode = content.mode || "scroll"
+				const obj = {
+					commentId: content.commentId || id,
+					userId: content.userId,
+					content: content.content,
+					time: this.flagTime + 1,
+					color: content.color || this.danmuItemStyle.color,
+					style: this.userInfo.userId == content.userId ? mystyle : otherstyle,
+					top: null
+				}
+				if(this.showDanmu == 0) return
+
+				// 如果danmuList超过最大大小,移除旧的弹幕
+				const maxDanmuListSize = 10000; // 设置最大大小
+				if (this.danmuList.length >= maxDanmuListSize) {
+					this.danmuList.shift(); // 移除最旧的弹幕
+				}
+				this.danmuList.push(obj);
+			
+				// 更新索引
+				if (!this.danmuIndex[obj.time]) {
+					this.danmuIndex[obj.time] = [];
+				}
+				this.danmuIndex[obj.time].push(obj);
+			},
+			closeWSocket() {
+				if(this.socket!=null){
+					this.socket.close()
+				}
+				if(this.pingpangTimes) {
+					clearInterval(this.pingpangTimes)
+					this.pingpangTimes= null
+				}
+			},
+			initTracks() {
+				this.tracks = [];
+				const trackHeight = 22; // 每行高度
+				const trackCount = 3;
+				for (let i = 0; i < trackCount; i++) {
+					this.tracks.push({
+						top: i * trackHeight + 10,
+						isFree: true,
+						releaseTime: 0 // 轨道释放时间
+					});
+				}
+			},
+			// 获取字体高度
+			getTextWidth(content) {
+				if (!this.ctx) {
+					this.ctx = uni.createCanvasContext('myCanvas')
+				}
+				const metrics = this.ctx.measureText(content)
+				return Math.ceil(metrics.width)
+			},
+			// 分配轨道
+			getFreeTrack(item) {
+				const screenWidth = uni.getSystemInfoSync().screenWidth;
+				const width = this.getTextWidth(item.content);
+				const passWidth = width + screenWidth;
+				const duration = 8; // 持续时间(秒)
+				const currentTime = Date.now();
+			
+				for (let i = 0; i < this.tracks.length; i++) {
+					if (this.tracks[i].isFree || this.tracks[i].releaseTime <= currentTime) {
+						this.tracks[i].isFree = false;
+						this.tracks[i].releaseTime = currentTime + Math.ceil(duration * 1000 / passWidth * width) + 1000;
+						return this.tracks[i].top;
+					}
+				}
+			
+				// 无可用轨道
+				if (this.userInfo.userId && item.userId == this.userInfo.userId) {
+					// console.log("自己发的弹幕");
+					let trackHeight = this.tracks[this.tracks.length - 1].top;
+					return Math.random() * trackHeight + 16; // 自己发的弹幕随机高度
+				} else {
+					// console.log("无可用轨道");
+					return 'abandon';
+				}
+			},
+			// 初始化时建立索引
+			initDanmuIndex() {
+			    this.danmuIndex = {};
+			    this.danmuList.forEach((item) => {
+			        if (!this.danmuIndex[item.time]) {
+			            this.danmuIndex[item.time] = [];
+			        }
+			        this.danmuIndex[item.time].push(item);
+			    });
+			},
+			// 检测并激活弹幕
+			checkDanmu(flagTime) {
+				this.flagTime = flagTime;
+				if(this.showDanmu == 0) return;
+				const newDanmus = this.danmuList.filter((item) => Math.abs(item.time - this.flagTime) < 1);
+				// 分配轨道高度
+				const aliveNewDanmus = newDanmus.map((item) => {
+					if (!item.top) {
+						item.top = this.getFreeTrack(item);
+					}
+					return item;
+				}).filter((item) => item.top !== 'abandon');
+				// 添加到活跃列表
+				this.activeDanmus = [...this.activeDanmus, ...aliveNewDanmus];
+				this.$emit("getActiveDanmus",this.activeDanmus)
+			},
+			animationend(moveItem, i) {
+				// 移除动画结束的弹幕(性能优化)
+				this.activeDanmus = this.activeDanmus.filter((item) => item.commentId !== moveItem.commentId)
+				this.$emit("getActiveDanmus",this.activeDanmus)
+			},
+		},
+		beforeDestroy() {
+			if(this.socket!=null){
+				this.socket.close()
+			}
+			if(this.pingpangTimes) {
+				clearInterval(this.pingpangTimes)
+				this.pingpangTimes= null
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.empty {
+		@include u-flex(row, center, center);
+		padding: 24rpx 50rpx;
+		color: #999999;
+	}
+	.listbox {
+		white-space: pre-wrap;
+		letter-spacing: 1px;
+		margin-bottom: 16rpx;
+	}
+	.list-name {
+		flex-shrink: 0;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 600;
+		font-size: 28rpx;
+		color: #222222;
+		margin-right: 16rpx;
+	}
+	.my {
+		color: #FF5C03;
+	}
+	.list-con {
+		font-family: PingFang SC, PingFang SC;
+		font-size: 28rpx;
+		color: #222222;
+	}
+	.nav-bar {
+		position: fixed;
+		z-index: 9999;
+		top: 0;
+		left: 0;
+		width: 100%;
+		overflow: hidden;
+
+		.nav-bg {
+			width: 100%;
+			height: 100%;
+			position: absolute;
+			left: 0;
+			top: 0;
+			z-index: 1;
+			background-color: #fff;
+		}
+
+		&-box {
+			position: relative;
+			padding: 0 24rpx;
+			@include u-flex(row, center, flex-start);
+			height: 88rpx;
+			box-sizing: border-box;
+			z-index: 3;
+		}
+
+		&-left {
+			width: 100%;
+			@include u-flex(row, center, flex-start);
+			overflow: hidden;
+
+			image {
+				flex-shrink: 0;
+				width: 64rpx;
+				height: 64rpx;
+				border-radius: 12rpx 12rpx 12rpx 12rpx;
+			}
+		}
+
+		&-name {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 28rpx;
+			color: #222222;
+		}
+
+		&-head {
+			flex: 1;
+			overflow: hidden;
+			margin-left: 22rpx;
+			margin-right: 22rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 23rpx;
+			color: #999999;
+		}
+	}
+
+	.page-bg {
+		position: absolute;
+		top: 0;
+		left: 0;
+	}
+
+	.container-body {
+		padding: 32rpx 30rpx;
+		box-sizing: border-box;
+	}
+
+	.TUI-message-list {
+		width: 100%;
+		box-sizing: border-box;
+	}
+	.chatinput {
+		position: fixed;
+		left: 32rpx;
+		right: 32rpx;
+		z-index: 999;
+		bottom: calc(var(--window-bottom) + 24rpx);
+		height: 96rpx;
+		background-color: green;
+		background: #FFFFFF;
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		@include u-flex(row, center, center);
+		padding: 0 24rpx;
+		box-sizing: border-box;
+		.uni-input {
+			flex: 1;
+			margin-right: 32rpx;
+			font-size: 30rpx;
+		}
+	
+		.send {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF !important;
+			flex-shrink: 0;
+			padding: 0 20rpx;
+			height: 72rpx;
+			background: #FF5C03 !important;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	// .danmu-item {
+	// 	position: absolute;
+	// 	top: 0;
+	// 	white-space: nowrap;
+	// 	font-size: 16px;
+	// 	height: 20px;
+	// 	display: inline-flex;
+	// 	box-sizing: border-box;
+	// 	align-items: center;
+	// }
+	// .danmuMove {
+	// 	// animation: mymove 8s linear forwards;
+	// 	// animation-duration: 8s;
+	// 	animation-timing-function: linear;
+	// 	animation-delay: 0s;
+	// 	animation-iteration-count: 1;
+	// 	animation-direction: normal;
+	// 	animation-fill-mode: forwards;
+	// 	animation-play-state: running;
+	// 	animation-name: mymove;
+	// 	will-change: transform;
+	// }
+	
+	// @keyframes mymove {
+	// 	from {
+	// 		transform: translateX(100vw);
+	// 	}
+	
+	// 	to {
+	// 		transform: translateX(-100%);
+	// 	}
+	// }
+</style>

+ 162 - 0
pages_course/components/descInfo.vue

@@ -0,0 +1,162 @@
+<template>
+	<view class="descbox" style="padding-top: 20rpx;">
+		<template v-if="!isLogin||isAddKf!=1">
+			<view class="descbox-title">{{courseInfo.title || ''}}</view>
+			<view class="descbox-info">
+				<!-- <view class="descbox-info-l">
+					<view>{{courseInfo.views}}次播放</view>
+					<view class="descbox-info-time">总时长:{{courseInfo.totalDuration}}</view>
+				</view> -->
+				<view class="descbox-info-r expand" v-if="textHeight > 21">
+					<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+					<image :src="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+					<image :src="imgPath+'/app/image/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+				</view>
+			</view>
+		</template>
+		<view class="descbox-desc" id="descbox-desc" :style="{height: isExpand ? 'auto': '42rpx'}">
+			<text>{{courseInfo.description || ''}}</text>
+			<view :class="isExpand ? 'expand': 'expand expand-ab'" v-if="isLogin&&isAddKf==1&&textHeight > 21">
+				<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+				<image :src="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+				<image :src="imgPath+'/app/image/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isLogin: {
+				type: Boolean,
+				default: false,
+			},
+			isAddKf: {
+				type: [String,Number],
+				default: 0,
+			},
+			courseInfo: {
+				type: Object,
+				default: {},
+			},
+		},
+		computed:{
+			imgPath() {
+			  return this.$store.state.imgpath
+			},
+		},
+		data() {
+			return {
+				// 是否展开
+				isExpand: true,
+				textHeight: 0, //文本高度
+			}
+		},
+		methods: {
+			// 展开简介
+			handleExpand() {
+				this.isExpand = !this.isExpand
+			},
+			getDescHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#descbox-desc")
+						.boundingClientRect((data) => {
+							if(data) {
+								this.textHeight = data.height
+							}
+						})
+						.exec();
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.descbox {
+		padding: 0 32rpx;
+		margin-bottom: 20rpx;
+		background-color: #fff;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222222;
+		line-height: 42rpx;
+		word-break: break-word;
+	
+		&-title {
+			padding: 24rpx 0;
+			font-weight: 500;
+			font-size: 32rpx;
+		}
+	
+		&-info {
+			padding-top: 24rpx;
+			@include u-flex(row, center, space-between);
+			font-size: 26rpx;
+			color: #757575;
+	
+			&-l {
+				flex: 1;
+				@include u-flex(row, center, flex-start);
+			}
+	
+			&-time {
+				margin-left: 18rpx;
+				padding-left: 18rpx;
+				position: relative;
+	
+				&::after {
+					content: "";
+					width: 4rpx;
+					height: 4rpx;
+					background: #999999;
+					border-radius: 50%;
+					position: absolute;
+					left: 0;
+					top: 50%;
+					transform: translateY(-50%);
+				}
+			}
+	
+			&-r {
+				background: transparent;
+			}
+		}
+	
+		&-desc {
+			overflow: hidden;
+			position: relative;
+		}
+	}
+	.expand {
+		flex-shrink: 0;
+		@include u-flex(row, center, flex-end);
+		color: #FF5C03;
+		font-weight: 400;
+		font-size: 24rpx;
+	
+		image {
+			width: 32rpx;
+			height: 32rpx;
+		}
+	}
+	
+	.expand-ab {
+		position: absolute;
+		top: 0;
+		right: 0;
+		box-shadow: -50rpx 0 20rpx 8rpx #FFFFFF;
+		background-color: #fff;
+	}
+	
+</style>

+ 206 - 0
pages_course/components/descInfoNav.vue

@@ -0,0 +1,206 @@
+<template>
+	<view style="background-color: #fff;padding-bottom: 116rpx;">
+		<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>
+		<view class="descbox" style="padding-top: 20rpx;" v-if="courseInfo.title || courseInfo.description">
+			<template v-if="!isLogin||isAddKf!=1">
+				<view class="descbox-title">{{courseInfo.title || ''}}</view>
+				<view class="descbox-info">
+					<!-- <view class="descbox-info-l">
+						<view>{{courseInfo.views}}次播放</view>
+						<view class="descbox-info-time">总时长:{{courseInfo.totalDuration}}</view>
+					</view> -->
+					<view class="descbox-info-r expand" v-if="textHeight > 21">
+						<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+						<image :src="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+						<image :src="imgPath+'/app/image/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+					</view>
+				</view>
+			</template>
+			<view class="descbox-desc" id="descbox-desc" v-if="courseInfo.description" :style="{height: isExpand ? 'auto': '42rpx'}">
+				<text>{{courseInfo.description || ''}}</text>
+				<view :class="isExpand ? 'expand': 'expand expand-ab'" v-if="isLogin&&isAddKf==1&&textHeight > 21">
+					<text @click="handleExpand">{{isExpand ? '收起简介' : '展开简介'}}</text>
+					<image :src="imgPath+'/app/image/course_arrow_up_icon.png'" v-show="isExpand"></image>
+					<image :src="imgPath+'/app/image/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isLogin: {
+				type: Boolean,
+				default: false,
+			},
+			isAddKf: {
+				type: [String,Number],
+				default: 0,
+			},
+			courseInfo: {
+				type: Object,
+				default: {},
+			},
+		},
+		computed:{
+			imgPath() {
+			  return this.$store.state.imgpath
+			},
+		},
+		data() {
+			return {
+				// 是否展开
+				isExpand: true,
+				textHeight: 0, //文本高度
+			}
+		},
+		methods: {
+			// 展开简介
+			handleExpand() {
+				this.isExpand = !this.isExpand
+			},
+			getDescHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#descbox-desc")
+						.boundingClientRect((data) => {
+							if(data){
+								this.textHeight = data.height
+							}
+						})
+						.exec();
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.miantitlebox {
+		padding: 30rpx 32rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #222222;
+	}
+	.subtitlebox {
+		padding: 30rpx 0;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #222222;
+	}
+	.title-content {
+		padding: 0 32rpx;
+		background-color: #fff;
+		font-size: 28rpx;
+		line-height: 1.6;
+	
+		.title {
+			font-size: 36rpx;
+			font-weight: 500;
+			color: #414858;
+		}
+	
+		.time-or-subtitle {
+			margin-top: 12rpx;
+			color: #666666;
+		}
+	}
+	.descbox {
+		padding: 14rpx 32rpx;
+		margin-bottom: 20rpx;
+		background-color: #fff;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222222;
+		line-height: 42rpx;
+		word-break: break-word;
+	
+		&-title {
+			margin-bottom: 24rpx;
+			font-weight: 500;
+			font-size: 32rpx;
+		}
+	
+		&-info {
+			margin-bottom: 24rpx;
+			@include u-flex(row, center, space-between);
+			font-size: 26rpx;
+			color: #757575;
+	
+			&-l {
+				flex: 1;
+				@include u-flex(row, center, flex-start);
+			}
+	
+			&-time {
+				margin-left: 18rpx;
+				padding-left: 18rpx;
+				position: relative;
+	
+				&::after {
+					content: "";
+					width: 4rpx;
+					height: 4rpx;
+					background: #999999;
+					border-radius: 50%;
+					position: absolute;
+					left: 0;
+					top: 50%;
+					transform: translateY(-50%);
+				}
+			}
+	
+			&-r {
+				background: transparent;
+			}
+		}
+	
+		&-desc {
+			overflow: hidden;
+			position: relative;
+		}
+	}
+	.expand {
+		flex-shrink: 0;
+		@include u-flex(row, center, flex-end);
+		color: #FF5C03;
+		font-weight: 400;
+		font-size: 24rpx;
+	
+		image {
+			width: 32rpx;
+			height: 32rpx;
+		}
+	}
+	
+	.expand-ab {
+		position: absolute;
+		top: 0;
+		right: 0;
+		box-shadow: -50rpx 0 20rpx 8rpx #FFFFFF;
+		background-color: #fff;
+	}
+	
+</style>

+ 238 - 0
pages_course/components/like.vue

@@ -0,0 +1,238 @@
+<template>
+	<view class="like-container">
+		<image class="image" @click="handleLike" src="/static/images/like.png" ref="likeBtn"></image>
+		<view v-for="(icon, index) in icons" :key="icon.id" class="animated-icon" :style="{
+        top: icon.top + 'rpx',
+        left: icon.left + 'rpx',  // 补充left属性的单位
+        fontSize: icon.size + 'rpx',
+        color: icon.color,
+        opacity: icon.opacity,
+        transform: 'translateY(' + icon.y + 'rpx) rotate(' + icon.rotate + 'deg)',
+        transition: 'all ' + icon.duration + 'ms ' + icon.delay + 'ms ease-out'
+      }">
+			{{ icon.symbol }}
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'DouyinLike',
+		props: {
+			// 初始点赞数
+			initialCount: {
+				type: Number,
+				default: 0
+			},
+			// 单次点击生成的图标数量
+			iconAmount: {
+				type: Number,
+				default: 6
+			},
+			// 图标颜色集合
+			iconColors: {
+				type: Array,
+				default: () => [
+					'#ff798b', '#ffc54f', '#ffaefb',
+					'#87f37f', '#6eb9ff', '#6d86d6',
+					'#bb7df5', '#eeffc5'
+				]
+			},
+			// 图标大小范围
+			sizeRange: {
+				type: Array,
+				default: () => [40, 78]
+			},
+			// 动画持续时间范围(ms)
+			durationRange: {
+				type: Array,
+				default: () => [700, 1300]
+			},
+			// 上升距离范围(px)
+			riseRange: {
+				type: Array,
+				default: () => [200, 420]
+			},
+			// 左右飘动范围(px)
+			floatRange: {
+				type: Array,
+				default: () => [-50, 50]
+			}
+		},
+		data() {
+			return {
+				// 当前点赞数
+				count: this.initialCount,
+				// 是否已点赞
+				isLiked: false,
+				// 动画图标数组
+				icons: [],
+				// 按钮位置信息
+				btnRect: null,
+				// 可使用的图标集合
+				iconSymbols: ['❤', '★', '', '', '', '✨', '', ''],
+				// 用于生成唯一ID
+				iconId: 0
+			};
+		},
+		mounted() {
+			// 获取按钮位置信息
+			this.getBtnRect();
+		},
+		methods: {
+			/**
+			 * 获取按钮位置信息
+			 */
+			getBtnRect() {
+				const query = uni.createSelectorQuery().in(this);
+				query.select('.image').boundingClientRect(data => {
+					this.btnRect = data;
+				}).exec();
+			},
+
+			/**
+			 * 处理点击事件
+			 */
+			handleLike(e) {
+				// 更新点赞状态
+				this.isLiked = !this.isLiked;
+				this.count += this.isLiked ? 1 : -1;
+				this.$emit('change', {
+					isLiked: this.isLiked,
+					count: this.count
+				});
+
+				// 生成图标动画
+				this.createIcons(e);
+			},
+
+			/**
+			 * 创建多个图标动画
+			 */
+			createIcons(e) {
+				if (!this.btnRect) {
+					this.getBtnRect();
+					return;
+				}
+
+				// 获取点击位置(相对于按钮)
+				const rect = this.btnRect;
+				const x = e.detail.x - rect.left;
+				const y = e.detail.y - rect.top;
+
+				// 生成多个图标,带轻微延迟形成连续效果
+				for (let i = 0; i < this.iconAmount; i++) {
+					this.createIcon(x, y, i * 40);
+				}
+			},
+
+			/**
+			 * 创建单个图标动画
+			 * @param {Number} x 初始X坐标
+			 * @param {Number} y 初始Y坐标
+			 * @param {Number} delay 延迟时间(ms)
+			 */
+			createIcon(x, y, delay) {
+				// 随机属性
+				const size = this.getRandom(...this.sizeRange);
+				const color = this.iconColors[Math.floor(Math.random() * this.iconColors.length)];
+				const duration = this.getRandom(...this.durationRange);
+				const riseDistance = -this.getRandom(...this.riseRange);
+				const floatOffset = this.getRandom(...this.floatRange);
+				const rotate = this.getRandom(-30, 30);
+				// 随机选择一个图标
+				const symbol = this.iconSymbols[Math.floor(Math.random() * this.iconSymbols.length)];
+
+				// 生成唯一ID
+				const iconId = this.iconId++;
+
+				// 创建图标对象
+				const icon = {
+					id: iconId,
+					left: x,
+					top: y,
+					size,
+					color,
+					opacity: 1,
+					y: 0,
+					rotate,
+					duration,
+					delay,
+					symbol
+				};
+
+				// 添加到数组
+				this.icons.push(icon);
+
+				// 触发动画
+				setTimeout(() => {
+					// 使用Vue的$set方法确保响应式更新
+					this.$set(this.icons, this.icons.findIndex(item => item.id === iconId), {
+						...this.icons.find(item => item.id === iconId),
+						y: riseDistance,
+						left: x + floatOffset,
+						opacity: 0
+					});
+				}, delay);
+
+				// 动画结束后移除
+				setTimeout(() => {
+					const index = this.icons.findIndex(item => item.id === iconId);
+					if (index !== -1) {
+						this.icons.splice(index, 1);
+					}
+				}, duration + delay);
+			},
+
+			/**
+			 * 生成范围内的随机数
+			 */
+			getRandom(min, max) {
+				return min + Math.random() * (max - min);
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+
+	.like-icon {
+		font-size: 28rpx;
+		color: #999;
+		transition: all 0.3s ease;
+	}
+
+	/* 动画容器 */
+	.like-container {
+		position: relative;
+		
+		.image {
+			width: 48rpx;
+			height: 48rpx;
+		}
+
+		/* 动画图标样式 */
+		.animated-icon {
+			position: absolute;
+			will-change: transform, opacity, left;
+			text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.2);
+			z-index: 10;
+			animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
+		}
+
+		/* 点赞按钮动画 */
+		@keyframes pulse {
+			0% {
+				transform: scale(1);
+			}
+
+			50% {
+				transform: scale(1.4);
+			}
+
+			100% {
+				transform: scale(1);
+			}
+		}
+	}
+</style>

+ 146 - 0
pages_course/components/ques.vue

@@ -0,0 +1,146 @@
+<template>
+	<view class="ques-content" :style="{ fontSize: fontSize(28)}">
+		<view class="ques-content-tit" :style="{ fontSize: fontSize(36)}" v-show="openCommentStatus!=1">问答题</view>
+		<view v-for="(item,index) in quesList" :key="index">
+			<view class="ques-title" :style="{ fontSize: fontSize(32)}">
+				<text>{{index + 1}}.</text>
+				<view class="ques-type" :style="{ fontSize: fontSize(24)}" v-show="item.type == 1 || item.type == 2">
+					{{item.type == 1 ? '单选' : item.type == 2 ? '多选' : ''}}
+				</view>
+				<text>{{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,index)">
+				<view>
+					{{numberToLetter(idx)}}.
+				</view>
+				<view>{{option.name}}</view>
+			</view>
+		</view>
+		<view class="empty" v-if="quesList&&quesList.length==0">暂未设置题目~</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: ['quesList','openCommentStatus'],
+		data() {
+			return {
+				
+			}
+		},
+		computed: {
+			fontSize() {
+				return size=>{
+					const value = uni.upx2px(size)
+					const scale = uni.getStorageSync('fontScale') || 1;
+					if(scale<1){
+						return value + 'px';
+					}else {
+						return value * scale + 'px';
+					}
+				}
+			},
+			isAnswer() {
+				return (item, name) => {
+					if (item.type == 1) {
+						return item.answer == name
+					} else if (item.type == 2) {
+						const array = item.answer.split(',')
+						return array.some(i => i == name)
+					} else {
+						return false
+					}
+				}
+			}
+		},
+		methods: {
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			handleAnswer(item, option,index) {
+				const param = {
+					item,
+					option,
+					index
+				}
+				this.$emit("handleAnswer", param)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.empty {
+		@include u-flex(row, center, center);
+		padding: 24rpx 50rpx;
+		color: #999999;
+	}
+	.ques-content {
+		background-color: #fff;
+		padding: 24rpx 32rpx 24rpx 32rpx;
+		box-sizing: border-box;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222222;
+	}
+
+	.ques-content-tit {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 600;
+		font-size: 36rpx;
+		color: #222222;
+	}
+
+	.ques-title {
+		margin: 48rpx 0 34rpx 0;
+		font-weight: 500;
+		font-size: 32rpx;
+		white-space: normal;
+	}
+
+	.ques-type {
+		flex-shrink: 0;
+		min-width: 72rpx;
+		min-height: 40rpx;
+		padding: 0 12rpx;
+		margin: 0 12rpx;
+		box-sizing: border-box;
+		background: #FF5C03;
+		border-radius: 8rpx 8rpx 8rpx 8rpx;
+		line-height: 40rpx;
+		text-align: center;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #FFFFFF;
+		display: inline-block;
+	}
+
+	.ques-option {
+		min-height: 88rpx;
+		padding: 24rpx 32rpx;
+		box-sizing: border-box;
+		margin-bottom: 24rpx;
+		background: #F5F7FA;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		display: flex;
+		align-items: center;
+
+		&-active {
+			color: #FF5C03 !important;
+			background: #FCF0E7 !important;
+		}
+	}
+</style>

+ 60 - 66
pages_manage/learn.vue → pages_course/learn.vue

@@ -1,64 +1,31 @@
 <template>
 	<view class="container">
 		<view class="top">
-			<image class="bg" src="/static/assets/learn-bg.png" mode="widthFix"></image>
+			<image class="bg " style="height: 600rpx;" :src="learncourse.imgUrl" mode="scaleToFill"></image>
 			<view class="top-box">
-				<view class="title">《健康生活方式指导》</view>
+				<view class="title">{{learncourse.courseName}}</view>
 				<view class="txt">
-					<image src="/static/assets/learn1.png"></image>
-					<text>共5节课</text>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/learn1.png"></image>
+					<text>共{{learnList.length}}节课</text>
 				</view>
 			</view>
 		</view>
 		<view class="container-body">
-			<!-- <view class="center-box">
-				<u-tabs lineColor="#f56c6c" :scrollable="false"
-					:activeStyle="{color: '#fd694f',fontWeight: 'bold',fontSize:'34rpx'}"
-					:inactiveStyle="{color: '#787878',fontSize:'34rpx'}" :list="tabList" @click="ontabList">
-				</u-tabs>
-				<view class="progress-box">
-					<image src="/static/assets/learn2.png"></image>
-					<text class="title">听课进度</text>
-					<text class="txt">已学习<text style="color: #f74d3a;">0</text>/5节课</text>
-				</view>
-				<view class="progress">
-					<u-line-progress inactiveColor="#f0f4f7" activeColor="#3c9cff" :percentage="0"
-						:showText="false"></u-line-progress>
-					<text>0%</text>
-				</view>
-			</view> -->
-
-			<!-- <view class="list">
-				<view class="img-box">
-					<view class="sub">第一课</view>
-					<image src="/static/assets/learn-img.png"></image>
-				</view>
-				<view class="right">
-					<view class="title">第一课 如何防控烦人的慢性病</view>
-					<view class="bottom">
-						<view class="tip">
-							<image src="/static/assets/learn3.png" mode="widthFix"></image>
-							<text>答题送金币+200</text>
-						</view>
-						<view class="btn">已学习4%</view>
-					</view>
-				</view>
-			</view> -->
 
 			<view class="list" v-for="(item,index) in learnList" :key="index">
 				<view class="img-box">
-					<view class="sub">第课</view>
-					<image :src="item.videoImgUrl || '/static/assets/no-img.png'"></image>
+					<view class="sub">第{{index+1}}课</view>
+					<image :src="item.videoImgUrl || 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no-img.png'" mode="aspectFill"></image>
 				</view>
 				<view class="right">
 					<view class="title">{{item.title}}</view>
 					<view class="bottom">
-						<view class="tip">
-							<image src="/static/assets/learn3.png" mode="widthFix"></image>
+						<!-- <view class="tip">
+							<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/learn3.png" mode="widthFix"></image>
 							<text>答题送金币+200</text>
-						</view>
-						<view @click="goLive(item)" class="btn" v-if="item.stauts==0">已学习4%</view>
-						<view @click="goLive(item)" class="btn-red" v-else>去学习</view>
+						</view> -->
+						<!-- <view @click="goLive(item)" class="btn" v-if="item.stauts==0">已学习4%</view> -->
+						<view @click="goLive(item)" class="btn-red">去学习</view>
 					</view>
 				</view>
 			</view>
@@ -69,7 +36,8 @@
 <script>
 	import { compile } from "vue";
 import {
-		courseList
+		courseList,
+		courseListB
 	} from '@/api/class.js'
 	
 	export default {
@@ -81,7 +49,9 @@ import {
 				}, {
 					name: '课程目录'
 				}],
-				learnList: []
+				learnList: [],
+				learncourse:{},
+				type:null,
 			}
 		},
 		computed: {
@@ -90,18 +60,56 @@ import {
 		onLoad(options) {
 			// 接收传递的课程 ID
 			if (options.courseId) {
+				console.log(options.courseId)
 				this.courseId = options.courseId;
+				if(options.type==1){
+					this.getCourseList()
+				}else{
+					this.getCourseListb()
+				}
 			}
+			
 		},
 		mounted() {
-			this.getCourseList()
 		},
 		methods: {
 			goLive(item) {
 				console.log("id",item)
 				const id=item.videoId
+				const videoitem = {
+					videoId:item.videoId,
+					courseId:this.courseId
+				}
 				uni.navigateTo({
-					url: '/pages_course/videovip?videoitem='+JSON.stringify(item)
+					url: '/pages_course/video?videoitem='+JSON.stringify(videoitem)
+					// url: '/pages_course/video'
+				})
+			},
+			getCourseListb() {
+				//私域看课
+				courseListB().then(res => {
+					console.log("课程列表", res)
+					if (res.code == 200) {
+						// 1. 根据 courseId 找到对应的课程
+						const course = res.data.find(item => item.courseId == this.courseId);
+						if (course && course.fsUserCourseVideoList) {
+							// 2. 映射数据到 learnList 格式
+							this.learncourse=course
+							this.learnList = course.fsUserCourseVideoList
+							console.log("learnList是多少》》", this.learnList)
+							console.log("learnList是多少", this.learncourse)
+							
+						} else {
+							console.warn("未找到课程或视频列表");
+							this.learnList = [];
+						}
+					} else {
+						uni.hideLoading();
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
 				})
 			},
 			getCourseList() {
@@ -112,8 +120,11 @@ import {
 						const course = res.data.find(item => item.courseId == this.courseId);
 						if (course && course.fsUserCourseVideoList) {
 							// 2. 映射数据到 learnList 格式
+							this.learncourse=course
 							this.learnList = course.fsUserCourseVideoList
 							console.log("learnList是多少》》", this.learnList)
+							console.log("learnList是多少", this.learncourse)
+							
 						} else {
 							console.warn("未找到课程或视频列表");
 							this.learnList = [];
@@ -127,23 +138,6 @@ import {
 					}
 				})
 			}
-			// getCourseDetails() {
-			// 	var data={
-			// 		courseId:courseId
-			// 	}
-			// 	courseDetails(data).then(res => {
-			// 		console.log("课程详情", res)
-			// 		if (res.code == 200) {
-			// 		} else {
-			// 			uni.hideLoading();
-			// 			uni.showToast({
-			// 				title: res.msg,
-			// 				icon: 'none'
-			// 			});
-			// 		}
-			// 	})
-
-			// }
 		}
 	}
 </script>
@@ -301,7 +295,7 @@ import {
 					.bottom {
 						display: flex;
 						// flex-direction: column;
-						justify-content: space-between;
+						justify-content: flex-end;
 						align-items: center;
 						font-size: 26rpx;
 

+ 5679 - 0
pages_course/living.vue

@@ -0,0 +1,5679 @@
+<template>
+	<view class="swiper-wrapper" :class="liveItem.showType == 1 ? 'horizontal' : ''">
+		<view class="container">
+			<!-- 预告直播状态 -->
+			<view class="trailer-box" v-if="liveItem.status == 1">
+				<video v-if="liveItem.previewUrl" :id="`myVideo_${liveId}`" class="trailer-video"
+					:src="liveItem.previewUrl" :autoplay="true" :loop="false" object-fit="contain" :custom-cache="false"
+					:enable-progress-gesture="false" vslide-gesture-in-fullscreen="false" :show-center-play-btn="false"
+					:http-cache="false" @error="videoError" @loadedmetadata="onVideoMetaLoaded" @pause="onVideoPause"
+					@play="onVideoPlay" :disable-progress="true" :enable-play-gesture="true" @waiting="onVideoWaiting"
+					preload="auto" type="application/x-mpegURL" :controls="false"></video>
+				<image v-if="liveItem.status == 1 && !liveItem.previewUrl" class="trailer-placeholder"
+					src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/no_live.png">
+				</image>
+				<view class="countdown-container" v-if="liveItem.status == 1 && liveCountdown">
+					<view class="live-name">{{ liveItem.liveName }}</view>
+					<view class="countdown-display">
+						<text class="countdown-label">距离开播还有</text>
+						<view class="countdown-unit">
+							{{ liveCountdown.hours || '00' }}
+						</view>
+						<view class="countdown-separator">:</view>
+						<view class="countdown-unit">
+							{{ liveCountdown.minutes || '00' }}
+						</view>
+						<view class="countdown-separator">:</view>
+						<view class="countdown-unit">
+							{{ liveCountdown.seconds || '00' }}
+						</view>
+					</view>
+				</view>
+				<view class="trailer-actions">
+					<button open-type="share" class="button-reset share-button">
+						<view class="action-button mr18" @click="handleAgreement">
+							<text>分享给好友</text>
+						</view>
+					</button>
+
+					<view class="action-button reserve-button" @click="handleAgreement">
+						<image class="button-icon mr8" src="/static/images/trailer.png"></image>
+						<text>预约直播</text>
+					</view>
+				</view>
+			</view>
+
+			<!-- 无直播状态 -->
+			<view class="trailer-box" v-if="!liveItem">
+				<image class="trailer-placeholder"
+					src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/no_live.png">
+				</image>
+				<view class="no-live-title">暂无直播</view>
+			</view>
+
+			<!-- 主要内容区域 -->
+			<view class="content">
+				<!-- 顶部信息栏 -->
+				<view class="top-info-bar" :class="liveItem.showType == 1 ? 'horizontal-top' : ''">
+					<view class="user-info-section">
+						<image v-if="!scene" @click="goBack" class="back-icon mr4"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/return3.png" />
+						<view class="user-avatar-container">
+							<u-avatar
+								:src="liveItem.liveImgUrl || 'https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/avatar.png'"
+								:size="32"></u-avatar>
+							<view class="user-name ml10 mr6">
+								<view>{{ liveItem.liveName ? truncateString(liveItem.liveName, 8) : '未命名' }}</view>
+							</view>
+						</view>
+					</view>
+
+					<!-- 观众头像列表 -->
+					<!-- @click="toggleViewerList" -->
+					<view v-if="Array.isArray(filteredViewers)" class="viewers-section">
+						<view v-for="(item, index) in (filteredViewers ||[])" :key="index">
+							<image v-if="item.avatar" class="viewer-avatar mr4" :src="item.avatar" />
+							<view v-else class="viewer-avatar-placeholder mr4"
+								:style="{ backgroundColor: getUserRandomColor(item.userId) }">
+								<text class="avatar-initial">{{ getNicknameInitial(item.nickName) }}</text>
+							</view>
+						</view>
+						<view class="viewer-count ">{{formattedWatchCount || 0 }}</view>
+					</view>
+				</view>
+
+				<!-- 购买提示 -->
+				<view class="purchase-prompt"
+					v-if="showPurchasePrompt && orderUser && orderUser.count && liveItem.status == 2">
+					<image class="prompt-icon mr8"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/shopping.png" />
+					<text>{{ orderUser.count || 0 }}人正在去购买</text>
+				</view>
+
+				<!-- 视频区域 -->
+				<view class="videolist" v-if="liveItem.status == 2">
+					<view class="video-container" :class="liveItem.showType == 1 ? 'horizontal-layout' : ''">
+						<video v-if="liveItem.videoUrl && liveItem.liveType == 2" :id="`myVideo_${liveId}`"
+							:autoplay="true" class="video-player" :src="liveItem.videoUrl" object-fit="contain"
+							:custom-cache="false" :enable-progress-gesture="false" vslide-gesture-in-fullscreen="false"
+							:show-center-play-btn="false" :http-cache="false" loop @error="videoError"
+							@timeupdate="onVideoTimeUpdate" @loadedmetadata="onVideoMetaLoaded" @pause="onVideoPause"
+							@play="onVideoPlay" @waiting="onVideoWaiting" :enable-play-gesture="false"
+							:play-strategy="1" @dblclick="preventDoubleClick" preload="auto"
+							:enable-stash-buffer="false" :stash-initial-size="0" :stash-max-size="0" :stash-time="0"
+							type="application/x-mpegURL" :controls="isPlayback"></video>
+					</view>
+				</view>
+
+				<!-- 直播结束状态 -->
+				<view class="videolist" v-if="liveItem.status == 3">
+					<view class="video-container" :class="liveItem.showType == 1 ? 'horizontal-layout' : ''">
+						<view class="live-end-message">直播已结束</view>
+					</view>
+				</view>
+
+				<!-- 直播回放 -->
+				<view class="videolist" v-if="liveItem.status == 4">
+					<view class="video-container" :class="liveItem.showType == 1 ? 'horizontal-layout' : ''">
+						<video v-if="liveItem.videoUrl && liveItem.liveType == 3" :id="`myVideo_${liveId}`"
+							class="video-player" :src="liveItem.videoUrl" :autoplay="true" :controls="true"
+							object-fit="contain" :custom-cache="false"
+							:enable-progress-gesture="liveItem.isSpeedAllowed" vslide-gesture-in-fullscreen="true"
+							:show-center-play-btn="true" :http-cache="false" loop @error="videoError"
+							@timeupdate="onVideoTimeUpdate" @loadedmetadata="onVideoMetaLoaded" @pause="onVideoPause"
+							@play="onVideoPlay" :enable-play-gesture="true" preload="auto" @waiting="onVideoWaiting"
+							type="application/x-mpegURL"></video>
+						<view v-if="liveItem.videoUrl && liveItem.liveType == 3" class="replay-label">直播回放</view>
+					</view>
+				</view>
+
+				<!-- 底部聊天区域 -->
+				<view class="chat-area-container" :class="{
+				    'chat-area-container2': liveItem.showType == 1,
+				    'chat-area-focused': isFocus
+				  }" :style="{ '--keyboard-height': keyboardHeight + 'rpx' }">
+					<view class="tabs_bg" v-if="liveItem.showType == 1">
+						<u-tabs :list="listTabs" @click="clickTabs" lineColor="#02B176"
+							:activeStyle="{color: '#02B176',fontWeight: 'bold',transform: 'scale(1.05)'}">
+						</u-tabs>
+					</view>
+
+					<view class="chat-content-wrapper" :class="{ 'chat-content-focused': isFocus }">
+						<!-- 公告 -->
+						<view class="notice-message" v-if="!isFocus&&isShowNotice">
+							公告消息: {{notice.msg}}
+						</view>
+						<scroll-view id="msgScroll" v-if="Array.isArray(talklist)" enable-flex scroll-y="true"
+							:enhanced="true" :bounces="false" :show-scrollbar="false" :fast-deceleration="false"
+							:enable-back-to-top="false" class="message-scroll-view" :scroll-top="scrollTop"
+							:scroll-into-view="scrollIntoView" @scroll="onScroll" ref="scrollView">
+							<view class="message-list" v-for="(item, talkIndex) in (talklist || [])"
+								:key="item.uniqueId " :id="`list_${item.uniqueId }`" v-show="item.cmd != 'red' ">
+								<view class="message-item">
+									<view class="message-content">
+										<text class="user-nickname">{{ item.nickName || '未命名' }}
+											<text v-if="item.cmd != 'entry'">:</text>
+										</text>
+										<text class="message-text ml8">{{ item.msg }}</text>
+									</view>
+								</view>
+							</view>
+						</scroll-view>
+					</view>
+
+					<!-- 底部输入和操作区域 -->
+					<view class="input-actions-container" :class="{ 'input-actions-focused': isFocus }">
+						<view class="input-container" :class="{ 
+									'input-container-focused': isFocus,
+									'input-container-normal': !isFocus
+								}">
+							<input v-if="isIOS" type="text" :placeholder="placeholderText" v-model="value"
+								:placeholder-style="liveItem.showType == 1 ? 'color:#999999;' : 'color:#e7e7e7;'"
+								placeholder-class="placeholder-style" class="chat-input"
+								:class="{ 'input-focused': isFocus }" @focus="inputFocus" @blur="inputBlur"
+								cursor-spacing="100" :adjust-position="false" :disabled="isEnd" @confirm="sendMsg" />
+
+							<input v-else :placeholder="placeholderText" v-model="value"
+								:placeholder-style="liveItem.showType == 1 ? 'color:#999999;' : 'color:#e7e7e7;'"
+								placeholder-class="placeholder-style" class="chat-input"
+								:class="{ 'input-focused': isFocus }" @focus="inputFocus" @blur="inputBlur"
+								cursor-spacing="100" :adjust-position="false" :disabled="isEnd" />
+
+							<view v-if="isFocus&&!isIOS" class="send-button" @click="sendMsg()">发送</view>
+						</view>
+						<view class="action-buttons" :class="{ 'action-buttons-hidden': isFocus }">
+							<view class="action-button-group" v-if="!isFocus">
+								<view
+									:class="[liveItem.showType === 1 ? 'horizontal' : 'vertical','icon-button','ml20']"
+									@click="isMore=true,shopping=false">
+									<!-- <image
+										src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/more-icon.png"
+										class="action-icon" /> -->
+
+									<image :src="liveItem.showType == 1 
+										    ? '/static/images/more2.png' 
+										    :'https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/more-icon.png'"
+										class="action-icon" />
+								</view>
+							</view>
+							<view class="action-button-group" v-if="!isFocus">
+								<view
+									:class="[liveItem.showType === 1 ? 'horizontal' : 'vertical','icon-button','ml20']">
+									<button open-type="share" class="action-icon button-reset">
+										<image class="action-icon"
+											src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/weixin.png"
+											mode="widthFix" />
+									</button>
+								</view>
+							</view>
+							<view class="icon-button ml20" @tap="openCart()">
+								<image
+									src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/shopping.png"
+									class="cart-icon" />
+							</view>
+							<view class="action-button-group" v-if="!isFocus">
+								<view
+									:class="[liveItem.showType === 1 ? 'horizontal' : 'vertical','icon-button','ml20','like-container']"
+									@click="onLike">
+									<LikeButton :initialCount="100" :heartsPerClick="5" @like="onLike" />
+									<view class="like-count">{{formattedLikeCount||0 }}</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!-- 商品卡片 -->
+			<view class="goods-card" v-if="isShowGoods" @click.stop="goShop(goodsCard.productId, goodsCard.goodsId)">
+				<view class="goods-card-header">
+					<view class="goods-status">
+						<image class="status-icon mr8"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/signal.png" />
+						主播讲解中
+					</view>
+					<image @click.stop="isShowGoods = false" class="close-icon" src="/static/images/close_w.png" />
+				</view>
+				<image class="goods-image" :src="goodsCard.imgUrl" />
+				<view class="goods-info">
+
+					<view class="goods-title oneline-hide">{{ goodsCard.productName }}</view>
+					<view class="goods-action">
+						<view class="goods-price">
+							<text class="price-symbol">¥<text class="price-integer">{{ goodsCard.price }}</text> <text
+									class="price-decimal"></text></text>
+						</view>
+						<image class="shop-icon" src="/static/images/shop.png"></image>
+					</view>
+				</view>
+			</view>
+			<!-- 抽奖弹窗 -->
+			<u-popup :show="isShowLotteryPop && countdown" round="40rpx">
+				<view class="lottery-popup">
+					<image class="lottery-header-image"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_head.png"
+						mode="widthFix" />
+					<image class="lottery-background-image"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_bg.png" />
+					<view class="lottery-content">
+						<view class="lottery-close-section">
+							<view class="close-button-wrapper">
+								<view class="close-button" @click="isShowLotteryPop = false">
+									<u-icon class="close-icon" name="close" color="#fff" size="20"></u-icon>
+								</view>
+							</view>
+						</view>
+						<view class="lottery-main-content">
+							<image class="lottery-title-image"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_title.png" />
+							<view class="lottery-countdown-section">
+								<view class="countdown-label">开奖倒计时</view>
+								<view class="countdown-timer">
+									<view class="countdown-number">
+										{{ countdown.hours || '00' }}
+									</view>
+									<view class="countdown-number">
+										{{ countdown.minutes || '00' }}
+									</view>
+									<view class="countdown-number">
+										{{ countdown.seconds || '00' }}
+									</view>
+								</view>
+							</view>
+							<view class="lottery-products-section">
+								<ThreeItemSwiper :products="lotteryProducts"></ThreeItemSwiper>
+							</view>
+							<view class="lottery-indicators">
+								<view class="indicator-point" v-for="(item, index) in (lotteryProducts || [])"
+									:key="index"></view>
+							</view>
+							<view class="lottery-tip">观看直播参与抽奖</view>
+							<view class="lottery-action-button" @click="onClaim">参与抽奖</view>
+						</view>
+					</view>
+				</view>
+			</u-popup>
+			<!-- 积分弹窗 -->
+			<u-popup :show="!!integral.status" round="20rpx" mode="center" bgColor="#ffffff" zIndex="10076">
+				<view class="integral-popup">
+					<view class="integral-header">
+						<view class="integral-title">观看视频领积分</view>
+						<image class="integral-background-image"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/integral_bg.png"
+							mode="widthFix" />
+					</view>
+					<view class="integral-content">
+						<view class="integral-message">{{ integral.msg }}</view>
+						<view class="integral-confirm-button" @click="integral.status = false">确认</view>
+					</view>
+				</view>
+			</u-popup>
+
+			<!-- 红包弹窗 -->
+			<u-popup :show="isShowRed" round="20rpx" mode="center" zIndex="10076" bgColor="transparent">
+				<view class="red-envelope-popup" @click="onRed()">
+					<image class="red-envelope-close-button"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/close_white.png"
+						@click.stop="isShowRed=false"></image>
+					<image class="red-envelope-background"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/pop1.png"></image>
+					<view class="red-envelope-content">
+						<view class="red-envelope-header">
+							<image class="header-decoration-left"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/top_left.png"
+								mode="widthFix" />
+							<view class="header-title">恭喜您可以</view>
+							<image class="header-decoration-right"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/top_right.png"
+								mode="widthFix" />
+						</view>
+						<view class="red-envelope-text">领红包</view>
+						<view class="red-envelope-open-text">开</view>
+					</view>
+				</view>
+			</u-popup>
+
+			<!-- 抽奖弹窗2 -->
+			<u-popup :show="isShowLottery&&countdown" round="20rpx" mode="center" zIndex="10076" bgColor="transparent">
+				<view class="lottery-popup-v2">
+					<image class="lottery-close-button-v2"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/close_white.png"
+						@click.stop="isShowLottery=false">
+					</image>
+					<image class="lottery-top-image"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/pop_top.png"
+						mode="widthFix"></image>
+					<image class="lottery-background-v2"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/pop2.png"></image>
+					<view class="lottery-content-v2">
+						<view class="lottery-header-v2">
+							<image class="lottery-header-decoration-left"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/top_left.png"
+								mode="widthFix" />
+							<view class="lottery-header-title">恭喜您可以</view>
+							<image class="lottery-header-decoration-right"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/top_right.png"
+								mode="widthFix" />
+						</view>
+						<view class="lottery-text-v2">参与抽奖</view>
+						<view class="lottery-text-v2">赢好礼</view>
+						<view class="lottery-action-button-v2" @click="onLottery()">确认</view>
+					</view>
+				</view>
+			</u-popup>
+
+			<!-- 红包卡片弹窗 -->
+			<u-popup :show="isShowRedCard" round="20rpx" mode="center" bgColor="transparent" zIndex="10076">
+				<view class="red-card-popup">
+					<image class="red-card-image"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_card.png" />
+					<view class="red-card-content">
+						<view class="red-card-message">{{ redCard.msg }}</view>
+						<view class="red-card-tip">直播惊喜积分</view>
+						<view class="red-card-confirm-button" @click="isShowRedCard = false">确认</view>
+					</view>
+				</view>
+			</u-popup>
+
+			<!-- 消息弹窗 -->
+			<u-popup :show="isShowPopMsg" round="20rpx" mode="center" zIndex="10076">
+				<view class="message-popup">
+					<image class="message-close-icon"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/del2.png" />
+					<view class="message-title">消息通知</view>
+					<view class="message-content">{{popMsg}}</view>
+					<view class="message-confirm-button" @click="isShowPopMsg = false">确认</view>
+				</view>
+			</u-popup>
+
+
+			<!-- 中奖和未中奖 -->
+			<u-popup :show="isShowPrize && havePrize" round="20rpx" mode="center" bgColor="#fff" zIndex="10076">
+				<view class="prize-popup" v-if="isCurrentUserWon">
+					<image class="prize-header-image"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_head.png"
+						mode="widthFix" />
+					<view class="prize-title">恭喜您 中奖啦!</view>
+					<view class="prize-info-section" v-for="(item, index) in (prizeInfo || [])" :key="index">
+						<view class="prize-info-item">{{ item.userName }}</view>
+						<view class="prize-info-item">{{ item.userId }}</view>
+						<view class="prize-level item">{{ item.prizeLevel }}等奖</view>
+					</view>
+					<view class="prize-tip">请填写收货地址,主播将会将奖品发给您</view>
+					<view class="prize-action-button"
+						@click="navgetTo('/pages_shopping/live/confirmCreateOrder?type=win&productId='+getCurrentUserPrizeProductId+'&liveId='+liveId+'&recordId='+getCurrentUserPrizeRecordId),confirm()">
+						填写地址</view>
+				</view>
+				<view class="no-prize-popup" v-else>
+					<image class="no-prize-image"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/no-prize.png"
+						mode="widthFix" />
+					<view class="no-prize-tip">很遗憾 您未中奖</view>
+					<view class="no-prize-confirm-button" @click="confirm">确认</view>
+				</view>
+			</u-popup>
+
+			<!-- 中奖记录弹窗 -->
+			<u-popup :show="winning" @close="closeWin" round="20rpx" bgColor="#f3f5f9" zIndex="10076">
+				<view class="winning-record-popup">
+					<image class="winning-record-header-bg"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_head.png"
+						mode="widthFix"></image>
+					<image class="winning-record-background"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/red_bg.png"></image>
+					<view class="winning-record-content">
+						<view class="winning-record-title">我的中奖记录</view>
+						<view class="winning-record-header">
+							<view class="header-column time-column">时间</view>
+							<view class="header-column status-column">状态</view>
+							<view class="header-column prize-column">奖品</view>
+						</view>
+						<scroll-view v-if="prizeAll" enable-flex scroll-y class="winning-record-list">
+							<view class="winning-record-item" v-for="(item, index) in (prizeAll||[])" :key="index">
+								<view class="record-time">{{ item.createTime }}</view>
+								<view class="record-status-button" v-if="item.orderStatus=='-9'||!item.orderStatus"
+									@click="navgetTo('/pages_shopping/live/confirmCreateOrder?type=win&productId='+item.productId+'&liveId='+liveId+'&recordId='+item.id),winning=false">
+									<text>填地址</text>
+								</view>
+								<view class="record-status" v-else>
+									<text v-if="item.orderStatus=='1'">待支付</text>
+									<text v-if="item.orderStatus=='2'">待发货</text>
+									<text v-if="item.orderStatus=='3'">待收货</text>
+									<text v-if="item.orderStatus=='4'">已完成</text>
+									<text v-if="item.orderStatus=='-3'">已取消</text>
+								</view>
+								<view class="record-prize">
+									{{ item.productName ? truncateString(item.productName, 6) : '' }}
+								</view>
+							</view>
+						</scroll-view>
+						<view v-else class="no-winning-records">暂无中奖信息</view>
+					</view>
+				</view>
+			</u-popup>
+
+			<!-- 观众列表弹窗 -->
+			<!-- 	<u-popup :show="showadd" @close="close" @open="openViews" round="20rpx" bgColor="#ffffff" zIndex="10077">
+				<view class="view-box">
+					<view class="fs32" style="text-align: center">在线观众</view>
+					<scroll-view v-if="Array.isArray(liveViewers)" scroll-y class="scroll-content"
+						:style="{ height: scrollHeight + 'px' }" @scrolltolower="handleScrollToLower">
+						<view class="fs28 x-f mb20 mt20" v-for="(item, index) in (liveViewers || [])" :key="index">
+							<view :style="{
+									color: index === 0 ? '#FF3B30' : index === 1 ? '#FF9500' : index === 2 ? '#FFCC00' : '#8E8E93',
+									fontWeight: index < 3 ? 'bold' : 'normal',
+									width: '50rpx'
+								}" class="mr10">
+								{{ index + 1 }}
+							</view>
+							<u-avatar v-if="item.avatar" :src="item.avatar" :size="36"></u-avatar>
+							<view v-else class="w72 h72"
+								:style="{ backgroundColor: getUserRandomColor(item.userId), borderRadius: '50%' }">
+								<text class="text-white text-sm">{{ getNicknameInitial(item.nickName) }}</text>
+							</view>
+							<text class="ml16 f30">{{ item.nickName || '未命名' }}</text>
+						</view>
+					</scroll-view>
+				</view>
+			</u-popup> -->
+
+			<!-- 更多操作弹窗 -->
+			<u-popup :show="isMore" @close="closeMore" round="20rpx" bgColor="#f3f5f9" zIndex="10076">
+				<view class="more-actions-popup">
+					<view class="more-action-item" @click="navgetTo('/pages_shopping/live/integral'), (isMore = false)">
+						<image class="action-icon"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/order.png" />
+						<view class="action-label">积分</view>
+					</view>
+					<view class="more-action-item"
+						@click="navgetTo('/pages_shopping/live/storeOrderRefundList?liveId=' + liveId), (isMore = false)">
+						<image class="action-icon"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/after_sales.png" />
+						<view class="action-label">售后订单</view>
+					</view>
+					<view class="more-action-item" @click="goMiniProgram(), (isMore = false)">
+						<image class="action-icon"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/points.png" />
+						<view class="action-label">兑换好礼</view>
+					</view>
+					<view class="more-action-item" @click="getMyLottery(), (isMore = false), (winning = true)">
+						<image class="action-icon"
+							src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/health_sel.png" />
+						<view class="action-label">中奖记录</view>
+					</view>
+				</view>
+			</u-popup>
+
+			<!-- 商品弹窗 -->
+			<u-popup :show="shopping" @close="closeShop" round="20rpx" bgColor="#f3f5f9" zIndex="10075">
+				<view class="shopping-popup">
+					<view class="shopping-header">
+						<view class="search-input-container">
+							<image class="search-icon"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/search.png"
+								mode="widthFix" />
+							<input placeholder="请搜索商品" v-model="inputInfo" @input="handleSearchInput" />
+						</view>
+						<view class="shopping-action-button" @click="navgetTo('/pages_shopping/live/order')">
+							<image class="action-button-icon"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/carts.png" />
+							<view class="action-button-label">订单</view>
+						</view>
+						<view class="shopping-action-button" @click="(isMore = true), (shopping = false)">
+							<image class="action-button-icon"
+								src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/search2.png" />
+							<view class="action-button-label">更多</view>
+						</view>
+					</view>
+
+					<scroll-view enable-flex scroll-y class="products-list">
+						<view v-for="(item, index) in products" :key="index" class="product-item">
+							<view class="product-image-container">
+								<image class="product-image" :src="item.imgUrl" mode="widthFix" />
+								<view class="product-index-label">{{ index + 1 }}</view>
+							</view>
+							<view class="product-info">
+								<view class="product-name">{{ item.productName }}</view>
+								<view class="product-sales">{{ item.sales }} 人已购</view>
+								<view class="product-action-section">
+									<text class="product-price">
+										<text class="price-symbol">¥</text>
+										<text class="price-integer">{{ Math.trunc(item.price) }}</text>
+										.{{ getPureDecimal(item.price) ? getPureDecimal(item.price) : '00' }}
+									</text>
+									<view class="product-action-buttons">
+										<view class="collect-button">
+											<image v-if="item.isFavorite" @click="onGoodsCollect(item)"
+												class="collect-icon"
+												src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/collect_select.png" />
+											<image v-else @click="onGoodsCollect(item)" class="collect-icon"
+												src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/collect.png" />
+										</view>
+										<view v-if="item.status == 1" class="buy-button"
+											@click="goShop(item.productId, item.goodsId)">去购买</view>
+										<view v-else-if="item.status == 0" class="buy-button disabled">已下架</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</scroll-view>
+				</view>
+			</u-popup>
+
+			<!-- 优惠券弹窗 -->
+			<view class="coupon-popup" v-if="isShowCoupon">
+				<view class="coupon-container">
+					<image class="coupon-background"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/coupon_bg.png" />
+					<image class="coupon-header"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/coupon_top.png" />
+					<image @click="isShowCoupon = false" class="coupon-close-button"
+						src="https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/close_white.png" />
+					<view class="coupon-content">
+						<view class="coupon-name">{{ couponInfo.couponName }}</view>
+						<view class="coupon-price">
+							¥
+							<text class="coupon-price-integer">{{ couponInfo.couponPrice }}</text>
+						</view>
+						<view class="coupon-condition">满{{ couponInfo.useMinPrice }}元可用</view>
+						<view class="coupon-description">指定商品可用</view>
+						<view class="coupon-validity">自领取起{{ couponInfo.couponTime }}天内有效</view>
+						<view class="coupon-get-button" @click="onCoupon()">立即领券</view>
+					</view>
+				</view>
+			</view>
+			<view v-if="liveItem.status == 1" class="ash_bg"></view>
+		</view>
+	</view>
+</template>
+<script>
+	import LikeButton from '@/pages_course/components/like.vue';
+	import ThreeItemSwiper from '@/pages_course/components/ThreeItemSwiper.vue';
+	import CryptoJS from 'crypto-js';
+	import {
+		myLiveMsg,
+		myLottery, // 我的中奖明细
+		coupon, //领取优惠券
+		liveLottery, // 抽奖查询
+		claim, //抽奖
+		liveRed, // 点击领红包
+		liveDataLike, // 点赞
+		collectStore, // 店铺收藏/取消收藏
+		collectGoods, // 商品收藏/取消收藏
+		watchUserList, //获取直播间用户(展示在线用户)
+		liveMsg, //获取最近聊天记录
+		// 小黄车
+		liveStore, //店铺展示,
+		liveOrderUser, //正在购买
+		getLiveInfo, //获取直播间信息接口
+		getLiveViewData, //直播间点赞、关注、在线人数数据
+		currentActivities, //红包 卡片 抽奖
+		getlive,
+		subNotifyLive,
+		internetTraffic, // 流量(缓冲百分比),
+		liveInternetTraffic, // 直播流量(缓冲百分比),
+		loginByMp,
+		getUserInfo
+	} from '@/api/living.js';
+
+	// import {
+	// 	generateRandomString
+	// } from '@/utils/common.js';
+	import dayjs from 'dayjs';
+	import {
+		nextTick
+	} from 'vue';
+
+	import {
+		mapGetters
+	} from 'vuex';
+	import {
+		TOKEN_KEYAuto,
+		generateRandomString
+	} from '@/utils/courseTool.js'
+
+	var isSocketOpen = false;
+	var socket = null;
+
+	export default {
+		components: {
+			ThreeItemSwiper,
+			LikeButton
+		},
+		data() {
+			return {
+				listTabs: [{
+					name: '讨论',
+				}],
+				isPlayback: false, //是否是回放
+				isIOS: false,
+				myselfFlag: false, // yhq
+				isEnd: false,
+				popMsg: null,
+				// barrageList: ['支持你!', '谢谢你!', '平台真好!', '666', '欢迎回家!'], //一键弹幕列表
+				uuId: '',
+				totalTraffic: 0, // 总流量(字节)
+				bitrate: 800, // 录播默认码率 0.16Mbps
+				bitrateLive: 1600, // 直播默认码率 0.16Mbps
+
+				//定时器
+				trafficTimer: null,
+				pingTimeoutTimer: null, // 心跳超时定时器
+				heartBeatTimer: null, // 心跳定时器
+				liveViewDataTimer: null,
+				reconnectTimer: null, // 重连定时器
+				scrollTimer: null, // 滚动防抖定时器
+				lastScrollTime: 0, // 上次滚动时间
+				scrollDebounceDelay: 200, // 滚动防抖延迟(毫秒)
+				searchTimer: null, //搜索
+				purchasePromptTimer: null, //购买提示
+				welcomeTimer: null, //进入离开直播间定时器
+				redTimer: null,
+				liveStartTimer: null,
+				lotteryTimer: null,
+				memoryMonitorTimer: null, // 内存监控定时器
+				networkStatusTimer: null, // 网络状态检测定时器
+				networkRetryTimer: null, // 网络重试定时器
+				lastHeartBeatTime: 0, // 上次心跳时间
+
+				// 性能监控
+				connectionStartTime: 0, // 连接开始时间
+				connectionLatency: 0, // 连接延迟
+				messageCount: 0, // 消息计数
+				errorCount: 0, // 错误计数
+				lastPerformanceCheck: 0, // 上次性能检查时间
+
+				stayTime: 0,
+				startTime: 0,
+
+				scrollTop: 0,
+				currentScrollTop: 0, // 当前实际滚动位置
+				scrollIntoView: '', // scroll-into-view属性
+				messageIdCounter: 0, // 消息ID计数器,确保每个消息有唯一ID
+				scrollPending: false, // 滚动操作是否正在等待执行
+				isOnload: false,
+				isConnecting: false, // 是否正在连接中
+				hasInitialized: false,
+
+				liveViewersData: [],
+				liveUserCalled: false, //调用过watchUserList没
+				userRandomColors: Object.create(null), // 缓存用户ID -> 随机色的映射
+
+				heartBeatRetryCount: 0, // 心跳发送重试次数(避免一次失败就重连)
+				maxHeartBeatRetries: 3, // 心跳最大重试次数(增加到3次)
+				pingTimeout: 25000, // 心跳超时时间(25秒,适应移动网络)
+				shownEntryUsers: new Set(), // 存储已显示过「进入提示」的用户ID
+
+				socket: null, // WebSocket 实例
+				isSocketOpen: false, // 连接是否已打开
+				heartBeatInterval: 15000, // 心跳发送间隔(15秒)
+				adaptiveHeartBeatInterval: 15000, // 自适应心跳间隔
+				reconnectCount: 0, // 当前重连次数f
+				maxReconnectAttempts: 5, // 最大重连次数(增加到5次)
+				isManualClose: false, // 是否手动关闭(用于区分主动关闭和异常断开)
+				networkType: 'unknown', // 当前网络类型
+				isNetworkAvailable: true, // 网络是否可用
+
+				templateId: 'IKffTm6HnbLS91hDCUnKSQpC2r4EABo3fOtThnK1dI8',
+				isAgreement: false,
+
+				wsNewUrl: 'wss://api.fhhx.runtzh.com/ws/app/webSocket',
+				// wsNewUrl: 'ws://192.168.10.166:7114/ws/app/webSocket',
+				qrFrom: null,
+				scene: '',
+
+				liveCountdown: {}, //直播倒计时
+				countdown: {}, //抽奖倒计时
+				liveViewData: {},
+
+				keyboardHeight: 0,
+				videoCurrentTime: 0, // 当前视频播放时间
+				videoProgressKey: '', // 存储进度的key
+				inAndOut: {},
+				winning: false,
+				isShowPrize: false,
+				isShowCoupon: false,
+				prizeInfo: [],
+				havePrize: uni.getStorageSync('havePrize') || false, //是否参与抽奖
+				countDownKey: 0,
+				lotteryProducts: [],
+				lotteryList: [],
+				talklist: [],
+				isShowLotteryPop: false,
+				liveItem: {},
+				isSending: false,
+				isMore: false,
+
+				value: '',
+				placeholderText: '说点什么...',
+
+				prizeAll: [],
+				isShowLottery: false,
+				isShowRedCard: false,
+				isShowPopMsg: false,
+				isShowNotice: false,
+				notice: [],
+				redCard: null, //点击红包出现弹窗
+				integral: {},
+				lotteryInfo: {},
+				goodsCard: {},
+				couponInfo: {},
+				redInfo: {},
+				storeId: null,
+				isFocus: false,
+				shopping: false,
+				systemInfo: null, // 缓存系统信息,避免重复调用同步API
+
+				inputInfo: '',
+				showWelcomeMessage: false,
+				isShowGoods: false,
+				isShowRed: false,
+				lastClickTime: 0,
+				videoRetryCounts: Object.create(null), // 记录每个直播间的视频重试次数,格式: { liveId: 次数 }
+
+				clickDelay: 300, // 300ms内只响应一次点击
+				liveUserTotal: 0,
+				viewPageSize: 10, // 每页数量
+				viewPageNum: 1, // 当前页码
+				viewLoading: false, // 是否正在加载
+				scrollHeight: 0,
+
+				showPurchasePrompt: false,
+				prevOrderCount: 0, // 用于记录上一次的购买人数
+				videoUrl: null,
+				showType: 1, //横屏1 竖屏2
+				boxHeight: 300, //小黄车高度
+				liveViewers: [], //观众
+				livingUrl: '',
+				products: [],
+				loadingProducts: false, // 商品加载状态
+				orderUser: {}, //正在购买
+				userType: 0,
+				timestamp: '',
+				showadd: false,
+				liveId: null,
+				userinfo: '', //用户信息
+				userData: {},
+				diffTotalTime: '',
+				address: ''
+			};
+		},
+		async onLoad(options) {
+			this.initTime()
+			this.getLocationByIP();
+			if (options.liveId) {
+				this.liveId = options.liveId;
+			}
+			// 扫码传来的参数
+			if (options.scene) {
+				this.scene = options.scene;
+				const decodedScene = decodeURIComponent(this.scene);
+				const params = {};
+				decodedScene.split('&').forEach((item) => {
+					const [key, value] = item.split('=');
+					params[key] = value;
+					this.liveId = params.a;
+				});
+				if (params.b && params.c) {
+					this.qrFrom = `&companyId=${params.b}&companyUserId=${params.c}`;
+				}
+			}
+			if (options.companyId && options.companyUserId) {
+				this.qrFrom = `&companyId=${options.companyId}&companyUserId=${options.companyUserId}`;
+			}
+			this.userinfo = uni.getStorageSync('userInfo');
+			this.userData = uni.getStorageSync('userData');
+			console.log('全部参数', options);
+			try {
+				const isLogin = await this.utils.checkLiveToken();
+				if (isLogin) {
+					this.haveLogin()
+				}
+			} catch (error) {
+				console.error('初始化失败:', error);
+			}
+			//获取键盘高度 - 针对iPhone优化(使用缓存的系统信息)
+			uni.onKeyboardHeightChange((res) => {
+				console.log('键盘高度变化:', res.height, '平台:', this.systemInfo.platform);
+				if (this.systemInfo.platform === 'ios') {
+					// iPhone特殊处理
+					if (res.height > 0) {
+						// 键盘弹出
+						this.isKeyboardShow = true;
+						// iPhone键盘高度计算优化
+						let calculatedHeight = res.height * 2;
+						// 根据iPhone型号进行微调
+						if (this.systemInfo.model) {
+							if (this.systemInfo.model.includes('iPhone X') ||
+								this.systemInfo.model.includes('iPhone 11') ||
+								this.systemInfo.model.includes('iPhone 12') ||
+								this.systemInfo.model.includes('iPhone 13') ||
+								this.systemInfo.model.includes('iPhone 14') ||
+								this.systemInfo.model.includes('iPhone 15') ||
+								this.systemInfo.model.includes('iPhone 16') ||
+								this.systemInfo.model.includes('iPhone 17')) {
+								// 刘海屏设备需要额外调整
+								calculatedHeight = calculatedHeight + 20; // 增加20rpx补偿
+							}
+						}
+
+						// 减去底部安全区域,避免过高
+						const safeAreaBottom = this.systemInfo.safeAreaInsets ? this.systemInfo.safeAreaInsets
+							.bottom : 0;
+						if (safeAreaBottom > 0) {
+							calculatedHeight = calculatedHeight - (safeAreaBottom * 3.0); // 微调10rpx
+						}
+						this.keyboardHeight = Math.max(400, calculatedHeight);
+					} else {
+						// 键盘隐藏
+						this.isKeyboardShow = false;
+						this.keyboardHeight = 0;
+					}
+				} else {
+					console.log("手机型号是>>>>", this.systemInfo.model)
+					// Android处理保持原有逻辑
+					if (res.height > 0) {
+						this.isKeyboardShow = true;
+						const safeAreaBottom = this.systemInfo.safeAreaInsets ? this.systemInfo.safeAreaInsets
+							.bottom : 0;
+						// this.keyboardHeight = (res.height * 2)-50;
+						// this.keyboardHeight = res.height * 2;
+						if (this.systemInfo.brand == 'vivo') {
+							this.keyboardHeight = res.height * 2;
+						} else {
+							this.keyboardHeight = (res.height * 1.78) + 20;
+						}
+						console.log("高度是", this.keyboardHeight)
+					} else {
+						this.isKeyboardShow = false;
+						this.keyboardHeight = 0;
+					}
+				}
+			});
+
+			// 初始化网络状态监听
+			this.initNetworkStatusListener();
+		},
+		onPullDownRefresh() {
+			this.getLiveMsg(this.liveItem);
+			this.getliveUser();
+			setTimeout(() => {
+				uni.stopPullDownRefresh();
+			}, 1000);
+			this.getliving(this.liveId);
+		},
+		mounted() {
+			const systemInfo = uni.getSystemInfoSync();
+			this.isIOS = systemInfo.platform === 'ios';
+		},
+		async onShow() {
+			try {
+				const isLogin = await this.utils.checkLiveToken();
+				if (isLogin) {
+					this.haveLogin()
+				} else {
+					this.goLogin();
+				}
+			} catch (error) {
+				console.error('初始化失败:', error);
+			}
+
+
+			this.getLocationByIP();
+
+			this.uuId = generateRandomString(16);
+			const isLiveLogin = uni.getStorageSync('isLiveLogin');
+			this.share = uni.getStorageSync('share');
+			this.scene = uni.getStorageSync('scene');
+			if (this.share && this.share.length > 0) {
+				this.liveId = this.share.liveId;
+				this.qrFrom = `&companyId=${this.share.companyId}&companyUserId=${this.share.companyUserId}`;
+				uni.removeStorageSync('share');
+			}
+			if (this.scene) {
+				const decodedScene = decodeURIComponent(this.scene);
+				const params = {};
+				decodedScene.split('&').forEach((item) => {
+					const [key, value] = item.split('=');
+					params[key] = value;
+					this.liveId = params.a;
+				});
+				if (params.b && params.c) {
+					this.qrFrom = `&companyId=${params.b}&companyUserId=${params.c}`;
+				}
+				uni.removeStorageSync('scene');
+			}
+			// if (isLiveLogin) {
+			// 	if (this.liveId) {
+			// 		await this.getliving(this.liveId);
+			// 		this.getCurrentActivities();
+			// 		this.getliveOrder();
+			// 		this.initSocket();
+			// 	}
+			// 	this.hasInitialized = true;
+			// 	uni.removeStorageSync('isLiveLogin');
+			// }
+			// 恢复播放和连接
+			await this.resumePageActivity();
+			// this.userinfo = JSON.parse(uni.getStorageSync('userInfo'));
+			this.userinfo = uni.getStorageSync('userInfo');
+			this.isAgreement = uni.getStorageSync('isAgreement');
+
+			this.$nextTick(() => {
+				this.setVideoProgress();
+			});
+			if (this.lookTimer) {
+				clearInterval(this.lookTimer);
+				this.lookTimer = null;
+				this.stayTime = 0;
+				this.startTime = 0;
+			}
+
+			// 启动内存监控,定期清理
+			this.startMemoryMonitor();
+			if (this.trafficTimer) {
+				clearInterval(this.trafficTimer);
+				this.trafficTimer = null;
+				this.startTime = 0;
+				this.totalTraffic = 0;
+			}
+			this.startTimer();
+		},
+
+		//分享给好友
+		onShareAppMessage() {
+			return {
+				title: '邀请你来观看直播:' + this.liveItem.liveName,
+				path: '/pages_course/living?companyId=-2&companyUserId=' + this.userData.userId + '&liveId=' + this.liveId,
+				imageUrl: '/static/logo.png',
+				success(res) {
+					console.log('分享成功', res);
+				},
+				fail(err) {
+					console.error('分享失败', err);
+				}
+			};
+		}, // 分享到朋友圈
+		onShareTimeline() {
+			return {
+				title: '邀请你来观看直播:' + this.liveItem.liveName,
+				query: 'companyId=-2&companyUserId=' + this.userData.userId + '&liveId=' + this.liveId
+			};
+		},
+		computed: {
+			...mapGetters(['coureLogin']),
+			appid() {
+				return this.$store.state.appid
+			},
+			// 观看人数
+			formattedWatchCount() {
+				return this.formatNumber(this.liveUserTotal || 0);
+			},
+			//点赞人数
+			formattedLikeCount() {
+				return this.formatNumber(this.liveViewData.like || 0);
+			},
+			filteredViewers() {
+				const safeLiveViewers = Array.isArray(this.liveViewersData) ? this.liveViewersData : [];
+				// 截取前3项
+				return safeLiveViewers.slice(0, 3);
+			},
+			isCurrentUserWon() {
+				if (!Array.isArray(this.prizeInfo) || !this.userData?.userId) {
+					return false;
+				}
+				return this.prizeInfo.some((item) => {
+					return String(item.userId) === String(this.userData.userId);
+				});
+			},
+			getCurrentUserPrizeProductId() {
+				if (!Array.isArray(this.prizeInfo) || !this.userData?.userId) {
+					return null;
+				}
+				// 在 prizeInfo 中查找当前用户的中奖记录
+				const userPrize = this.prizeInfo.find(item => {
+					return String(item.userId) == String(this.userData.userId);
+				});
+
+				// 返回商品ID,如果没有找到则返回null
+				return userPrize ? userPrize.productId : null;
+			},
+			getCurrentUserPrizeRecordId() {
+				if (!Array.isArray(this.prizeInfo) || !this.userData?.userId) {
+					return null;
+				}
+				// 在 prizeInfo 中查找当前用户的中奖记录
+				const userPrize = this.prizeInfo.find(item => {
+					return String(item.userId) == String(this.userData.userId);
+				});
+
+				// 返回商品ID,如果没有找到则返回null
+				return userPrize ? userPrize.recordId : null;
+			}
+
+		},
+		onHide() {
+			//  清除所有定时器(使用增强清理)
+			// this.clearAllTimersEnhanced();
+			// this.stopHeartBeat();
+			if (this.trafficTimer) {
+				clearInterval(this.trafficTimer);
+			}
+
+			// 页面隐藏时清理部分数据,减少内存占用
+			if (this.talklist && this.talklist.length > 20) {
+				// 只保留最新的20条消息
+				this.talklist = this.talklist.slice(-20);
+			}
+
+			// 触发垃圾回收
+			// this.triggerGarbageCollection();
+		},
+
+		onUnload() {
+			// 保存视频进度
+			this.saveVideoProgress();
+
+			// 清理直播相关定时器
+			if (this.liveItem) {
+				this.pauseVideo();
+				// 清除直播间的时间定时器
+				if (this.liveItem.timeTimer) {
+					clearInterval(this.liveItem.timeTimer);
+					this.liveItem.timeTimer = null;
+				}
+			}
+
+			// 关闭WebSocket连接(会自动清理相关资源)
+			this.closeWebSocket(true);
+
+			// 清除所有定时器(使用增强清理)
+			this.clearAllTimersEnhanced();
+
+			// 暂停视频
+			const videoId = `myVideo_${this.liveId}`;
+			const videoContext = uni.createVideoContext(videoId, this);
+			if (videoContext) {
+				videoContext.pause();
+			}
+
+			// 移除网络状态监听
+			try {
+				uni.offNetworkStatusChange();
+			} catch (err) {
+				console.warn('移除网络状态监听失败:', err);
+			}
+
+			// 清理大数据和状态
+			this.clearBigData();
+			this.resetAllStates();
+		},
+
+		mounted() {
+			// 初始化系统信息缓存,避免在键盘监听器中重复调用同步API
+			this.systemInfo = uni.getSystemInfoSync();
+			console.log('系统信息:', this.systemInfo.platform, this.systemInfo.model);
+
+			this.getCurrentActivities();
+			this.getliveOrder();
+		},
+		watch: {
+			coureLogin: {
+				immediate: true, // 页面一进入就检查一次
+				handler(val) {
+					if (val == 2 && this.isLogin) {
+						this.isLogin = false
+						this.goLogin()
+					}
+				}
+			},
+			// 监听liveItem.status的变化
+			'liveItem.status': {
+				handler(newStatus, oldStatus) {
+					if (newStatus === undefined || oldStatus === undefined) return;
+					if (newStatus === oldStatus) return;
+					if (!this.liveId) {
+						console.warn('liveId不存在,无法触发getliving请求');
+						return;
+					}
+					// 状态变化时,调用getliving更新直播间数据
+					// console.log(`liveItem.status从${oldStatus}变为${newStatus},触发getliving请求`);
+					this.getliving(this.liveId);
+				},
+				deep: true
+			},
+			// 监听orderUser.count的变化
+			'orderUser.count': {
+				handler(newVal, oldVal) {
+					if (newVal !== this.prevOrderCount) {
+						this.prevOrderCount = newVal;
+						this.showPurchaseMessage();
+					}
+				},
+				immediate: true
+			}
+		},
+		methods: {
+			async haveLogin() {
+				this.userinfo = uni.getStorageSync('userInfo');
+				this.userData = uni.getStorageSync('userData');
+				await this.getUserInfo();
+				// this.initTime();
+				if (this.liveId) {
+					// 先获取直播间信息
+					await this.getliving(this.liveId);
+					this.isOnload = true;
+
+					await this.getLiveMsg(this.liveItem);
+					await this.getliveViewData();
+					// await this.getliving(this.liveId);
+					this.getCurrentActivities();
+					this.getliveOrder();
+					this.initSocket();
+				}
+			},
+			// haveShow(){
+			// 	if (this.liveId) {
+			// 		await this.getLiveMsg(this.liveItem);
+			// 	}
+			// 	if (!this.liveViewData) {
+			// 		this.getliveViewData();
+			// 	}
+			// 	if (!this.userData) {
+			// 		await this.getUserInfo();
+			// 	}
+			// },
+			goLogin(data) {
+				let provider = 'weixin'
+				uni.login({
+					provider: provider,
+					success: async loginRes => {
+						console.log(loginRes)
+						uni.getUserInfo({
+							provider: provider,
+							success: (infoRes) => {
+								uni.showToast({
+									title: '登录中...',
+									icon: 'loading'
+								});
+								loginByMp({
+									code: loginRes.code,
+									encryptedData: infoRes.encryptedData,
+									iv: infoRes.iv,
+									appId: this.appid
+								}).then(res => {
+									uni.hideLoading();
+									if (res.code == 200) {
+										uni.setStorageSync('AppToken', res.token);
+										uni.setStorageSync('userInfo', JSON.stringify(res
+											.user));
+										this.userinfo = uni.getStorageSync('userInfo');
+										// uni.setStorageSync('auto_userInfo', JSON.stringify(res.user));
+										// this.user = res.user
+										this.$store.commit('setCoureLogin', 1);
+										this.isLogin = true
+										this.haveLogin()
+										// console.log("TOKEN_KEYAuto",TOKEN_KEYAuto)
+										// this.getIsAddKf() 
+									} else {
+										uni.showToast({
+											title: res.msg,
+											icon: 'none'
+										});
+									}
+								}).catch(err => {
+									uni.hideLoading();
+									uni.showToast({
+										icon: 'none',
+										title: "登录失败,请重新登录",
+									});
+								});
+							}
+						});
+					}
+				})
+			},
+			clickTabs(item) {},
+			getLocationByIP() {
+				// 高德IP定位API,需要替换成你的key
+				const key = '4e13632be0cc278f56825919603c07cf';
+				uni.request({
+					url: `https://restapi.amap.com/v3/ip?key=${key}`,
+					method: 'GET',
+					success: (res) => {
+						if (res.data && res.data.status === '1') {
+							// 返回数据格式:{ province: '广东省', city: '深圳市', ... }
+							// ${res.data.city}
+							this.location = `${res.data.province} `;
+							this.address = this.location
+							console.log('用户所在地:', this.location);
+						} else {
+							console.error('获取位置失败:', res.data);
+						}
+					},
+					fail: (err) => {
+						console.error('请求失败:', err);
+					}
+				});
+			},
+			formatNumber(num) {
+				if (typeof num !== 'number') {
+					num = Number(num) || 0;
+				}
+				if (num < 10000) {
+					return num.toString();
+				}
+				// 处理万以上的数字
+				const wan = num / 10000;
+				if (wan < 10) {
+					// 1万-10万之间,保留2位小数
+					const rounded = Math.round(wan * 100) / 100;
+					return rounded.toFixed(2).replace(/\.?0+$/, '') + 'w';
+				} else if (wan < 10000) {
+					// 10万-1亿之间,保留1位小数
+					const rounded = Math.round(wan * 10) / 10;
+					return rounded.toFixed(1).replace(/\.0$/, '') + 'w';
+				} else {
+					// 1亿以上,转换为亿单位
+					const yi = wan / 10000;
+					const rounded = Math.round(yi * 100) / 100;
+					return rounded.toFixed(2).replace(/\.?0+$/, '') + '亿';
+				}
+			},
+			// 重置所有状态
+			resetAllStates() {
+				this.liveUserCalled = false;
+				this.talklist = [];
+				this.liveViewersData = [];
+				this.liveViewers = [];
+				this.products = [];
+				this.liveItem = [];
+
+				// 重置WebSocket相关状态
+				this.isSocketOpen = false;
+				this.isConnecting = false;
+				this.isManualClose = true;
+				this.reconnectCount = 0;
+				this.heartBeatRetryCount = 0;
+				this.lastHeartBeatTime = 0;
+				this.adaptiveHeartBeatInterval = this.heartBeatInterval;
+				this.isNetworkAvailable = true;
+				this.networkType = 'unknown';
+
+				// 重置性能监控数据
+				this.connectionStartTime = 0;
+				this.connectionLatency = 0;
+				this.messageCount = 0;
+				this.errorCount = 0;
+				this.lastPerformanceCheck = 0;
+			},
+
+			// 获取WebSocket性能统计
+			getWebSocketPerformanceStats() {
+				const now = Date.now();
+				const uptime = this.connectionStartTime > 0 ? now - this.connectionStartTime : 0;
+
+				return {
+					connectionLatency: this.connectionLatency,
+					uptime: uptime,
+					messageCount: this.messageCount,
+					errorCount: this.errorCount,
+					errorRate: this.messageCount > 0 ? (this.errorCount / this.messageCount * 100).toFixed(2) : 0,
+					messagesPerSecond: uptime > 0 ? (this.messageCount / (uptime / 1000)).toFixed(2) : 0,
+					networkType: this.networkType,
+					isConnected: this.isSocketAvailable(),
+					reconnectCount: this.reconnectCount
+				};
+			},
+
+			// 定期检查性能并输出统计信息
+			performanceCheck() {
+				const now = Date.now();
+				// 每5分钟输出一次性能统计
+				if (now - this.lastPerformanceCheck > 300000) { // 5分钟
+					const stats = this.getWebSocketPerformanceStats();
+					console.log('WebSocket性能统计:', stats);
+					this.lastPerformanceCheck = now;
+
+					// 如果错误率过高,记录警告
+					if (stats.errorRate > 10) {
+						console.warn(`WebSocket错误率过高: ${stats.errorRate}%`);
+					}
+
+					// 如果连接延迟过高,记录警告
+					if (stats.connectionLatency > 5000) {
+						console.warn(`WebSocket连接延迟过高: ${stats.connectionLatency}ms`);
+					}
+				}
+			},
+
+			// 定期清理视频缓存
+			startVideoCacheCleanup() {
+				if (this.videoCleanupTimer) {
+					clearInterval(this.videoCleanupTimer);
+				}
+
+				// 每30秒清理一次视频缓存
+				this.videoCleanupTimer = setInterval(() => {
+					this.cleanupVideoCache();
+				}, 30000);
+			},
+			// 清理视频缓存
+			cleanupVideoCache() {
+				if (!this.liveItem || !this.liveId) return;
+
+				// 只对录播视频进行清理
+				if (this.liveItem.liveType === 2 && this.liveItem.videoUrl) {
+					this.reloadVideoPlayer();
+				}
+			},
+			// 重新加载视频播放器
+			reloadVideoPlayer() {
+				const videoId = `myVideo_${this.liveId}`;
+				const videoContext = uni.createVideoContext(videoId, this);
+
+				if (videoContext) {
+					const currentTime = this.videoCurrentTime;
+					// 暂停视频
+					videoContext.pause();
+					// 延迟重新加载
+					setTimeout(() => {
+						// 重新设置视频源,强制清理缓存
+						this.$set(this.liveItem, 'videoUrl', this.liveItem.videoUrl + '&t=' + Date.now());
+
+						// 恢复播放位置
+						setTimeout(() => {
+							if (videoContext.seek) {
+								videoContext.seek(currentTime);
+							}
+							videoContext.play();
+						}, 500);
+					}, 100);
+				}
+			},
+			// 启动内存监控
+			startMemoryMonitoring() {
+				if (this.memoryMonitorTimer) {
+					clearInterval(this.memoryMonitorTimer);
+				}
+				this.memoryMonitorTimer = setInterval(() => {
+					this.checkMemoryUsage();
+				}, 15000); // 每15秒检查一次
+			},
+
+
+			// 检查内存使用情况
+			checkMemoryUsage() {
+				try {
+					// 检查定时器数量
+					const timerCount = this.getActiveTimerCount();
+					if (timerCount > 10) {
+						console.warn(`检测到过多定时器: ${timerCount}个,可能存在内存泄漏`);
+						this.cleanupUnusedTimers();
+					}
+
+					// 检查消息队列长度
+					if (this.messageQueue && this.messageQueue.length > 100) {
+						console.warn(`消息队列过长: ${this.messageQueue.length}条,清理旧消息`);
+						this.messageQueue = this.messageQueue.slice(-50); // 只保留最新50条
+					}
+
+					// 检查用户颜色缓存
+					if (this.userRandomColors && Object.keys(this.userRandomColors).length > 500) {
+						console.warn('用户颜色缓存过大,清理部分缓存');
+						const keys = Object.keys(this.userRandomColors);
+						const keysToRemove = keys.slice(0, keys.length - 200); // 只保留最新200个
+						keysToRemove.forEach(key => delete this.userRandomColors[key]);
+					}
+
+					// 定期触发垃圾回收
+					if (Date.now() - this.lastPerformanceCheck > 60000) { // 每分钟一次
+						this.triggerGarbageCollection();
+						this.lastPerformanceCheck = Date.now();
+					}
+				} catch (error) {
+					console.error('内存检查失败:', error);
+				}
+			},
+
+
+
+			// 强制内存清理
+			forceMemoryCleanup() {
+				console.log('执行强制内存清理');
+
+				// 1. 清理视频播放器
+				this.cleanupVideoPlayer();
+
+				// 2. 清理大数据
+				this.clearBigData();
+
+				// 3. 强制垃圾回收(在支持的环境下)
+				this.triggerGarbageCollection();
+			},
+			// 清理视频播放器
+			cleanupVideoPlayer() {
+				const videoId = `myVideo_${this.liveId}`;
+				const videoContext = uni.createVideoContext(videoId, this);
+
+				if (videoContext) {
+					// 停止播放
+					videoContext.stop();
+
+					// 重置视频源
+					setTimeout(() => {
+						this.$set(this.liveItem, 'videoUrl', '');
+						setTimeout(() => {
+							this.$set(this.liveItem, 'videoUrl', this.getFreshVideoUrl());
+							this.playVideo();
+						}, 500);
+					}, 100);
+				}
+			},
+			// 获取带时间戳的新视频URL
+			getFreshVideoUrl() {
+				if (!this.liveItem.originalVideoUrl) {
+					this.liveItem.originalVideoUrl = this.liveItem.videoUrl;
+				}
+
+				// 添加时间戳参数,避免缓存
+				const separator = this.liveItem.originalVideoUrl.includes('?') ? '&' : '?';
+				return this.liveItem.originalVideoUrl + separator + 't=' + Date.now();
+			},
+			// 清理大数据
+			clearBigData() {
+				// 清理聊天记录,只保留最近50条
+				if (this.talklist.length > 50) {
+					this.talklist = this.talklist.slice(-50);
+				}
+				// 清理观众数据
+				if (this.liveViewersData.length > 100) {
+					this.liveViewersData = this.liveViewersData.slice(-100);
+				}
+
+				// 清理虚拟数据
+				if (this.liveViewers.length > 100) {
+					this.liveViewers = this.liveViewers.slice(-100);
+				}
+
+				// 清理商品数据
+				if (this.products.length > 50) {
+					this.products = this.products.slice(0, 50);
+				}
+
+				// 强制垃圾回收(如果支持)
+				if (typeof gc === 'function') {
+					gc();
+				}
+			},
+
+
+			// 触发垃圾回收(在支持的环境下)
+			triggerGarbageCollection() {
+				if (wx && wx.triggerGC) {
+					wx.triggerGC();
+				}
+			},
+
+			// 强制滚动到底部(备用方案)
+			forceScrollToBottom() {
+				console.log('执行强制滚动到底部');
+
+				// 方案1:直接设置一个很大的scrollTop值
+				this.scrollTop = 999999;
+
+				// 方案2:使用scroll-into-view滚动到最后一个元素
+				this.$nextTick(() => {
+					if (this.talklist && this.talklist.length > 0) {
+						const lastMessage = this.talklist[this.talklist.length - 1];
+						const targetId = `list_${lastMessage.uniqueId || (this.talklist.length - 1)}`;
+						console.log(
+							`尝试滚动到元素: ${targetId}, 当前消息数量: ${this.talklist.length}, 最后消息ID: ${lastMessage.uniqueId}`
+						);
+
+						this.scrollIntoView = targetId;
+
+						// 清除scroll-into-view,避免影响后续滚动
+						setTimeout(() => {
+							this.scrollIntoView = '';
+						}, 200);
+					}
+
+					// 方案3:使用更大的延迟再次设置scrollTop
+					setTimeout(() => {
+						this.scrollTop = 999999;
+						console.log('延迟设置scrollTop为999999');
+					}, 100);
+
+					// 方案4:300ms后使用原生API作为最终备用方案
+					setTimeout(() => {
+						this.nativeScrollToBottom();
+					}, 300);
+				});
+			},
+
+			// 可靠的滚动方法(包含多种备用方案)
+			simpleScrollToBottom() {
+				const now = Date.now();
+
+				// 防抖检查:如果距离上次滚动时间太短,则忽略
+				if (now - this.lastScrollTime < this.scrollDebounceDelay) {
+					console.log('滚动防抖:忽略频繁调用');
+					return;
+				}
+
+				this.lastScrollTime = now;
+				console.log('执行可靠滚动到底部');
+
+				// 清理之前的定时器
+				if (this.scrollTimer) {
+					clearTimeout(this.scrollTimer);
+					this.scrollTimer = null;
+				}
+
+				// 方案1:直接设置scrollTop
+				this.scrollTop = 999999999;
+				console.log('方案1: 设置scrollTop为999999999');
+
+				// 方案2:使用scroll-into-view(备用方案)
+				if (this.talklist.length > 0) {
+					const lastMessage = this.talklist[this.talklist.length - 1];
+					if (lastMessage && lastMessage.uniqueId) {
+						this.scrollIntoView = `msg-${lastMessage.uniqueId}`;
+						console.log(`方案2: 设置scrollIntoView为msg-${lastMessage.uniqueId}`);
+					}
+				}
+
+				// 方案3:延迟再次设置scrollTop(最终备用方案)
+				this.scrollTimer = setTimeout(() => {
+					this.scrollTop = 999999999;
+					console.log('方案3: 延迟设置scrollTop为999999999');
+					this.scrollTimer = null;
+				}, 50);
+			},
+
+			// 强制滚动到底部(用于发送消息,绕过防抖限制)
+			forceScrollToBottomOnSend() {
+				console.log('执行强制滚动到底部(发送消息专用)');
+
+				// 清理之前的定时器
+				if (this.scrollTimer) {
+					clearTimeout(this.scrollTimer);
+					this.scrollTimer = null;
+				}
+
+				// 强制更新滚动时间,确保不被防抖阻止
+				this.lastScrollTime = Date.now();
+
+				// 清除scroll-into-view,避免冲突
+				this.scrollIntoView = '';
+
+				// 方案1:立即使用scroll-into-view滚动到最后一条消息
+				if (this.talklist.length > 0) {
+					const lastMessage = this.talklist[this.talklist.length - 1];
+					if (lastMessage && lastMessage.uniqueId) {
+						this.scrollIntoView = `list_${lastMessage.uniqueId}`;
+						//console.log(`强制滚动方案1: 设置scrollIntoView为list_${lastMessage.uniqueId}`);
+					}
+				}
+
+				// 方案2:同时设置scrollTop为一个非常大的值
+				const targetScrollTop = Date.now(); // 使用时间戳确保每次都不同
+				this.scrollTop = targetScrollTop;
+				//console.log('强制滚动方案2: 设置scrollTop为', targetScrollTop);
+
+				// 方案3:立即尝试原生滚动
+				this.nativeScrollToBottom();
+
+				// 方案4:使用nextTick确保DOM更新后再次滚动
+				this.$nextTick(() => {
+					// 清除scroll-into-view后重新设置scrollTop
+					this.scrollIntoView = '';
+					this.scrollTop = targetScrollTop + 1;
+					//console.log('强制滚动方案3: nextTick后重新设置scrollTop');
+					// 再次尝试原生滚动
+					setTimeout(() => {
+						this.nativeScrollToBottom();
+					}, 50);
+				});
+
+				// 方案5:延迟检查和强制滚动(最终保障)
+				this.scrollTimer = setTimeout(() => {
+					this.checkAndForceScroll(targetScrollTop);
+					this.scrollTimer = null;
+				}, 200);
+			},
+
+			// 检查并强制滚动
+			checkAndForceScroll(targetScrollTop) {
+				//console.log(`检查滚动状态: 当前位置=${this.currentScrollTop}, 目标位置=${targetScrollTop}`);
+				// 无论当前位置如何,都尝试强制滚动到底部
+				// 使用scroll-into-view滚动到最后一条消息
+				if (this.talklist.length > 0) {
+					const lastMessage = this.talklist[this.talklist.length - 1];
+					if (lastMessage && lastMessage.uniqueId) {
+						this.scrollIntoView = `list_${lastMessage.uniqueId}`;
+						//console.log(`最终检查: 设置scrollIntoView为list_${lastMessage.uniqueId}`);
+					}
+				}
+
+				// 设置一个新的scrollTop值
+				this.scrollTop = Date.now() + Math.random() * 1000;
+				//console.log('最终检查: 设置新的scrollTop值');
+
+				// 多次尝试原生滚动
+				this.nativeScrollToBottom();
+
+				setTimeout(() => {
+					this.nativeScrollToBottom();
+				}, 100);
+
+			},
+
+			// 使用原生API强制滚动(最终备用方案)
+			nativeScrollToBottom() {
+				try {
+					// 方案1:使用uni.createSelectorQuery直接操作DOM
+					const query = uni.createSelectorQuery().in(this);
+					query.select('#msgScroll').node((res) => {
+						if (res && res.node) {
+							// console.log('找到msgScroll节点,执行原生滚动');
+							const scrollHeight = res.node.scrollHeight;
+							res.node.scrollTop = scrollHeight;
+
+							// 确保滚动生效,延迟再次设置
+							setTimeout(() => {
+								res.node.scrollTop = scrollHeight + 100;
+							}, 50);
+						}
+					}).exec();
+
+					// 方案2:同时使用scrollIntoView API
+					// query.select('#msgScroll').scrollIntoView({
+					// 	duration: 0,
+					// 	complete: () => {
+					// 		console.log('scrollIntoView完成');
+					// 	}
+					// }).exec();
+
+					// 方案3:尝试获取最后一个消息元素并滚动到它
+					// if (this.talklist.length > 0) {
+					// 	const lastMessage = this.talklist[this.talklist.length - 1];
+					// 	if (lastMessage && lastMessage.uniqueId) {
+					// 		query.select(`#list_${lastMessage.uniqueId}`).scrollIntoView({
+					// 			duration: 0,
+					// 			complete: () => {
+					// 				console.log('最后消息元素滚动完成');
+					// 			}
+					// 		}).exec();
+					// 	}
+					// }
+
+				} catch (error) {
+					console.error('原生滚动失败:', error);
+				}
+			},
+
+			// 监听滚动事件
+			onScroll(e) {
+				this.currentScrollTop = e.detail.scrollTop;
+				// console.log('当前滚动位置:', this.currentScrollTop);
+			},
+			// 停止内存监控
+			stopMemoryMonitor() {
+				if (this.memoryMonitorTimer) {
+					clearInterval(this.memoryMonitorTimer);
+					this.memoryMonitorTimer = null;
+				}
+			},
+			// 获取活跃定时器数量
+			getActiveTimerCount() {
+				const timers = [
+					'trafficTimer', 'pingTimeoutTimer', 'heartBeatTimer', 'liveViewDataTimer',
+					'reconnectTimer', 'scrollTimer', 'searchTimer', 'purchasePromptTimer',
+					'welcomeTimer', 'redTimer', 'liveStartTimer', 'lotteryTimer',
+					'memoryMonitorTimer', 'networkStatusTimer', 'networkRetryTimer'
+				];
+
+				return timers.filter(timer => this[timer] !== null).length;
+			},
+
+			// 清理未使用的定时器
+			cleanupUnusedTimers() {
+				// 检查并清理可能泄漏的定时器
+				const timers = [
+					'trafficTimer', 'pingTimeoutTimer', 'heartBeatTimer', 'liveViewDataTimer',
+					'reconnectTimer', 'scrollTimer', 'searchTimer', 'purchasePromptTimer',
+					'welcomeTimer', 'redTimer', 'liveStartTimer', 'lotteryTimer', 'noticeTimer',
+					'networkStatusTimer', 'networkRetryTimer'
+				];
+
+				timers.forEach(timerName => {
+					if (this[timerName] && typeof this[timerName] === 'number') {
+						// 检查定时器是否还在运行
+						if (timerName.includes('Interval')) {
+							clearInterval(this[timerName]);
+						} else {
+							clearTimeout(this[timerName]);
+						}
+						this[timerName] = null;
+						console.log(`清理了可能泄漏的定时器: ${timerName}`);
+					}
+				});
+			},
+
+			// 增强的定时器清理方法
+			clearAllTimersEnhanced() {
+				// 先调用原有的清理方法
+				this.clearAllTimers();
+
+				// 额外清理新增的定时器
+				if (this.networkRetryTimer) {
+					clearTimeout(this.networkRetryTimer);
+					this.networkRetryTimer = null;
+				}
+
+				// 停止内存监控
+				this.stopMemoryMonitor();
+
+				// 清理缓存数据
+				this.userRandomColors = Object.create(null);
+				this.shownEntryUsers.clear();
+
+				// 重置性能监控数据
+				this.messageCount = 0;
+				this.errorCount = 0;
+				this.connectionLatency = 0;
+				this.lastPerformanceCheck = 0;
+
+				console.log('增强清理完成:所有定时器和缓存已清理');
+			},
+
+			goMiniProgram() {
+				// uni.navigateToMiniProgram({
+				// 	appId: 'wx45cf09091aead547',
+				// 	path: '/pages/home/index',
+				// 	success: function(res) {
+				// 		console.log('跳转成功', res);
+				// 	},
+				// 	fail: function(err) {
+				// 		console.error('跳转失败', err);
+				// 	}
+				// });
+				uni.showToast({
+					title: '系统升级中,兑换请联系伴学助手!',
+					icon: 'none'
+				});
+			},
+			// 阻止双击事件
+			preventDoubleClick(e) {
+				e.preventDefault();
+				e.stopPropagation();
+				return false;
+			},
+
+			// 清理所有定时器和内存
+			clearAllTimers() {
+				// 清理所有定时器
+				const timers = [
+					'scrollTimer',
+					'liveViewDataTimer',
+					'redTimer',
+					'liveStartTimer',
+					'lotteryTimer',
+					'noticeTimer',
+					'welcomeTimer',
+					'trafficInterval',
+					'lookTimer',
+					'trafficTimer',
+					'intervalId',
+					'reconnectTimer',
+					'searchTimer',
+					'purchasePromptTimer',
+					'heartBeatTimer',
+					'pingTimeoutTimer'
+				];
+
+				timers.forEach((timer) => {
+					if (this[timer]) {
+						if (timer.includes('Interval') || timer.includes('Timer')) {
+							clearInterval(this[timer]);
+						} else {
+							clearTimeout(this[timer]);
+						}
+						this[timer] = null;
+					}
+				});
+
+				// 重置相关状态
+				this.stayTime = 0;
+				this.startTime = 0;
+				this.totalTraffic = 0;
+				this.scrollPending = false;
+				this.reconnectCount = 0;
+				this.heartBeatRetryCount = 0;
+			},
+
+			//直播计算流量
+			startTrafficCalculation(bitrate) {
+				if (this.trafficTimer) {
+					clearInterval(this.trafficTimer);
+					this.trafficTimer = null;
+				}
+				this.startTime = Date.now();
+				var that = this;
+				this.trafficTimer = setInterval(() => {
+					that.calculateTraffic(bitrate);
+				}, 10000); // 每10秒计算一次
+			},
+			// 计算流量
+			calculateTraffic(bitrate) {
+				const currentTime = Date.now();
+				const duration = (currentTime - this.startTime) / 1000; // 持续时间(秒)
+				// 流量 = 码率 × 时间
+				// 码率单位: bps, 时间单位: 秒, 流量单位: 比特
+				const trafficBits = bitrate * duration;
+				// 转换为字节
+				this.totalTraffic = trafficBits / 8;
+				this.getLiveInternetTraffic();
+			},
+
+			startTimer() {
+				this.startTime = Date.now();
+				this.lookTimer = setInterval(() => {
+					this.stayTime = Math.floor((Date.now() - this.startTime) / 1000);
+				}, 1000);
+			},
+
+			//直播、录播缓冲
+			getLiveInternetTraffic() {
+				if (!this.liveId) return;
+				const currentTime = (this.stayTime / this.liveItem.duration) * 100;
+				const param = {
+					userId: this.userData.userId || '',
+					liveId: this.liveId || '',
+					uuId: dayjs().format('YYYYMMDD') + this.uuId,
+					internetTraffic: this.totalTraffic
+				};
+				liveInternetTraffic(param);
+			},
+			// 回放、预告缓冲
+			getInternetTraffic() {
+				if (!this.liveId || !this.liveId || !this.userData.userId || !this.uuId) return;
+				const currentTime = (this.stayTime / this.liveItem.duration) * 100;
+				const param = {
+					videoType: this.liveItem.videoType,
+					videoId: this.liveItem.videoId,
+					userId: this.userData.userId,
+					liveId: this.liveId,
+					uuId: dayjs().format('YYYYMMDD') + this.uuId,
+					duration: this.liveItem.duration,
+					bufferRate: currentTime
+				};
+				if (this.liveItem.status == 1) {
+					param.videoType = this.liveItem.previewVideoType || '';
+					param.videoId = this.liveItem.previewVideoId || '';
+				}
+				if (this.liveItem.liveType == 1) {
+					param.bufferRate = this.totalTraffic;
+				}
+				internetTraffic(param);
+			},
+			scrollToBottom() {
+				const now = Date.now();
+				// 防抖检查:如果距离上次滚动时间太短,则忽略
+				if (now - this.lastScrollTime < this.scrollDebounceDelay) {
+					console.log('滚动防抖:忽略频繁调用');
+					return;
+				}
+				this.lastScrollTime = now;
+				// 清理之前的定时器
+				if (this.scrollTimer) {
+					clearTimeout(this.scrollTimer);
+					this.scrollTimer = null;
+				}
+				// 直接设置滚动位置
+				this.scrollTop = 999999999;
+
+			},
+
+			// 启动内存监控
+			startMemoryMonitor() {
+				// 清理之前的监控
+				if (this.memoryMonitorTimer) {
+					clearInterval(this.memoryMonitorTimer);
+				}
+				// 每5分钟检查一次内存使用情况
+				this.memoryMonitorTimer = setInterval(() => {
+					this.checkAndCleanMemory();
+				}, 5 * 60 * 1000); // 5分钟
+			},
+
+			// 检查并清理内存
+			checkAndCleanMemory() {
+				try {
+					// 清理过多的聊天消息
+					if (this.talklist && this.talklist.length > 25) {
+						const keepCount = 20;
+						this.talklist.splice(0, this.talklist.length - keepCount);
+					}
+
+					// 清理用户颜色缓存(保留最近的50个)
+					if (this.userRandomColors && Object.keys(this.userRandomColors).length > 50) {
+						const entries = Object.entries(this.userRandomColors);
+						const keepEntries = entries.slice(-50);
+						this.userRandomColors = Object.fromEntries(keepEntries);
+					}
+
+					// 清理已显示用户集合(保留最近的100个)
+					if (this.shownEntryUsers && this.shownEntryUsers.size > 100) {
+						const array = Array.from(this.shownEntryUsers);
+						this.shownEntryUsers.clear();
+						array.slice(-100).forEach((id) => this.shownEntryUsers.add(id));
+					}
+
+					console.log('内存清理完成');
+				} catch (error) {
+					console.error('内存清理失败:', error);
+				}
+			},
+
+			// 恢复页面活动
+			async resumePageActivity() {
+				if (this.liveItem) {
+					await this.getliving(this.liveId);
+					this.startTimeTimer(this.liveItem);
+				}
+				if (!this.isSocketAvailable()) {
+					this.initSocket();
+				}
+			},
+
+			// 获取用户专属随机色(缓存机制:同一用户始终用同一颜色)
+			getUserRandomColor(userId) {
+				if (!userId) {
+					return '#8978e2'; // 默认颜色
+				}
+				//如果缓存中已有该用户的颜色,直接返回
+				if (this.userRandomColors[userId]) {
+					return this.userRandomColors[userId];
+				}
+				//为新用户生成固定颜色(基于用户ID生成,不是完全随机)
+				const color = this.generateStableColor(userId);
+				this.userRandomColors[userId] = color;
+				// 存储到本地缓存,确保页面刷新后颜色不变
+				this.saveUserColorsToStorage();
+				return color;
+			}, // 基于用户ID生成稳定颜色(不是完全随机)
+			generateStableColor(userId) {
+				// 将用户ID转换为数字种子
+				let seed = 0;
+				for (let i = 0; i < userId.length; i++) {
+					seed = (seed * 31 + userId.charCodeAt(i)) % 1000000;
+				}
+				const colorPool = [
+					'#FF6B6B',
+					'#4ECDC4',
+					'#45B7D1',
+					'#96CEB4',
+					'#FFEAA7',
+					'#DDA0DD',
+					'#98D8C8',
+					'#F7DC6F',
+					'#BB8FCE',
+					'#85C1E9',
+					'#F8C471',
+					'#82E0AA',
+					'#F1948A',
+					'#85C1E9',
+					'#D7BDE2'
+				];
+				return colorPool[seed % colorPool.length];
+			},
+			// 保存颜色映射到本地存储
+			saveUserColorsToStorage() {
+				try {
+					uni.setStorageSync('userRandomColors', this.userRandomColors);
+				} catch (e) {
+					console.warn('保存用户颜色缓存失败:', e);
+				}
+			},
+			// 从本地存储加载颜色映射
+			loadUserColorsFromStorage() {
+				try {
+					const cached = uni.getStorageSync('userRandomColors');
+					if (cached) {
+						this.userRandomColors = cached;
+					}
+				} catch (e) {
+					console.warn('加载用户颜色缓存失败:', e);
+				}
+			},
+			//头像名字
+			getNicknameInitial(nickName) {
+				if (!nickName || typeof nickName !== 'string') return '未';
+				if (/^[\u4e00-\u9fa5]/.test(nickName[0])) {
+					return nickName[0];
+				}
+				return nickName[0].toUpperCase();
+			},
+
+			async getUserInfo() {
+				await getUserInfo().then(
+					(res) => {
+						if (res.code == 200) {
+							this.userData = res.user;
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: '请求失败'
+							});
+						}
+					},
+					(rej) => {}
+				);
+			},
+
+			//订阅消息
+			handleAgreement() {
+				const templateId = this.templateId;
+				uni.requestSubscribeMessage({
+					tmplIds: [templateId],
+					success: (res) => {
+						// console.log("模板订阅状态", res[templateId]);
+						if (res[templateId] === 'accept') {
+							uni.showToast({
+								title: '订阅成功,开播将提醒您',
+								icon: 'success'
+							});
+							this.callSendMessageApi();
+						} else if (res[templateId] === 'reject') {
+							uni.showToast({
+								title: '您已拒绝订阅,将无法收到提醒',
+								icon: 'none'
+							});
+						} else if (res[templateId] === 'ban') {
+							uni.showToast({
+								title: '您已关闭所有订阅权限,请在设置中开启',
+								icon: 'none'
+							});
+						}
+					},
+					fail: (err) => {
+						console.error('订阅消息失败', err);
+						uni.showToast({
+							title: '订阅失败,请重试',
+							icon: 'none'
+						});
+					}
+				});
+			},
+			async callSendMessageApi() {
+				if (!this.userData.userId) return;
+				const templateData = {
+					liveId: this.liveId,
+					userId: this.userData.userId,
+					templateId: this.templateId, // 模板ID
+					data: {
+						thing6: this.liveItem.liveName,
+						date7: this.liveItem.startTime
+					}
+				};
+				subNotifyLive(templateData).then(
+					(res) => {
+						if (res.code == 200) {
+							this.isAgreement = true;
+							uni.setStorageSync('isAgreement', true);
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					(rej) => {}
+				);
+			},
+
+			//发送心跳
+			sendHeartBeat() {
+				if (!this.isSocketAvailable() || !this.isNetworkAvailable) {
+					console.warn('网络不可用或Socket连接异常,跳过心跳发送');
+					return;
+				}
+
+				this.lastHeartBeatTime = Date.now();
+
+				try {
+					const heartBeatMsg = JSON.stringify({
+						cmd: 'heartbeat',
+						msg: 'ping',
+						userId: this.userData.userId || '',
+						liveId: this.liveId,
+						timestamp: this.lastHeartBeatTime,
+						networkType: this.networkType
+					});
+
+					this.socket.send({
+						data: heartBeatMsg,
+						success: () => {
+							this.heartBeatRetryCount = 0; // 成功后重置重试次数
+							this.adjustHeartBeatInterval(true); // 网络良好,可适当延长间隔
+							this.startPingTimeout(); // 启动超时检测
+						},
+						fail: (err) => {
+							console.error('心跳包发送失败:', err);
+							this.heartBeatRetryCount++;
+							this.adjustHeartBeatInterval(false); // 网络不稳定,缩短间隔
+
+							// 根据网络类型调整重试策略
+							const retryDelay = this.getRetryDelay();
+
+							if (this.heartBeatRetryCount < this.maxHeartBeatRetries) {
+								setTimeout(() => this.sendHeartBeat(), retryDelay);
+							} else {
+								this.heartBeatRetryCount = 0;
+								this.handleReconnect(); // 重试用完才重连
+							}
+						}
+					});
+				} catch (err) {
+					console.error('心跳发送异常:', err);
+					this.heartBeatRetryCount++;
+
+					const retryDelay = this.getRetryDelay();
+					if (this.heartBeatRetryCount < this.maxHeartBeatRetries) {
+						setTimeout(() => this.sendHeartBeat(), retryDelay);
+					} else {
+						this.heartBeatRetryCount = 0;
+						this.handleReconnect();
+					}
+				}
+			},
+
+			// 根据网络状态获取重试延迟
+			getRetryDelay() {
+				const baseDelay = 2000;
+				const retryMultiplier = Math.pow(1.5, this.heartBeatRetryCount); // 指数退避
+
+				// 根据网络类型调整延迟
+				let networkMultiplier = 1;
+				switch (this.networkType) {
+					case '2g':
+						networkMultiplier = 3;
+						break;
+					case '3g':
+						networkMultiplier = 2;
+						break;
+					case '4g':
+					case '5g':
+						networkMultiplier = 1;
+						break;
+					case 'wifi':
+						networkMultiplier = 0.8;
+						break;
+					default:
+						networkMultiplier = 1.5;
+				}
+
+				return Math.min(baseDelay * retryMultiplier * networkMultiplier, 10000); // 最大10秒
+			},
+
+			// 自适应调整心跳间隔
+			adjustHeartBeatInterval(isSuccess) {
+				if (isSuccess) {
+					// 连接稳定,可适当延长间隔(最大30秒)
+					this.adaptiveHeartBeatInterval = Math.min(this.adaptiveHeartBeatInterval * 1.1, 30000);
+				} else {
+					// 连接不稳定,缩短间隔(最小10秒)
+					this.adaptiveHeartBeatInterval = Math.max(this.adaptiveHeartBeatInterval * 0.9, 10000);
+				}
+			},
+			// 启动心跳超时检测
+			startPingTimeout() {
+				// 清除现有的ping超时定时器
+				if (this.pingTimeoutTimer) {
+					clearTimeout(this.pingTimeoutTimer);
+					this.pingTimeoutTimer = null;
+				}
+				// 启动新的ping超时定时器
+				this.pingTimeoutTimer = setTimeout(() => {
+					console.warn('心跳超时,触发重连');
+					// 清理当前定时器引用
+					this.pingTimeoutTimer = null;
+					// 增加心跳重试次数
+					this.heartBeatRetryCount++;
+					// 如果重试次数未达到上限,先尝试重发心跳
+					if (this.heartBeatRetryCount < this.maxHeartBeatRetries) {
+						console.log(`心跳超时,尝试重发 (${this.heartBeatRetryCount}/${this.maxHeartBeatRetries})`);
+						setTimeout(() => this.sendHeartBeat(), 1000);
+					} else {
+						console.log('心跳重试次数用尽,触发重连');
+						this.heartBeatRetryCount = 0;
+						this.handleReconnect();
+					}
+				}, this.pingTimeout);
+			},
+			stopHeartBeat() {
+				if (this.heartBeatTimer) {
+					clearInterval(this.heartBeatTimer);
+					this.heartBeatTimer = null;
+				}
+				if (this.pingTimeoutTimer) {
+					clearTimeout(this.pingTimeoutTimer);
+					this.pingTimeoutTimer = null;
+				}
+			}, // 封装通用的连接状态校验方法
+			isSocketAvailable() {
+				// WebSocket readyState:0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED
+				return this.socket && this.isSocketOpen && this.socket.readyState === 1;
+			},
+			// 处理重连逻辑
+			handleReconnect() {
+				if (this.isManualClose) {
+					console.log('手动关闭连接,不进行重连');
+					return;
+				}
+
+				// 防止重复重连
+				if (this.reconnectTimer) {
+					console.log('重连已在进行中,跳过重复重连');
+					return;
+				}
+
+				this.stopHeartBeat();
+
+				// 检查网络状态
+				if (!this.isNetworkAvailable) {
+					console.warn('网络不可用,延迟重连');
+					this.reconnectTimer = setTimeout(() => {
+						this.reconnectTimer = null;
+						this.handleReconnect();
+					}, 5000);
+					return;
+				}
+
+				if (this.reconnectCount < this.maxReconnectAttempts) {
+					this.reconnectCount++;
+
+					// 指数退避算法:基础延迟 * 2^(重连次数-1) + 随机抖动
+					const baseDelay = 1000;
+					const exponentialDelay = baseDelay * Math.pow(2, this.reconnectCount - 1);
+					const jitter = Math.random() * 1000; // 随机抖动,避免同时重连
+					const totalDelay = Math.min(exponentialDelay + jitter, 30000); // 最大30秒
+
+					console.log(`第${this.reconnectCount}次重连,延迟${Math.round(totalDelay)}ms,网络类型:${this.networkType}`);
+
+					this.reconnectTimer = setTimeout(() => {
+						this.reconnectTimer = null; // 清理定时器引用
+						// 重连前再次检查网络状态和连接状态
+						if (this.isNetworkAvailable && !this.isManualClose && !this.isSocketAvailable()) {
+							console.log('开始执行重连...');
+							this.initSocket();
+						} else if (this.isSocketAvailable()) {
+							console.log('连接已恢复,取消重连');
+							this.reconnectCount = 0; // 重置重连计数
+						} else {
+							console.warn('重连时网络不可用或已手动关闭');
+							this.handleReconnect(); // 递归重试
+						}
+					}, totalDelay);
+				} else {
+					console.log(`已达最大重连次数(${this.maxReconnectAttempts}),停止重连`);
+					this.showReconnectFailedMessage();
+				}
+			},
+
+			// 显示重连失败提示
+			showReconnectFailedMessage() {
+				uni.showToast({
+					title: '网络连接异常,请检查网络后重新进入',
+					icon: 'none',
+					duration: 3000
+				});
+			},
+
+			// 统一处理连接错误
+			handleConnectionError(errorType, error) {
+				console.error(`WebSocket ${errorType}:`, error);
+
+				// 根据错误类型进行不同处理
+				if (errorType === '连接请求失败') {
+					// 连接请求失败,可能是网络问题或服务器问题
+					if (!this.isNetworkAvailable) {
+						console.warn('网络不可用,等待网络恢复后重连');
+						return;
+					}
+				}
+
+				// 触发重连
+				this.handleReconnect();
+			},
+			// 重置重连状态
+			resetReconnectState() {
+				this.reconnectCount = 0;
+				this.heartBeatRetryCount = 0;
+
+				// 清理重连定时器
+				if (this.reconnectTimer) {
+					clearTimeout(this.reconnectTimer);
+					this.reconnectTimer = null;
+				}
+
+				// 重置自适应心跳间隔
+				this.adaptiveHeartBeatInterval = this.heartBeatInterval;
+			},
+
+			// 初始化网络状态监听
+			initNetworkStatusListener() {
+				// 获取当前网络状态
+				uni.getNetworkType({
+					success: (res) => {
+						this.networkType = res.networkType;
+						this.isNetworkAvailable = res.networkType !== 'none';
+						console.log('当前网络类型:', res.networkType);
+					}
+				});
+
+				// 监听网络状态变化
+				uni.onNetworkStatusChange((res) => {
+					const oldNetworkType = this.networkType;
+					const oldNetworkAvailable = this.isNetworkAvailable;
+
+					this.networkType = res.networkType;
+					this.isNetworkAvailable = res.isConnected;
+
+					console.log(`网络状态变化: ${oldNetworkType} -> ${res.networkType}, 连接状态: ${res.isConnected}`);
+
+					// 网络从不可用变为可用时,尝试重连
+					if (!oldNetworkAvailable && res.isConnected) {
+						console.log('网络恢复,尝试重连WebSocket');
+						this.resetReconnectState();
+						setTimeout(() => {
+							if (!this.isSocketAvailable()) {
+								this.initSocket();
+							}
+						}, 1000);
+					}
+
+					// 网络类型变化时,调整心跳策略
+					if (oldNetworkType !== res.networkType && res.isConnected) {
+						this.adjustHeartBeatForNetworkType(res.networkType);
+					}
+
+					// 网络断开时停止心跳
+					if (!res.isConnected) {
+						console.warn('网络断开,停止心跳');
+						this.stopHeartBeat();
+					}
+				});
+			},
+
+			// 根据网络类型调整心跳策略
+			adjustHeartBeatForNetworkType(networkType) {
+				let newInterval = this.heartBeatInterval;
+				switch (networkType) {
+					case '2g':
+						newInterval = 30000; // 2G网络,30秒间隔
+						break;
+					case '3g':
+						newInterval = 20000; // 3G网络,20秒间隔
+						break;
+					case '4g':
+					case '5g':
+						newInterval = 15000; // 4G/5G网络,15秒间隔
+						break;
+					case 'wifi':
+						newInterval = 10000; // WiFi网络,10秒间隔
+						break;
+					default:
+						newInterval = 15000; // 默认15秒
+				}
+
+				if (newInterval !== this.adaptiveHeartBeatInterval) {
+					this.adaptiveHeartBeatInterval = newInterval;
+					console.log(`根据网络类型(${networkType})调整心跳间隔为${newInterval}ms`);
+
+					// 如果当前有心跳在运行,重启心跳以应用新间隔
+					if (this.heartBeatTimer && this.isSocketAvailable()) {
+						this.startHeartBeat();
+					}
+				}
+			},
+
+			//输入框
+			inputFocus() {
+				// 立即更新状态,确保UI零延迟响应
+				this.isFocus = true;
+				this.isKeyboardShow = true;
+
+				// 获取容器信息用于调试
+				// this.$nextTick(() => {
+				// 	try {
+				// 		// 获取输入框容器元素信息
+				// 		const query = uni.createSelectorQuery().in(this);
+				// 		query.select('.input-container-optimized').boundingClientRect((data) => {
+				// 			if (data) {
+				// 				console.log('输入框容器当前宽度:', data.width);
+				// 				console.log('输入框容器当前高度:', data.height);
+				// 				console.log('容器位置信息:', data);
+				// 			} else {
+				// 				console.log('未找到输入框容器元素');
+				// 			}
+				// 		}).exec();
+				// 	} catch (error) {
+				// 		console.log('获取容器信息失败:', error);
+				// 	}
+				// });
+			},
+			inputBlur() {
+				this.isFocus = false;
+			},
+			getTimeDifferenceInSeconds(createTimeStr) {
+				const createTime = new Date(createTimeStr.replace(/-/g, '/'));
+				const now = new Date();
+				const timeDiffMs = now - createTime;
+				const timeDiffSeconds = Math.floor(timeDiffMs / 1000);
+				return Math.max(0, timeDiffSeconds);
+			},
+			// 录播时间点
+			onVideoMetaLoaded(e) {
+				console.log("录播时间点", e)
+				this.videoProgressKey = `videoProgress_${this.liveId}`;
+				this.setVideoProgress();
+			},
+			setVideoProgress() {
+				// 只有录播和回放需要设置进度
+				if (this.liveItem.liveType !== 2 && this.liveItem.liveType !== 3) {
+					return;
+				}
+				let currentTime = 0;
+				if (this.liveItem.liveType === 2) {
+					// 录播:计算当前时间与开始时间的差值,对视频总时长取模
+					const diff = this.getTimeDifferenceInSeconds(this.liveItem.startTime);
+					if (diff > this.liveItem.duration) {
+						const storedProgress = uni.getStorageSync(this.videoProgressKey) || 0;
+						// console.log("开始断点续播了storedProgress", storedProgress)
+						currentTime = storedProgress >= this.liveItem.duration ? 0 : storedProgress || 0;
+						// console.log("开始断点续播了currentTime", currentTime);
+						this.isPlayback = true;
+					} else {
+						currentTime = diff % this.liveItem.duration;
+					}
+
+					// currentTime = diff % this.liveItem.duration;
+				} else if (this.liveItem.liveType === 3) {
+					// 回放:从存储中获取进度
+					const storedProgress = uni.getStorageSync(this.videoProgressKey);
+					currentTime = storedProgress || 0;
+				}
+				const videoId = `myVideo_${this.liveId}`;
+				const videoContext = uni.createVideoContext(videoId, this);
+				if (videoContext) {
+					videoContext.seek(currentTime);
+				}
+			},
+
+			onVideoWaiting(e) {
+				// console.log('视频等待加载', e);
+				if (this.liveItem.liveType == 2) {
+					this.startTrafficCalculation(this.bitrate);
+				} else {
+					let that = this;
+					if (this.trafficInterval) {
+						clearInterval(this.trafficInterval);
+						this.trafficInterval = null;
+					}
+					this.trafficInterval = setInterval(function() {
+						that.getInternetTraffic();
+					}, 10000);
+				}
+			},
+
+			// 视频时间更新
+			onVideoTimeUpdate(e) {
+
+				// 获取当前播放时间
+				this.videoCurrentTime = e.detail.currentTime;
+				// 每隔10秒保存一次进度(避免频繁存储)
+				if (Math.floor(this.videoCurrentTime) % 10 === 0) {
+					this.saveVideoProgress();
+				}
+				const diff = this.getTimeDifferenceInSeconds(this.liveItem.startTime)
+				if (diff >= this.liveItem.duration) {
+					this.closeWebSocket(true);
+					this.isEnd = true
+				}
+			},
+
+			// 视频暂停
+			onVideoPause(e) {
+				if (this.liveItem.liveType === 2) {
+					const videoId = `myVideo_${this.liveId}`;
+					const videoContext = uni.createVideoContext(videoId, this);
+					setTimeout(() => {
+						videoContext.play();
+					}, 100);
+				}
+				// 暂停时保存进度
+				this.saveVideoProgress();
+			},
+
+			// 视频播放
+			onVideoPlay(e) {},
+			// 设置视频当前时间
+			// setVideoCurrentTime(time) {
+			// 	if (!time) return;
+			// 	const videoId = `myVideo_${this.liveId}`;
+			// 	const videoContext = uni.createVideoContext(videoId, this);
+
+			// 	if (videoContext) {
+			// 		videoContext.seek(time);
+			// 		console.log(`设置视频播放位置: ${time}秒`);
+			// 	}
+			// },
+
+			// 保存视频进度
+			saveVideoProgress() {
+				if (this.videoProgressKey) {
+					uni.setStorage({
+						key: this.videoProgressKey,
+						data: this.videoCurrentTime,
+						success: () => {},
+						fail: (err) => {
+							console.error('保存视频进度失败:', err);
+						}
+					});
+				}
+			},
+
+			// 点击红包
+			onRed() {
+				if (!this.liveId) return;
+				if (!this.redInfo?.redId) return;
+				if (this.redTimer) {
+					clearInterval(this.redTimer);
+					this.redTimer = null;
+				}
+				let data = {
+					liveId: this.liveId,
+					userId: this.userData.userId,
+					redId: this.redInfo.redId
+				};
+				liveRed(data).then((res) => {
+						this.isShowRed = false;
+						this.redCard = res;
+						this.isShowRedCard = true;
+					},
+					(rej) => {}
+				);
+			},
+			//领取优惠券
+			onCoupon() {
+				if (!this.couponInfo.couponIssueId) return;
+				let data = {
+					goodsId: this.couponInfo.goodsId,
+					couponIssueId: this.couponInfo.couponIssueId,
+					liveId: this.liveId
+				};
+				coupon(data).then((res) => {
+						this.isShowCoupon = false;
+						if (res.code == 200) {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					})
+					.catch((rej) => {});
+			},
+
+			// 我的中奖名单
+			getMyLottery() {
+				this.winning = true;
+				myLottery()
+					.then((res) => {
+						if (res.code == 200) {
+							// console.log("我的中奖名单", res)
+							this.prizeAll = res.data.list || {};
+						} else {}
+					})
+					.catch((rej) => {});
+			},
+			// 抽奖
+			onLottery() {
+				if (!this.lotteryInfo) return;
+				this.isShowLottery = false
+				let data = {
+					lotteryId: this.lotteryInfo.lotteryId
+				};
+
+				liveLottery(data)
+					.then((res) => {
+						if (res.code == 200) {
+							const resData = res.data || {};
+							this.lotteryList = Array.isArray(resData) ? resData : [];
+							this.lotteryProducts = Array.isArray(resData.products) ? resData.products : [];
+
+							if (resData.duration) {
+								this.isShowLotteryPop = true;
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							this.lotteryList = [];
+							this.lotteryProducts = [];
+						}
+					})
+					.catch((rej) => {
+						uni.showToast({
+							title: '获取抽奖信息失败',
+							icon: 'none'
+						});
+						// 失败时强制重置为数组
+						this.lotteryList = [];
+						this.lotteryProducts = [];
+					});
+			},
+			// 参与抽奖
+			onClaim() {
+				let data = {
+					liveId: this.liveId,
+					lotteryId: this.lotteryInfo.lotteryId
+				};
+				claim(data).then(
+					(res) => {
+						if (res.code == 200) {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							this.isShowLotteryPop = false;
+							this.havePrize = true;
+							uni.setStorageSync('havePrize', this.havePrize);
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					(rej) => {}
+				);
+			},
+			confirm() {
+				this.isShowPrize = false;
+				this.havePrize = false;
+				uni.setStorageSync('havePrize', this.havePrize);
+			},
+			// 商品收藏
+			onGoodsCollect(item) {
+				if (!item || item.length === 0 || !item.goodsId) {
+					return;
+				}
+				collectGoods(item.goodsId).then(
+					(res) => {
+						if (res.code == 200) {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							item.isFavorite = !item.isFavorite;
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					(rej) => {}
+				);
+			},
+
+			//正在购买
+			getliveOrder(item) {
+				if (!this.liveId) {
+					return;
+				}
+				liveOrderUser(this.liveId).then(
+					(res) => {
+						if (res.code == 200) {
+							this.orderUser = res;
+						} else {
+							console.log('获取正在购买用户失败');
+						}
+					},
+					(rej) => {}
+				);
+			},
+			onLiveStateChange(e, liveItem) {
+				// 可以根据状态码处理不同的直播状态
+				const stateCode = e.detail.code;
+				if (e.detail.code == -2301 || e.detail.code == -2302) {
+					this.playVideo();
+				} else if (e.detail.code == 2004) {
+					this.calculateTimeDiff(this.liveItem);
+					this.startTrafficCalculation(this.bitrateLive);
+				}
+				// 2001: 已经连接服务器
+				// 2002: 已经连接服务器,开始拉流
+				// 2003: 网络接收到首个视频数据包(IDR)
+				// 2004: 视频播放开始
+				// 2005: 视频播放进度
+				// 2006: 视频播放结束
+				// 2007: 视频播放Loading
+				// 2008: 解码器启动
+				// -2301: 网络断连,且经多次重连抢救无效,更多重试请自行重启播放
+				// -2302: 获取加速拉流地址失败
+			}, // 直播错误事件
+			onLiveError(e, liveItem) {
+				this.videoError(e, liveItem);
+				console.log('错误');
+			},
+			//  红包 卡片 抽奖
+			getCurrentActivities() {
+				if (!this.liveId) return;
+				currentActivities(this.liveId).then(
+					(res) => {
+						if (res.code === 200) {
+							// 提取数据(默认空数组/对象避免报错)
+							this.redInfo = (Array.isArray(res.red) ? res.red : [])[0] || {};
+							this.lotteryInfo = (Array.isArray(res.lottery) ? res.lottery : [])[0] || {};
+							this.goodsCard = res.goods || {};
+							this.notice = res.topMsg || {};
+
+							this.isShowGoods = this.goodsCard && this.goodsCard.status == 1;
+							this.isShowRed = this.redInfo && this.redInfo.redStatus == 1;
+							this.isShowLottery = this.lotteryInfo && this.lotteryInfo.lotteryStatus == 1;
+
+							if (this.notice.msg) {
+								console.log("有》》》》")
+								this.noticeTimer = setInterval(() => {
+									const noticeCountdown = this.handleTime(this.notice.endTime, 0);
+									console.log("出现1>>>", noticeCountdown)
+									if (!noticeCountdown) {
+										this.isShowNotice = false;
+										clearInterval(this.noticeTimer);
+									} else {
+										this.isShowNotice = true
+									}
+								}, 1000);
+							}
+							// if(this.notice.msg&&this.notice){
+							// 	this.isShowNotice = true
+							// }else{
+							// 	this.isShowNotice = false
+							// }
+							if (this.isShowRed) {
+								this.redTimer = setInterval(() => {
+									const redCountdown = this.handleTime(this.redInfo.updateTime, this.redInfo
+										.duration);
+									if (!redCountdown) {
+										this.isShowRed = false;
+										clearInterval(this.redTimer);
+									}
+								}, 1000);
+							}
+							// 处理抽奖定时器
+							if (this.isShowLottery) {
+								this.lotteryTimer = setInterval(() => {
+									this.countdown = this.handleTime(this.lotteryInfo.updateTime, this
+										.lotteryInfo.duration);
+								}, 1000);
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					(rej) => {}
+				);
+			},
+
+			// 计算当前时间与 liveItem.startTime 的差值,并更新 totalTime
+			calculateTimeDiff(item) {
+				if (!item.startTime) return;
+				// 提取对应场景的时间字符串(直播用startTime,抽奖用updateTime)
+				let timeStr = item.startTime;
+
+				// 转换时间格式(适配iOS,将 "-" 替换为 "/")
+				const time = new Date(timeStr.replace(/-/g, '/'));
+
+				if (isNaN(time.getTime())) {
+					return;
+				}
+				const now = new Date();
+				let diffMs = Math.max(0, now.getTime() - time.getTime());
+				// 转换为 时:分:秒(补零处理)
+				const totalSeconds = Math.floor(diffMs / 1000);
+				const hours = this.padZero(Math.floor(totalSeconds / 3600));
+				const minutes = this.padZero(Math.floor((totalSeconds % 3600) / 60));
+				const seconds = this.padZero(totalSeconds % 60);
+				this.diffTotalTime = `${hours}:${minutes}:${seconds}`;
+			},
+
+			padZero(num) {
+				return num < 10 ? `0${num}` : num;
+			},
+			// 启动当前直播间的时间差值定时器
+			startTimeTimer(item) {
+				if (!item) return;
+				// 立即计算一次(避免等待1秒才显示)
+				const totalTime = this.calculateTimeDiff(item);
+				item.timeTimer = setInterval(() => {
+					const totalTime = this.calculateTimeDiff(item);
+				}, 1000);
+			},
+
+			// toggleViewerList() {
+			// 	const now = Date.now();
+			// 	if (now - this.lastClickTime > this.clickDelay) {
+			// 		this.showadd = !this.showadd;
+			// 		if (this.showadd) {
+			// 			this.getliveUser(false); // 加载第一页观众
+			// 		}
+			// 		this.lastClickTime = now;
+			// 	}
+			// },
+			// 播放视频
+			playVideo() {
+				if (!this.liveItem) {
+					console.log('liveItem 为空,无法播放视频');
+					return;
+				}
+				try {
+					if (this.liveItem.liveType === 1 && this.liveItem.livingUrl && this.liveItem.status == 2) {
+
+					} else if (this.liveItem.status == 1 && this.liveItem.previewUrl) {
+						const videoId = `myVideo_${this.liveId}`;
+						const videoContext = uni.createVideoContext(videoId, this);
+
+						if (videoContext) {
+							videoContext.play();
+						}
+					} else if (this.liveItem.liveType === 2 && this.liveItem.videoUrl && this.liveItem.status == 2) {
+						const videoId = `myVideo_${this.liveId}`;
+						const videoContext = uni.createVideoContext(videoId, this);
+						// console.log("录播")
+						if (videoContext) {
+							videoContext.play();
+						}
+					} // 回放视频使用video
+					else if (this.liveItem.liveType === 3 && this.liveItem.videoUrl && this.liveItem.status == 4) {
+						const videoId = `myVideo_${this.liveId}`;
+						const videoContext = uni.createVideoContext(videoId, this);
+						// console.log("回放")
+						if (videoContext) {
+							videoContext.play();
+						}
+					}
+				} catch (error) {
+					console.error('播放视频失败:', error);
+				}
+			},
+
+			pauseVideo() {
+				if (!this.liveItem) return;
+
+				try {
+					if (this.liveItem.status == 1) {
+						const videoId = `myVideo_${this.liveId}`;
+						const videoContext = uni.createVideoContext(videoId, this);
+						if (videoContext) {
+							videoContext.pause();
+						}
+					} else if (this.liveItem.status == 2) {
+						if (this.liveItem.liveType === 1) {
+							const livePlayerId = `myLivePlayer_${this.liveId}`;
+							const livePlayerContext = uni.createLivePlayerContext(livePlayerId, this);
+							if (livePlayerContext) {
+								livePlayerContext.pause();
+							}
+						} else if (this.liveItem.liveType === 2) {
+							const videoId = `myVideo_${this.liveId}`;
+							const videoContext = uni.createVideoContext(videoId, this);
+							if (videoContext) {
+								videoContext.pause();
+							}
+						}
+					}
+				} catch (error) {
+					console.error('暂停视频失败:', error);
+				}
+			},
+			// 视频错误处理
+			videoError(e, liveItem) {
+				if (!liveItem || !this.liveId) return;
+				// 初始化重试计数
+				if (this.videoRetryCounts[liveItem.liveId] === undefined) {
+					this.videoRetryCounts[liveItem.liveId] = 0;
+				}
+				// 限制重试次数
+				if (this.videoRetryCounts[liveItem.liveId] >= 3) {
+					console.error(`直播间 ${this.liveId} 视频加载失败,停止重试`);
+					// 显示错误提示
+					uni.showToast({
+						title: '视频加载失败,请检查网络',
+						icon: 'none',
+						duration: 2000
+					});
+					return;
+				}
+
+				this.videoRetryCounts[this.liveId]++;
+
+				// 延迟重试
+				setTimeout(() => {
+					if (this.liveId === this.liveId) {
+						console.log(`第${this.videoRetryCounts[this.liveId]}次重试播放视频`);
+						this.playVideo();
+					}
+				}, 2000);
+			},
+
+			openViews() {
+				// 计算scroll-view高度
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select('.view-box')
+						.boundingClientRect((data) => {
+							if (data) {
+								this.scrollHeight = data.height - 80; // 80是标题高度,120是底部高度
+							}
+						})
+						.exec();
+				});
+			},
+			// 滚动到底部触发
+			handleScrollToLower() {
+				// 清除上一次未执行的定时器,避免重复请求
+				if (this.scrollTimer) {
+					clearTimeout(this.scrollTimer);
+				}
+				// 延迟1秒执行接口请求
+				this.scrollTimer = setTimeout(() => {
+					this.getliveUser(true);
+				}, 1000);
+			},
+
+			async getMyLiveMsg(liveItem) {
+				console.log("不可见了")
+				if (!liveItem || !this.liveId) {
+					console.error('getLiveMsg 错误:无效的 liveItem');
+					return;
+				}
+				try {
+					const res = await myLiveMsg(this.liveId, 30, 1);
+					if (res.code == 200) {
+						const rows = Array.isArray(res.rows) ? res.rows : [];
+						const reversedTalkList = [...rows].reverse();
+						this.talklist = Array.isArray(reversedTalkList) ? reversedTalkList : [];
+						// 获取历史消息后也滚动到底部
+						this.$nextTick(() => {
+							this.scrollToBottom();
+						});
+					} else {
+						this.talklist = [];
+					}
+				} catch (error) {
+					this.talklist = [];
+					console.error('获取聊天记录失败:', error);
+				}
+			},
+			async getLiveMsg(liveItem) {
+				if (!liveItem || !this.liveId) {
+					console.error('getLiveMsg 错误:无效的 liveItem');
+					return;
+				}
+				try {
+					const res = await liveMsg(this.liveId, 30, 1);
+					if (res.code == 200) {
+						const rows = Array.isArray(res.rows) ? res.rows : [];
+						const reversedTalkList = [...rows].reverse();
+						this.talklist = Array.isArray(reversedTalkList) ? reversedTalkList : [];
+						// 获取历史消息后也滚动到底部
+						this.$nextTick(() => {
+							this.scrollToBottom();
+						});
+					} else {
+						this.talklist = [];
+					}
+				} catch (error) {
+					this.talklist = [];
+					console.error('获取聊天记录失败:', error);
+				}
+			},
+
+			// 获取直播间用户
+			async getliveUser(isLoadMore = false) {
+				this.viewLoading = true;
+				try {
+					const res = await watchUserList(this.liveId, this.viewPageSize, this.viewPageNum, false);
+					if (res.code === 200) {
+						const userRows = Array.isArray(res.rows) ? res.rows : [];
+
+						let array = userRows.map((item) => ({
+							avatar: item.avatar || '',
+							userId: item.userId || '',
+							nickName: item.nickName || '未命名'
+						}));
+
+						// 虚拟数据
+						let virtualData = [];
+						let virtualTotal = res.total * 10;
+						this.liveUserTotal = virtualTotal;
+						console.log("人数是>>", this.liveUserTotal)
+						for (let i = 0; i < virtualTotal; i++) {
+							let data = {
+								avatar: '',
+								userId: '8565' + i,
+								nickName: '微信用户'
+							};
+							virtualData.push(data);
+						}
+						this.liveViewersData = [...array, ...virtualData];
+
+						const newRows = Array.isArray(res.rows) ? res.rows : [];
+						const currentViewers = Array.isArray(this.liveViewers) ? this.liveViewers : [];
+
+						let viewlist = isLoadMore ? [...currentViewers, ...newRows] : newRows;
+						this.liveViewers = [...viewlist, ...virtualData];
+						this.viewPageNum++;
+					}
+				} catch (error) {
+					console.error('获取观众列表失败:', error);
+				} finally {
+					this.viewLoading = false;
+				}
+			},
+
+			//小黄车搜索商品
+			handleSearchInput() {
+				// 使用防抖优化性能,避免频繁请求
+				clearTimeout(this.searchTimer);
+				this.searchTimer = setTimeout(() => {
+					this.queryCollect();
+				}, 500); // 500毫秒延迟
+			},
+
+			// 显示购买提示信息
+			showPurchaseMessage() {
+				// 清除之前的定时器
+				if (this.purchasePromptTimer) {
+					clearTimeout(this.purchasePromptTimer);
+				}
+
+				// 显示提示
+				this.showPurchasePrompt = true;
+
+				// 2秒后自动隐藏
+				this.purchasePromptTimer = setTimeout(() => {
+					this.showPurchasePrompt = false;
+				}, 2000);
+			},
+
+			//名字超过省略
+			truncateString(str, maxLength) {
+				if (typeof str !== 'string' || str.length <= maxLength) {
+					return str;
+				}
+				return str.slice(0, maxLength) + '...'; // 截断后加省略号
+			},
+			// 跳转页面
+			navgetTo(url) {
+				uni.navigateTo({
+					url: url
+				});
+			},
+			// 修改获取直播信息方法
+			async getliving(liveId) {
+				if (!liveId) return;
+				const param = {
+					id: liveId
+				};
+				try {
+					const res = await getlive(param);
+					if (res.code !== 200) {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+						return;
+					}
+					this.liveItem = Object.assign({}, this.liveItem, res.data);
+					if (res.data.globalVisible || res.data.singleVisible) {
+						this.myselfFlag = true;
+					}
+					// this.talklist = Array.isArray((res.data || {}).talklist) ? res.data.talklist : [];
+					this.startTimeTimer(this.liveItem);
+					// 清除旧定时器(如预告倒计时)
+					if (this.liveStartTimer) {
+						clearInterval(this.liveStartTimer);
+						this.liveStartTimer = null;
+					}
+					if (res.data.status == 1) {
+						// 直播预告
+						this.liveStartTimer = setInterval(async () => {
+							this.liveCountdown = this.handleTime(res.data.startTime, 0);
+							if (!this.liveCountdown) {
+								uni.removeStorageSync('isAgreement');
+								await this.getliving(this.liveId);
+								clearInterval(this.liveStartTimer);
+							}
+						}, 1000);
+						this.$set(this.liveItem, 'previewUrl', res.data.previewUrl);
+						this.$set(this.liveItem, 'livingUrl', ''); // 清空直播流
+						this.$set(this.liveItem, 'videoUrl', ''); // 清空回放视频
+					} else if (res.data.status == 2) {
+						if (res.data.liveType == 1) {
+							// 直播流
+							let cTime = Math.floor(Math.random() * 10000) + 1;
+							let livingUrl = res.data.flvHlsUrl + '&t=' + cTime;
+							console.log('地址在', this.liveItem.livingUrl);
+							this.$set(this.liveItem, 'livingUrl', livingUrl);
+							this.$set(this.liveItem, 'videoUrl', ''); // 清空回放视频
+						} else if (res.data.liveType === 2) {
+							// 回放视频   2录播 3直播回放
+							// let urlStr = 'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/10%E6%9C%8820%E6%97%A5%20%281%29.m3u8'
+							// this.$set(this.liveItem, 'videoUrl', urlStr);
+							this.$set(this.liveItem, 'videoUrl', res.data.videoUrl);
+							this.$set(this.liveItem, 'livingUrl', '');
+						}
+					} else if (res.data.status == 4 && res.data.liveType == 3) {
+						this.$set(this.liveItem, 'videoUrl', res.data.videoUrl);
+						this.$set(this.liveItem, 'livingUrl', '');
+					} else {
+						// 未开播
+						this.$set(this.liveItem, 'livingUrl', '');
+						this.$set(this.liveItem, 'videoUrl', '');
+					}
+					this.$set(this.liveItem, 'autoplay', res.data.liveType !== 0);
+					this.$set(this.liveItem, 'showType', res.data.showType);
+					this.storeId = res.storeId;
+					this.startLiveViewDataTimer();
+					this.playVideo();
+				} catch (err) {
+					console.error('获取直播信息失败:', err);
+					uni.showToast({
+						title: '获取直播信息失败',
+						icon: 'none'
+					});
+				}
+			},
+
+			getPureDecimal(num, precision = 6) {
+				const decimalPart = Math.abs(num).toFixed(precision).split('.')[1];
+				return decimalPart?.replace(/0+$/, '') || ''; // 移除末尾多余的0
+			},
+
+			goBack() {
+				// 暂停当前视频
+				if (this.liveItem) {
+					this.pauseVideo();
+				}
+				// 关闭WebSocket连接
+				this.closeWebSocket(true);
+				// 导航返回
+				// const pages = getCurrentPages();
+				// if (pages.length > 1) {
+				// 	uni.navigateBack();
+				// } else {
+				// 	uni.reLaunch({
+				// 		url: '/pages_course/livingList'
+				// 	});
+				// }
+
+				const pages = getCurrentPages();
+				uni.reLaunch({
+					url: '/pages/home/index'
+				});
+			},
+			// 点赞
+			async onLike() {
+				if (!this.liveId) return;
+				try {
+					const res = await liveDataLike(this.liveId);
+					if (res?.like) {
+						this.liveViewData.like++; //只更新当前直播间的点赞数
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				} catch (error) {
+					console.error('点赞失败:', error);
+				}
+			},
+
+			//直播间点赞、关注、在线人数数据
+			getliveViewData() {
+				if (!this.liveId) return;
+				getLiveViewData(this.liveId).then((res) => {
+					if (res.code == 200) {
+						// 强制响应式更新,确保数据实时显示
+						this.liveViewData = res;
+					}
+				}).catch((error) => {
+					console.error('获取直播间数据失败:', error);
+					// 失败时兜底,避免显示异常
+					this.liveViewData = {
+						like: 0,
+						watchCount: 0
+					};
+				});
+			},
+			// 30秒刷新一下直播间点赞数
+			startLiveViewDataTimer() {
+				// 先清除旧定时器(防止重复创建)
+				if (this.liveViewDataTimer) {
+					clearInterval(this.liveViewDataTimer);
+					this.liveViewDataTimer = null;
+				}
+				this.getliveViewData();
+				this.liveViewDataTimer = setInterval(() => {
+					// 安全校验:确保liveItem和liveId存在(避免无效请求)
+					if (this.liveId) {
+						this.getliveViewData();
+					}
+				}, 20000);
+			},
+			// 去购买,跳商品详情
+			goShop(productId, goodsId) {
+				if (!this.liveId) return;
+				uni.navigateTo({
+					url: '/pages_shopping/live/goods?productId=' + productId + '&liveId=' + this.liveId +
+						'&goodsId=' + goodsId + '&storeId=' + this.storeId
+				});
+			},
+
+			// 查询店铺
+			async queryCollect() {
+				this.loadingProducts = true;
+				if (!this.liveId) return;
+				if (this.inputInfo == null) this.inputInfo = '';
+				uni.showLoading({
+					title: '加载中'
+				});
+				try {
+					const res = await liveStore(this.liveId, this.inputInfo);
+					uni.hideLoading();
+					this.shopping = true;
+					if (res.code === 200) {
+						// 数据绑定到当前 liveItem,避免全局污染
+						this.products = Array.isArray(res.data) ? res.data : [];
+					}
+				} catch (error) {
+					console.error('获取小黄车商品失败:', error);
+				} finally {
+					this.loadingProducts = false;
+				}
+			},
+			// 时间戳
+			initTime() {
+				const now = new Date();
+				this.timestamp = now.getTime();
+			},
+
+			openCart() {
+				this.queryCollect();
+			},
+			close() {
+				this.showadd = false;
+			},
+
+			// 关闭小黄车
+			closeShop() {
+				this.shopping = false;
+			},
+			closeMore() {
+				this.isMore = false;
+			},
+			closeWin() {
+				this.winning = false;
+			},
+			// 关闭WebSocket连接(isManual:是否手动关闭)
+			closeWebSocket(isManual = true) {
+				if (!this.socket || !this.isSocketOpen) {
+					// console.warn('WebSocket 任务不存在或未打开,无需关闭');
+					return;
+				}
+
+				console.log(`WebSocket连接关闭 - ${isManual ? '手动' : '自动'}`);
+				this.isManualClose = isManual;
+
+				// 清理所有定时器和状态
+				this.cleanupAllResources();
+
+				try {
+					// 先保存引用,避免在关闭过程中被置为null
+					const socketToClose = this.socket;
+					this.socket = null;
+					this.isSocketOpen = false;
+					this.isConnecting = false;
+
+					socketToClose.close({
+						code: 1000,
+						reason: isManual ? '主动关闭' : '异常关闭'
+					});
+					console.log('WebSocket连接已发起关闭');
+				} catch (err) {
+					console.error('关闭WebSocket失败:', err);
+					// 即使关闭失败,也要重置状态
+					this.socket = null;
+					this.isSocketOpen = false;
+					this.isConnecting = false;
+				}
+			},
+
+			// 清理所有资源
+			cleanupAllResources() {
+				// 停止心跳相关
+				this.stopHeartBeat();
+
+				// 清理ping超时定时器
+				if (this.pingTimeoutTimer) {
+					clearTimeout(this.pingTimeoutTimer);
+					this.pingTimeoutTimer = null;
+				}
+
+				// 清理网络状态定时器
+				if (this.networkStatusTimer) {
+					clearTimeout(this.networkStatusTimer);
+					this.networkStatusTimer = null;
+				}
+
+				// 重置重连状态
+				this.resetReconnectState();
+
+				// 重置心跳相关状态
+				this.heartBeatRetryCount = 0;
+				this.lastHeartBeatTime = 0;
+				this.adaptiveHeartBeatInterval = this.heartBeatInterval;
+			},
+			startHeartBeat() {
+				this.stopHeartBeat(); // 先停止现有心跳,防止重复
+				// 使用自适应间隔循环发送心跳
+				this.heartBeatTimer = setInterval(() => {
+					this.sendHeartBeat();
+				}, this.adaptiveHeartBeatInterval);
+			},
+			initSocket() {
+				// 检查是否正在连接中
+				if (this.isConnecting) {
+					console.log('WebSocket正在连接中,跳过重复连接');
+					return;
+				}
+
+				// 检查网络状态
+				if (!this.isNetworkAvailable) {
+					console.warn('网络不可用,延迟WebSocket连接');
+					// 使用定时器而不是递归调用,避免内存泄漏
+					if (!this.networkRetryTimer) {
+						this.networkRetryTimer = setTimeout(() => {
+							this.networkRetryTimer = null;
+							this.initSocket();
+						}, 3000);
+					}
+					return;
+				}
+
+				// 如果已经存在连接且状态为open,则退出
+				if (this.socket && this.socket.readyState === 1) {
+					console.log('WebSocket连接已存在且正常,无需重新连接');
+					// 重置重连计数
+					this.reconnectCount = 0;
+					return;
+				}
+
+				// 关闭现有连接
+				if (this.socket && (this.socket.readyState === 0 || this.socket.readyState === 1)) {
+					console.log('关闭现有WebSocket连接,创建新连接');
+					this.closeWebSocket(false); // 非手动关闭
+					// 等待一小段时间确保连接完全关闭
+					setTimeout(() => {
+						this.createWebSocketConnection();
+					}, 100);
+					return;
+				}
+
+				this.createWebSocketConnection();
+			},
+			createWebSocketConnection() {
+				// 校验必要参数
+				if (!this.liveId) {
+					console.error('缺失直播间ID,无法初始化WebSocket');
+					return;
+				}
+				if (!this.userData || !this.userData.userId) {
+					console.error('用户信息缺失,无法初始化WebSocket');
+					return;
+				}
+
+				// 设置连接状态
+				this.isConnecting = true;
+				this.isSocketOpen = false;
+
+				// 记录连接开始时间(性能监控)
+				this.connectionStartTime = Date.now();
+
+				// 清除之前的重连定时器
+				this.resetReconnectState();
+
+				setTimeout(() => {
+					this.getliveUser(false);
+				}, 200);
+
+				const now = new Date();
+				this.timestamp = now.getTime(); // 生成签名
+				const signature = CryptoJS.HmacSHA256(
+					`${this.liveId}${this.userData.userId}${this.userType}${this.timestamp}`, this.timestamp.toString()
+				).toString(CryptoJS.enc.Hex);
+
+				try {
+					const baseWsUrl = 'wss://ws.klbycp.com/ws/app/webSocket';
+					// const baseWsUrl = 'wss://api.fhhx.runtzh.com/ws/app/webSocket';
+					// const baseWsUrl = 'ws://d6998672.natappfree.cc/ws/app/webSocket';
+					// const baseWsUrl = 'ws://nd967d83.natappfree.cc/ws/app/webSocket';
+					let wsUrl =
+						`${baseWsUrl}?userId=${this.userData.userId}&liveId=${this.liveId}&userType=${this.userType}&timestamp=${this.timestamp}&signature=${signature}`;
+
+					// let wsUrl =
+					// 	'ws://q96d9752.natappfree.cc/ws/app/webSocket?liveId=128&userId=9769&userType=1&timestamp=1762501143712&signature=0498c66c3fca64ab009586200c04d51312ce44e36d5639e99b22e34f3bac8d13';
+					if (this.qrFrom) {
+						wsUrl += this.qrFrom;
+					}
+					// if(this.address){
+					console.log("this.address是什么>>>", this.address)
+					wsUrl += `&location=${this.address}`;
+					// wsUrl += `&location=${encodeURIComponent(liveWatchUser)}`;
+					// }
+					console.log("qxj wsUrl", wsUrl);
+					console.log(`尝试连接WebSocket: ${wsUrl.replace(/signature=[^&]+/, 'signature=***')}`);
+					const socketTask = uni.connectSocket({
+						url: wsUrl,
+						success: () => {
+							console.log("WebSocket连接请求发送成功");
+						},
+						fail: (err) => {
+							console.error('WebSocket连接请求失败:', err);
+							this.isConnecting = false;
+							this.handleConnectionError('连接请求失败', err);
+						}
+					});
+
+					// 连接打开事件
+					socketTask.onOpen((res) => {
+						console.log("WebSocket连接已打开");
+						this.socket = socketTask;
+						this.isConnecting = false;
+						this.isSocketOpen = true;
+
+						// 计算连接延迟(性能监控)
+						if (this.connectionStartTime > 0) {
+							this.connectionLatency = Date.now() - this.connectionStartTime;
+							console.log(`WebSocket连接延迟: ${this.connectionLatency}ms`);
+						}
+
+						this.reconnectCount = 0;
+						this.resetReconnectState();
+						this.heartBeatRetryCount = 0; // 重置心跳重试次数
+						this.shownEntryUsers.clear(); // 重连后重置进入提示记录
+
+						// 连接成功后显示提示(仅首次连接)
+						if (this.reconnectCount === 0) {
+							console.log('WebSocket连接建立成功');
+						} else {
+							console.log(`WebSocket重连成功(第${this.reconnectCount}次尝试)`);
+						}
+						this.startHeartBeat();
+
+					});
+
+					// 消息接收事件
+					socketTask.onMessage((res) => {
+						// 消息计数(性能监控)
+						this.messageCount++;
+						try {
+							//console.log("qxj onMessage handleSocketMessage",res);
+							const data = JSON.parse(res.data);
+							// 处理服务端心跳响应 - 修复:后端返回的是heartBeat而不是heartBeatAck
+							if (!!data.data && data.data.cmd === 'heartbeat') {
+								// console.log('收到心跳响应:', data.data);
+								// 清除ping超时定时器
+								if (this.pingTimeoutTimer) {
+									clearTimeout(this.pingTimeoutTimer);
+									this.pingTimeoutTimer = null;
+								}
+								// 重置心跳重试次数
+								this.heartBeatRetryCount = 0;
+								// 更新网络状态为良好
+								this.adjustHeartBeatInterval(true);
+								return;
+							}
+							this.handleSocketMessage(res);
+
+						} catch (err) {
+							console.error('消息解析异常:', err);
+							this.errorCount++; // 错误计数
+						}
+					});
+					// 连接错误事件
+					socketTask.onError((err) => {
+						console.error('WebSocket连接错误:', err);
+						this.errorCount++; // 错误计数
+						this.isSocketOpen = false;
+						this.isConnecting = false;
+						this.stopHeartBeat();
+						this.handleConnectionError('连接错误', err);
+					});
+
+					// 连接关闭事件
+					socketTask.onClose((res) => {
+						console.log('WebSocket连接关闭:', res);
+						this.isSocketOpen = false;
+						this.isConnecting = false;
+						this.stopHeartBeat(); // 清除心跳定时器
+
+						// 根据关闭原因决定是否重连
+						if (!this.isManualClose) {
+							if (res.code === 1000) {
+								console.log('WebSocket正常关闭,不进行重连');
+							} else {
+								console.warn(`WebSocket异常关闭 (code: ${res.code}, reason: ${res.reason})`);
+								this.handleReconnect();
+							}
+						} else {
+							console.log('WebSocket手动关闭,不进行重连');
+						}
+					});
+				} catch (e) {
+					console.error('创建WebSocket异常:', e);
+					this.handleReconnect();
+				}
+			},
+			handleTime(time, duration) {
+				let timeStamp;
+
+				if (typeof time === 'number' && time > 0 && time < 9999999999999) {
+					timeStamp = time;
+				} else if (typeof time === 'string' && time.trim() !== '') {
+					// 手动解析 CST 时间字符串
+					const match = time.match(/^(\w{3}) (\w{3}) (\d{1,2}) (\d{1,2}):(\d{2}):(\d{2}) CST (\d{4})$/);
+
+					if (match) {
+						const [, day, month, date, hours, minutes, seconds, year] = match;
+
+						// 月份映射
+						const monthMap = {
+							'Jan': 0,
+							'Feb': 1,
+							'Mar': 2,
+							'Apr': 3,
+							'May': 4,
+							'Jun': 5,
+							'Jul': 6,
+							'Aug': 7,
+							'Sep': 8,
+							'Oct': 9,
+							'Nov': 10,
+							'Dec': 11
+						};
+
+						// 创建日期对象(CST 是 UTC+8,与中国时区一致)
+						const jsDate = new Date(
+							parseInt(year),
+							monthMap[month],
+							parseInt(date),
+							parseInt(hours),
+							parseInt(minutes),
+							parseInt(seconds)
+						);
+						timeStamp = jsDate.getTime();
+					} else {
+						// 如果不是预期格式,回退到普通解析
+						const date = new Date(time);
+						if (!isNaN(date.getTime())) {
+							timeStamp = date.getTime();
+						} else {
+							console.error('无效的日期格式:', time);
+							return false;
+						}
+					}
+				} else {
+					console.error('time参数必须是有效的时间戳(数字)或日期字符串');
+					return false;
+				}
+
+				const targetTimestamp = timeStamp + duration * 60 * 1000;
+				const currentTimestamp = Date.now();
+				const timeDiffMs = targetTimestamp - currentTimestamp;
+
+				if (timeDiffMs <= 0) {
+					return false;
+				}
+
+				const hours = Math.floor(timeDiffMs / (1000 * 60 * 60));
+				const minutes = Math.floor((timeDiffMs % (1000 * 60 * 60)) / (1000 * 60));
+				const seconds = Math.floor((timeDiffMs % (1000 * 60)) / 1000);
+
+				const formatNum = (num) => num.toString().padStart(2, '0');
+				return {
+					hours: formatNum(hours),
+					minutes: formatNum(minutes),
+					seconds: formatNum(seconds)
+				};
+			},
+			// 限制聊天消息数量,防止内存泄漏
+			addToTalkList(message) {
+				// console.log("修改后的message>>", message)
+				// 减少最大消息数量,提升iPhone性能
+				const MAX_TALK_ITEMS = 30;
+
+				// 直接操作数组,避免创建新数组
+				if (!Array.isArray(this.talklist)) {
+					this.talklist = [];
+				}
+
+				const wasAtLimit = this.talklist.length >= MAX_TALK_ITEMS;
+				//console.log(`添加消息前: 当前消息数量=${this.talklist.length}, 是否达到限制=${wasAtLimit}`);
+
+				// 检查是否是自己发送的消息
+				const isMyMessage = message.userId === this.userData.userId;
+				//console.log(`消息来源: ${isMyMessage ? '自己' : '他人'}, userId=${message.userId}`);
+
+				// 给消息添加唯一ID
+				message.uniqueId = ++this.messageIdCounter;
+				this.talklist.push(message);
+
+				// 当消息超过限制时,批量删除旧消息
+				if (this.talklist.length > MAX_TALK_ITEMS) {
+					const removeCount = this.talklist.length - MAX_TALK_ITEMS;
+					//console.log(`消息超过限制,删除前${removeCount}条旧消息`);
+					this.talklist.splice(0, removeCount);
+				}
+				//console.log(`添加消息后: 当前消息数量=${this.talklist.length}`);
+
+				// 强制触发视图更新
+				this.$forceUpdate();
+
+				// 使用单次nextTick确保DOM更新后再滚动
+				this.$nextTick(() => {
+					this.forceScrollToBottomOnSend();
+					// if (isMyMessage) {
+					// 	// 如果是自己发送的消息,强制滚动到底部
+					// 	console.log('自己的消息,执行强制滚动');
+					// 	this.forceScrollToBottomOnSend();
+					// } else {
+					// 	// 如果是他人的消息,使用普通滚动(有防抖)
+					// 	console.log('他人的消息,执行普通滚动');
+					// 	this.simpleScrollToBottom();
+					// }
+				});
+			},
+			// 处理Socket消息
+			async handleSocketMessage(message) {
+				try {
+					let data = JSON.parse(message.data);
+					const socketMessage = data.data; // 服务端返回的消息体
+					//console.log("qxj handleSocketMessage socketMessage",socketMessage);
+					if (data.code == 200) {
+						const messageData = {
+							...socketMessage,
+							cmd: socketMessage.cmd || '', // 确保cmd字段存在
+							ts: Date.now() // 时间戳
+						};
+						// 处理服务端返回的sendMsg消息,加入本地列表
+						if (socketMessage.cmd == 'sendMsg') {
+							if (!this.isSocketAvailable()) {
+								uni.showToast({
+									title: '连接已断开,正在重试...',
+									icon: 'none'
+								});
+								this.handleReconnect();
+								return;
+							}
+							this.addToTalkList(messageData);
+						} else if (socketMessage.cmd == 'red') {
+							const redData = socketMessage.data ? JSON.parse(socketMessage.data) : {};
+							this.redInfo = redData || {};
+							this.isShowRed = socketMessage.status === 1;
+							if (this.isShowRed) {
+								this.redTimer = setInterval(() => {
+									const redCountdown = this.handleTime(this.redInfo.updateTime, this.redInfo
+										.duration);
+									if (!redCountdown) {
+										this.isShowRed = false;
+										clearInterval(this.redTimer);
+									}
+								}, 1000);
+							}
+						} else if (socketMessage.cmd == 'goods') {
+							const goodsData = socketMessage.data ? JSON.parse(socketMessage.data) : {};
+							this.goodsCard = goodsData || {};
+							this.isShowGoods = socketMessage.status == 1;
+						} else if (socketMessage.cmd == 'coupon') {
+							const couponData = socketMessage.data ? JSON.parse(socketMessage.data) : {};
+							this.couponInfo = couponData || {};
+							this.isShowCoupon = socketMessage.status === 1;
+							if (this.isShowCoupon) {}
+						} else if (socketMessage.cmd == 'likeDetail') {
+							this.liveViewData.like = socketMessage.data;
+						} else if (socketMessage.cmd == 'lottery') {
+							const lotteryData = socketMessage.data ? JSON.parse(socketMessage.data) : {};
+							this.lotteryInfo = lotteryData || {};
+							this.isShowLottery = socketMessage.status === 1;
+							if (socketMessage.status != 1) {
+								this.isShowLotteryPop = false;
+							}
+							// 清除已有定时器(无论状态是否为1,先清掉旧的)
+							clearInterval(this.lotteryTimer);
+							if (this.isShowLottery) {
+								this.lotteryTimer = setInterval(() => {
+									this.countdown = this.handleTime(this.lotteryInfo.updateTime, this
+										.lotteryInfo.duration);
+									if (!this.countdown) {
+										console.log('倒计时', this.countdown);
+										this.isShowLottery = false;
+										this.isShowLotteryPop = false;
+										clearInterval(this.lotteryTimer);
+									}
+								}, 1000);
+							} else {
+								this.isShowLottery = false;
+							}
+						} else if (socketMessage.cmd == 'globalVisible' || socketMessage.cmd == 'singleVisible') {
+							//  status = 1的时候,用户消息自可见,其他消息丢失}
+							console.log("可见性>>>>>", socketMessage)
+							if (socketMessage.status == 1) {
+								console.log("不可见性")
+								this.myselfFlag = true;
+							} else {
+								this.myselfFlag = false;
+							}
+
+						} else if (socketMessage.cmd == 'sendPopMsg') {
+							console.log("弹窗消息>>>>", socketMessage)
+							this.popMsg = socketMessage.msg
+							this.isShowPopMsg = true
+						} else if (socketMessage.cmd == 'sendTopMsg') {
+							clearInterval(this.noticeTimer);
+							console.log("公告消息>>>>", socketMessage)
+							const noticeData = socketMessage.data ? JSON.parse(socketMessage.data) : {};
+							this.notice = noticeData || {};
+							this.isShowNotice = true
+							if (this.isShowNotice) {
+								this.noticeTimer = setInterval(() => {
+									const noticeCountdown = this.handleTime(this.notice.endTime, 0);
+									if (!noticeCountdown) {
+										this.isShowNotice = false;
+										clearInterval(this.noticeTimer);
+									}
+								}, 1000);
+							}
+
+						} else if (socketMessage.cmd == 'entry') {
+							try {
+								if (!this.liveUserCalled) {
+									await this.getliveUser(false);
+									this.liveUserCalled = true;
+								}
+								const userIdToEntry = socketMessage.userId;
+								const existingIndex = this.liveViewersData.findIndex((item) => item.userId ===
+									userIdToEntry);
+
+								if (existingIndex === -1) {
+									const liveViewers = {
+										userId: socketMessage.userId,
+										nickName: socketMessage.nickName,
+										avatar: socketMessage.avatar
+									};
+									this.liveViewersData.push(liveViewers);
+									this.liveUserTotal++;
+									console.log("2人数是", this.liveUserTotal)
+								}
+
+								// 解析用户ID(根据实际接口字段调整,此处假设data含userId)
+								const userData = JSON.parse(socketMessage.data || '{}');
+								const userId = userData.userId || socketMessage.userId; // 兼容不同字段
+								if (!userId) return; // 无用户ID不处理
+
+								// 仅新用户(未显示过)才触发提示
+								if (!this.shownEntryUsers.has(userId)) {
+									this.inAndOut = socketMessage;
+									this.showWelcomeMessage = true;
+									this.shownEntryUsers.add(userId); // 加入已显示集合
+									messageData.msg = '来了'
+									this.addToTalkList(messageData);
+
+									// 3秒后隐藏提示(可调整时长)
+									if (this.welcomeTimer) clearTimeout(this.welcomeTimer);
+									this.welcomeTimer = setTimeout(() => {
+										this.showWelcomeMessage = false;
+									}, 3000);
+								}
+							} catch (err) {
+								console.error('解析entry用户数据失败:', err);
+							}
+						} else if (socketMessage.cmd == 'out') {
+							if (this.liveUserTotal > 0) {
+								const userIdToRemove = socketMessage.userId;
+								const index = this.liveViewersData.findIndex((item) => item.userId === userIdToRemove);
+								if (index !== -1) {
+									this.liveViewersData.splice(index, 1);
+									this.liveUserTotal--; // 根据userId删除对应的用户数据
+									console.log("3人数是", this.liveUserTotal)
+								}
+							}
+							this.inAndOut = socketMessage;
+							this.showWelcomeMessage = true;
+
+							// 3秒后隐藏提示
+							if (this.welcomeTimer) clearTimeout(this.welcomeTimer);
+							this.welcomeTimer = setTimeout(() => {
+								this.showWelcomeMessage = false;
+							}, 3000);
+						} else if (socketMessage.cmd == 'live_start' || socketMessage.cmd == 'live_end') {
+							console.log("直播关闭在这里>>>>>>关闭")
+							// 开始直播,关闭直播
+							if (this.liveStartTimer) {
+								clearInterval(this.liveStartTimer);
+								this.liveStartTimer = null;
+							}
+							if (this.redTimer) {
+								clearInterval(this.redTimer);
+								this.redTimer = null;
+							}
+							//  请求最新直播间数据
+							this.$nextTick(() => {
+								this.getliving(this.liveId);
+							});
+						} else if (socketMessage.cmd == 'Integral') {
+							this.integral = {
+								msg: socketMessage.msg,
+								status: true
+							};
+						} else if (socketMessage.cmd == 'deleteMsg') {
+							
+						}else if (socketMessage.cmd == 'LotteryDetail') {
+							try {
+								this.prizeInfo = Array.isArray(JSON.parse(socketMessage.data || '[]')) ? JSON.parse(
+									socketMessage.data || '[]') : [];
+							} catch (err) {
+								console.error('解析抽奖结果失败:', err);
+								this.prizeInfo = [];
+							}
+							this.isShowPrize = true;
+							this.isShowLottery = false;
+							this.isShowLotteryPop = false;
+						} else if (socketMessage.cmd == 'blockUser') {
+							uni.removeStorage({
+								key: 'AppToken',
+								success: () => {
+									uni.reLaunch({
+										url: '/pages/auth/login'
+									});
+								}
+							});
+						}
+					} else {
+						uni.showToast({
+							title: data.msg,
+							icon: 'none'
+						});
+					}
+				} catch (error) {
+					console.error('Socket消息处理失败:', error);
+				}
+			},
+
+			sendMsg(retries = 1) {
+				// 防止连续点击发送两次(800ms短时锁定)
+				if (this.isSending) return;
+				this.isSending = true;
+				setTimeout(() => {
+					this.isSending = false;
+				}, 800);
+				const text = (this.value || '').trim();
+				if (!text) {
+					uni.showToast({
+						title: '不能发送空消息',
+						icon: 'none'
+					});
+					return;
+				}
+				if (!this.isSocketAvailable()) {
+					if (retries > 0) {
+						uni.showToast({
+							title: `连接不稳定,正在重试(${retries}次)...`,
+							icon: 'none'
+						});
+						// 延迟500ms重试,重试次数减1
+						setTimeout(() => this.sendMsg(retries - 1), 500);
+					} else {
+						uni.showToast({
+							title: '连接已断开,发送失败',
+							icon: 'none'
+						});
+						this.value = text; // 恢复输入框内容
+					}
+					return;
+				}
+				const liveId = this.liveId;
+				this.value = ''; // 立即清空输入框
+				// 构造发送给服务端的消息数据
+				const data = {
+					liveId,
+					userId: this.userData.userId,
+					userType: 0,
+					cmd: 'sendMsg',
+					msg: text,
+					nickName: this.userData.nickname || '未命名',
+					avatar: this.userData.avatar ||
+						'https://bjzmky-1323137866.cos.ap-chongqing.myqcloud.com/userapp/images/avatar.png'
+				};
+				// 发送socket消息
+				try {
+					if (this.myselfFlag) {
+						this.addToTalkList(data);
+					} else {
+						this.socket.send({
+							data: JSON.stringify(data),
+							success: () => {
+								this.value = '';
+								// 发送成功后强制滚动到底部,无论当前滚动位置如何
+								this.forceScrollToBottomOnSend();
+							},
+							fail: (err) => {
+								console.error('消息发送失败:', err);
+								if (retries > 0) {
+									uni.showToast({
+										title: `发送失败,正在重试(${retries}次)`,
+										icon: 'none'
+									});
+									setTimeout(() => this.sendMsg(retries - 1), 500);
+								} else {
+									uni.showToast({
+										title: '发送失败,请稍后再试',
+										icon: 'none'
+									});
+									this.value = text; // 恢复输入框内容
+								}
+							}
+						});
+					}
+
+				} catch (err) {
+					console.error('发送消息异常:', err);
+					if (retries > 0) {
+						setTimeout(() => this.sendMsg(retries - 1), 500);
+					} else {
+						uni.showToast({
+							title: '发送失败,请稍后再试',
+							icon: 'none'
+						});
+						this.value = text;
+					}
+				}
+			},
+			formatUserNum() {
+
+				let userTotal = 0;
+				if (!this.liveUserTotal) {
+					this.liveUserTotal = 0;
+				}
+				if (this.liveUserTotal > 0) {
+					userTotal = this.liveUserTotal = 0;
+				}
+				if (this.liveUserTotal > 10000) {
+					userTotal = (this.liveUserTotal / 10000.0).toFixed(1);
+					userTotal = userTotal + "万";
+				}
+				console.log("qxj userTotal", userTotal);
+				return userTotal;
+			}
+
+		},
+
+
+	};
+</script>
+
+<style scoped lang="scss">
+	// 重置按钮样式
+	.button-reset {
+		background-color: transparent !important;
+		padding: 0 !important;
+		line-height: 1 !important;
+		margin: 0 !important;
+		width: auto !important;
+		font-weight: 500 !important;
+		border-radius: none !important;
+
+		&::after {
+			border: none !important;
+			padding: 0 !important;
+			margin: 0 !important;
+		}
+	}
+
+	// :deep(.u-tabs__wrapper__nav) {
+	// 	background-color: #fff !important;
+	// }
+
+	.swiper-wrapper {
+		/* 深色主题变量 */
+		--bottom-color: transparent;
+		--bg-color: #242424;
+		--text-color: #ffffff;
+		--name-color: #8CE7FF;
+		--normal-bg: rgba(0, 0, 0, 0.3);
+		--input-bg: rgba(0, 0, 0, 0.3);
+		--chat-bg: transparent;
+		--video-height: 100vh;
+		--chat-height: 30vh;
+	}
+
+	.swiper-wrapper.horizontal {
+		/* 默认变量(浅色主题) */
+		--bottom-color: #fff;
+		--name-color: #666666;
+		--bg-color: #ffffff;
+		--text-color: #333333;
+		--normal-bg: #fff;
+		--input-bg: #F5F7FA;
+		--chat-bg: #ECF5F4; //对话聊天
+		--video-height: 500rpx;
+		--chat-height: clac(100% - 650rpx);
+	}
+
+	.video-container {
+		height: var(--video-height);
+	}
+
+
+
+
+	// 主容器
+	.swiper-wrapper {
+		position: relative;
+		width: 100%;
+		height: 100vh;
+		overflow: hidden;
+		/* 应用变量 */
+		background: var(--bg-color);
+		color: var(--text-color);
+
+		.container {
+			width: 100%;
+			height: 100%;
+			position: relative;
+			transition: opacity 0.3s ease;
+			transform: translateZ(0);
+			will-change: opacity;
+
+			// 预告直播盒子
+			.trailer-box {
+				width: calc(100% - 80rpx);
+				background: #333333;
+				border-radius: 24rpx;
+				position: relative;
+				top: 15%;
+				left: 50%;
+				transform: translateX(-50%);
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				color: #ffffff;
+				padding: 20rpx;
+				z-index: 9999;
+
+				.trailer-video {
+					width: 100%;
+					height: 400rpx;
+				}
+
+				.trailer-placeholder {
+					margin-bottom: 40rpx;
+					width: 240rpx;
+					height: 240rpx;
+				}
+
+				.countdown-container {
+					margin: 20rpx 0;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+
+					.live-name {
+						font-weight: 600;
+						font-size: 36rpx;
+					}
+
+					.countdown-display {
+						display: flex;
+						align-items: center;
+						margin: 30rpx 0;
+
+						.countdown-label {
+							font-size: 24rpx;
+							color: #999999;
+						}
+
+						.countdown-separator {
+							font-size: 24rpx;
+							color: #999999;
+						}
+
+						.countdown-unit {
+							width: 40rpx;
+							height: 40rpx;
+							background: #4D4D4D;
+							border-radius: 8rpx;
+							text-align: center;
+							overflow: hidden;
+							margin: 0 8rpx;
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #FFFFFF;
+							line-height: 40rpx;
+						}
+					}
+				}
+
+				.trailer-actions {
+					display: flex;
+					justify-content: center;
+					align-items: center;
+
+					.action-button {
+						width: 280rpx;
+						height: 72rpx;
+						border-radius: 36rpx;
+						line-height: 72rpx;
+						text-align: center;
+						color: #fff;
+
+						&.reserve-button {
+							background: linear-gradient(136deg, #38D97D 0%, #02B176 100%);
+						}
+
+						&:not(.reserve-button) {
+							background: #F4A007;
+						}
+
+						.button-icon {
+							width: 32rpx;
+							height: 32rpx;
+						}
+					}
+				}
+
+				.no-live-title {
+					margin-top: 30rpx;
+					font-size: 42rpx;
+					font-weight: 500;
+				}
+			}
+
+			// 主要内容区域
+			.content {
+				position: relative;
+				z-index: 2;
+				height: 100%;
+				width: 100%;
+				top: 0;
+				left: 0;
+				display: flex;
+				flex-direction: column;
+				// justify-content: space-between;
+
+				// 顶部信息栏
+				.top-info-bar {
+					position: fixed;
+					top: 0;
+					z-index: 5;
+					width: 100%;
+					padding: 0 24rpx;
+					box-sizing: border-box;
+					margin-top: 48rpx;
+					display: flex;
+					justify-content: space-between;
+
+					&.horizontal-top {
+						position: static;
+						margin-bottom: 50rpx;
+
+					}
+
+					.user-info-section {
+						display: flex;
+						align-items: center;
+
+						.back-icon {
+							width: 60rpx;
+							height: 64rpx;
+						}
+
+						.user-avatar-container {
+							padding: 6rpx 8rpx;
+							height: 64rpx;
+							background: var(--normal-bg);
+							border-radius: 32rpx;
+							display: flex;
+							align-items: center;
+
+							.user-name {
+								color: var(--text-color);
+							}
+						}
+					}
+
+					.viewers-section {
+						display: flex;
+						align-items: center;
+						margin-top: 120rpx;
+
+						.viewer-avatar {
+							width: 52rpx;
+							height: 52rpx;
+							border-radius: 26rpx;
+						}
+
+						.viewer-avatar-placeholder {
+							width: 52rpx;
+							height: 52rpx;
+							border-radius: 50%;
+							display: flex;
+							align-items: center;
+							justify-content: center;
+
+							.avatar-initial {
+								color: var(--text-color);
+								font-size: 18rpx;
+							}
+						}
+
+						.viewer-count {
+							width: 80rpx;
+							height: 52rpx;
+							background: var(--normal-bg);
+							border-radius: 26rpx;
+							font-size: 30rpx;
+							color: var(--text-color);
+							text-align: center;
+							line-height: 52rpx;
+						}
+					}
+				}
+
+				// 购买提示
+				.purchase-prompt {
+					position: absolute;
+					bottom: 750rpx;
+					left: 24rpx;
+					padding: 6rpx 20rpx;
+					background: rgba(230, 154, 34, 0.7);
+					border-radius: 24rpx;
+					z-index: 9;
+					font-weight: 500;
+					color: #ffffff;
+					transition: opacity 0.3s ease;
+					font-size: 30rpx;
+					display: flex;
+					align-items: center;
+
+					.prompt-icon {
+						width: 32rpx;
+						height: 32rpx;
+					}
+				}
+
+				// 视频区域
+				.videolist {
+					position: relative;
+					height: var(--video-height);
+					width: 100%;
+
+					.video-container {
+						height: var(--video-height);
+						width: 100%;
+						transform: translateZ(0);
+						backface-visibility: hidden;
+						perspective: 1000;
+
+						&.horizontal-layout {
+							// position: absolute;
+							// top: 20%;
+							// max-height: 450rpx;
+							// z-index: 99;
+						}
+
+						.video-player {
+							width: 100%;
+							height: 100%;
+						}
+
+						.live-end-message {
+							position: absolute;
+							top: 50%;
+							left: 50%;
+							transform: translate(-50%, -50%);
+							font-size: 36rpx;
+							color: #fff;
+						}
+
+						.replay-label {
+							position: absolute;
+							top: 50rpx;
+							right: 16rpx;
+							background-color: rgba(57, 57, 57, 0.6);
+							padding: 4rpx 10rpx;
+							color: #fff;
+							border-radius: 15rpx;
+						}
+					}
+				}
+			}
+
+			// 聊天区域
+			.chat-area-container {
+				// height: var(--chat-height);
+				background: var(--chat-bg);
+				position: fixed;
+				width: 100%;
+				bottom: 0;
+				z-index: 999;
+				transform: translateZ(0);
+				will-change: transform;
+				backface-visibility: hidden;
+
+				&.chat-area-container2 {
+					flex: 1;
+					min-height: 0; // 重要:允许收缩到0
+					position: relative;
+					transform: none; // 移除之前的变换
+					will-change: auto;
+					display: flex;
+					flex-direction: column;
+				}
+
+				&.chat-area-focused {
+					transform: translateY(calc(-1 * var(--keyboard-height, 0rpx))) translateZ(0);
+					z-index: 1000;
+				}
+
+				.tabs_bg {
+					background-color: #fff;
+					padding: 20rpx 40rpx;
+				}
+
+				.chat-content-wrapper {
+					flex: 1;
+					height: 368rpx;
+					padding: 20rpx 0;
+					transform: translateZ(0);
+					will-change: height;
+					position: relative;
+
+					&.chat-content-focused {
+						height: 64rpx;
+					}
+
+					.notice-message {
+						position: absolute;
+						bottom: 30vh;
+						max-width: 80%;
+						padding: 24rpx;
+						background-color: rgba(0, 0, 0, 0.3);
+						margin: 0 0 20rpx 20rpx;
+						border-radius: 20rpx;
+						color: #ffda73;
+					}
+
+					.message-scroll-view {
+						width: calc(100% - 20rpx);
+						height: 100%;
+						padding-left: 20rpx;
+						display: flex;
+						flex: 1;
+						flex-direction: column;
+						-webkit-overflow-scrolling: touch;
+					}
+
+					.message-list {
+						width: 80%;
+						margin-bottom: 4rpx;
+						animation: simpleFade 0.2s;
+
+						.message-item {
+							display: flex;
+							justify-content: flex-start;
+
+							.message-content {
+								font-size: 30rpx;
+								max-width: 100%;
+								border-radius: 30rpx;
+								background: var(--normal-bg);
+								padding: 10rpx 30rpx;
+								line-height: 1.4;
+								word-break: break-all;
+								word-wrap: break-word;
+								overflow-wrap: break-word;
+
+								.user-nickname {
+									color: var(--name-color);
+								}
+
+								.message-text {
+									color: var(--text-color);
+								}
+							}
+						}
+					}
+				}
+
+				// 输入和操作区域
+				.input-actions-container {
+					background-color: var(--bottom-color);
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					padding: 24rpx;
+
+					&.input-actions-focused {
+						justify-content: flex-start !important;
+						align-items: stretch !important;
+						width: 100% !important;
+						display: flex !important;
+					}
+
+					.input-container {
+						background: var(--input-bg);
+						box-sizing: border-box;
+						border-radius: 36rpx;
+						display: flex;
+						align-items: center;
+						transform: translateZ(0);
+						will-change: transform;
+						backface-visibility: hidden;
+						perspective: 1000px;
+
+						&.input-container-normal {
+							padding: 18rpx 32rpx;
+							width: auto;
+							max-width: auto;
+							margin-right: 0;
+							justify-content: space-between;
+						}
+
+						&.input-container-focused {
+							padding: 10rpx 10rpx 10rpx 20rpx;
+							width: calc(100% - 20rpx);
+							max-width: calc(100% - 20rpx);
+							margin-right: 20rpx;
+							flex: 1;
+							justify-content: flex-start;
+						}
+
+						.chat-input {
+							border: none !important;
+							font-size: 32rpx !important;
+							color: var(--text-color) !important;
+							background: transparent !important;
+							width: 70% !important;
+							transform: translateZ(0);
+							will-change: contents, width;
+							backface-visibility: hidden;
+							margin-left: 20rpx;
+
+							&.input-focused {
+								width: auto !important;
+								flex: 1 !important;
+								min-width: 0 !important;
+								margin-left: 10rpx !important;
+								max-width: none !important;
+							}
+						}
+
+						.send-button {
+							background-color: #fafafa;
+							border-radius: 28rpx;
+							padding: 14rpx 16rpx;
+							color: #181818;
+							font-weight: 500;
+							min-width: 80rpx;
+							text-align: center;
+							flex-shrink: 0;
+						}
+					}
+
+					.action-buttons {
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						margin-right: 15rpx;
+						transform: translateZ(0);
+
+						&.action-buttons-hidden {
+							opacity: 0;
+							visibility: hidden;
+						}
+
+						.action-button-group {
+							display: flex;
+							justify-content: space-between;
+							align-items: center;
+						}
+
+						.icon-button {
+							background: var(--normal-bg);
+							border-radius: 50%;
+							width: 88rpx;
+							height: 88rpx;
+							display: flex;
+							justify-content: center;
+							align-items: center;
+							transition: transform 0.2s ease;
+							margin-left: 20rpx;
+
+							&.like-container {
+								display: flex;
+								flex-direction: column;
+								justify-content: center;
+								align-items: center;
+
+								.like-count {
+									position: absolute;
+									bottom: -10rpx;
+									font-size: 14rpx;
+									color: #FA341E;
+									padding: 4rpx 6rpx;
+									background: #FFFFFF;
+									border-radius: 10rpx;
+								}
+							}
+
+							.action-icon {
+								width: 48rpx;
+								height: 48rpx;
+							}
+
+							.cart-icon {
+								width: 58rpx;
+								height: 58rpx;
+							}
+						}
+					}
+				}
+			}
+
+			// 商品卡片
+			.goods-card {
+				position: fixed;
+				bottom: 140rpx;
+				right: 24rpx;
+				z-index: 5;
+				background-color: #fff;
+				border-radius: 20rpx;
+				overflow: hidden;
+				width: 224rpx;
+				padding: 4rpx;
+
+				.goods-card-header {
+					position: absolute;
+					top: 4rpx;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					color: #fff;
+					width: 100%;
+					padding-right: 10rpx;
+					box-sizing: border-box;
+
+					.goods-status {
+						background: rgba(0, 0, 0, 0.4);
+						padding: 12rpx;
+						font-size: 22rpx;
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						border-radius: 10rpx;
+
+						.status-icon {
+							width: 30rpx;
+							height: 30rpx;
+						}
+					}
+
+					.close-icon {
+						width: 24rpx;
+						height: 24rpx;
+					}
+				}
+
+				.goods-image {
+					width: 100%;
+					height: 224rpx;
+					border-radius: 16rpx 16rpx 0 0;
+					overflow: hidden;
+				}
+
+				.goods-info {
+					padding: 4rpx;
+
+					.goods-title {
+						font-weight: 500;
+						font-size: 24rpx;
+						margin: 10rpx 0 12rpx;
+						color: #111111;
+					}
+
+					.goods-action {
+						color: #fff;
+						text-align: center;
+						font-weight: 500;
+						font-size: 30rpx;
+						position: relative;
+
+						.goods-price {
+							left: 10rpx;
+							position: absolute;
+							top: 40%;
+							transform: translateY(-50%);
+							font-size: 30rpx;
+							z-index: 999;
+
+							.price-symbol {
+								font-weight: 600;
+								font-size: 20rpx;
+								color: #FFFFFF;
+							}
+
+							.price-integer {
+								font-size: 36rpx;
+								margin-right: 10rpx;
+							}
+						}
+
+						.shop-icon {
+							width: 204rpx;
+							height: 52rpx;
+						}
+					}
+				}
+			}
+
+			// 动画
+			@keyframes simpleFade {
+				from {
+					opacity: 0;
+				}
+
+				to {
+					opacity: 1;
+				}
+			}
+
+			// 抽奖弹窗1
+			.lottery-popup {
+				position: relative;
+				border-radius: 40rpx;
+				height: fit-content;
+
+				.lottery-header-image {
+					width: 311rpx;
+					position: absolute;
+					top: -122rpx;
+					left: 50%;
+					transform: translateX(-50%);
+				}
+
+				.lottery-background-image {
+					position: absolute;
+					top: 0;
+					left: 0;
+					width: 100%;
+					height: 100%;
+					z-index: 1;
+				}
+
+				.lottery-content {
+					position: relative;
+					z-index: 2;
+					padding: 24rpx 0 68rpx;
+
+					.lottery-close-section {
+						display: flex;
+						justify-content: flex-end;
+						margin-right: 20rpx;
+
+						.close-button-wrapper {
+							.close-button {
+								width: 80rpx;
+								height: 80rpx;
+								display: flex;
+								justify-content: center;
+								align-items: center;
+							}
+						}
+					}
+
+					.lottery-main-content {
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+
+						.lottery-title-image {
+							width: 446rpx;
+							height: 80rpx;
+						}
+
+						.lottery-countdown-section {
+							font-size: 24rpx;
+							color: #fff;
+							display: flex;
+							align-items: center;
+							margin: 30rpx 0;
+
+							.countdown-label {
+								margin-right: 10rpx;
+							}
+
+							.countdown-timer {
+								display: flex;
+								align-items: center;
+
+								.countdown-number {
+									width: 40rpx;
+									height: 40rpx;
+									text-align: center;
+									overflow: hidden;
+									background: #ffffff;
+									box-shadow: inset 0rpx 2rpx 8rpx 0rpx #ffebb2;
+									border-radius: 8rpx;
+									margin: 4rpx;
+									font-weight: 600;
+									font-size: 24rpx;
+									color: #f85d22;
+									line-height: 40rpx;
+								}
+							}
+						}
+
+						.lottery-products-section {
+							width: 100%;
+						}
+
+						.lottery-indicators {
+							margin: 20rpx 0 50rpx;
+							display: flex;
+							gap: 6rpx;
+
+							.indicator-point {
+								width: 20rpx;
+								height: 8rpx;
+								background: rgba(255, 255, 255, 0.5);
+								border-radius: 4rpx;
+
+								&.selected {
+									background: #ffeb66;
+								}
+							}
+						}
+
+						.lottery-tip {
+							color: #fff;
+							font-size: 28rpx;
+						}
+
+						.lottery-action-button {
+							margin-top: 30rpx;
+							width: 520rpx;
+							height: 88rpx;
+							line-height: 88rpx;
+							background: linear-gradient(180deg, #fff4d6 0%, #ffeb66 100%);
+							box-shadow: 0rpx 10rpx 8rpx 4rpx rgba(246, 82, 25, 0.5);
+							border-radius: 44rpx;
+							font-weight: 500;
+							font-size: 36rpx;
+							color: #f4410b;
+							text-align: center;
+						}
+					}
+				}
+			}
+
+			// 积分弹窗
+			.integral-popup {
+				min-width: 400rpx;
+				max-width: 600rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				border-radius: 20rpx;
+				overflow: hidden;
+
+				.integral-header {
+					width: 100%;
+					position: relative;
+
+					.integral-title {
+						width: 100%;
+						font-weight: 600;
+						font-size: 40rpx;
+						color: #ffffff;
+						text-shadow: 0px 4rpx 8rpx rgba(255, 89, 2, 0.8);
+						position: absolute;
+						top: 50rpx;
+						text-align: center;
+					}
+
+					.integral-background-image {
+						width: 100%;
+					}
+				}
+
+				.integral-content {
+					padding: 20rpx;
+
+					.integral-message {
+						font-weight: 500;
+						font-size: 32rpx;
+						text-align: center;
+					}
+
+					.integral-confirm-button {
+						font-size: 32rpx;
+						margin-top: 20rpx;
+						background: linear-gradient(270deg, #ff4702 0%, #fe6304 100%);
+						color: #fff;
+						text-align: center;
+						padding: 18rpx 60rpx;
+						border-radius: 10rpx;
+						font-weight: 500;
+					}
+				}
+			}
+
+			// 红包弹窗
+			.red-envelope-popup {
+				width: 504rpx;
+				position: relative;
+				text-align: center;
+				height: 610rpx;
+				display: flex;
+				align-items: center;
+
+				.red-envelope-close-button {
+					position: absolute;
+					right: 0;
+					top: -180rpx;
+					width: 64rpx;
+					height: 64rpx;
+				}
+
+				.red-envelope-background {
+					width: 100%;
+					height: 100%;
+				}
+
+				.red-envelope-content {
+					position: absolute;
+					top: 0;
+					left: 50%;
+					transform: translateX(-50%);
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					height: auto;
+
+					.red-envelope-header {
+						margin-top: 68rpx;
+						display: flex;
+						align-items: center;
+
+						.header-decoration-left,
+						.header-decoration-right {
+							width: 44rpx;
+							height: 20rpx;
+						}
+
+						.header-title {
+							margin: 0 12rpx;
+							font-size: 28rpx;
+							color: #FFF1BC;
+						}
+					}
+
+					.red-envelope-text {
+						font-weight: 600;
+						font-size: 80rpx;
+						color: #FFF1BC;
+						margin-top: 42rpx;
+					}
+
+					.red-envelope-open-text {
+						font-weight: 800;
+						font-size: 110rpx;
+						color: #F41420;
+						margin-top: 70rpx;
+					}
+				}
+			}
+
+			// 抽奖弹窗2
+			.lottery-popup-v2 {
+				width: 504rpx;
+				position: relative;
+				text-align: center;
+				height: 556rpx;
+				display: flex;
+				align-items: center;
+
+				.lottery-close-button-v2 {
+					position: absolute;
+					right: 0;
+					top: -180rpx;
+					width: 64rpx;
+					height: 64rpx;
+				}
+
+				.lottery-top-image {
+					position: absolute;
+					top: -214rpx;
+					width: 100%;
+				}
+
+				.lottery-background-v2 {
+					width: 100%;
+					height: 100%;
+				}
+
+				.lottery-content-v2 {
+					position: absolute;
+					top: 0;
+					left: 50%;
+					transform: translateX(-50%);
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					height: auto;
+
+					.lottery-header-v2 {
+						margin-top: 68rpx;
+						display: flex;
+						align-items: center;
+
+						.lottery-header-decoration-left,
+						.lottery-header-decoration-right {
+							width: 44rpx;
+							height: 20rpx;
+						}
+
+						.lottery-header-title {
+							margin: 0 12rpx;
+							font-size: 28rpx;
+							color: #FFF1BC;
+							margin-top: 22rpx;
+						}
+					}
+
+					.lottery-text-v2 {
+						font-weight: 600;
+						font-size: 80rpx;
+						color: #FFF1BC;
+
+						&:last-of-type {
+							margin-bottom: 56rpx;
+						}
+					}
+
+					.lottery-action-button-v2 {
+						width: 424rpx;
+						height: 96rpx;
+						line-height: 96rpx;
+						background: linear-gradient(180deg, #FBF1CA 0%, #FFD684 100%);
+						border-radius: 48rpx;
+						font-weight: 600;
+						font-size: 36rpx;
+						color: #F12E2C;
+						margin-bottom: 52rpx;
+					}
+				}
+			}
+
+			// 红包卡片弹窗
+			.red-card-popup {
+				width: 550rpx;
+				height: 636rpx;
+				position: relative;
+
+				.red-card-image {
+					position: absolute;
+					width: 100%;
+					height: 100%;
+				}
+
+				.red-card-content {
+					position: relative;
+					z-index: 5;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+
+					.red-card-message {
+						font-size: 36rpx;
+						color: #ff3a1e;
+						margin: 180rpx 0 90rpx;
+					}
+
+					.red-card-tip {
+						font-size: 28rpx;
+						color: #ffecc3;
+						margin: 80rpx 0 40rpx;
+					}
+
+					.red-card-confirm-button {
+						width: 392rpx;
+						height: 96rpx;
+						line-height: 96rpx;
+						background: linear-gradient(180deg, #fff4d5 0%, #ffe5b1 100%);
+						border-radius: 48rpx;
+						font-weight: 600;
+						font-size: 36rpx;
+						color: #c32008;
+						text-align: center;
+					}
+				}
+			}
+
+			// 消息弹窗
+			.message-popup {
+				display: flex;
+				flex-direction: column;
+				position: relative;
+				align-items: center;
+				padding: 40rpx 20rpx 0 20rpx;
+				width: 420rpx;
+				box-sizing: border-box;
+
+				.message-close-icon {
+					position: absolute;
+					top: 14rpx;
+					right: 14rpx;
+					width: 50rpx;
+					height: 50rpx;
+				}
+
+				.message-title {
+					font-weight: 500;
+					font-size: 42rpx;
+					margin: 40rpx 0;
+				}
+
+				.message-content {
+					margin-bottom: 60rpx;
+				}
+
+				.message-confirm-button {
+					width: 55%;
+					border-radius: 50rpx;
+					height: 100rpx;
+					line-height: 100rpx;
+					font-weight: 600;
+					font-size: 32rpx;
+					text-align: center;
+					background-color: #dfdfdf;
+				}
+			}
+
+			// 中奖弹窗
+			.prize-popup {
+				width: 504rpx;
+				padding: 40rpx 40rpx 30rpx;
+				box-sizing: border-box;
+				display: flex;
+				flex-direction: column;
+				border-radius: 20rpx;
+				align-items: center;
+				background: linear-gradient(180deg, #f7823f 0%, #ffd4be 27%, #ffffff 100%);
+				position: relative;
+
+				.prize-header-image {
+					width: 311rpx;
+					position: absolute;
+					top: -122rpx;
+					left: 50%;
+					transform: translateX(-50%);
+				}
+
+				.prize-title {
+					color: #c32008;
+					font-size: 34rpx;
+					font-weight: 600;
+					margin: 20rpx 0 40rpx;
+				}
+
+				.prize-info-section {
+					width: 100%;
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					font-size: 28rpx;
+					margin: 10rpx 0;
+
+					.prize-level {
+						font-weight: 600;
+					}
+				}
+
+				.prize-tip {
+					font-size: 28rpx;
+					color: #414141;
+					margin: 40rpx 0;
+				}
+
+				.prize-action-button {
+					width: 200rpx;
+					height: 70rpx;
+					line-height: 70rpx;
+					background: linear-gradient(180deg, #ff7c30 0%, #ff3a1e 100%);
+					border-radius: 28rpx;
+					font-weight: 500;
+					font-size: 32rpx;
+					color: #ffffff;
+					text-align: center;
+				}
+			}
+
+			// 未中奖弹窗
+			.no-prize-popup {
+				width: 504rpx;
+				padding: 40rpx 40rpx 30rpx;
+				box-sizing: border-box;
+				display: flex;
+				flex-direction: column;
+				border-radius: 20rpx;
+				align-items: center;
+				position: relative;
+
+				.no-prize-image {
+					margin-top: 40rpx;
+					width: 300rpx;
+					height: 300rpx;
+				}
+
+				.no-prize-tip {
+					font-size: 36rpx;
+					color: #414141;
+					margin: 40rpx 0;
+				}
+
+				.no-prize-confirm-button {
+					width: 220rpx;
+					height: 80rpx;
+					line-height: 80rpx;
+					background: linear-gradient(180deg, #fdfbb8 0%, #b79243 100%);
+					border-radius: 28rpx;
+					font-weight: 500;
+					font-size: 32rpx;
+					color: #ffffff;
+					text-align: center;
+				}
+			}
+
+			// 中奖记录弹窗
+			.winning-record-popup {
+				position: relative;
+				height: 800rpx;
+
+				.winning-record-header-bg {
+					position: absolute;
+					top: -125rpx;
+					left: 50%;
+					width: 311rpx;
+					transform: translateX(-50%);
+				}
+
+				.winning-record-background {
+					width: 100%;
+					height: 100%;
+				}
+
+				.winning-record-content {
+					position: absolute;
+					top: 50rpx;
+					color: #fff;
+					width: 100%;
+					padding: 0 36rpx;
+					box-sizing: border-box;
+
+					.winning-record-title {
+						text-align: center;
+						font-size: 40rpx;
+						font-weight: 500;
+						margin-bottom: 40rpx;
+					}
+
+					.winning-record-header {
+						display: flex;
+						justify-content: space-between;
+						text-align: center;
+						font-size: 34rpx;
+						margin-bottom: 40rpx;
+
+						.header-column {
+							&.time-column {
+								width: 45%;
+							}
+
+							&.status-column {
+								width: 20%;
+							}
+
+							&.prize-column {
+								width: 35%;
+							}
+						}
+					}
+
+					.winning-record-list {
+						height: 500rpx;
+
+						.winning-record-item {
+							display: flex;
+							justify-content: space-between;
+							text-align: center;
+							font-size: 34rpx;
+							margin-bottom: 20rpx;
+
+							.record-time {
+								width: 45%;
+								font-size: 30rpx;
+							}
+
+							.record-status-button {
+								width: 20%;
+								background-color: #fff;
+								border-radius: 20rpx;
+								color: #f4410b;
+							}
+
+							.record-status {
+								width: 20%;
+							}
+
+							.record-prize {
+								width: 35%;
+							}
+						}
+					}
+
+					.no-winning-records {
+						font-size: 36rpx;
+						margin-top: 150rpx;
+						text-align: center;
+					}
+				}
+			}
+
+			// 观众列表弹窗
+			.viewers-list-popup {
+				position: relative;
+				height: 40vh;
+				padding: 40rpx 0rpx;
+				box-sizing: border-box;
+				display: flex;
+				flex-direction: column;
+
+				.viewers-list-title {
+					font-size: 32rpx;
+					text-align: center;
+				}
+
+				.viewers-scroll-list {
+					flex: 1;
+					margin-top: 50rpx;
+					overflow-y: auto;
+					padding: 0 40rpx;
+
+					.viewer-list-item {
+						display: flex;
+						align-items: center;
+						font-size: 28rpx;
+						margin: 20rpx 0;
+
+						.rank-number {
+							width: 50rpx;
+							margin-right: 10rpx;
+							font-weight: normal;
+
+							&.rank-1 {
+								color: #FF3B30;
+								font-weight: bold;
+							}
+
+							&.rank-2 {
+								color: #FF9500;
+								font-weight: bold;
+							}
+
+							&.rank-3 {
+								color: #FFCC00;
+								font-weight: bold;
+							}
+
+							&:not(.rank-1):not(.rank-2):not(.rank-3) {
+								color: #8E8E93;
+							}
+						}
+
+						.viewer-avatar-placeholder {
+							width: 72rpx;
+							height: 72rpx;
+							border-radius: 50%;
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							background-color: #8978e2;
+
+							.avatar-initial {
+								color: #ffffff;
+								font-size: 24rpx;
+							}
+						}
+
+						.viewer-name {
+							margin-left: 16rpx;
+							font-size: 30rpx;
+						}
+					}
+				}
+			}
+
+			// 更多操作弹窗
+			.more-actions-popup {
+				border-radius: 20rpx 0 0 20rpx;
+				padding: 70rpx 30rpx;
+				display: flex;
+				justify-content: space-between;
+
+				.more-action-item {
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+
+					.action-icon {
+						width: 48rpx;
+						height: 48rpx;
+					}
+
+					.action-label {
+						color:#1e1e1e;
+						text-align: center;
+						margin-top: 10rpx;
+					}
+				}
+			}
+
+			// 商品弹窗
+			.shopping-popup {
+				padding: 22rpx 16rpx;
+
+				.shopping-header {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					padding: 0 16rpx 22rpx;
+
+					.search-input-container {
+						width: 414rpx;
+						height: 76rpx;
+						background: #ffffff;
+						border-radius: 36rpx;
+						margin-left: 20rpx;
+						padding: 0 32rpx;
+						box-sizing: border-box;
+						font-size: 24rpx;
+						margin-right: 24rpx;
+						display: flex;
+						align-items: center;
+
+						.search-icon {
+							width: 24rpx;
+							margin-right: 16rpx;
+						}
+					}
+
+					.shopping-action-button {
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						font-size: 20rpx;
+						color: #222222;
+
+						.action-button-icon {
+							width: 48rpx;
+							height: 48rpx;
+						}
+
+						.action-button-label {
+							text-align: center;
+						}
+					}
+				}
+
+				.products-list {
+					height: 30vh;
+					overflow: hidden;
+
+					.product-item {
+						display: flex;
+						align-items: center;
+						padding: 20rpx 16rpx;
+						background: #ffffff;
+						border-radius: 16rpx;
+						margin-bottom: 16rpx;
+
+						.product-image-container {
+							width: 200rpx;
+							height: 200rpx;
+							border-radius: 16rpx;
+							overflow: hidden;
+							position: relative;
+							margin-right: 24rpx;
+
+							.product-image {
+								width: 100%;
+								height: 100%;
+							}
+
+							.product-index-label {
+								position: absolute;
+								top: 0;
+								width: 64rpx;
+								height: 40rpx;
+								background: var(--normal-bg);
+								border-radius: 16rpx 0rpx 16rpx 0rpx;
+								text-align: center;
+								font-weight: 500;
+								font-size: 28rpx;
+								color: var(--text-color);
+							}
+						}
+
+						.product-info {
+							flex: 1;
+
+							.product-name {
+								font-weight: 500;
+								font-size: 30rpx;
+								color: #000000;
+								margin-bottom: 10rpx;
+							}
+
+							.product-sales {
+								font-size: 22rpx;
+								color: #e69a22;
+								height: 56rpx;
+							}
+
+							.product-action-section {
+								display: flex;
+								justify-content: space-between;
+								align-items: center;
+
+								.product-price {
+									color: #ff5c03;
+									font-size: 22rpx;
+									font-weight: 500;
+
+									.price-symbol {
+										font-size: 20rpx;
+										font-weight: 600;
+									}
+
+									.price-integer {
+										font-size: 36rpx;
+										font-weight: bold;
+									}
+								}
+
+								.product-action-buttons {
+									display: flex;
+									align-items: center;
+									text-align: center;
+									line-height: 56rpx;
+
+									.collect-button {
+										width: 72rpx;
+										height: 100%;
+										background: #f5f7fa;
+										border-radius: 8rpx 0rpx 0rpx 8rpx;
+
+										.collect-icon {
+											width: 36rpx;
+											height: 36rpx;
+											vertical-align: middle;
+										}
+									}
+
+									.buy-button {
+										width: 152rpx;
+										background: linear-gradient(270deg, #ff5c03 0%, #ffac64 100%);
+										border-radius: 0rpx 8rpx 8rpx 0rpx;
+										font-weight: 500;
+										font-size: 30rpx;
+										color: #ffffff;
+
+										&.disabled {
+											background: #cccccc;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+
+			// 优惠券弹窗
+			.coupon-popup {
+				position: fixed;
+				bottom: 140rpx;
+				right: 100rpx;
+				z-index: 5;
+				border-radius: 20rpx;
+				width: 320rpx;
+
+				.coupon-container {
+					width: 100%;
+					position: relative;
+
+					.coupon-background {
+						height: 452rpx;
+						width: 100%;
+					}
+
+					.coupon-header {
+						position: absolute;
+						height: 120rpx;
+						top: -120rpx;
+						left: 0;
+						width: 100%;
+						z-index: 6;
+					}
+
+					.coupon-close-button {
+						position: absolute;
+						right: 10rpx;
+						top: 10rpx;
+						width: 40rpx;
+						height: 40rpx;
+						z-index: 99;
+					}
+
+					.coupon-content {
+						width: 100%;
+						position: absolute;
+						top: 20rpx;
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						color: #fff;
+
+						.coupon-name {
+							font-weight: 500;
+							font-size: 30rpx;
+							margin: 16rpx 0 12rpx;
+						}
+
+						.coupon-price {
+							font-size: 40rpx;
+
+							.coupon-price-integer {
+								font-size: 56rpx;
+								font-weight: 600;
+							}
+						}
+
+						.coupon-condition,
+						.coupon-description,
+						.coupon-validity {
+							font-weight: 500;
+							font-size: 30rpx;
+							margin: 5rpx 0;
+						}
+
+						.coupon-description {
+							margin-top: 26rpx;
+						}
+
+						.coupon-get-button {
+							background: linear-gradient(270deg, #fffce1 0%, #ffeaaf 100%);
+							color: #ff0004;
+							text-align: center;
+							padding: 16rpx 0;
+							border-radius: 40rpx;
+							font-weight: 500;
+							font-size: 30rpx;
+							width: 70%;
+							margin-top: 26rpx;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 159 - 0
pages_course/livingList.vue

@@ -0,0 +1,159 @@
+<template>
+	<view class="content">
+		<mescroll-body bottom="0" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
+			:down="downOption" :up="upOption">
+			<view class="list">
+				<view class="list-item" @click="goLive(item)" v-for="(item,index) in list" :key="index">
+					<image class="img"  v-if="item.liveImgUrl" :src="item.liveImgUrl"></image>
+					<view class="info">
+						<text>{{item.liveName}}</text>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {
+		liveList
+	} from '@/api/living.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+
+				list: [],
+				downOption: {
+					offset: 80,
+					use: true,
+					auto: false
+				},
+				upOption: {
+					use: true,
+					auto: true,
+					page: {
+						num: 0,
+						size: 10
+					}
+				},
+				mescroll: null,
+			}
+		},
+		onLoad() {
+			// if (!uni.getStorageSync("AppToken")) {
+			// 	uni.navigateTo({
+			// 		url: '/pages/auth/login'
+			// 	});
+			// }
+		},
+		onUnload() {
+
+		},
+		methods: {
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+
+			// 下拉刷新回调
+			downCallback(mescroll) {
+				this.list = [];
+				mescroll.resetUpScroll();
+			},
+
+			// 上拉加载回调
+			upCallback(mescroll) {
+				const pageNum = mescroll.num;
+				const pageSize = mescroll.size;
+
+				let data = {
+					pageSize: pageSize,
+					pageNum: pageNum,
+				}
+				liveList(data).then(res => {
+					if (!res) {
+						mescroll.endErr();
+						return;
+					}
+					if (res.code == 200) {
+						let curPageData = Array.isArray(res.data.list) ? res.data.list : [];
+						let totalSize = Number(res.data.total) || 0;
+						if (pageNum === 1) {
+							this.list = [];
+						}
+						this.list = this.list.concat(curPageData);
+
+						mescroll.endBySize(curPageData.length, totalSize);
+					} else {
+						mescroll.endErr();
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				}).catch(err => {
+					mescroll.endErr();
+				});
+			},
+
+			goLive(item) {
+				uni.navigateTo({
+					// &immediate=true
+					url: `./living?liveId=${item.liveId}`
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #111;
+		min-height: 100vh;
+		padding: 24rpx;
+
+		.list {
+			display: flex;
+			justify-content: space-between;
+			flex-wrap: wrap;
+
+			.list-item {
+				border-radius: 16rpx;
+				width: 340rpx;
+				height: 450rpx;
+				background-color: #0d0d0d;
+				margin-bottom: 24rpx;
+				overflow: hidden;
+				position: relative;
+
+				.img {
+					width: 100%;
+					height: 100%;
+				}
+
+				.info {
+					position: absolute;
+					box-sizing: border-box;
+					width: 100%;
+					bottom: 0;
+					padding: 20rpx;
+					color: #ffffff;
+					display: flex;
+					background-color: rgba(0, 0, 0, 0.6);
+					align-items: center;
+					text{
+						white-space: nowrap;
+						overflow: hidden;
+						text-overflow: ellipsis;
+					}
+				}
+				
+			}
+
+			.list-item:nth-child(2n) {
+				margin-right: 0;
+			}
+		}
+	}
+</style>

+ 2 - 2
pages_course/reward.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="answerPopup-box bg">
 		<!-- 正确 -->
-		<image class="tipimg" src="https://zkzh-2025.oss-cn-beijing.aliyuncs.com/shop/images/course_answer_img.png"
+		<image class="tipimg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/course_answer_img.png"
 			mode="aspectFill"></image>
 		<view class="answerPopup-title">恭喜你,回答正确</view>
 		<view class="answerPopup-desc">您有一份奖励待领取哦</view>
@@ -12,7 +12,7 @@
 
 <script>
 	// import wx from 'jweixin-module';
-	import { initJssdk } from "@/utils/common.js"
+	// import { initJssdk } from "@/utils/common.js"
 	export default {
 		data() {
 			return {

+ 34 - 23
pages_manage/teacherClassroom.vue → pages_course/teacherClassroom.vue

@@ -2,7 +2,7 @@
 	<view class="container">
 		<view class="top">
 			<text class="title"><text class="title-brown">健康生活方式</text>大讲堂</text>
-			<image class="top-bg" src="/static/assets/famous1.png"></image>
+			<image class="top-bg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/famous1.png"></image>
 			<view class="txt">
 				<view>让医学回归生活化,</view>
 				<view>以健康的生活方式,</view>
@@ -10,26 +10,16 @@
 			</view>
 		</view>
 		<view class="container-body">
-			<image class="bg" src="/static/assets/bg-class.png"></image>
-			<text class="title">上医有话说</text>
-			<!-- <view class="card-box">
-				<view class="bar">
-					<image class="" src="/static/assets/bar.png"></image>
-					<view class="tit">科学养生 | 名师首发</view>
-				</view>
-				<view class="img">
-					<image src="/static/assets/class.png"></image>
-				</view>
-			</view> -->
+			<image class="bg" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/bg-class.png"></image>
+			<text class="title">{{type==1?'百域大讲堂':'生活大讲堂'}}</text>
 			<view class="card-box" v-for="(item,index) in cardList" :key="index" @click="goLearn(item.courseId)">
 				<view class="bar">
-					<image src="/static/assets/bar.png" mode="widthFix"></image>
+					<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/bar.png" mode="widthFix"></image>
 					<view class="tit">{{item.courseName}}</view>
 				</view>
 				<view class="img-box">
 					<view class="img">
-						
-						<image :src="item.imgUrl || '/static/assets/no-img.png'" mode="widthFix"></image>
+						<image :src="item.imgUrl || 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no-img.png'" mode="widthFix"></image>
 					</view>
 				</view>
 			</view>
@@ -39,25 +29,46 @@
 
 <script>
 	import {
-		courseList
+		courseList,
+		courseListB
 	} from '@/api/class.js'
 	export default {
 		data() {
 			return {
-
-				cardList: []
-
+				type:null,
+				cardList: [],
+				classListb:[]
 			}
 		},
 		computed: {
 
 		},
 		mounted() {
-			this.getCourseList()
-			//this.getDepartmentList();
+			
+		},
+		onLoad(option) {
+			this.type=option.type
+			if(this.type==1){
+				this.getCourseList()
+			}else{
+				this.getCourseListb()
+			}
 		},
-
 		methods: {
+			getCourseListb() {
+				//私域看课
+				courseListB().then(res => {
+					if (res.code == 200) {
+						this.cardList = res.data
+					} else {
+						uni.hideLoading();
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						});
+					}
+				})
+			},
 			getCourseList() {
 				courseList().then(res => {
 					if (res.code == 200) {
@@ -74,7 +85,7 @@
 			},
 			goLearn(id) {
 				uni.navigateTo({
-					url: `/pages_manage/learn?courseId=${id}`
+					url: '/pages_course/learn?courseId='+id+'&type='+this.type
 				})
 			},
 		}

+ 2302 - 0
pages_course/video.vue

@@ -0,0 +1,2302 @@
+<!-- 自动发课看课页面 -->
+<template>
+	<view class="content">
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<view class="arrow-left-warning" @click="navback" v-if="isOpen==1">
+				<u-icon name="arrow-left" size='22' color="#222" bold></u-icon>
+			</view>
+			<view class="arrow-left-warning" v-else @click="feedback">
+				<image :src="imgPath+'/app/image/warning.png'"></image>
+				<text>投诉</text>
+			</view>
+			<view class="header-title" :style="{width:menuButtonLeft + 'px',height:menuButtonH+'px',lineHeight:menuButtonH+'px'}">{{courseInfo.title}}</view>
+		</view>
+		<view class="video-box">
+			<image v-if="!isLogin || isAddKf!=1" class="video-poster" :src="courseInfo.imgUrl" mode="aspectFill">
+			</image>
+			<video 
+			@timeupdate="onTimeUpdate" 
+			@progress="progressChange" 
+			@error="videoErrorCallback" 
+			@play="getPlay"
+			@pause="getPause" 
+			@ended="getEnded"
+			@controlstoggle="controlstoggle"
+			@fullscreenchange="fullscreenchange"
+			:title="courseInfo.title"
+			style="width: 100%;height: 420rpx;" 
+			:poster="poster"  
+			id="video-content-box"  
+			controls
+			:auto-pause-if-open-native="true"
+			:auto-pause-if-navigate="true"
+			:enable-progress-gesture="false" 
+			:show-progress="showProgress"
+			:picture-in-picture-mode="[]"
+			:show-background-playback-button="false"
+			:src="videoUrl">
+			<!-- logo -->
+				<!-- 弹幕展示 -->
+				<template v-if="showDanmu==1&&openCommentStatus==2">
+					<text v-for="(item, index) in activeDanmus" :key="item.commentId" class="danmu-item danmuMove"
+						:style="item.danmustyle" @animationend="animationend(item,index)">
+						{{ item.content }}
+					</text>
+				</template>
+				<cover-view class="video-danmu-btnbox" :style="{display: openCommentStatus==2&&isfull&&crtShow&&isLogin&&isAddKf==1 ? 'block':'none'}">
+					<cover-image class="video-danmu-image" :src="imgPath+'/app/image/danmu_set.png'" @click="openDanmu(1)"></cover-image>
+				</cover-view>
+				<cover-image v-if="courseLogo" :class="isfull?'logo-full':'logo'" :src="courseLogo" mode="widthFix"></cover-image>
+			</video>
+		</view>
+		<!-- 弹幕方法 -->
+		<commentBox
+			v-if="openCommentStatus==2"
+			ref="danmuBox" 
+			:height="height" 
+			:urlOption="urlOption" 
+			:time="playTime"
+			:showDanmu="showDanmu"
+			:viewCommentNum="viewCommentNum"
+			:openCommentStatus="openCommentStatus"
+			@setInputText="setInputText" 
+			@getScrollTop="getScrollTop"
+			@getMore="getMore"
+			@getActiveDanmus="getActiveDanmus"></commentBox>
+		<view id="title-contentnav">
+			<view class="title-content" v-show="openCommentStatus!=1">
+				<!-- 答题时展示小节课程名,其他展示课程名 -->
+				<!-- 小节课程名 -->
+				<view class="subtitlebox" v-if="isLogin&&isAddKf==1">
+					{{courseInfo.title}}
+				</view>
+				<!-- 课程名字 -->
+				<view class="miantitlebox" v-else>
+					{{courseInfo.courseName}}
+				</view>
+			</view>
+			<view class="tabbox" v-if="openCommentStatus==1">
+				<view :class="currentTab == nav.id ? 'tabbox-active':''" v-for="nav in navList" :key="nav.id" @click="handleTab(nav.id)">{{nav.name}}</view>
+			</view>
+		</view>
+		<scroll-view
+		class="scroll-view" 
+		:style="{height: height}" 
+		:scroll-top="scrollTop" 
+		:scroll-y="true" 
+		:refresher-enabled="currentTab == 2"
+		:refresher-triggered="triggered"
+		@refresherrefresh="handleRefresher">
+			<template v-if="openCommentStatus==1">
+				<view v-show="currentTab==0">
+					<descInfoNav ref="descInfoNav" :isLogin="isLogin" :isAddKf="isAddKf" :courseInfo="courseInfo"></descInfoNav>
+				</view>
+				<view v-show="currentTab==2">
+					<commentBox 
+					ref="commentBox" 
+					:height="height" 
+					:urlOption="urlOption" 
+					:time="playTime"
+					:flagTime="flagTime"
+					:showDanmu="showDanmu"
+					:viewCommentNum="viewCommentNum"
+					:openCommentStatus="openCommentStatus"
+					@setInputText="setInputText" 
+					@getScrollTop="getScrollTop"
+					@getMore="getMore"></commentBox>
+				</view>
+			</template>
+			<view v-show="currentTab==1">
+				<template v-if="openCommentStatus!=1&&(courseInfo.title || courseInfo.description)">
+					<!-- 介绍 -->
+					<descInfo ref="descInfo" :isLogin="isLogin" :isAddKf="isAddKf" :courseInfo="courseInfo"></descInfo>
+				</template>
+				<!-- 问题 -->
+				<template v-if="isLogin&&isAddKf==1">
+					<ques ref="ques" :quesList="quesList" :openCommentStatus="openCommentStatus" @handleAnswer="handleAnswer"></ques>
+				</template>
+			</view>
+		</scroll-view>
+		<!-- 线路 -->
+		<view class="video-line" @click="openPop" v-if="isLogin&&isAddKf==1">
+			<image :src="imgPath+'/app/image/changePlayer-icon.png'"></image>
+			<text>线路{{numberToChinese(lineIndex + 1)}}</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)">
+						线路{{numberToChinese(index + 1)}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 温馨提示弹窗 -->
+		<uni-popup ref="tipsPopup" type="center" :is-mask-click="false">
+			<view class="tipsPopup-mask">
+				<image class="red_envelope_top" :src="imgPath+'/app/image/red_envelope_img.png'" mode="aspectFill"></image>
+				<view class="tipsPopup">
+					<image class="tipsPopup-close"  :src="imgPath+'/app/image/course_close_white_icon.png'" mode="aspectFill"
+						@click="closeTipsPop"></image>
+					<view class="tipsPopup-line">
+						<view class="tipsPopup-box">
+							<view class="tipsPopup-head">
+								<image class="tipsPopup-head-title" :src="imgPath+'/app/image/tips_title_img.png'"
+									mode="widthFix"></image>
+							</view>
+							<view class="tipsPopup-content">
+								<view class="tipsPopup-content-title">亲爱的用户,</view>
+								<view>您已经观看课程一半的时间了,请注意休息并保持专注。</view>
+							</view>
+							<view class="tipsPopup-btn-box">
+								<view class="tipsPopup-btn" @click="closeTipsPop">继续观看领奖励</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 发送弹幕 -->
+		<view class="video-line danmu-line" @click="openDanmu(0)" v-if="isLogin&&isAddKf==1&&openCommentStatus==2">
+			<image class="set_image"  :src="imgPath+'/app/image/danmu_set_black.png'" mode="aspectFill"></image>
+			<text>发弹幕</text>
+		</view>
+		<!-- 发送弹幕弹窗 -->
+		<uni-popup ref="danmuPopup" type="bottom" style="z-index: 999;" @change="changeShowPopup">
+			<view class="danmuPopup" :style="{marginLeft:isfull ? statusBarHeight+'px': 0,marginBottom: danmuboxHeight+'px'}">
+				<view class="danmuPopup-head border-line">
+					<image class="danmu-icon" :src="showDanmu==0? imgPath+'/app/image/danmu-off.png':imgPath+'/app/image/danmu-on.png'" mode="heightFix" @click="switchDanmu()"></image>
+					<view class="u-border">
+						<input 
+						class="danmuPopup-input" 
+						placeholder="发个弹幕吧~" 
+						border="border"
+						:focus="focus"
+						:adjustPosition="false" 
+						:autoBlur="false" 
+						maxlength="50"
+						v-model.trim="inputText" />
+						<text style="font-size: 24rpx;color: #bbb;margin-left: 10rpx;">{{inputText?inputText.trim().length:0}}/50</text>
+					</view>
+					<button class="danmuPopup-send" @click="handleChatInput">发送</button>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 答题弹窗 -->
+		<uni-popup ref="answerPopup" type="center" :show="answerPopup">
+			<view :class="errTitle == '恭喜你,回答正确' ? 'answerPopup-box bg':'answerPopup-box'">
+				<!-- 正确 -->
+				<image class="tipimg" v-if="errTitle == '恭喜你,回答正确'" :src="imgPath+'/app/image/course_answer_img.png'"
+					mode="aspectFill"></image>
+				<!-- 错误 -->
+				<image class="tipimg" v-else :src="imgPath+'/app/image/course_answer_incorrectly_img.png'" mode="aspectFill">
+				</image>
+				<view class="answerPopup-title">{{errTitle}}</view>
+				<view class="answerPopup-desc" v-if="isOpen!=1" v-html="errDesc"></view>
+				<!-- 选择奖励 -->
+				<view class="reward-list" v-if="errTitle == '恭喜你,回答正确'&&isOpen!=1">
+					<radio-group class="reward-list-group" @change="rewardChange">
+						<label class="reward-list-option" v-for="(item, index) in rewardType" :key="item.value">
+							<radio :value="item.value+ ''" :checked="item.value == currentReward"
+								activeBorderColor="#FF5C03" activeBackgroundColor="#FF5C03"
+								style="transform:scale(0.7)" />
+							<view :style="{color: item.value == currentReward ? '#FF5C03':''}">{{item.name}}</view>
+						</label>
+					</radio-group>
+				</view>
+				<!-- 错误题目 -->
+				<view class="errQuesbox" v-if="errQues&&errQues.length>0">
+					<view class="errQuesbox-item textOne" v-for="(it,index) in errQues" :key="index">{{it.title}}</view>
+				</view>
+				<view class="answerPopup-btn" v-if="errTitle == '恭喜你,回答正确'" @click="closeAnswerPopup">确认</view>
+				<view class="tipsPopup-btn-box" v-else
+					:style="{marginTop: errQues&&errQues.length>0 ? '40rpx':'54rpx'}">
+					<view class="tipsPopup-btn" @click="closeAnswerPopup">{{remain > 0 ? '重新答题': '确认'}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 可以答题提示 -->
+		<view class="answerTip" v-if="isLogin&&currentTab!=1&&openCommentStatus==1&&showAnswerTip" @click="handleTab(1)">
+			<text>开始</text>
+			<text>答题</text>
+		</view>
+		<!-- 客服二维码弹窗 -->
+		<uni-popup ref="kfPopup" type="center" :mask-click="false">
+			<view class="kfqrcode-box">
+				<image class="kfqrcode" :src="qrcode" show-menu-by-longpress="true"></image>
+				<view v-show="qrcodeMsg" style="margin-top: 30rpx;" v-html="qrcodeMsg"></view>
+				<image class="kfqrcode-close" :src="imgPath+'/app/image/course_close_white_icon.png'" mode="aspectFill"
+					@click="closeKFPop"></image>
+			</view>
+		</uni-popup>
+		<!-- footer -->
+		<view class="footer" v-show="currentTab!=2&&videoId">
+			<view class="footer-btn" v-if="!isLogin || isAddKf !=1" @click="submit">
+				<text>立即学习</text>
+			</view>
+			<view v-if="currentTab==1&&isLogin&&isAddKf==1&&quesList&&quesList.length>0" class="footer-btn footer-btn-border" @click="submit">
+				<text>{{isOpen==1 ? '提交答案':'提交答案领取奖励'}}</text>
+			</view>
+			<!-- <view @click="checked=!checked" class="agreement" v-if="!isLogin">
+				<radio value="r1" :checked="checked" color="#ff5c03" activeBorderColor="#ff5c03"
+					style="transform:scale(0.6);" />
+				<view>阅读并同意<text style="color: #ff5c03;" @click.stop="goWeb(0)">《用户协议》</text>和<text
+						style="color: #ff5c03;" @click.stop="goWeb(1)">《隐私协议》</text></view>
+			</view> -->
+			<!-- <view class="footer-tips">重庆云联融智提供技术支持</view> -->
+		</view>
+		<view v-show="currentTab==2">
+			<view class="chatinput" :style="{bottom:danmuboxHeight>0?danmuboxHeight+'px':'calc(var(--window-bottom) + 24rpx)'}">
+				<input class="uni-input" v-model.trim="inputText" :adjustPosition="false" :autoBlur="false"  maxlength="140" placeholder="发消息···" confirm-type="send" @confirm="handleChatInput" />
+				<button class="send" @click="handleChatInput">发送</button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import ques from "./components/ques.vue"
+	import descInfo from "./components/descInfo.vue"
+	import descInfoNav from "./components/descInfoNav.vue"
+	import commentBox from "./components/commentBox.vue"
+	import {TOKEN_KEYAuto,generateRandomString} from '@/utils/courseTool.js'
+	import dayjs from 'dayjs';
+	import { mapGetters } from 'vuex';
+	import {
+		getErrMsg,
+		getH5CourseByVideoId,
+		getH5CourseVideoDetails,
+		courseAnswer,
+		getFinishCourseVideo,
+		getIsAddKf,
+		getInternetTraffic,
+		getIntegralByH5Video,
+		sendReward,
+		loginByMp,
+		getRealLink
+	} from "@/api/courseAuto.js"
+	import {
+		getConfigByKey
+	} from "@/api/user.js"
+	import {handleFsUserWx} from '@/api/courseLook.js'
+	export default {
+		components: {
+			descInfoNav,
+			descInfo,
+			commentBox,
+			ques,
+		},
+		data() {
+			return {
+				code: '',
+				baseUrl:uni.getStorageSync('requestPath'),
+				// 1 红包 2 积分
+				rewardType: [{
+					name: '红包奖励',
+					value: 1
+				}, {
+					name: '积分奖励',
+					value: 2
+				}],
+				currentReward: 1,
+				player: null,
+				loading: true,
+				progress: 0,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				scrollTop: 0,
+				height: '0px',
+				isLogin: false,
+				videoUrl: "",
+				videoId: "",
+				//现在的时长
+				playTime: 0,
+				//总时长
+				duration: 0,
+				playDuration: 0,
+				// 用于续播
+				playDurationSeek: 0,
+				// 温馨提醒时间节点,
+				tipsTime: 0,
+				tipsOpen: false,
+				config: {},
+				courseInfo: {},
+				quesList: [],
+				lineList: [],
+				// 错题
+				errQues: [],
+				// 答题机会
+				remain: 0,
+				errTitle: "",
+				errDesc: "",
+				showPlay: true,
+				showControls: false,
+				playStatus: "",
+				isAddKf: 0,
+				lineIndex: 0,
+				// 是否展开
+				isExpand: true,
+				textHeight: 0, //文本高度
+				qwUserId: "",
+				qrcode: "",
+				corpId: "",
+				qrcodeMsg: "",
+				urlOption: {},
+				bufferRate: 0, // 缓冲时间
+				uuId: "",
+				isEnded: false,
+				// 是否允许拖动进度条
+				videolinkType: 0,
+				ip: null,
+				checked: true,
+				isFinish: 0, // 是否完课
+				interval: null,
+				intervalIntegral: null, // 积分定时
+				options: {
+					sources: [{
+						src: ""
+					}],
+					poster: "",
+					live: false /* 是否直播 */ ,
+					controls: true,
+					autoplay: false,
+					licenseUrl: 'https://license.vod2.myqcloud.com/license/v2/1323137866_1/v_cube.license', // license 地址,参考准备工作部分,在视立方控制台申请 license 后可获得 licenseUrl,
+					LicenseKey: 'bcc5bd9a14b798b48c52ff005a21d926',
+					controlBar: {
+						volumePanel: false,
+						playbackRateMenuButton: false,
+						QualitySwitcherMenuButton: false,
+						// progressControl: false
+					},
+					plugins: {
+						// ProgressMarker: false,
+						ContextMenu: {
+							statistic: false
+						}
+					},
+				},
+				// 错误请求次数
+				errorCount: 0,
+				answerPopup: false,
+				sortLink:"",
+				// 课程是否过期
+				isExpire: false,
+				menuButtonLeft: 281,
+				menuButtonH: 45,
+				timer: null,
+				flag: false,
+				msg:'',
+				poster:'',
+				focus: false,
+				openDanmuType: 0,
+				danmuboxHeight: 0,
+				user: {},
+				crtShow: true,
+				courseLogo: '',
+				isfull: false,
+				navList:[{
+					id: 0,
+					name: '介绍'
+				},{
+					id: 1,
+					name: '答题'
+				},{
+					id: 2,
+					name: '评论'
+				}],
+				currentTab: 1,
+				triggered: false,
+				// 没有更多
+				isMore: false,
+				inputText:"",
+				// 获取最多历史评论条数
+				viewCommentNum: 200,
+				// 1-开启评论;2-开启弹幕;3-关闭
+				openCommentStatus: 3,
+				showAnswerTip: false,
+				showDanmu: 1,
+				activeDanmus:[],
+				flagTime:0,
+				showProgress: true,
+				imgPath:this.$store.state.imgpath,
+				videoitem:null,
+				// 是否公开课
+				isOpen: 0,
+			}
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.$store.state.logoname,
+				path: '/pages/about/index',
+				imageUrl: this.$store.state.imgpath+'/app/image/logoshare.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.$store.state.logoname,
+				path: '/pages/about/index',
+				imageUrl: this.$store.state.imgpath+'/app/image/logoshare.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		computed:{
+			appid() {
+				return this.$store.state.appid
+			},
+			isSpare() {
+				return this.$store.state.isSpare
+			},
+			...mapGetters(['coureLogin']),
+		},
+		watch: {
+		    coureLogin: {
+		      immediate: true,          // 页面一进入就检查一次
+		      handler(val) {
+		        if (val == 2&&this.isLogin) {
+					console.log("看课AppToken失效,请重新登录")
+					this.isLogin = false
+					this.isAddKf = 0
+					this.goLogin()
+		        }
+		      }
+		    }
+		},
+		onLoad(option) {
+			this.getWebviewUrl()
+			if(option.videoitem){
+				this.isOpen = 1
+				this.urlOption=JSON.parse(option.videoitem)
+				this.urlOption = {
+					...this.urlOption,
+					isOpen: 1
+				}
+			}else {
+				this.isOpen = 0
+				console.log(option)
+				this.urlOption = option.course ? JSON.parse(option.course) : {}
+				console.log(this.urlOption)
+			}
+			uni.$on('usercode',(data)=>{
+				if(this.isSpare == 1&&data) {
+					this.code=data.code
+					this.goLogin(data)
+				}
+			})
+			this.videoId = this.urlOption.videoId
+			this.qwUserId = this.urlOption.qwUserId || ''
+			this.corpId = this.urlOption.corpId || ''
+			this.videolinkType = this.urlOption.linkType || 0
+
+			var that=this;
+			if (this.videoId) {
+				this.getH5CourseByVideo()
+			}
+			this.sortLink = this.urlOption.link || ''
+			this.getMenuButton()
+			// #ifndef H5
+			uni.onKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		onShow() {
+			this.tipsOpen = false
+			this.isExpand = true
+			// this.isLogin = this.$isLoginCourseAuto()
+			this.uuId = generateRandomString(16)
+			if(uni.getStorageSync('auto_userInfo') && JSON.stringify(uni.getStorageSync('auto_userInfo'))!='{}') {
+				this.user = JSON.parse(uni.getStorageSync('auto_userInfo'))
+			} else {
+				this.user = {}
+			}
+
+			if((this.sortLink||this.isOpen==1)&&!this.code){
+				this.getLink()
+			} else {
+				if(this.code) return;
+				uni.showToast({
+					title: '链接地址有误',
+					icon: 'none'
+				});
+			}
+		},
+		mounted() {
+			this.getIP()
+			this.getHeight()
+		},
+		onHide() {
+			// this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.pause()
+			}
+			// if (this.interval != null) {
+			// 	clearInterval(this.interval)
+			// 	this.interval = null
+			// }
+		},
+		onUnload() {
+			uni.$off('usercode')
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.clearIntegral()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		beforeDestroy() {
+			uni.$off('usercode')
+			this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.stop()
+				this.player = null
+			}
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.clearIntegral()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		methods: {
+			getWebviewUrl() {
+				var data = {
+					key: 'course.config'
+				}
+					getConfigByKey(data).then(res => {
+						if (res.code == 200) {
+							console.log("getConfigByKey====", JSON.parse(res.data))
+							let data = JSON.parse(res.data,)
+							uni.setStorageSync('setWebviewUrl',data.userCourseAuthDomain)
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: res.msg,
+							});
+						}
+					})
+			},
+			numberToChinese(number) {
+				if (number) {
+					const chineseNumber = ['一', '二', '三', '四', '五', '六', '七', '八', '九'];
+					return chineseNumber[number - 1];
+				} else {
+					return ''
+				}
+			},
+			keyboardHeightChange(res) {
+				// #ifndef H5
+				console.log("this.danmuboxHeight",this.danmuboxHeight)
+				 this.danmuboxHeight = res.height
+				// #endif
+			},
+			getMenuButton(){
+				const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+				this.menuButtonLeft = menuButtonInfo.left
+				this.menuButtonH = menuButtonInfo.height
+			},
+			//播放时间更新事件方法
+			onTimeUpdate(e){
+				let currentTime = Math.round(e.detail.currentTime)
+				if (this.playDurationSeek > 0) {
+					this.playTime = this.playDurationSeek
+					this.throttle(() => this.changeTime(this), 1000, false)
+				} else {
+					if (this.videolinkType != 1 && (currentTime - this.playTime > 3 || currentTime - this.playTime < -3)&&this.isFinish!=1) {
+						uni.showToast({
+							title: '不能快进哦',
+							icon: 'none',
+						});
+						currentTime = this.playTime
+						this.player.seek(this.playTime);
+					}
+					this.playTime = currentTime
+				}
+				if (Math.floor(e.detail.currentTime) != this.flagTime) {
+					this.flagTime = Math.floor(e.detail.currentTime)
+					let answerType = this.$store.state.answerType;
+					
+					this.showAnswerTip = answerType == 1 ? this.shouldShowByRate(this): this.shouldShowByLastMinute(this);
+					if(this.openCommentStatus == 2) {
+						this.$refs.danmuBox&&this.$refs.danmuBox.checkDanmu(this.flagTime)
+					}
+				}
+			},
+			// 工具函数:保留两位小数的百分比(0~100)
+			calcPercent(play, total) {
+			  return Number(((play || 0) / (total || 1) * 100).toFixed(2));
+			},
+			
+			// 策略1:按完课领红包
+			shouldShowByRate({ playTime, duration, config }) {
+			  const finished = this.calcPercent(playTime, duration) >= Number(config?.answerRate || 100);
+			  return finished;
+			},
+			
+			// 策略2:完课且最后一分钟可领(第二次进来只看是否已完课)
+			shouldShowByLastMinute({ isEnded, isFinish, playTime, duration }) {
+			  const alreadyDone = isEnded || isFinish == 1;          // 已完课
+			  const inLastMinute = playTime >= (duration || 0) - 60;  // 最后一分钟
+			  return alreadyDone || inLastMinute;
+			},
+			changeTime(that,e) {
+				that.playDurationSeek = 0
+			},
+			videoErrorCallback(e) {
+				this.clearIntegral()
+				this.errorCount++
+				if (this.errorCount > 3) return
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.getErrMsg(e.target.errMsg)
+				this.getH5CourseVideoDetails('error')
+			},
+			// 当开始/继续播放时触发play事件
+			getPlay() {
+				this.errorCount = 0
+				// this.judgeDuration()
+			},
+			getPause() {
+				this.clearIntegral()
+			},
+			getEnded() {
+				this.clearIntegral()
+				this.isEnded = true
+				this.showAnswerTip = true
+				// this.playDurationSeek = 0
+				this.isFinish = 1
+				this.showProgress = true
+				this.getFinishCourseVideo()
+			},
+			fullscreenchange(event) {
+				this.isfull = event.detail.fullScreen
+				if(this.isfull) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.initTracks()
+				}
+			},
+			controlstoggle(event) {
+				this.crtShow =  event.detail.show
+			},
+			getIP() {
+				uni.request({
+					url: 'https://ipinfo.io/json', //仅为示例,并非真实接口地址。
+					method: 'GET',
+					success: (res) => {
+						this.ip = res.data.ip
+					}
+				});
+			},
+			getHeight() {
+				setTimeout(()=>{
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#title-contentnav")
+						.boundingClientRect((data) => {
+							if(data) {
+								this.height =
+									`calc(100vh - ${data.height}px - 420rpx - ${this.statusBarHeight}px - 75px - 88rpx)`
+							}
+						})
+						.exec();
+				},200)
+			},
+			updateTime() {
+				var that = this;
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.interval = setInterval(function() {
+					that.getFinishCourseVideo()
+					that.getInternetTraffic()
+				}, 60000);
+			},
+			judgeDuration() {
+				var that = this;
+				if (this.intervalIntegral != null) {
+					clearInterval(this.intervalIntegral)
+					this.intervalIntegral = null
+				}
+				// 观看10分钟获得积分
+				this.intervalIntegral = setInterval(function() {
+					that.getIntegralByH5Video()
+				}, 600000);
+			},
+			clearIntegral() {
+				if (this.intervalIntegral != null) {
+					clearInterval(this.intervalIntegral)
+					this.intervalIntegral = null
+				}
+			},
+			getH5CourseByVideo() {
+				this.loading = true
+				getH5CourseByVideoId({
+					videoId: this.videoId
+				}).then(res => {
+						this.loading = false
+						if (res.code == 200) {
+							this.courseInfo = res.data
+							uni.setNavigationBarTitle({
+								title: this.courseInfo && this.courseInfo.title ? this.courseInfo.title : ''
+							});
+						}
+						this.getHeight()
+						this.$nextTick(()=>{
+							this.$refs.descInfo&&this.$refs.descInfo.getDescHeight()
+							this.$refs.descInfoNav&&this.$refs.descInfoNav.getDescHeight()
+						})
+					},
+					rej => {
+						this.loading = false
+					}
+				).catch(() => {
+					this.loading = false
+				})
+			},
+			getH5CourseVideoDetails(type) {
+				getH5CourseVideoDetails(this.urlOption).then(res => {
+						if (res.code == 200) {
+							this.config = res.config || {}
+							this.courseLogo = res.config&&res.config.courseLogo
+							this.isFinish = res.isFinish || 0
+							this.duration = res.course && res.course.duration ? res.course.duration : 0
+							this.playDuration = res.playDuration || 0
+							this.tipsTime = res.tipsTime || 0
+							let lineList = []
+							if (res.course && res.course.lineOne) {
+								lineList.push(res.course.lineOne)
+							}
+							if (res.course && res.course.lineTwo) {
+								lineList.push(res.course.lineTwo)
+							}
+							if (res.course && res.course.lineThree) {
+								lineList.push(res.course.lineThree)
+							}
+							this.lineList = lineList
+							this.viewCommentNum = res.config&&res.config.viewCommentNum || 200
+		
+							const status = res.config&&res.config.openCommentStatus || 3
+							if(status != this.openCommentStatus) {
+								if(this.openCommentStatus != 3 && status==3) {
+									this.$refs.commentBox&&this.$refs.commentBox.closeWSocket()
+									this.$refs.danmuBox&&this.$refs.danmuBox.closeWSocket()
+								}
+								this.openCommentStatus = this.isOpen == 1 ? 3: status
+							}
+							this.currentTab = 1
+							if(this.openCommentStatus!=2 || this.showDanmu!=1) {
+								this.activeDanmus = []
+							}
+							if (!this.player || type == 'error') {
+								this.lineIndex = this.config.defaultLine
+								this.videoUrl = lineList[this.lineIndex]
+								this.poster= res.course && res.course.imgUrl ? res.course.imgUrl : ''
+								// this.options.sources = [{
+								// 	src: this.videoUrl
+								// }]
+								// this.options.poster = res.course && res.course.imgUrl ? res.course.imgUrl : ''
+								// this.initVideo()
+								this.playTime = this.playDuration >= this.duration ? 0 : this.playDuration
+								this.playDurationSeek = this.playTime
+								setTimeout(()=>{
+									this.player = uni.createVideoContext('video-content-box');
+									this.player.seek(this.playTime)
+									this.player.play();
+								},500);
+							} else {
+								// let div = document.querySelector(".vjs-progress-control");
+								// if(div) {
+								// 	if (this.isFinish == 1 || this.isEnded || this.videolinkType == 1) {
+								// 		div.style.pointerEvents = "auto";
+								// 	} else {
+								// 		div.style.pointerEvents = "none"; //禁止所有事件
+								// 	}
+								// }
+								this.playTime = this.playTime > this.playDuration ? this.playTime : this.playDuration >= this.duration ? 0 : this.playDuration
+								this.playDurationSeek = this.playTime
+								this.player.seek(this.playTime)
+								this.player.play();
+							}
+							this.updateTime();
+							this.quesList = res.questions && res.questions.length > 0 ? res.questions : [],
+								this.quesList = this.quesList.map(item => ({
+									...item,
+									questionOption: JSON.parse(item.question),
+									answer: ''
+								}))
+						}
+						this.getHeight()
+						this.$nextTick(()=>{
+							this.$refs.descInfo&&this.$refs.descInfo.getDescHeight()
+							this.$refs.descInfoNav&&this.$refs.descInfoNav.getDescHeight()
+						})
+					},
+					rej => {}
+				)
+			},
+			handleAnswer(val) {
+				let {item, option,index} = val
+				if(this.$store.state.answerType == 1) {
+					// 按照完课领红包
+					let rate = 0
+					if(this.isEnded || this.isFinish==1) {
+						rate = 1
+					} else {
+						rate = (Number(this.playTime || 0) / Number(this.duration || 0)).toFixed(2)
+					}
+					if(Number(this.duration || 0) == 0 || rate*100 < Number(this.config.answerRate || 100)) {
+						uni.showToast({
+							title: "请先观看完整课程再答题哦~",
+							icon: "none"
+						})
+						return
+					}
+				} else {
+					// 按照完课且最后一分钟领红包(完课第二次进来就不需要最后一分钟)
+					let time = this.playTime
+					if(this.isEnded||this.isFinish==1) {
+						time = this.duration
+					} else {
+						if(time < this.playDuration&&this.isFinish!=1) {
+							// 没完课且小于续播的时间
+							time = this.playDuration
+						}
+					}
+					if(Number(this.duration || 0) == 0 || time < this.duration - 60) {
+						uni.showToast({
+							title: "请先观看完整课程再答题哦~",
+							icon: "none"
+						})
+						return
+					}
+				}
+				 
+				if (this.quesList[index].type == 1) {
+					// 单选option
+					this.quesList[index].answer = option.name
+				} else if (this.quesList[index].type == 2) {
+					// 多选
+					let answer = this.quesList[index].answer ? this.quesList[index].answer.split(',') : []
+					if (answer.indexOf(option.name) === -1) {
+						answer.push(option.name)
+						this.quesList[index].answer = answer.join(',')
+					} else {
+						answer.splice(answer.indexOf(option.name), 1)
+						this.quesList[index].answer = answer.join(',')
+					}
+				}
+			},
+			submit() {
+				if(this.isExpire){
+					uni.showToast({
+						title: '课程已过期或链接无效',
+						icon: 'none'
+					});
+					return
+				}
+				// 登录
+				this.$isLoginCourseAuto().then(
+					res => {
+						if(res){
+							if (this.isAddKf == 1) {
+								// 答题
+								// 您已提交过答案,请领取红包
+								this.courseAnswer()
+							} else {
+								// 添加客服
+								if (this.videoId && this.qwUserId) {
+									this.getIsAddKf()
+								} else {
+									uni.showToast({
+										title: '请添加客服',
+										icon: 'none'
+									})
+								}
+							} 
+						} else{
+							this.goLogin()
+						}
+					},
+					rej => {}
+				);
+			},
+			// 答题
+			courseAnswer() {
+				if(this.$store.state.answerType == 1) {
+					// 按照完课领红包
+					let rate = 0
+					if(this.isEnded || this.isFinish==1) {
+						rate = 1
+					} else {
+						rate = (Number(this.playTime || 0) / Number(this.duration || 0)).toFixed(2)
+					}
+					if(Number(this.duration || 0) == 0 || rate*100 < Number(this.config.answerRate || 100)) {
+						uni.showToast({
+							title: "请先观看完整课程再答题哦~",
+							icon: "none"
+						})
+						return
+					}
+				} else {
+					// 按照完课且最后一分钟领红包(完课第二次进来就不需要最后一分钟)
+					let time = this.playTime
+					if(this.isEnded||this.isFinish==1) {
+						time = this.duration
+					} else {
+						if(time < this.playDuration&&this.isFinish!=1) {
+							// 没完课且小于续播的时间
+							time = this.playDuration
+						}
+					}
+					if(Number(this.duration || 0) == 0 || time < this.duration - 60) {
+						uni.showToast({
+							title: "请先观看完整课程再答题哦~",
+							icon: "none"
+						})
+						return
+					}
+				}
+				if (this.quesList.some(item => !item.answer)) {
+					uni.showToast({
+						title: "请确认是否答完所有题目",
+						icon: "none"
+					})
+					return
+				}
+				const questions = this.quesList.map(obj => {
+					const {
+						questionOption,
+						...rest
+					} = obj;
+					return rest;
+				});
+				const param = {
+					...this.urlOption,
+					questions: questions,
+					videoId: this.videoId,
+					duration: this.playTime,
+				}
+				this.errTitle = ""
+				this.errDesc = ""
+				this.errQues = []
+				courseAnswer(param).then(res => {
+						if (res.code == 200) {
+							if (res.incorrectQuestions) {
+								// 答题失败
+								if (res.incorrectQuestions.length > 0) {
+									this.errQues = res.incorrectQuestions
+								}
+								this.remain = res.remain || 0
+								if (res.remain > 0) {
+									this.errTitle = "很遗憾答错了"
+									this.errDesc = `<span style="color:#FF5C03">还有${res.remain}次机会,继续加油</span>`
+									this.$refs.answerPopup.open("center")
+								}
+							} else {
+								// 答题成功
+								this.errTitle = "恭喜你,回答正确"
+								this.errDesc = `请选择奖励`
+								// this.$refs.answerPopup.open("center")
+								if(this.isOpen==1) {
+									this.$refs.answerPopup.open("center")
+									return
+								}
+								this.closeAnswerPopup(1)
+							}
+						} else {
+							if (res.msg == "该课题到达答错次数限制") {
+								this.errTitle = "答题次数超过限制"
+								this.errDesc = "以后的课程要认真学习哦"
+								this.$refs.answerPopup.open("center")
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: "none"
+								})
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			// 选择
+			rewardChange(e) {
+				this.currentReward = e.detail.value
+			},
+			closeAnswerPopup(type) {
+				this.$refs.answerPopup.close()
+				if(this.isOpen==1) {
+					return
+				}
+				if (this.errTitle == '恭喜你,回答正确') {
+					let param = {
+						...this.urlOption,
+						rewardType: Number(this.currentReward),
+						source: 2,
+						appId: this.appid
+					}
+					if(type==1) {
+						param = {
+							...this.urlOption,
+							source: 2,
+							appId: this.appid
+						}
+					}
+					sendReward(param).then(res => {
+						if(res.isNew&&res.isNew==1) {
+							const packageInfo = res.data.packageInfo || ''
+							if(packageInfo) {
+								uni.setStorageSync('receive_package',packageInfo);
+								if(res.mchId) uni.setStorageSync('mchId',res.mchId);
+								uni.navigateTo({
+									url: '/pages_course/reward'
+								})
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							})
+						}
+					})
+				}
+			},
+			// 线路
+			openPop() {
+				this.$refs.popup.open('bottom')
+			},
+			close() {
+				this.$refs.popup.close()
+			},
+			handleLine(index) {
+				var that=this;
+				if (this.lineIndex == index && this.videoUrl == this.lineList[index]) {
+					this.close()
+					return
+				} else {
+					// let div = document.querySelector(".vjs-progress-control");
+					// if(div) {
+					// 	if (this.isFinish == 1 || this.isEnded || this.videolinkType == 1) {
+					// 		div.style.pointerEvents = "auto";
+					// 	} else {
+					// 		div.style.pointerEvents = "none"; //禁止所有事件
+					// 	}
+					// }
+					this.lineIndex = index
+					this.videoUrl = this.lineList[index]
+					this.tipsOpen = false
+					this.playDurationSeek = this.playTime || 0
+					this.player = uni.createVideoContext('video-content-box');
+					setTimeout(function(){
+						that.player.seek(that.playDurationSeek)
+						that.player.play();
+					},500);
+					// this.player.src(this.lineList[index])
+					// this.player.one('loadedmetadata', () => {
+					// 	this.player.currentTime(this.playDurationSeek);
+					// 	this.player.play();
+					// });
+					this.close()
+				}
+
+			},
+			// 温馨提示
+			openTipsPop() {
+				this.$refs.tipsPopup.open()
+				this.tipsOpen = true
+				this.pause()
+			},
+			closeTipsPop() {
+				this.$refs.tipsPopup.close()
+			},
+			// 客服
+			getIsAddKf() {
+				this.qrcode = ''
+				this.qrcodeMsg = ''
+				this.isAddKf = 0
+				// {videoId: this.videoId,qwUserId: this.qwUserId,corpId: this.corpId}
+				getIsAddKf(this.urlOption).then(res => {
+						if (res.code == 200) {
+							this.isAddKf = 1
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 400) {
+							this.isAddKf = 0
+							this.qrcode = res.qrcode
+							this.qrcodeMsg = res.msg
+							this.$refs.kfPopup.open()
+						} else if (res.code == 504) {
+							// 登录
+							// this.goLogin()
+						} else if (res.code == 566) {
+							// 官方群发通用链接
+							const url = res.courseLink.realLink.split('?course=')[1]
+							this.urlOption = JSON.parse(url)
+							this.isAddKf = 1
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 567) {
+							// 群聊通用链接
+							this.urlOption = {
+								...this.urlOption,
+								qwExternalId: res.qwExternalId
+							}
+							this.isAddKf = 1
+							this.getH5CourseVideoDetails()
+						} else {
+							this.isAddKf = 0
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					err => {}
+				);
+			},
+			closeKFPop() {
+				this.$refs.kfPopup.close()
+			},
+			getFinishCourseVideo() {
+				if (!this.playTime || this.isAddKf!=1 ||!this.isLogin) return
+				// {videoId: this.videoId,duration:this.playTime}
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getFinishCourseVideo(param)
+			},
+			// 每十分钟获得积分
+			getIntegralByH5Video() {
+				if(this.isAddKf!=1||!this.isLogin) return
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getIntegralByH5Video(param).then(res => {
+					if (res.code == 200) {
+						uni.showToast({
+							title: "积分+10",
+							icon: "none"
+						})
+					}
+				})
+			},
+			progressChange(e) {
+				this.bufferRate = Math.ceil(e.detail.buffered)
+			},
+			// 缓冲
+			getInternetTraffic() {
+				if(!this.isLogin||this.isAddKf!=1) return
+				const playVideoTime = Math.ceil(this.playTime / this.duration * 100) // 播放百分比
+				if(this.bufferRate == 0 || this.bufferRate < playVideoTime) {
+					this.bufferRate = playVideoTime
+				}
+				if(this.bufferRate == 0 || Number(this.bufferRate.toFixed(2)) == 0) return
+				const param = {
+					...this.urlOption,
+					uuId: dayjs().format('YYYYMMDD') + this.uuId,
+					duration: this.playTime,
+					bufferRate: Number(this.bufferRate.toFixed(2)),
+				}
+				if(!param.bufferRate) return
+				getInternetTraffic(param)
+			},
+			getErrMsg(err) {
+				let msgerr = {
+					videoUrl: this.videoUrl,
+					lineIndex: this.lineIndex,
+					errTime: new Date(),
+					ip: this.ip,
+					errMsg: err
+				}
+				getErrMsg({
+					msg: JSON.stringify(msgerr)
+				})
+			},
+			goLogin(data) {
+				if(data || this.isSpare==1) {
+					this.loginFsUserWx(data)
+					return
+				}
+				let provider = 'weixin'
+				uni.login({
+					provider: provider,
+					success: async loginRes => {
+						console.log(loginRes)
+						uni.getUserInfo({
+						   provider: provider,
+						   success: (infoRes)=> {
+							    uni.showToast({
+									title: '处理中...',
+									icon: 'loading'
+							    });
+								loginByMp({
+									code: loginRes.code,
+									encryptedData:infoRes.encryptedData,
+									iv:infoRes.iv,
+									appId: this.appid
+								}).then(res=>{
+									 uni.hideLoading();
+									 if (res.code == 200) {
+										uni.setStorageSync(TOKEN_KEYAuto, res.token);
+										uni.setStorageSync('auto_userInfo', JSON.stringify(res.user));
+										this.user = res.user
+										this.isLogin = true
+										console.log("TOKEN_KEYAuto",TOKEN_KEYAuto)
+										this.getIsAddKf() 
+									 } else {
+										uni.showToast({
+											title: res.msg,
+											icon: 'none'
+										});
+									 }
+								 }).catch(err=>{
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "登录失败,请重新登录",
+									});
+								});
+						   }
+						});
+					}
+				})
+			},
+			getLink() {
+				let that = this;
+				this.msg = ''
+				if(this.isOpen==1) {
+					if (this.isLogin && this.isAddKf == 1) {
+						this.getH5CourseVideoDetails()
+					}
+					if (this.videoId &&this.isAddKf != 1) {
+						this.$isLoginCourseAuto().then(
+							isLogin => {
+								this.isLogin = isLogin
+								if(isLogin){
+									this.getIsAddKf() 
+								} else {
+									this.goLogin()
+								}
+							},
+							rej => {}
+						);
+					}
+					return
+				}
+				getRealLink({sortLink:this.sortLink}).then(res=>{
+					if(res.code == 200) {
+						this.isExpire = false
+						// 如果响应中包含真实链接,则跳转到真实链接
+						// window.location.href = res.realLink +"&sortLink="+this.sortLink+"&code="+this.code+"&time="+new Date().getTime()
+						if (this.isLogin && this.isAddKf == 1) {
+							this.getH5CourseVideoDetails()
+						}
+						if (this.videoId &&this.isAddKf != 1) {
+							this.$isLoginCourseAuto().then(
+								isLogin => {
+									this.isLogin = isLogin
+									if(isLogin){
+										this.getIsAddKf() 
+									} else {
+										this.goLogin()
+									}
+								},
+								rej => {}
+							);
+						}
+					} else {
+						this.isExpire = true
+						this.msg = '课程已过期或链接无效'
+						uni.showToast({
+							title: '课程已过期或链接无效',
+							icon: 'none'
+						});
+					}
+				}).catch(err=>{
+					this.isExpire = true
+					this.msg = '发生错误,请稍后再试'
+					uni.showToast({
+						title: '发生错误,请稍后再试',
+						icon: 'none'
+					});
+				})
+			},
+			/**
+			 * 节流原理:在一定时间内,只能触发一次
+			 *
+			 * @param {Function} func 要执行的回调函数
+			 * @param {Number} wait 延时的时间
+			 * @param {Boolean} immediate 是否立即执行
+			 * @return null
+			 */
+			throttle(func, wait = 1000, immediate = true) {
+			    if (immediate) {
+			        if (!this.flag) {
+			            this.flag = true
+			            // 如果是立即执行,则在wait毫秒内开始时执行
+			            typeof func === 'function' && func()
+			            this.timer = setTimeout(() => {
+			                this.flag = false
+			            }, wait)
+			        }
+			    } else if (!this.flag) {
+			        this.flag = true
+			        // 如果是非立即执行,则在wait毫秒内的结束处执行
+			        this.timer = setTimeout(() => {
+			            this.flag = false
+			            typeof func === 'function' && func()
+			        }, wait)
+			    }
+			},
+			// 弹幕
+			openDanmu(type) {
+				this.openDanmuType = type
+				this.inputText = ''
+				if(type == 1) {
+					this.player.exitFullScreen()
+				}
+				this.$refs.danmuPopup.open()
+			},
+			changeShowPopup(val) {
+				this.focus = val.show
+			},
+			switchDanmu() {
+				this.showDanmu = this.showDanmu == 1 ? 0:1
+				if(this.showDanmu == 0&&this.$refs.danmuBox) {
+					this.$refs.danmuPopup.close()
+					this.activeDanmus = []
+					this.$refs.danmuBox.activeDanmus = []
+					this.$refs.danmuBox.initTracks()
+				}
+			},
+			getScrollTop(res) {
+				if(this.currentTab == 2) {
+					this.scrollTop = res
+				} else {
+					this.scrollTop = 0
+				}
+			},
+			handleTab(index) {
+				this.currentTab = index
+				if(this.currentTab==2) {
+					if(this.$refs.commentBox) {
+						this.$refs.commentBox.msgs = []
+						this.$refs.commentBox.pageNum = 1
+						this.$refs.commentBox.getCommentsFun()
+					}
+				} else {
+					setTimeout(()=>{
+						this.scrollTop = 0
+					},100)
+				}
+			},
+			handleRefresher() {
+				this.triggered = true;
+				if (!this.isMore&&this.currentTab==2&&this.openCommentStatus==1) {
+					this.$nextTick(()=>{
+						this.$refs.commentBox&&this.$refs.commentBox.getCommentsFun()
+					})
+				}
+				setTimeout(() => {
+					this.triggered = false;
+				}, 500);
+			},
+			getMore(val) {
+				this.triggered = false;
+				this.isMore = val == 1
+			},
+			handleChatInput() {
+				this.inputText = this.inputText.trim()
+				if (this.inputText == "" || this.inputText.trim() == "") {
+					uni.showToast({
+						title: '请输入评论',
+						icon: "none"
+					})
+					return;
+				}
+				if(this.openCommentStatus==1) {
+					this.$refs.commentBox&&this.$refs.commentBox.handleInput(this.inputText)
+				} else if(this.openCommentStatus==2) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.handleInput(this.inputText)
+				}
+			},
+			setInputText() {
+				this.inputText = ""
+				if(this.openCommentStatus==2) {
+					this.$refs.danmuPopup.close()
+				}
+			},
+			getActiveDanmus(val) {
+				this.activeDanmus = val.map(item=>({
+					...item,
+					danmustyle: {
+						top: item.top + 'px',
+						...item.style, 
+						'animation-duration': '8s'
+					}
+				}))
+			},
+			animationend(moveItem, i) {
+				// 移除动画结束的弹幕(性能优化)
+				if(this.openCommentStatus==2) {
+					this.$refs.danmuBox&&this.$refs.danmuBox.animationend(moveItem, i)
+				}
+			},
+			navback() {
+				const pages = getCurrentPages(); // 获取当前页面栈
+				if (pages.length > 1) {
+				   uni.navigateBack(); // 有上一页才返回
+				} else { 
+				  // 如果是首页,跳转到某个默认页面(如首页)
+				  uni.reLaunch({ url: '/pages/index/index' }); // 或者用 switchTab 如果是 tabBar 页面
+				}
+			},
+			feedback() {
+				const userId = this.user.userId || ''
+				const courseId = this.urlOption.courseId || ''
+				const videoId = this.urlOption.videoId || ''
+				const companyId = this.urlOption.companyId || ''
+				const companyUserId = this.urlOption.companyUserId || ''
+				uni.navigateTo({
+					url: './feedback?userId='+userId+'&courseId='+courseId+'&videoId='+videoId+'&companyId='+companyId+'&companyUserId='+companyUserId
+				})
+			},
+			// 公开课登录\备用登录
+			async loginFsUserWx(data){
+				if(data){
+					console.log('huoqu1222',data)
+					uni.showLoading({
+						title: '登录中'
+					})
+					uni.login({
+						provider: "weixin",
+						success: async loginRes => {
+							console.log(loginRes)
+							let code = loginRes.code // 获取开发code
+							handleFsUserWx({
+							   code: code,
+							   appId:this.appid,
+							   userId:data.userId
+							})
+							.then( res => {
+								uni.hideLoading();
+								if(res.code==200){
+									console.log("loginFsUserWx:",res)
+									// this.userinfos=uni.getStorageSync('userinfos')
+									let token = uni.getStorageSync('TOKEN_WEXIN');
+									let user = uni.getStorageSync('userInfo')
+									// this.userInfo=uni.getStorageSync('userInfo');
+									// this.isLogin = true
+									uni.setStorageSync(TOKEN_KEYAuto, token);
+									uni.setStorageSync('auto_userInfo', JSON.stringify(user));
+									this.user = user
+									this.isLogin = true
+									this.getIsAddKf() 
+								}else if(res.code==406){
+									uni.showToast({
+										icon:'none',
+										title: '该用户已成为其他销售会员',
+									});
+								}else{
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							   
+							 })
+						},
+					})
+				}else{
+					uni.setStorageSync('H5course',{
+						companyId: this.urlOption.companyId,
+						companyUserId:this.urlOption.companyUserId,
+						type: 1, //1自动,其他手动
+					})
+					await this.$store.dispatch('getWebviewUrl');
+					uni.navigateTo({
+						url:'/pages_course/webview?H5course='+uni.getStorageSync('H5course')
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+.full-width-popup {
+  width: 100%;
+}
+</style>
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.footer-tips {
+		margin-top: 14rpx;
+		text-align: center;
+		font-family: PingFang SC,PingFang SC;
+		font-weight: 500;
+		font-size: 12px;
+		color: #bbb;
+	}
+	.textOne {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.textTwo {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+	.header-nav {
+		height: 88rpx;
+		@include u-flex(row, center, flex-start);
+		overflow: hidden;
+		background-color: #fff;
+		box-sizing: border-box;
+		.header-title {
+			text-align: center;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			padding: 0 10rpx 0 100rpx;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #000;
+			box-sizing: border-box;
+		}
+	}
+	.reward-list {
+		width: 100%;
+		margin-top: 20rpx;
+		margin-bottom: -40rpx;
+
+		&-group {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #222222;
+			@include u-flex(row, center, center);
+		}
+
+		&-option {
+			@include u-flex(row, center, flex-start);
+
+			&:first-child {
+				margin-right: 40rpx;
+			}
+		}
+	}
+
+	.err {
+		color: #f56c6c !important;
+	}
+
+	.kfqrcode-box {
+		background-color: #fff;
+		border-radius: 16rpx;
+		max-width: 560rpx;
+		padding: 60rpx 40rpx;
+		margin-top: -100rpx;
+		box-sizing: border-box;
+		@include u-flex(column, center, flex-start);
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 34rpx;
+		color: #222;
+		position: relative;
+		text-align: center;
+
+		.kfqrcode {
+			height: 460rpx;
+			width: 460rpx;
+		}
+	}
+
+	.kfqrcode-close {
+		width: 64rpx;
+		height: 64rpx;
+		position: absolute;
+		bottom: -100rpx;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.tipsPopup-mask {
+		position: relative;
+		width: 560rpx;
+		background-color: transparent;
+
+		.red_envelope_top {
+			width: 480rpx;
+			height: 360rpx;
+			margin: 0 auto;
+			display: inherit;
+		}
+	}
+
+	.tipsPopup-btn-box {
+		width: 456rpx;
+		height: 104rpx;
+		padding: 4rpx;
+		box-sizing: border-box;
+		background: linear-gradient(180deg, rgba(252, 209, 94, 1), rgba(254, 253, 251, 1));
+		border-radius: 52rpx;
+	}
+
+	.tipsPopup-btn {
+		width: 100%;
+		height: 100%;
+		background: linear-gradient(180deg, #FF9F22 0%, #FA1E05 100%);
+		border-radius: 52rpx 52rpx 52rpx 52rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #FFFFFF;
+		line-height: 96rpx;
+		text-align: center;
+	}
+
+	.tipsPopup {
+		width: 560rpx;
+		padding: 12rpx;
+		margin-top: -72rpx;
+		box-sizing: border-box;
+		background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+		border-radius: 32rpx 32rpx 32rpx 32rpx;
+		position: relative;
+
+		&-close {
+			width: 64rpx;
+			height: 64rpx;
+			position: absolute;
+			right: 0;
+			top: -188rpx;
+		}
+
+		&-line {
+			padding: 3rpx;
+			box-sizing: border-box;
+			background: linear-gradient(180deg, rgba(247, 245, 220, 1), rgba(250, 220, 157, 1));
+			border-radius: 24rpx;
+		}
+
+		&-box {
+			padding: 0 40rpx 40rpx 40rpx;
+			box-sizing: border-box;
+			background: linear-gradient(180deg, #FFFBEF 0%, #FFFFF5 43%, #F5EAC2 100%);
+			border-radius: 24rpx;
+			@include u-flex(column, center, flex-start);
+		}
+
+		&-head {
+			@include u-flex(row, center, center);
+
+			&-title {
+				width: 364rpx;
+				height: auto;
+				margin-top: -22rpx;
+			}
+		}
+
+		&-content {
+			margin: 48rpx 0;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #222222;
+			text-align: center;
+
+			&-title {
+				margin-bottom: 26rpx;
+				font-weight: 600;
+				font-size: 40rpx;
+				color: #FF5C03;
+			}
+		}
+	}
+
+	.video-controls-box {
+		width: 100%;
+		height: 420rpx;
+		overflow: hidden;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		z-index: 2;
+		background: rgba(0, 0, 0, 0.2);
+
+		.video-play {
+			height: 72rpx;
+			width: 72rpx;
+			position: absolute;
+			top: 50%;
+			left: 50%;
+			transform: translate(-50%, -50%);
+		}
+	}
+
+	.video-controls {
+		width: 100%;
+		height: 80rpx;
+		padding: 0 28rpx;
+		box-sizing: border-box;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		background: linear-gradient(to top, #222 0%, transparent 80%);
+
+		.video-icon {
+			height: 44rpx;
+			width: 44rpx;
+		}
+	}
+
+	.errQuesbox {
+		width: 100%;
+		max-height: 260rpx;
+		overflow-y: auto;
+		margin-top: 24rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 30rpx;
+		color: #222222;
+
+		&-item {
+			width: 100%;
+			height: 128rpx;
+			line-height: 128rpx;
+			margin-bottom: 24rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+			background: #fff;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			position: relative;
+
+			&::after {
+				content: "题目";
+				min-width: 64rpx;
+				height: 36rpx;
+				padding: 0 12rpx;
+				line-height: 36rpx;
+				background: #FF5C03;
+				box-sizing: border-box;
+				border-radius: 0rpx 0rpx 16rpx 0rpx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20rpx;
+				color: #fff;
+				position: absolute;
+				left: 0;
+				top: 0;
+			}
+		}
+	}
+
+	.bg {
+		background: #fff !important;
+	}
+
+	.answerPopup {
+		&-box {
+			width: 560rpx;
+			background: linear-gradient(180deg, #FFFAF6 0%, #FEECD8 100%);
+			border-radius: 32rpx 32rpx 32rpx 32rpx;
+			background-color: #fff;
+			font-weight: 400;
+			padding: 32rpx;
+			box-sizing: border-box;
+			position: relative;
+			@include u-flex(column, center, flex-start);
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+
+			.tipimg {
+				width: 206rpx;
+				height: 206rpx;
+				margin-bottom: 16rpx;
+			}
+		}
+
+		&-title {
+			font-weight: 600;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		&-desc {
+			margin-top: 10rpx;
+			font-size: 28rpx;
+			color: #757575;
+		}
+
+		&-btn {
+			width: 464rpx;
+			height: 84rpx;
+			margin-top: 54rpx;
+			margin-bottom: 16rpx;
+			background: #FF5C03;
+			border-radius: 42rpx;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			text-align: center;
+			line-height: 84rpx;
+		}
+	}
+
+	.popupbox {
+		width: 100%;
+		background-color: #fff;
+		border-radius: 16rpx 16rpx 0 0;
+		padding: 24rpx 32rpx;
+		position: relative;
+
+		&-head {
+			height: 60rpx;
+			margin-bottom: 30rpx;
+			text-align: center;
+			overflow-y: auto;
+			color: #414858;
+			font-size: 32rpx;
+			font-weight: bold;
+			position: relative;
+
+			.close-icon {
+				position: absolute;
+				right: 0;
+				top: 0;
+				height: 40rpx;
+				width: 40rpx;
+			}
+		}
+
+		&-content {
+			height: 20vh;
+			overflow-y: auto;
+			display: flex;
+			align-items: flex-start;
+			flex-wrap: wrap;
+			gap: 32rpx;
+
+			.line-item {
+				display: inline-block;
+				min-width: 200rpx;
+				min-height: 60rpx;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				border-radius: 50rpx;
+				overflow: hidden;
+				background-color: #f7f7f7;
+				text-align: center;
+				color: #414858;
+				font-size: 28rpx;
+				line-height: 60rpx;
+			}
+
+			.line-active {
+				color: #f56c6c !important;
+				background-color: #fef0f0 !important;
+			}
+		}
+	}
+
+	.content {
+		padding-bottom: calc(var(--window-bottom));
+		.video-box {
+			width: 100%;
+			height: 420rpx;
+			overflow: hidden;
+			position: relative;
+
+			#myVideo {
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.video-poster {
+			width: 100%;
+			height: 420rpx;
+		}
+
+		.miantitlebox {
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #F5F7FA;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.subtitlebox {
+			padding: 30rpx 0;
+			border-bottom: 2rpx solid #F5F7FA;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 36rpx;
+			color: #222222;
+		}
+
+		.title-content {
+			padding: 0 32rpx;
+			background-color: #fff;
+			font-size: 28rpx;
+			line-height: 1.6;
+
+			.title {
+				font-size: 36rpx;
+				font-weight: 500;
+				color: #414858;
+			}
+
+			.time-or-subtitle {
+				margin-top: 12rpx;
+				color: #666666;
+			}
+		}
+
+		.video-line {
+			min-width: 140rpx;
+			max-width: 200rpx;
+			height: 60rpx;
+			padding: 0 20rpx;
+			box-sizing: border-box;
+			border-radius: 50rpx 0 0 50rpx;
+			overflow: hidden;
+			background-color: #fff;
+			text-align: center;
+			color: #888;
+			font-size: 28rpx;
+			line-height: 60rpx;
+			display: inline-flex;
+			align-items: center;
+			justify-content: center;
+			position: fixed;
+			right: 0;
+			z-index: 9;
+			bottom: calc(var(--window-bottom) + 280rpx);
+			box-shadow: 0 4rpx 10rpx rgba(0, 0, 0, .12);
+		
+			image {
+				flex-shrink: 0;
+				height: 34rpx;
+				width: 34rpx;
+				margin-right: 6rpx;
+			}
+		}
+		.danmu-line {
+			bottom: calc(var(--window-bottom) + 370rpx);
+			word-break: keep-all;
+			.set_image {
+				height: 40rpx;
+				width: 40rpx;
+			}
+		}
+
+		.footer {
+			border-top: 1rpx solid #ededef;
+			background: #fff;
+			width: 100%;
+			position: fixed;
+			bottom: 0;
+			padding: 32rpx;
+			padding-bottom: calc(var(--window-bottom) + 12rpx);
+			box-sizing: border-box;
+			z-index: 9;
+
+			&-btn {
+				width: 100%;
+				height: 98rpx;
+				background: #FF5C03;
+				border-radius: 49rpx 49rpx 49rpx 49rpx;
+				line-height: 98rpx;
+				text-align: center;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 600;
+				font-size: 32rpx;
+				color: #FFFFFF;
+				@include u-flex(row, center, center);
+
+				&-img {
+					flex-shrink: 0;
+					width: 144rpx;
+					height: 144rpx;
+					margin-right: 8rpx;
+					margin-top: -24rpx;
+				}
+			}
+
+			&-btn-border {
+				position: relative;
+
+				&::after {
+					content: "";
+					background: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
+					position: absolute;
+					top: -2rpx;
+					left: 0;
+					height: 103rpx;
+					width: 100%;
+					z-index: -1;
+					border-radius: 49rpx 49rpx 49rpx 49rpx;
+					box-shadow: 0rpx 8rpx 11rpx 0rpx rgba(255, 92, 3, 0.3);
+					overflow: hidden;
+				}
+			}
+		}
+	}
+
+	.agreement {
+		display: inline-flex;
+		margin-top: 16rpx;
+		font-size: 24rpx;
+		color: #525252;
+		align-items: center;
+		justify-content: center;
+	}
+	 
+	.agreement {
+		display: inline-flex;
+		margin-top: 16rpx;
+		font-size: 24rpx;
+		color: #525252;
+		align-items: center;
+		justify-content: center;
+	}
+	.video-danmu-btnbox {
+		width: 50px;
+		height: 50px;
+		border-radius: 50%;
+		overflow: hidden;
+		position: absolute;
+		right: 10px;
+		bottom: calc(50% - 50px);
+		transform: translateY(-50%);
+		padding: 8px;
+		box-sizing: border-box;
+	}
+	.video-danmu-image {
+		width: 100%;
+		height: 100%;
+	}
+	.danmuPopup {
+		background-color: #fff;
+		padding-bottom: calc(var(--window-bottom) + 10px);
+		.u-border {
+			flex: 1;
+			@include u-flex(row,center,flex-start);
+			padding: 0 10rpx;
+			border-radius: 6px;
+			border: 1rpx solid #eee;
+		}
+		&-head {
+			width: 100%;
+			padding: 10px;
+			box-sizing: border-box;
+			overflow: hidden;
+			@include u-flex(row,center,flex-start);
+			.danmu-icon {
+				height: 24px;
+				width: 24px;
+				margin-right: 12px;
+			}
+		}
+		&-input {
+			flex: 1;
+			height: 35px;
+		}
+		&-send {
+			flex-shrink: 0;
+			height: 35px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			padding: 5px 15px;
+			box-sizing: border-box;
+			background: #FF5C03 !important;
+			border-radius: 22px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #fff !important;
+			margin-left: 12px;
+			&::after {
+				border: none;
+			}
+		}
+		&-con {
+			background-color: #F5F7FA;
+			padding: 24px 12px 48px 12px;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 14px;
+			color: #757575;
+		}
+	}
+	.danmu-icon{
+		height: 24px;
+		width: 24px;
+		margin-right: 12px;
+	}
+	.logo {
+		display: inline-block;
+		width: 30px;
+		height: auto;
+		margin: 20px 0 0 10px;
+		pointer-events: none;
+		object-fit: cover;
+	}
+	.logo-full {
+		display: inline-block;
+		width: 40px;
+		height: auto;
+		margin: 50px 0 0 30px;
+		pointer-events: none;
+		object-fit: cover;
+	}
+	.tabbox {
+		@include u-flex(row, center, center);
+		border-bottom: 2rpx solid #F5F7FA;
+		height: 44px;
+		background-color: #fff;
+		view {
+			flex: 1;
+			padding: 20rpx 0;
+			margin-right: 40rpx;
+			text-align: center;
+		}
+		&-active {
+			position: relative;
+			&::after {
+				position: absolute;
+				bottom: 0;
+				left: 50%;
+				transform: translateX(-50%);
+				content: "";
+				width: 3rem;
+				border-bottom: 4px solid #FF5C03;
+			}
+		}
+	}
+	.chatinput {
+		position: fixed;
+		left: 32rpx;
+		right: 32rpx;
+		z-index: 999;
+		height: 96rpx;
+		background-color: green;
+		background: #FFFFFF;
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		@include u-flex(row, center, center);
+		padding: 0 24rpx;
+		box-sizing: border-box;
+		.uni-input {
+			flex: 1;
+			margin-right: 32rpx;
+			font-size: 30rpx;
+		}
+	
+		.send {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FFFFFF !important;
+			flex-shrink: 0;
+			padding: 0 20rpx;
+			height: 72rpx;
+			background: #FF5C03 !important;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	.answerTip {
+		position: fixed;
+		right: 0;
+		z-index: 9;
+		bottom: calc(var(--window-bottom) + 380rpx);
+		box-shadow: 0rpx 8rpx 21rpx 0rpx rgba(0, 0, 0, 0.1);
+		border-radius: 24rpx 24rpx 24rpx 24rpx;
+		background-color: #ff5c03;
+		color: #fff;
+		border-radius: 50%;
+		height: 90rpx;
+		width: 90rpx;
+		font-size: 25rpx;
+		text-align: center;
+		padding: 10rpx;
+		@include u-flex(column, center, center);
+	}
+	.danmu-item {
+		position: absolute;
+		top: 0;
+		white-space: nowrap;
+		font-size: 16px;
+		height: 20px;
+		display: inline-flex;
+		box-sizing: border-box;
+		align-items: center;
+	}
+	.danmuMove {
+		// animation: mymove 8s linear forwards;
+		// animation-duration: 8s;
+		animation-timing-function: linear;
+		animation-delay: 0s;
+		animation-iteration-count: 1;
+		animation-direction: normal;
+		animation-fill-mode: forwards;
+		animation-play-state: running;
+		animation-name: mymove;
+		will-change: transform;
+	}
+	
+	@keyframes mymove {
+		from {
+			transform: translateX(100vw);
+		}
+	
+		to {
+			transform: translateX(-100%);
+		}
+	}
+	.arrow-left-warning {
+		position: absolute;
+		left: 24rpx;
+		height: 88rpx;
+		overflow: hidden;
+		color: #888;
+		font-size: 24rpx;
+		@include u-flex(column, center, center);
+		image {
+			flex-shrink: 0;
+			height: 36rpx;
+			width: 36rpx;
+		}
+	}
+</style>

+ 141 - 127
pages_course/videovip.vue

@@ -4,7 +4,7 @@
 			<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="video-box" v-if="!videoItem">
+		<view class="video-box" >
 			<image v-if="!isLogin || isAddKf!=1" class="video-poster" :src="courseInfo.imgUrl" mode="aspectFill">
 			</image>
 			<video 
@@ -30,14 +30,6 @@
 				<!-- <cover-image v-if="courseLogo" :class="isFull?'logo-full':'logo'" :src="courseLogo" mode="widthFix"></cover-image> -->
 			</video>
 		</view>
-		<view class="video-box" v-else>
-			<video
-			id="video-content-box"
-			style="width: 100%;height: 420rpx;"
-			:src="videoItem.videoUrl"
-			>
-			</video>
-		</view>
 		
 		<view class="justify-start align-center fs24 base-color-9" v-if="userInfo.userId">
 			<view>{{nameuser?nameuser:'暂未授权昵称'}}#</view>
@@ -259,24 +251,21 @@
 		<!-- footer -->
 		<view class="footer" v-if="videoId">
 			<view class="btns"  >
-				<!-- <button
+<!-- 				<button
 					class="author-btn"
-					open-type="getphonenumber" 
-					@getphonenumber="phoneLogin"  
-					>{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</button> -->
-					<button
-						class="author-btn"
-						open-type="getPhoneNumber"
-						@getphonenumber="phoneLogin"  v-if="!isquestion&&authType==1">{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</button>
-						<button
-							class="author-btn"
-							open-type="getUserInfo" :disabled="userdisabled"
-							@getuserinfo="userInfologin"  v-if="authType==0&&!isquestion">{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</button>
-					<!-- <view class="author-btn" @click="phoneLogin"> {{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</view> -->
-				<button class="author-btn" v-if="isLogin &&!isquestion" 
+					open-type="getPhoneNumber"
+					@getphonenumber="phoneLogin"  v-if="!isquestion&&authType==1">{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</button>
+				<button
+					class="author-btn"
+					open-type="getUserInfo" :disabled="userdisabled"
+					@getuserinfo="userInfologin"  v-if="authType==0&&!isquestion">{{isLogin&&isAddKf==1 ? '提交答案领取奖励' : '立即学习'}}</button> -->
+				<button class="author-btn"  
 				@click="submit">{{isLogin&&isAddKf==1 ?'提交答案领取奖励' : '立即学习'}}</button>
 			</view>
 		</view>
+		<view>
+			<u-modal :show="showfalse" title="提示" :content='contentmsg' @confirm='showfalse=false'></u-modal>
+		</view>
 		<u-loading-page :loading="viewload" iconSize="32" loadingColor="#3c9cff" fontSize="24"
 		:loading-text="loadingtext"></u-loading-page>
 	</view>
@@ -285,6 +274,7 @@
 <script>
 	import { generateRandomString} from "@/utils/common.js"
 	import dayjs from 'dayjs';
+	import { mapGetters } from 'vuex';
 	import {
 		getErrMsg,
 		getH5CourseByVideoId,
@@ -296,10 +286,12 @@
 		getIntegralByH5Video,
 		sendReward,
 		getRealLink,
-		checkUserInfo,
-		editUser,
-		loginByMiniApp
+		loginByMiniApp,
+		handleFsUserWx
 	} from "@/api/courseLook.js"
+	import {
+		getConfigByKey
+	} from "@/api/user.js"
 	export default {
 		data() {
 			return {
@@ -368,6 +360,7 @@
 				uuId: "",
 				isEnded: false,
 				// 是否允许拖动进度条
+				linkType: 0,
 				ip: null,
 				checked: true,
 				isFinish: 0, // 是否完课
@@ -428,7 +421,9 @@
 				headImg:'',
 				authType:0,//0微信登录 1手机号登录
 				userdisabled:false,
-				projectId:''
+				projectId:'',
+				showfalse:false,
+				contentmsg:null,
 			}
 		},
 		filters: {
@@ -469,54 +464,58 @@
 			avataruser() {
 				return this.userinfos.avatar
 			},
+			...mapGetters(['coureLogin']),
+		},
+		watch: {
+		    coureLogin: {
+		      immediate: true,          // 页面一进入就检查一次
+		      handler(val) {
+		        if (val == 2&&this.isLogin) {
+					console.log("看课AppToken失效,请重新登录")
+					this.isLogin = false
+					this.isAddKf = 0
+					this.goLogin()
+		        }
+		      }
+		    }
 		},
-		//发送给朋友
-		// onShareAppMessage(res) {
-		// 	return {
-		// 		title: this.$store.state.logoname,
-		// 		// path: '/pages/index/index',
-		// 		imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
-		// 	}
-			
-		// },
-		// //分享到朋友圈
-		// onShareTimeline(res) {
-		// 	return {
-		// 		title: this.$store.state.logoname,
-		// 		imageUrl: this.$store.state.imgpath+'/app/image/logo.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
-		// 	}
-			
-		// },
 		onLoad(option) {
-			console.log("option",option)
+			this.getWebviewUrl()
+			uni.$on('usercode',(data)=>{
+				console.log('huoqu ',data)
+				this.goLogin(data)
+			})
+			uni.$on('vipMsg',(data)=>{
+				console.log(4444,data)
+				this.contentmsg=data
+				this.showfalse=true
+				uni.showToast({
+					icon:'none',
+					title: data,
+					duration:5000
+				});
+			})
 			this.videoContext = uni.createVideoContext('video-content-box', this)
 			this.code = option.code
 			if(uni.getStorageSync('userInfo')&&JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
-				this.userInfo = JSON.parse(uni.getStorageSync('userInfo'))
+				this.userInfo = uni.getStorageSync('userInfo')
 			} else {
 				this.userInfo = {}
 			}
 			this.appToken=uni.getStorageSync('companyUserInfo')
-			// decodeURIComponent()
-			
-			if(!option.course&&!option.videoitem){
+			if(!option.course){
 				const keys = decodeURIComponent(Object.keys(option)[0]);
 				this.urlOption=JSON.parse(keys.split('course=')[1])
-			}else if(option.videoitem){
-				this.videoItem=option.videoitem ? JSON.parse(option.videoitem) : {}
-				this.videoId=this.videoItem.videoId
-				console.log("optionqqq",this.videoItem)
-				console.log("option111",this.videoItem.videoId)
-				return
-			}else if(option.course){
+			}else{
 				this.urlOption = option.course ? JSON.parse(option.course) : {}
 			}
-			this.projectId=this.urlOption.projectId
+			uni.setStorageSync('H5course',this.urlOption)
 			this.videoId = this.urlOption.videoId
 			this.courseId = this.urlOption.courseId
 			this.periodId = this.urlOption.periodId
 			this.companyId = this.urlOption.companyId
 			this.companyUserId = this.urlOption.companyUserId
+			this.projectId= this.urlOption.projectId
 			this.timeid=this.urlOption.id
 			console.log(this.urlOption)
 			console.log(decodeURIComponent(option.course))
@@ -536,21 +535,24 @@
 			// #endif
 		},
 		onShow() {
+			this.userinfos=uni.getStorageSync('userinfos')
+			this.userinfo=uni.getStorageSync('userinfo')
 			this.tipsOpen = false
 			this.isExpand = true
 			this.uuId = generateRandomString(16)
-			if (this.videoId) {
+			if(this.videoId) {
 				this.getH5CourseByVideo()
 			}
 			const AppToken=uni.getStorageSync('TOKEN_WEXIN')
 			console.log(AppToken)
 			if(AppToken){
 				// this.isLogin=true
-				if(this.isAddKf == 1){
+				if(this.isAddKf == 1&&this.userinfo.userId){
+					console.log(1233)
 					this.getH5CourseVideoDetails()
 				} else{
-					this.checkUserInfoA()
-					// this.getIsAddKf()
+					// this.checkUserInfoA()
+					this.getIsAddKf()
 				}
 			}
 			// if(this.sortLink){
@@ -565,6 +567,7 @@
 		mounted() {
 			// this.getIP()
 			this.getHeight()
+			
 		},
 		onHide() {
 			// this.player = uni.createVideoContext('video-content-box');
@@ -582,6 +585,7 @@
 				this.interval = null
 			}
 			this.clearIntegral()
+			uni.$off('usercode')
 		},
 		beforeDestroy() {
 			this.player = uni.createVideoContext('video-content-box');
@@ -596,67 +600,77 @@
 			this.clearIntegral()
 		},
 		methods: {
-			//检查用户昵称以及头像
-			checkUserInfoA(){
-				checkUserInfo().then(res=>{
-					if(res.code==200){
-						this.isLogin = true
-						this.userInfo= res.user
-						uni.setStorageSync('userInfo', JSON.stringify(res.user));
-						console.log(uni.getStorageSync('userInfos'))
-						if(this.nameuser==''){
-							this.userinfos.nickname=this.userInfo.nickname
-						}
-						let that=this
-						setTimeout(()=>{
-							that.getIsAddKf()
-						},100)
-					}else if(res.code==500){
-						if(res.authType==2){
-							uni.setStorageSync('authUrl',res.domain)
-							if(!uni.getStorageSync('userInfos')){
-								uni.navigateTo({
-									url:'/pages_course/webview'
-								})
-								return
-							}
-							this.editUserA()
+			getWebviewUrl() {
+				var data = {
+					key: 'course.config'
+				}
+					getConfigByKey(data).then(res => {
+						if (res.code == 200) {
+							console.log("getConfigByKey====", JSON.parse(res.data))
+							let data = JSON.parse(res.data,)
+							uni.setStorageSync('setWebviewUrl',data.userCourseAuthDomain)
 						}else{
-							this.userlogo=true
+							uni.showToast({
+								icon:'none',
+								title: res.msg,
+							});
 						}
-					}else{
-						uni.showToast({
-							icon:'none',
-							title:res.msg,
-						});
-					}
-				})
+					})
 			},
-			//修改用户昵称以及头像
-			editUserA(){
-				this.userinfos=uni.getStorageSync('userInfos')?uni.getStorageSync('userInfos'):this.userinfos
-				const data={
-					nickname:this.userinfos.nickname,
-					avatar:this.userinfos.avatar,
+			goLogin(data) {
+				if(data){
+					console.log('huoqu1222',data)
+					uni.showLoading({
+						title: '加载中'
+					})
+					uni.login({
+						provider: "weixin",
+						success: async loginRes => {
+							let code = loginRes.code // 获取开发code
+							handleFsUserWx({
+							   code: code,
+							   appId:this.appid,
+							   userId:data.userId
+							})
+							.then( res => {
+								if(res.code==200){
+									console.log(res)
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "登录成功",
+									});
+									this.userinfos=uni.getStorageSync('userinfos')
+									uni.getStorageSync('TOKEN_WEXIN');
+									this.userInfo=uni.getStorageSync('userInfo');
+									this.isLogin = true
+									this.getH5CourseVideoDetails()
+									// setTimeout(()=>{
+									// 	this.getIsAddKf()
+									// },200)
+								}else if(res.code==406){
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: '该用户已成为其他销售会员',
+									});
+								}else{
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							   
+							 })
+						},
+					})
+				}else{
+					uni.navigateTo({
+						url:'/pages_course/webview?H5course='+uni.getStorageSync('H5course')
+					})
 				}
-				editUser(data).then(res=>{
-					if(res.code==200){
-						this.isLogin = true
-						uni.showToast({
-							icon:'none',
-							title:'修改成功!',
-						});
-						setTimeout(()=>{
-							this.getIsAddKf()
-						},100)
-					}else{
-						uni.removeStorageSync('userInfos')
-						uni.showToast({
-							icon:'none',
-							title:res.msg+'请重新点击立即学习',
-						});
-					}
-				})
+				
 			},
 			shouquan(){
 				if(this.userinfos.nickname==''){
@@ -769,11 +783,9 @@
 										uni.setStorageSync('userInfo', JSON.stringify(res.user));
 										this.userInfo=res.user;
 										uni.hideLoading()
-										this.checkUserInfoA()
+										// this.checkUserInfoA()
 										// this.isLogin = true
-										// setTimeout(()=>{
-										// 	this.getIsAddKf()
-										// },200)
+										
 									}else if(res.code==406){
 										uni.hideLoading();
 										uni.showToast({
@@ -1070,6 +1082,7 @@
 				uni.showLoading({
 					title: '加载中'
 				})
+				console.log(this.userInfo)
 				const data={
 					videoId:this.videoId,
 					fsUserId:this.userInfo.userId,
@@ -1232,7 +1245,7 @@
 								}
 							} 
 						} else{
-							// this.goLogin()
+							this.goLogin()
 						}
 					},
 					rej => {}
@@ -1463,7 +1476,11 @@
 							this.isLogin = true
 							if(res.data){
 								this.isAddKf = 1
-								this.getH5CourseVideoDetails()
+								if(this.userInfo.userId){
+									this.getH5CourseVideoDetails()
+									console.log(123223)
+								}
+								
 							}
 							// else{
 							// 	uni.showToast({
@@ -1576,9 +1593,6 @@
 				getErrMsg({
 					msg: JSON.stringify(msgerr)
 				})
-			},
-			goLogin() {
-				
 			},
 			getLink() {
 				this.goLogin()

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.