소스 검색

首次提交

puyao 3 주 전
커밋
bce6d19a0d
100개의 변경된 파일26875개의 추가작업 그리고 0개의 파일을 삭제
  1. 4 0
      .gitignore
  2. 10 0
      .hbuilderx/launch.json
  3. 1085 0
      App.vue
  4. 11 0
      api/adv.js
  5. 15 0
      api/article.js
  6. 41 0
      api/common.js
  7. 34 0
      api/companyUser.js
  8. 17 0
      api/coupon.js
  9. 101 0
      api/course.js
  10. 17 0
      api/courseAnswer.js
  11. 12 0
      api/courseOrder.js
  12. 9 0
      api/department.js
  13. 16 0
      api/disease.js
  14. 24 0
      api/doctor.js
  15. 13 0
      api/doctorArticle.js
  16. 22 0
      api/drugReport.js
  17. 14 0
      api/follow.js
  18. 54 0
      api/healthRecords.js
  19. 21 0
      api/healthTongue.js
  20. 14 0
      api/hospital.js
  21. 39 0
      api/index.js
  22. 67 0
      api/inquiryOrder.js
  23. 42 0
      api/integral.js
  24. 23 0
      api/package.js
  25. 49 0
      api/packageOrder.js
  26. 39 0
      api/patient.js
  27. 38 0
      api/prescribe.js
  28. 25 0
      api/store.js
  29. 29 0
      api/storeAfterSales.js
  30. 55 0
      api/storeOrder.js
  31. 24 0
      api/test.js
  32. 53 0
      api/user.js
  33. 49 0
      api/userAddress.js
  34. 12 0
      api/userVipOrder.js
  35. 157 0
      assets/css/common.less
  36. 355 0
      assets/css/common.scss
  37. 2 0
      assets/iconfont/iconfont.css
  38. 9 0
      common/config.js
  39. 32 0
      common/css/flexCommon.css
  40. 89 0
      common/request.js
  41. 169 0
      components/CustomCamera/WeChat/Layout.vue
  42. 215 0
      components/CustomCamera/WeChat/index.vue
  43. 50 0
      components/Loading.vue
  44. 162 0
      components/Menu.vue
  45. 20 0
      index.html
  46. 72 0
      main.js
  47. 74 0
      manifest.json
  48. 54 0
      note.txt
  49. 1122 0
      package-lock.json
  50. 35 0
      package.json
  51. 1877 0
      pages.json
  52. 377 0
      pages/auth/login.vue
  53. 45 0
      pages/common/launch.vue
  54. 211 0
      pages/components/wxAuth.vue
  55. 137 0
      pages/courseAnswer/index.vue
  56. 191 0
      pages/courseAnswer/list.vue
  57. 395 0
      pages/doctor/index.vue
  58. 325 0
      pages/im/conversationList/components/ConversationItem.vue
  59. 107 0
      pages/im/conversationList/components/MyAvatar/index.vue
  60. 269 0
      pages/im/conversationList/index.vue
  61. 79 0
      pages/index/content.vue
  62. 40 0
      pages/index/h5.vue
  63. 1335 0
      pages/index/index.vue
  64. 64 0
      pages/index/webview.vue
  65. 277 0
      pages/store/index.vue
  66. 670 0
      pages/user/index.vue
  67. 260 0
      pages_company/bindInfo.vue
  68. 387 0
      pages_company/couponDetails.vue
  69. 460 0
      pages_company/couponList.vue
  70. 275 0
      pages_company/index.vue
  71. 649 0
      pages_company/inquiryOrderDetails.vue
  72. 407 0
      pages_company/inquiryOrderList.vue
  73. 141 0
      pages_company/login.vue
  74. 853 0
      pages_company/packageDetails.vue
  75. 536 0
      pages_company/packageList.vue
  76. 465 0
      pages_company/packageOrderDetails.vue
  77. 398 0
      pages_company/packageOrderList.vue
  78. 300 0
      pages_company/storeOrderDelivery.vue
  79. 694 0
      pages_company/storeOrderDetail.vue
  80. 481 0
      pages_company/storeOrderList.vue
  81. 705 0
      pages_course/components/commentBox.vue
  82. 157 0
      pages_course/components/descInfo.vue
  83. 201 0
      pages_course/components/descInfoNav.vue
  84. 134 0
      pages_course/components/ques.vue
  85. 135 0
      pages_course/feedback.vue
  86. 2057 0
      pages_course/video.vue
  87. 2243 0
      pages_course/videoOld.vue
  88. 159 0
      pages_course/webview.vue
  89. 244 0
      pages_doctor/doctorArticleDetails.vue
  90. 337 0
      pages_doctor/doctorArticleList.vue
  91. 941 0
      pages_doctor/doctorDetails.vue
  92. 456 0
      pages_doctor/doctorImgs.vue
  93. 538 0
      pages_doctor/doctorInfo.vue
  94. 307 0
      pages_doctor/doctorList.vue
  95. 225 0
      pages_doctor/doctorPingList.vue
  96. 18 0
      pages_im/api/checkUpdate.js
  97. 191 0
      pages_im/api/imApi.js
  98. 170 0
      pages_im/api/imBll.js
  99. 82 0
      pages_im/api/login.js
  100. 175 0
      pages_im/api/meeting.js

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+node_modules/
+.project
+unpackage/
+.DS_Store

+ 10 - 0
.hbuilderx/launch.json

@@ -0,0 +1,10 @@
+{
+    "version" : "1.0",
+    "configurations" : [
+        {
+            "customPlaygroundType" : "device",
+            "playground" : "custom",
+            "type" : "uni-app:app-android"
+        }
+    ]
+}

+ 1085 - 0
App.vue

@@ -0,0 +1,1085 @@
+<script>
+
+import { mapGetters, mapActions } from 'vuex';
+import IMSDK, { IMMethods, MessageReceiveOptType, MessageType, SessionType } from 'openim-uniapp-polyfill';
+import { config } from '@/pages_im/common/config';
+import { getDbDir, Igexin, toastWithCallback } from '@/pages_im/util/common.js';
+
+import { conversationSort, secFormat, callingModule, meetingModule, parseMessageByType, prepareConversationState } from '@/pages_im/util/imCommon';
+import { PageEvents, UpdateMessageTypes, CustomType, ContactChooseTypes } from '@/pages_im/constant';
+
+import { openImLoginApi } from '@/pages_im/api/imBll';
+import NotificationUtil from '@/pages_im/util/notification';
+import newMessage from '@/pages_im/static/audio/newMessage.wav';
+
+import { getTlsSig } from '@/api/common.js'
+import { checkLogin } from '@/api/user.js'
+
+let cacheConversationList = [];
+let updateDownloadTask = null;
+let notificationIntance = null;
+let pausing = false;
+let innerAudioContext;
+let notification;
+let uPushPlugin;
+
+export default {
+	globalData: {
+		wsUrl: 'wss://h5api.his.cdwjyyh.com',
+		appId: 'wx1e6d61497bba00ef'
+	},
+  onLaunch: function () {
+		this.checkUpdate()
+	    this.initOpenIm();
+		
+		var that=this;
+		uni.$on('refreshIM', () => {
+			this.checkLogin();
+		});
+		var urls="https://userapp.bjyjbao.com/prod-api";
+		var urlList=urls.split(";");
+		console.log(this.getRandomInt(0,urlList.length-1))
+		var path = urlList[this.getRandomInt(0,urlList.length-1)];
+		//path="https://api.cdwjyyh.com";
+		//path="https://test.userapp.his.cdwjyyh.com";
+		uni.setStorageSync('requestPath',path)
+  },
+  onUnload() {
+  	 
+  },
+  onShow() {
+	uni.getSystemInfo({
+	  	success: (result) => {
+	  		// 获取手机系统的状态栏高度(不同手机的状态栏高度不同)
+	  		// console.log('当前手机的状态栏高度',result.statusBarHeight)
+	  		let statusBarHeight = result.statusBarHeight + 'px'
+	  		// 获取右侧胶囊的信息 单位px
+	  		//#ifndef H5 || APP-PLUS
+	  		const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+	  		
+	  		//bottom: 胶囊底部距离屏幕顶部的距离
+	  		//height: 胶囊高度
+	  		//left:   胶囊左侧距离屏幕左侧的距离
+	  		//right:  胶囊右侧距离屏幕左侧的距离
+	  		//top:    胶囊顶部距离屏幕顶部的距离
+	  		//width:  胶囊宽度
+	  		// console.log(menuButtonInfo.width, menuButtonInfo.height, menuButtonInfo.top)
+	  		// console.log('计算胶囊右侧距离屏幕右边距离', result.screenWidth - menuButtonInfo.right)
+	  		let menuWidth = menuButtonInfo.width + 'px'
+	  		let menuHeight = menuButtonInfo.height + 'px'
+	  		let menuBorderRadius = menuButtonInfo.height / 2 + 'px'
+	  		let menuRight = result.screenWidth - menuButtonInfo.right + 'px'
+	  		let menuTop = menuButtonInfo.top + 'px'
+	  		let contentTop = result.statusBarHeight + 44 + 'px'
+	  		let menuInfo = {
+	  			statusBarHeight: statusBarHeight,//状态栏高度----用来给自定义导航条页面的顶部导航条设计padding-top使用:目的留出系统的状态栏区域
+	  			menuWidth: menuWidth,//右侧的胶囊宽度--用来给自定义导航条页面的左侧胶囊设置使用
+	  			menuHeight: menuHeight,//右侧的胶囊高度--用来给自定义导航条页面的左侧胶囊设置使用
+	  			menuBorderRadius: menuBorderRadius,//一半的圆角--用来给自定义导航条页面的左侧胶囊设置使用
+	  			menuRight: menuRight,//右侧的胶囊距离右侧屏幕距离--用来给自定义导航条页面的左侧胶囊设置使用
+	  			menuTop: menuTop,//右侧的胶囊顶部距离屏幕顶部的距离--用来给自定义导航条页面的左侧胶囊设置使用
+	  			contentTop: contentTop,//内容区距离页面最上方的高度--用来给自定义导航条页面的内容区定位距离使用
+	  		}
+	  		uni.setStorageSync('menuInfo', menuInfo)
+	  		//#endif
+	  	},
+	  	fail: (error) => {
+	  		console.log(error)
+	  	}
+	})
+  	
+  },
+  onHide() {
+      
+  },
+  computed: {
+  	...mapGetters([
+  		'storeConversationList',
+  		'storeCurrentConversation',
+  		'storeCurrentUserID',
+  		'storeSelfInfo',
+  		'storeRecvFriendApplications',
+  		'storeRecvGroupApplications',
+  		'storeHistoryMessageList',
+  		'storeIsSyncing',
+  		'storeGroupList'
+  	]),
+  	contactBadgeRely() {
+  		return {
+  			recvFriendApplications: this.storeRecvFriendApplications,
+  			recvGroupApplications: this.storeRecvGroupApplications,
+  			userKey: this.storeCurrentUserID
+  		};
+  	}
+  },
+  methods: {
+	...mapActions('message', ['pushNewMessage', 'updateOneMessage', 'updateQuoteMessageRevoke', 'updateMessageNicknameAndFaceUrl']),
+	...mapActions('conversation', ['updateCurrentMemberInGroup']),
+	...mapActions('contact', [
+		'updateFriendInfo',
+		'pushNewFriend',
+		'updateBlackInfo',
+		'pushNewBlack',
+		'pushNewGroup',
+		'updateGroupInfo',
+		'pushNewRecvFriendApplition',
+		'updateRecvFriendApplition',
+		'pushNewSentFriendApplition',
+		'updateSentFriendApplition',
+		'pushNewRecvGroupApplition',
+		'updateRecvGroupApplition',
+		'pushNewSentGroupApplition',
+		'updateSentGroupApplition'
+	]),  
+	getRandomInt(min, max) {
+	    const minCeiled = Math.ceil(min);
+	    const maxFloored = Math.floor(max);
+	    return Math.floor(Math.random() * (maxFloored - minCeiled + 1) + minCeiled); // 包含最小值和最大值
+	},
+	checkLogin(){
+		var data={};
+		checkLogin(data).then(
+			res => {
+				if(res.code==200){
+					this.openImLogin();
+				} 
+			},
+			rej => {}
+		);
+	},
+	checkUpdate() {
+		const updateManager = uni.getUpdateManager();
+		updateManager.onCheckForUpdate(function(res) {
+			// 请求完新版本信息的回调
+			console.log('是否有新版本:', res.hasUpdate);
+		});
+
+		updateManager.onUpdateReady(function() {
+			uni.showModal({
+				title: '更新提示',
+				content: '新版本已经准备好,是否重启小程序?',
+				confirmText: '立即重启',
+				confirmColor: '#2179f5',
+				success(res) {
+					if (res.confirm) {
+						// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+						updateManager.applyUpdate();
+					}
+				}
+			});
+		});
+
+		updateManager.onUpdateFailed(function() {
+			// 新的版本下载失败
+			uni.showModal({
+				title: '更新提示',
+				content: '新版本下载失败,请检查网络后重试。',
+				showCancel: false
+			});
+		});
+	},
+	initOpenIm() {
+		innerAudioContext = uni.createInnerAudioContext();
+		innerAudioContext.autoplay = false;
+		innerAudioContext.src = newMessage;
+		this.setGlobalIMlistener();
+		this.tryLogin();
+	},
+	setGlobalIMlistener() {
+		// init
+		const kickHander = (message) => {
+			toastWithCallback(message, () => {
+				uni.setStorageSync('AppToken',null);
+				uni.removeStorage({key: "IMToken",});
+				uni.removeStorage({key: "IMUserID",});
+				uni.removeStorage({key: "IMHasLogin"}); 
+				uni.$emit('loginOut');
+				//callingModule?.endCall();
+				//meetingModule?.endCall();
+			});
+		};
+		
+	    let that=this;
+		IMSDK.subscribe(IMSDK.IMEvents.OnKickedOffline, (data) => {
+			kickHander('您的账号在其他设备登录,请重新登陆!');
+			//that.removeImData();
+		    //that.openImLogin();
+		});
+		
+		IMSDK.subscribe(IMSDK.IMEvents.OnUserTokenExpired, (data) => {
+			//kickHander('您的登录已过期,请重新登陆!');
+			that.removeImData();
+			that.openImLogin();
+		});
+		
+		IMSDK.subscribe(IMSDK.IMEvents.OnUserTokenInvalid, (data) => {
+			//kickHander('您的登录已无效,请重新登陆!');
+			that.removeImData();
+			that.openImLogin();
+		});
+	
+		// sync
+		const syncStartHandler = ({ data }) => {
+			this.$store.commit('user/SET_IS_SYNCING', true);
+			this.$store.commit('user/SET_REINSTALL', data);
+		};
+		const syncProgressHandler = ({ data }) => {
+			this.$store.commit('user/SET_PROGRESS', data);
+		};
+		const syncFinishHandler = () => {
+			this.$store.dispatch('conversation/getConversationList');
+			this.$store.dispatch('contact/getFriendList');
+			this.$store.dispatch('contact/getGrouplist');
+			this.$store.dispatch('conversation/getUnReadCount');
+			this.$store.commit('user/SET_IS_SYNCING', false);
+			uni.hideLoading();
+		};
+		const syncFailedHandler = () => {
+			uni.hideLoading();
+			uni.$u.toast('同步消息失败');
+			this.$store.dispatch('conversation/getConversationList');
+			this.$store.dispatch('conversation/getUnReadCount');
+			this.$store.commit('user/SET_IS_SYNCING', false);
+		};
+		IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerStart, syncStartHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerFinish, syncFinishHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerFailed, syncFailedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnSyncServerProgress, syncProgressHandler);
+	
+		// self
+		const selfInfoUpdateHandler = ({ data }) => {
+			this.$store.commit('user/SET_SELF_INFO', {
+				...this.storeSelfInfo,
+				...data
+			});
+			this.updateMessageNicknameAndFaceUrl({
+				sendID: data.userID,
+				senderNickname: data.nickname,
+				senderFaceUrl: data.faceURL
+			});
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnSelfInfoUpdated, selfInfoUpdateHandler);
+	
+		// message
+		const newMessagesHandler = ({ data }) => {
+			if (this.storeIsSyncing) {
+				return;
+			}
+			data.forEach(this.handleNewMessage);
+			
+		};
+		const c2cReadReceiptHandler = ({ data: receiptList }) => {
+			if (receiptList[0].userID !== this.storeCurrentConversation.userID) {
+				return;
+			}
+			receiptList.forEach((item) => {
+				item.msgIDList.forEach((msgID) => {
+					this.updateOneMessage({
+						message: {
+							clientMsgID: msgID
+						},
+						type: UpdateMessageTypes.KeyWords,
+						keyWords: {
+							key: 'isRead',
+							value: true
+						}
+					});
+				});
+			});
+		};
+		const groupReadReceiptHandler = ({ data }) => {
+			if (data.conversationID !== this.storeCurrentConversation.conversationID) {
+				return;
+			}
+			data.groupMessageReadInfo.map((receipt) => {
+				const oldMessage = this.storeHistoryMessageList.find((msg) => msg.clientMsgID === receipt.clientMsgID);
+				if (oldMessage) {
+					uni.$emit(PageEvents.GroupMessageReceipt, receipt);
+					const newMessage = {
+						...oldMessage,
+						isRead: true,
+						attachedInfoElem: {
+							...oldMessage.attachedInfoElem,
+							groupHasReadInfo: {
+								hasReadCount: receipt.hasReadCount,
+								unreadCount: receipt.unreadCount
+							}
+						}
+					};
+					console.log(newMessage);
+					this.updateOneMessage({ message: newMessage });
+				}
+			});
+			console.log(data);
+		};
+		const newRecvMessageRevokedHandler = ({ data: revokedMessage }) => {
+			if (!this.storeCurrentConversation.conversationID) {
+				return;
+			}
+			this.updateOneMessage({
+				message: { clientMsgID: revokedMessage.clientMsgID },
+				type: UpdateMessageTypes.KeyWords,
+				keyWords: [
+					{
+						key: 'contentType',
+						value: MessageType.RevokeMessage
+					},
+					{
+						key: 'notificationElem',
+						value: {
+							detail: JSON.stringify(revokedMessage)
+						}
+					}
+				]
+			});
+			this.updateQuoteMessageRevoke({
+				clientMsgID: revokedMessage.clientMsgID
+			});
+		};
+		const inputStatusChanged = ({ data }) => {
+			if (data.userID === this.storeCurrentConversation.userID && data.conversationID === this.storeCurrentConversation.conversationID) {
+				if (data.platformIDs.length > 0) {
+					uni.$emit(PageEvents.TypingUpdate);
+				}
+			}
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnRecvNewMessages, newMessagesHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnInputStatusChanged, inputStatusChanged);
+		IMSDK.subscribe(IMSDK.IMEvents.OnRecvC2CReadReceipt, c2cReadReceiptHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnRecvGroupReadReceipt, groupReadReceiptHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnNewRecvMessageRevoked, newRecvMessageRevokedHandler);
+	
+		// friend
+		const friendInfoChangeHandler = ({ data }) => {
+			uni.$emit(IMSDK.IMEvents.OnFriendInfoChanged, { data });
+			if (data.userID === this.storeCurrentConversation?.userID) {
+				this.updateMessageNicknameAndFaceUrl({
+					sendID: data.userID,
+					senderNickname: data.remark || data.nickname,
+					senderFaceUrl: data.faceURL
+				});
+				this.$store.commit('conversation/SET_CURRENT_CONVERSATION', { ...this.storeCurrentConversation, showName: data.remark || data.nickname });
+			}
+			console.log(this.storeConversationList);
+			this.updateFriendInfo({friendInfo: data});
+		};
+		const friendAddedHandler = ({ data }) => {
+			this.pushNewFriend(data);
+		};
+		const friendDeletedHander = ({ data }) => {
+			this.updateFriendInfo({
+				friendInfo: data,
+				isRemove: true
+			});
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnFriendInfoChanged, friendInfoChangeHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnFriendAdded, friendAddedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnFriendDeleted, friendDeletedHander);
+	
+		// blacklist
+		const blackAddedHandler = ({ data }) => {
+			this.pushNewBlack(data);
+		};
+		const blackDeletedHandler = ({ data }) => {
+			this.updateBlackInfo({
+				blackInfo: data,
+				isRemove: true
+			});
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnBlackAdded, blackAddedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnBlackDeleted, blackDeletedHandler);
+	
+		// group
+		const joinedGroupAddedHandler = ({ data }) => {
+			uni.$emit(IMSDK.IMEvents.OnJoinedGroupAdded, { data });
+			this.pushNewGroup(data);
+		};
+		const joinedGroupDeletedHandler = ({ data }) => {
+			uni.$emit(IMSDK.IMEvents.OnJoinedGroupDeleted, { data });
+			this.updateGroupInfo({
+				groupInfo: data,
+				isRemove: true
+			});
+		};
+		const groupInfoChangedHandler = ({ data }) => {
+			this.updateGroupInfo({
+				groupInfo: data
+			});
+		};
+		const groupMemberInfoChangedHandler = ({ data }) => {
+			uni.$emit(IMSDK.IMEvents.OnGroupMemberInfoChanged, { data });
+			if (data.groupID === this.storeCurrentConversation?.groupID) {
+				this.updateMessageNicknameAndFaceUrl({
+					sendID: data.userID,
+					senderNickname: data.nickname,
+					senderFaceUrl: data.faceURL
+				});
+				this.updateCurrentMemberInGroup(data);
+			}
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnJoinedGroupAdded, joinedGroupAddedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnJoinedGroupDeleted, joinedGroupDeletedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnGroupInfoChanged, groupInfoChangedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnGroupMemberInfoChanged, groupMemberInfoChangedHandler);
+		// application
+		const friendApplicationNumHandler = ({ data }) => {
+			const isRecv = data.toUserID === this.storeCurrentUserID;
+			if (isRecv) {
+				this.pushNewRecvFriendApplition(data);
+			} else {
+				this.pushNewSentFriendApplition(data);
+			}
+		};
+		const friendApplicationAccessHandler = ({ data }) => {
+			const isRecv = data.toUserID === this.storeCurrentUserID;
+			if (isRecv) {
+				this.updateRecvFriendApplition({
+					application: data
+				});
+			} else {
+				this.updateSentFriendApplition({
+					application: data
+				});
+			}
+		};
+		const groupApplicationNumHandler = ({ data }) => {
+			const isRecv = data.userID !== this.storeCurrentUserID;
+			if (isRecv) {
+				this.pushNewRecvGroupApplition(data);
+			} else {
+				this.pushNewSentGroupApplition(data);
+			}
+		};
+		const groupApplicationAccessHandler = ({ data }) => {
+			const isRecv = data.userID !== this.storeCurrentUserID;
+			if (isRecv) {
+				this.updateRecvGroupApplition({
+					application: data
+				});
+			} else {
+				this.updateSentGroupApplition({
+					application: data
+				});
+			}
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnFriendApplicationAdded, friendApplicationNumHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnFriendApplicationAccepted, friendApplicationAccessHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnFriendApplicationRejected, friendApplicationAccessHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnGroupApplicationAdded, groupApplicationNumHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnGroupApplicationAccepted, groupApplicationAccessHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnGroupApplicationRejected, groupApplicationAccessHandler);
+	
+		// conversation
+		const totalUnreadCountChangedHandler = ({ data }) => {
+			if (this.storeIsSyncing) {
+				return;
+			}
+			this.$store.commit('conversation/SET_UNREAD_COUNT', data);
+		};
+		const newConversationHandler = ({ data }) => {
+			if (this.storeIsSyncing) {
+				return;
+			}
+			const result = [...data, ...this.storeConversationList];
+			this.$store.commit('conversation/SET_CONVERSATION_LIST', conversationSort(result));
+		};
+		const conversationChangedHandler = ({ data }) => {
+			if (this.storeIsSyncing) {
+				return;
+			}
+			let filterArr = [];
+			console.log("qxj conversationChangedHandler:::");
+			console.log(data);
+			const chids = data.map((ch) => ch.conversationID);
+			filterArr = this.storeConversationList.filter((tc) => !chids.includes(tc.conversationID));
+			const idx = data.findIndex((c) => c.conversationID === this.storeCurrentConversation.conversationID);
+			if (idx !== -1) this.$store.commit('conversation/SET_CURRENT_CONVERSATION', data[idx]);
+			const result = [...data, ...filterArr];
+			this.$store.commit('conversation/SET_CONVERSATION_LIST', conversationSort(result));
+		};
+	
+		IMSDK.subscribe(IMSDK.IMEvents.OnTotalUnreadMessageCountChanged, totalUnreadCountChangedHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnNewConversation, newConversationHandler);
+		IMSDK.subscribe(IMSDK.IMEvents.OnConversationChanged, conversationChangedHandler);
+	
+		const insertInCurrentConversation = (newServerMsg) => {
+			return newServerMsg.sendID === this.$store.getters.storeCurrentConversation.userID || newServerMsg.recvID === this.$store.getters.storeCurrentConversation.userID;
+		};
+	
+		const onNativeCallEndHandler = async ({ invitation, duration, status }) => {
+			uni.$emit(PageEvents.NativeCallEnd);
+			if (!status || invitation.groupID) {
+				return;
+			}
+			const type = invitation.mediaType === 'video' ? CustomType.VideoCall : CustomType.VoiceCall;
+			const customData = {
+				customType: CustomType.Call,
+				data: { type, duration: secFormat(duration), status }
+			};
+			// uni.clearStorageSync();
+			const nativeCallList = uni.getStorageSync(`${this.$store.getters.storeCurrentUserID}_nativecall`) || [];
+			const isSelf = invitation.inviterUserID === this.$store.getters.storeCurrentUserID;
+			const data = { ...invitation, duration, isSelf, type, time: new Date().getTime() };
+			uni.setStorage({
+				key: `${this.$store.getters.storeCurrentUserID}_nativecall`,
+				data: [...nativeCallList, data]
+			});
+			const message = await IMSDK.asyncApi(IMMethods.CreateCustomMessage, IMSDK.uuid(), {
+				data: JSON.stringify(customData),
+				extension: '',
+				description: 'RTC'
+			});
+			const recvID = invitation.inviteeUserIDList[0];
+			IMSDK.asyncApi(IMSDK.IMMethods.InsertSingleMessageToLocalStorage, IMSDK.uuid(), {
+				message,
+				recvID,
+				sendID: invitation.inviterUserID
+			}).then(({ data }) => {
+					if (insertInCurrentConversation(data)) {
+						this.$store.dispatch('message/pushNewMessage', data);
+						setTimeout(() => uni.$emit(PageEvents.ScrollToBottom, true));
+					}
+				}).catch((err) => {
+					console.log(err);
+				});
+		};
+		const onNativeInviteHandler = async (data) => {
+			// uni.$u.toast("onNativeInviteHandler")
+			uni.$u.route('/pages_im/pages/common/contactChoose/index', {
+				type: ContactChooseTypes.InviteMeeting,
+				forwardMessage: encodeURIComponent(JSON.stringify(data.data))
+			});
+		};
+		IMSDK.subscribe('onNativeCallEnd', onNativeCallEndHandler);
+		IMSDK.subscribe('Native_InviteUser', onNativeInviteHandler);
+	},
+	openImLogin() {
+		let that = this;
+		var userId=uni.getStorageSync('userId');
+		var avatar=uni.getStorageSync('avatar');
+		var nickName=uni.getStorageSync('nickName');
+		
+		var uid = 'U' + userId;
+		let IMToken = uni.getStorageSync('IMToken');
+		let IMUserID = uid
+		let reqData = { userID: uid, nickName: nickName, avatar: avatar };
+		//if(!!IMToken){
+		openImLoginApi(
+			reqData,
+			IMToken,
+			IMUserID,
+			function (token) {
+				that.tryLogin();
+			},
+			function () {}
+		);
+		//}
+	},
+		
+	async tryLogin() {
+		const initStore = () => {
+			
+			uni.setStorageSync('IMHasLogin', 1);
+	
+			this.$store.dispatch('user/initCache');
+			this.$store.dispatch('user/getSelfInfo');
+	
+			//this.$store.dispatch('conversation/getConversationList');
+			this.$store.dispatch('conversation/getUnReadCount');
+	
+			// this.$store.dispatch("contact/getFriendList");
+			// this.$store.dispatch("contact/getGrouplist");
+	
+			// this.$store.dispatch('contact/getBlacklist');
+			// this.$store.dispatch('contact/getRecvFriendApplications');
+			// this.$store.dispatch('contact/getSentFriendApplications');
+			// this.$store.dispatch('contact/getRecvGroupApplications');
+			// this.$store.dispatch('contact/getSentGroupApplications');
+			
+		};
+		let IMToken = uni.getStorageSync('IMToken');
+		let IMUserID = uni.getStorageSync('IMUserID');
+		
+		//1	未登录  2 登录中  3  已登录
+		const loginStatus = await IMSDK.asyncApi(IMSDK.IMMethods.GetLoginStatus, IMSDK.uuid());
+		console.log("qxj loginStatus:"+loginStatus);
+		if (loginStatus === 3) {
+			initStore();
+			return;
+		}
+		//callingModule?.initModule();
+		let platformID=5
+		
+		// #ifdef H5
+		   platformID=5
+		// #endif
+		
+		// #ifdef MP-WEIXIN
+	    	platformID=6
+		// #endif
+	
+		console.log("qxj platformID:"+platformID);
+		
+		if (IMToken && IMUserID) {
+			    IMSDK.asyncApi(IMSDK.IMMethods.Login, IMSDK.uuid(), { 
+				    userID: IMUserID, 
+				    token: IMToken,
+				    platformID:platformID,
+			        apiAddr: config.getApiUrl(),
+					wsAddr: config.getWsUrl(), 
+					logLevel: 1,
+				}).then(initStore).catch((err) => {
+					console.log('qxj initStore error:' + JSON.stringify(err));
+					uni.removeStorage({ key: 'IMToken' });
+				});
+		 } else{
+			this.checkLogin()
+		 }
+	},
+	async newMessageNotify(newServerMsg) {
+		if (this.storeIsSyncing) {
+			return;
+		}
+		const disableNotify = uni.getStorageSync(`${this.storeCurrentUserID}_DisableNotify`);
+		if (disableNotify || this.storeSelfInfo.globalRecvMsgOpt !== MessageReceiveOptType.Nomal) {
+			return;
+		}
+		let cveItem = [...this.storeConversationList, ...cacheConversationList].find((conversation) => {
+			if (newServerMsg.sessionType === SessionType.WorkingGroup) {
+				return newServerMsg.groupID === conversation.groupID;
+			}
+			return newServerMsg.sendID === conversation.userID;
+		});
+		if (!cveItem) {
+			try {
+				const { data } = await IMSDK.asyncApi(IMSDK.IMMethods.GetOneConversation, IMSDK.uuid(), {
+					sourceID: newServerMsg.groupID || newServerMsg.sendID,
+					sessionType: newServerMsg.sessionType
+				});
+				cveItem = data;
+				cacheConversationList = [...cacheConversationList, data];
+				
+			} catch (e) {
+				return;
+			}
+		}
+	
+		if (cveItem.recvMsgOpt !== MessageReceiveOptType.Nomal) {
+			return;
+		}
+	
+		// uni.createPushMessage({
+		// 	content: `${newServerMsg.senderNickname}: ${parseMessageByType(newServerMsg)}`,
+		// 	payload: {
+		// 		sessionType: newServerMsg.sessionType,
+		// 		sourceID: newServerMsg.groupID || newServerMsg.sendID,
+		// 	}
+		// });
+	
+		// const notificationFun = () => {
+		// 	const isSelf = newServerMsg.sendID === this.$store.getters.storeCurrentUserID;
+		// 	if (isSelf) return;
+		// 	const isSingle = newServerMsg.groupID ? false : true;
+		// 	console.log(this.storeGroupList, newServerMsg);
+		// 	const group = this.storeGroupList.filter((group) => group.groupID === newServerMsg.groupID);
+		// 	const title = isSingle ? newServerMsg.senderNickname : group[0].groupName;
+		// 	const desc = parseMessageByType(newServerMsg);
+		// 	console.log('notification', title, desc);
+		// 	notification.showNotice(0, title, desc, () => {
+		// 		prepareConversationState(cveItem);
+		// 	});
+		// };
+		
+		
+		// notificationFun();
+		// const platform = uni.getSystemInfoSync().platform;
+		// if (platform == 'ios') {
+		// 	if (this.storeSelfInfo.allowVibration === 1) {
+		// 		plus.device.vibrate();
+		// 	}
+		// 	if (this.storeSelfInfo.allowBeep === 1) {
+		// 		innerAudioContext.play();
+		// 		// plus.device.beep();
+		// 	}
+		// } else if (platform == 'android') {
+		// 	if (this.storeSelfInfo.allowVibration === 1) {
+		// 		plus.device.vibrate(500);
+		// 	}
+		// 	if (this.storeSelfInfo.allowBeep === 1) {
+		// 		let main = plus.android.runtimeMainActivity();
+		// 		let RingtoneManager = plus.android.importClass('android.media.RingtoneManager');
+		// 		let uri = RingtoneManager.getActualDefaultRingtoneUri(main, RingtoneManager.TYPE_NOTIFICATION);
+		// 		let MediaPlayer = plus.android.importClass('android.media.MediaPlayer');
+		// 		let player = MediaPlayer.create(main, uri);
+		// 		player.setLooping(false);
+		// 		player.prepare();
+		// 		player.start();
+		// 	}
+		// }
+	},
+	handleNewMessage(newServerMsg) {
+		console.log("---qxj newServerMsg");
+		console.log(newServerMsg);
+		if (this.inCurrentConversation(newServerMsg)) {
+			const isSingleMessage = newServerMsg.sessionType === SessionType.Single;
+			if (isSingleMessage) {
+				 uni.$u.throttle(() => uni.$emit(PageEvents.OnlineStateCheck), 2000);
+				 if(newServerMsg.ex!=null&&newServerMsg.ex!=''){
+					 var json=JSON.parse(newServerMsg.ex);
+					 this.$store.commit("timStore/setType",json.type);
+					 this.$store.commit("timStore/setImType", json.imType);
+					 this.$store.commit("timStore/setOrderId",json.orderId);
+					 this.$store.commit("timStore/setOrderType",json.orderType);
+					 this.$store.commit("timStore/setFollowId",json.followId);
+					 if(json.type==="finishInquiry"){
+					 	 this.$store.commit("timStore/setImType", 0);
+					 	 uni.navigateTo({ url: "/pages_order/pingOrder?orderId="+json.orderId })
+					 }
+					 else if(json.type==="startInquiry"){
+					 	
+					 }
+					 else if(json.type==="inquiry"){
+					 	
+					 }
+					 else if(json.type==="startFollow"){
+					 	
+					 }
+					 else if(json.type==="follow"){
+					 	
+					 }
+					 else if(json.type==="finishFollow"){
+					 	
+					 }
+					 else if(json.type==="startDrugReport"){
+					 	
+					 }
+					 else if(json.type==="finishDrugReport"){
+					 	
+					 }
+					 else if(json.type==="drugReport"){
+					 	
+					 }
+				 }
+			}
+			if (newServerMsg.contentType === MessageType.TypingMessage) {
+				if (isSingleMessage) {
+					uni.$emit(PageEvents.TypingUpdate);
+				}
+			} 
+			else {
+				if (newServerMsg.contentType === MessageType.RevokeMessage) {
+					
+				} 
+				else {
+					newServerMsg.isAppend = true;
+					this.pushNewMessage(newServerMsg);
+					setTimeout(() => uni.$emit(PageEvents.ScrollToBottom, true));
+				}
+				uni.$u.debounce(this.markConversationAsRead, 2000);
+			}
+		} 
+		else {
+			if (newServerMsg.contentType !== MessageType.TypingMessage) {
+				console.log("---qxj not inCurrentConversation");
+				uni.$u.throttle(() => this.newMessageNotify(newServerMsg), 500);
+				setTimeout(() => {
+					this.$store.dispatch('conversation/getUnReadCount');
+				},500);
+			}
+		}
+	},
+	inCurrentConversation(newServerMsg) {
+		switch (newServerMsg.sessionType) {
+			case SessionType.Single:
+				return (
+					newServerMsg.sendID === this.storeCurrentConversation.userID ||
+					(newServerMsg.sendID === this.storeCurrentUserID && newServerMsg.recvID === this.storeCurrentConversation.userID)
+				);
+			case SessionType.WorkingGroup:
+				return newServerMsg.groupID === this.storeCurrentConversation.groupID;
+			case SessionType.Notification:
+				return newServerMsg.sendID === this.storeCurrentConversation.userID;
+			default:
+				return false;
+		}
+	},
+	markConversationAsRead() {
+		IMSDK.asyncApi(IMSDK.IMMethods.MarkConversationMessageAsRead, IMSDK.uuid(), this.storeCurrentConversation.conversationID);
+	},
+	removeImData(){
+		uni.removeStorage({ key: 'IMToken' });
+		uni.removeStorage({ key: 'IMUserID' });
+	},
+	getRuntimePlatform() {
+		  const systemInfo = uni.getSystemInfoSync();
+		  const compilePlatform = process.env.UNI_PLATFORM;
+		  //1:iOS,2:Android,3:Windows,4:OSX,5:WEB,6:小程序,7:linux,8:AndroidPad,9:IPad,10:Admin
+		  let platformType=5;
+		  // H5 环境
+		  if (compilePlatform === 'h5') platformType= 5;  
+		
+		  // 小程序环境
+		  if (compilePlatform.startsWith('mp-')) {
+			 const mpType = compilePlatform.split('-')[1]; // 如 weixin/alipay
+			 platformType=6;
+		  }
+		  // App 环境
+		  if (compilePlatform === 'app-plus') {
+			 if(systemInfo.platform.toLowerCase() === 'android'){
+				 platformType=2;
+			 }
+			 if(systemInfo.platform.toLowerCase() === 'ios'){
+				 platformType=1;
+			 }
+		  }
+		  console.log("----qxj platformType:"+platformType);
+		  uni.showToast({ title:" platformType:"+platformType,icon:'none', duration: 2000 });
+		  return platformType;
+	},
+  }
+};
+</script>
+
+
+<style lang="scss">
+	/*每个页面公共css */
+	// #ifdef VUE3
+	@import "@/uni_modules/uview-plus/index.scss";
+	// #endif
+	// #ifndef VUE3
+	@import "uview-ui/index.scss";
+	// #endif
+	view{
+		box-sizing: border-box;
+	}
+	.ellipsis{
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+	.ellipsis2{
+		overflow:hidden; 
+		text-overflow:ellipsis;
+		display:-webkit-box; 
+		-webkit-box-orient:vertical;
+		-webkit-line-clamp:2; 
+	}
+	.no-data-box{
+		box-sizing: border-box;
+		width: 100%;
+		padding: 200rpx 50rpx;
+		text-align: center;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		image{
+			width: 200upx;
+			height: 150upx;
+		}
+		.empty-title{
+			margin-top: 20rpx;
+			font-size: 28rpx;
+			color: #bbbbbb;
+			 
+		}
+	}
+	.doctor-box{
+		margin-top: 15rpx;
+		padding: 20rpx 0rpx 0rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: flex-start;
+		justify-content: flex-start;
+		.doctor{
+			width: 100%;
+			margin-bottom: 15rpx;
+			background: #f9f8fe;
+			padding: 15rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: flex-start;
+			justify-content: flex-start;
+			&:last-child{
+				margin-bottom: 0rpx;
+			}
+			.item{
+				width: 100%;
+				display: flex;
+				align-items: flex-start;
+				justify-content: flex-start;
+				.left{
+					.head-box{
+						width:92rpx;
+						height:92rpx;
+						position: relative;
+						.isline{
+							width:92rpx;
+							height:92rpx;
+							border-radius: 50%;
+							border: 2rpx solid #E69A22;
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							position: absolute;
+							bottom: 0rpx;
+							.img{
+								position: absolute;
+								bottom: 1rpx;
+								width:75rpx;
+								height:35rpx;
+								image{
+									width:75rpx;
+									height:35rpx;
+								}
+								.name{
+									width:75rpx;
+									height:35rpx;
+									bottom: -3rpx;
+									text-align: center;
+									position: absolute;
+									font-size: 16upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #ffffff;
+								}
+							}
+							
+							
+						}
+						.doc-img{
+							border-radius: 50%;
+							width:100%;
+							height:100%;
+						
+						}
+						
+					}
+				}
+				
+				.right{
+					width: calc(100% - 100rpx); 
+					margin-left: 20rpx;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					.doc-box{
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						.doc-name{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+							
+						}
+						.doc-position{
+							margin-left: 16rpx;
+							font-size: 26upx;
+							font-weight: bold;
+							font-family: PingFang SC;
+							color: #2A2B2E;
+						}
+						.doc-dept{
+							margin-left: 16rpx;
+							font-size: 26upx;
+							font-weight: bold;
+							font-family: PingFang SC;
+							color: #2A2B2E;
+						}
+					}
+					.hospital-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 10rpx;
+						.tag{
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							background-color: #4FC06B;
+							border-radius: 10rpx;
+							padding: 5rpx 10rpx;
+							font-size: 20upx;
+							font-weight: bold;
+							font-family: PingFang SC;
+							color: #ffffff;
+						}
+						.name{
+							margin-left: 6rpx;
+							font-size: 26upx;
+							font-weight: bold;
+							font-family: PingFang SC;
+							color: #2A2B2E;
+						}
+						
+					}
+					.doc-spec{
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 15rpx;
+						.spec{
+							font-size: 26upx;
+							font-family: PingFang SC;
+							color: #626468;
+						}
+					}
+					.doc-count{
+						margin-top: 15rpx;
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						.name{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							color: #9B9B9B;
+						}
+						.count{
+							margin: 0rpx 5rpx;
+							font-size: 24upx;
+							font-family: PingFang SC;
+							color: #2A2B2E;
+						}
+					}
+					.doc-price{
+						width: 100%;
+						margin-top: 15rpx;
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						.btn{
+							display: flex;
+							align-items: center;
+							justify-content: center;
+							background-color: #FEEFD7;
+							padding: 15rpx 30rpx;
+							border-radius: 30rpx;
+							font-size: 26upx;
+							font-family: PingFang SC;
+							color: #E69A22;
+						}
+					}
+					
+				}
+			}
+			
+		}
+	}
+	 
+</style>
+<style lang="less">
+/*每个页面公共css */
+@import './assets/iconfont/iconfont.css';
+@import './assets/css/common.less';
+/* 全局flex样式 */
+@import './common/css/flexCommon.css';
+</style>

+ 11 - 0
api/adv.js

@@ -0,0 +1,11 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getAdvList(data) {
+	 return request('/app/adv/getAdvList',data,'GET');
+ }
+  
+ 
+
+ 
+ 

+ 15 - 0
api/article.js

@@ -0,0 +1,15 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getArticleList(data) {
+ 	 return request('/app/article/getArticleList',data,'GET');
+ }
+ export function getArticleById(data) {
+ 	 return request('/app/article/getArticleById',data,'GET');
+ }
+ export function getArticleCateList(data) {
+ 	 return request('/app/article/getArticleCateList',data,'GET');
+ }
+  
+  
+  

+ 41 - 0
api/common.js

@@ -0,0 +1,41 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ export function getCitys(data) {
+	 return request('/app/common/getCitys',data,'GET');
+ }
+ export function getDicts(data) {
+	 return request('/app/common/getDicts',data,'GET');
+ }
+ export function uploadOSS(data) {
+ 	 return request('/app/common/uploadOSS',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getTlsSig(data) {
+ 	 return request('/app/common/getTlsSig',data,'GET');
+ }
+ 
+ export function getDictByKey(data) {
+ 	 return request('/app/common/getDictByKey',data,'GET');
+ }
+ 
+ export function getConfigByKey(data) {
+ 	 return request('/app/common/getConfigByKey',data,'GET');
+ }
+ 
+ export function getWeixinOrderTemps() {
+ 	 return request('/app/common/getWeixinOrderTemps',null,'GET');
+ }
+ 
+ 
+ export function sendSmsCode(data) {
+ 	return request('/app/common/sendSmsCode',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+
+ 
+ export function getHospitalList(data) {
+ 	 return request('/app/common/getHospitalList',data,'GET');
+ }
+ export function getDepartmentList(data) {
+ 	 return request('/app/common/getDepartmentList',data,'GET');
+ }

+ 34 - 0
api/companyUser.js

@@ -0,0 +1,34 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function login(data) {
+ 	 return request('/app/companyUser/login',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getUserInfo(data) {
+ 	 return request('/app/companyUser/getUserInfo',data,'GET','application/json;charset=UTF-8');
+ }
+ export function getQrImg(data) {
+ 	 return request('/app/companyUser/getQrImg',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+ export function getCompanyUserCard(data) {
+ 	 return request('/app/companyUser/getCompanyUserCard',data,'GET','application/json;charset=UTF-8');
+ }
+ export function bindCompanyUser(data) {
+ 	 return request('/app/companyUser/bindCompanyUser',data,'POST','application/json;charset=UTF-8');
+ }
+ // 获取绑定
+ export function getBindInfo(data) {
+ 	 return request('/app/companyUser/getBindInfo',data,'GET','application/json;charset=UTF-8');
+ }
+ // 绑定销售
+ export function bindCompanyFsUser(id) {
+ 	 return request('/app/companyCompanyFsUser/bind/'+id,null,'GET','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+  
+ 
+ 

+ 17 - 0
api/coupon.js

@@ -0,0 +1,17 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ export function getCouponList(data) {
+	 return request('/app/coupon/getCouponList',data,'GET');
+ }
+ export function getCouponById(data) {
+	 return request('/app/coupon/getCouponById',data,'GET');
+ }
+ export function genCode(data) {
+ 	 return request('/app/coupon/genCode',data,'GET');
+ }
+ 
+ 
+ export function receive(data) {
+ 	 return request('/app/coupon/receive',data,'POST','application/json;charset=UTF-8');
+ }
+  

+ 101 - 0
api/course.js

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

+ 17 - 0
api/courseAnswer.js

@@ -0,0 +1,17 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取真实链接
+export function getRealLink(data) {
+	return request('/app/course/getRealLink', data, 'GET');
+}
+
+// 
+export function getSopCourseStudyList(data) {
+	return request('/app/course/getSopCourseStudyList', data, 'GET');
+}
+
+//看课消息已读
+ export function updateSopAppLink(id) {
+ 	 return request('/app/course/updateSopAppLink/'+id,null,'GET');
+ }

+ 12 - 0
api/courseOrder.js

@@ -0,0 +1,12 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+  
+ export function payment(data) {
+  	return request('/app/courseOrder/weChatPayment',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getCourseOrderById(data) {
+ 	 return request('/app/courseOrder/getCourseOrderById',data,'GET');
+ }
+  

+ 9 - 0
api/department.js

@@ -0,0 +1,9 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getDepartmentList(data) {
+ 	 return request('/app/department/getDepartmentList',data,'GET');
+ }
+ 
+  
+  

+ 16 - 0
api/disease.js

@@ -0,0 +1,16 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getDiseaseList(data) {
+ 	 return request('/app/disease/getDiseaseList',data,'GET');
+ }
+ export function getDiseaseById(data) {
+ 	 return request('/app/disease/getDiseaseById',data,'GET');
+ }
+ 
+ 
+ 
+ 
+  
+  
+  

+ 24 - 0
api/doctor.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getMyDoctorList(data) {
+ 	 return request('/app/doctor/getMyDoctorList',data,'GET');
+ }
+ export function getDoctorDetails(data) {
+ 	 return request('/app/doctor/getDoctorDetails',data,'GET');
+ }
+ export function getDoctorPingList(data) {
+ 	 return request('/app/doctor/getDoctorPingList',data,'GET');
+ }
+ export function getDoctorList(data) {
+ 	 return request('/app/doctor/getDoctorList',data,'GET');
+ }
+ export function checkFollow(data) {
+	return request('/app/doctor/checkFollow',data,'GET');
+ }
+  
+ export function doFollow(data) {
+  	return request('/app/doctor/doFollow',data,'POST','application/json;charset=UTF-8');
+ }
+  
+  

+ 13 - 0
api/doctorArticle.js

@@ -0,0 +1,13 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ export function getDoctorArticleCateList(data) {
+ 	 return request('/app/doctorArticle/getDoctorArticleCateList',data,'GET');
+ }
+ export function getDoctorArticleList(data) {
+ 	 return request('/app/doctorArticle/getDoctorArticleList',data,'GET');
+ }
+ export function getDoctorArticleById(data) {
+ 	 return request('/app/doctorArticle/getDoctorArticleById',data,'GET');
+ }
+  
+   

+ 22 - 0
api/drugReport.js

@@ -0,0 +1,22 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getUserFollowDoctor() {
+ 	 return request('/app/drugReport/getUserFollowDoctor',null,'GET');
+ }
+ export function getDrugReportList(data) {
+ 	 return request('/app/drugReport/getDrugReportList',data,'GET');
+ }
+ export function getDrugReportById(data) {
+ 	 return request('/app/drugReport/getDrugReportById',data,'GET');
+ }
+ export function pingReport(data) {
+ 	 return request('/app/drugReport/pingReport',data,'POST','application/json;charset=UTF-8');
+ }
+ export function startDrugReport(data) {
+ 	 return request('/app/drugReport/startDrugReport',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+  
+  
+  

+ 14 - 0
api/follow.js

@@ -0,0 +1,14 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getFollowList(data) {
+ 	 return request('/app/follow/getFollowList',data,'GET');
+ }
+ export function getFollowById(data) {
+ 	 return request('/app/follow/getFollowById',data,'GET');
+ }
+ export function doFollow(data) {
+ 	 return request('/app/follow/doFollow',data,'POST','application/json;charset=UTF-8');
+ }
+  
+  

+ 54 - 0
api/healthRecords.js

@@ -0,0 +1,54 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+// 获取我的健康档案
+export function myRecord() {
+	return request('/app/healthRecord/myRecord', null, 'GET');
+}
+
+// 查询今日健康生活
+export function HealthLife(data) {
+	return request('/app/healthRecord/HealthLife', data, 'GET');
+}
+
+ 
+
+// 查询健康史模板列表
+export function healthHistoryTempList() {
+	return request('/app/healthRecord/healthHistoryTempList', null, 'GET');
+}
+
+// 健康数据列表
+export function HealthDataList(data) {
+	return request('/app/healthRecord/HealthDataList', data, 'GET');
+}
+
+// 健康数据详细
+export function HealthData(id) {
+	return request('/app/healthRecord/HealthData/' + id, null, 'GET');
+}
+
+// 获取健康生活详细信息
+export function getHealthLife(id) {
+	return request('/app/healthRecord/getHealthLife/' + id, null, 'GET');
+}
+
+// 获取健康生活详细信息
+export function editRecord(data) {
+	return request('/app/healthRecord/editRecord', data, 'PUT','application/json;charset=UTF-8');
+}
+
+// 新增健康档案
+export function addRecord(data) {
+	return request('/app/healthRecord/addRecord', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 新增健康生活
+export function addFsHealthLife(data) {
+	return request('/app/healthRecord/addFsHealthLife', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 新增健康数据
+export function addFsHealthData(data) {
+	return request('/app/healthRecord/addFsHealthData', data, 'POST', 'application/json;charset=UTF-8');
+}

+ 21 - 0
api/healthTongue.js

@@ -0,0 +1,21 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+export function getHealthTongueList(data) {
+	return request('/app/healthTongue/getHealthTongueList', data, 'GET');
+}
+
+export function getCount(data) {
+	return request('/app/healthTongue/getCount', data, 'GET');
+}
+
+ 
+ export function getHealthTongueById(id) {
+ 	return request('/app/healthTongue/getHealthTongueById/'+id, null, 'GET');
+ }
+ 
+ 
+
+export function add(data) {
+	return request('/app/healthTongue/add', data, 'POST', 'application/json;charset=UTF-8');
+}

+ 14 - 0
api/hospital.js

@@ -0,0 +1,14 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getHospitalList(data) {
+ 	 return request('/app/hospital/getHospitalList',data,'GET');
+ }
+ export function getHospitalById(data) {
+ 	 return request('/app/hospital/getHospitalById',data,'GET');
+ }
+ 
+ 
+  
+  
+  

+ 39 - 0
api/index.js

@@ -0,0 +1,39 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ export function getFamousPrescribeList(data) {
+	 return request('/app/index/getFamousPrescribeList',data,'GET');
+ }
+ export function getFamousPrescribeById(data) {
+	 return request('/app/index/getFamousPrescribeById',data,'GET');
+ }
+ export function getQuestionsList(data) {
+ 	 return request('/app/index/getQuestionsList',data,'GET');
+ }
+ export function getQuestionsById(data) {
+ 	 return request('/app/index/getQuestionsById',data,'GET');
+ }
+ export function getMedicatedFoodList(data) {
+ 	 return request('/app/index/getMedicatedFoodList',data,'GET');
+ }
+ export function getMedicatedFoodById(data) {
+ 	 return request('/app/index/getMedicatedFoodById',data,'GET');
+ }
+ export function getVesselList(data) {
+ 	 return request('/app/index/getVesselList',data,'GET');
+ }
+ export function getVesselById(data) {
+ 	 return request('/app/index/getVesselById',data,'GET');
+ }
+ export function getChineseMedicineList(data) {
+ 	 return request('/app/index/getChineseMedicineList',data,'GET');
+ }
+ export function getChineseMedicineById(data) {
+ 	 return request('/app/index/getChineseMedicineById',data,'GET');
+ }
+ 
+ 
+ 
+ 
+ 
+  
+  

+ 67 - 0
api/inquiryOrder.js

@@ -0,0 +1,67 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function confirm(data) {
+  	return request('/app/inquiryOrder/confirm',data,'POST','application/json;charset=UTF-8');
+ }
+ export function create(data) {
+  	return request('/app/inquiryOrder/create',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function pay(data) {
+  	return request('/app/inquiryOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function compute(data) {
+  	return request('/app/inquiryOrder/compute',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function payment(data) {
+  	return request('/app/inquiryOrder/payment',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function cancel(data) {
+  	return request('/app/inquiryOrder/cancel',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyInquiryOrderList(data) {
+ 	 return request('/app/inquiryOrder/getMyInquiryOrderList',data,'GET');
+ 
+ }
+ export function getMyInquiryOrderById(data) {
+ 	 return request('/app/inquiryOrder/getMyInquiryOrderById',data,'GET');
+ }
+ export function getMyInquiryOrderPingList(data) {
+ 	 return request('/app/inquiryOrder/getMyInquiryOrderPingList',data,'GET');
+ }
+ export function getInquiryOrderById(data) {
+ 	 return request('/app/inquiryOrder/getInquiryOrderById',data,'GET');
+ }
+ export function getCompanyUserInquiryOrderById(data) {
+ 	 return request('/app/inquiryOrder/getCompanyUserInquiryOrderById',data,'GET');
+ }
+ 
+ 
+ export function pingOrder(data) {
+  	return request('/app/inquiryOrder/pingOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getInquiryTemp(data) {
+ 	 return request('/app/inquiryOrder/getInquiryTemp',data,'GET');
+ }
+ export function getInquiryOrderReport(data) {
+ 	 return request('/app/inquiryOrder/getInquiryOrderReport',data,'GET');
+ }
+ export function getCurrentImInquiryOrderId(data) {
+ 	 return request('/app/inquiryOrder/getCurrentImInquiryOrderId',data,'GET');
+ }
+ 
+ export function getCompanyUserInquiryOrderList(data) {
+ 	 return request('/app/inquiryOrder/getCompanyUserInquiryOrderList',data,'GET');
+ 
+ }
+ 
+ 
+ 
+ 
+  

+ 42 - 0
api/integral.js

@@ -0,0 +1,42 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getIntegralGoodsList(data) {
+ 	 return request('/app/integral/getIntegralGoodsList',data,'GET');
+ }
+ export function getIntegralGoodsById(data) {
+ 	 return request('/app/integral/getIntegralGoodsById',data,'GET');
+ }
+ export function getUserIntegralLogsList(data) {
+ 	 return request('/app/integral/getUserIntegralLogsList',data,'GET');
+ }
+ export function getIntegralOrderList(data) {
+ 	 return request('/app/integral/getIntegralOrderList',data,'GET');
+ }
+ export function getIntegralOrderById(data) {
+ 	 return request('/app/integral/getIntegralOrderById',data,'GET');
+ }
+ 
+ export function createOrder(data) {
+  	return request('/app/integral/createOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getUserSign() {
+ 	 return request('/app/integral/getUserSign',null,'GET');
+ }
+ 
+ export function doSign(data) {
+ 	 return request('/app/integral/sign',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+  
+  
+ 
+ 
+ 
+ 
+ 
+  
+  
+  

+ 23 - 0
api/package.js

@@ -0,0 +1,23 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+ 
+ export function getPackagCateList(data) {
+ 	 return request('/app/package/getPackagCateList',data,'GET');
+ }
+ export function getPackageList(data) {
+ 	 return request('/app/package/getPackageList',data,'GET');
+ }
+ export function getPackageById(data) {
+ 	 return request('/app/package/getPackageById',data,'GET');
+ }
+ export function getPackageDoctorList(data) {
+ 	 return request('/app/package/getPackageDoctorList',data,'GET');
+ }
+ export function getNewOrderByPackageId(data) {
+ 	 return request('/app/packageOrder/getNewOrderByPackageId',data,'GET');
+ }
+ export function getIcdNameByPackageId(data) {
+ 	 return request('/app/package/getIcdNameByPackageId',data,'GET');
+ }

+ 49 - 0
api/packageOrder.js

@@ -0,0 +1,49 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+ export function create(data) {
+  	return request('/app/packageOrder/create',data,'POST','application/json;charset=UTF-8');
+ }
+ export function compute(data) {
+  	return request('/app/packageOrder/compute',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pay(data) {
+  	return request('/app/packageOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ export function payment(data) {
+  	return request('/app/packageOrder/payment',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getPackageOrderById(data) {
+ 	 return request('/app/packageOrder/getPackageOrderById',data,'GET');
+ }
+ export function getMyPackageOrderList(data) {
+ 	 return request('/app/packageOrder/getMyPackageOrderList',data,'GET');
+ }
+ export function getCompanyUserPackageOrderList(data) {
+ 	 return request('/app/packageOrder/getCompanyUserPackageOrderList',data,'GET');
+ }
+ export function getSharePackageOrderById(data) {
+ 	 return request('/app/packageOrder/getSharePackageOrderById',data,'GET');
+ }
+ export function getCompanyUserPackageOrderById(data) {
+ 	 return request('/app/packageOrder/getCompanyUserPackageOrderById',data,'GET');
+ }
+ 
+ export function cancelOrder(data) {
+  	return request('/app/packageOrder/cancel',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function getOrderCount(data) {
+ 	 return request('/app/packageOrder/getOrderCount',data,'GET');
+ }
+ 
+ // 领取礼品(创建订单)
+ export function giftCreate(data) {
+  	return request('/app/pop',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getAgreement() {
+  	return request('/app/doctor/getAgreement',null,'GET');
+ }

+ 39 - 0
api/patient.js

@@ -0,0 +1,39 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ export function getPatientList() {
+ 	 return request('/app/patient/getPatientList',null,'GET');
+ }
+ export function getPatientById(data) {
+ 	 return request('/app/patient/getPatientById',data,'GET');
+ }
+ export function delPatient(data) {
+ 	return request('/app/patient/delPatient',data,'POST','application/json;charset=UTF-8');
+ }
+ export function addPatient(data) {
+ 	return request('/app/patient/addPatient',data,'POST','application/json;charset=UTF-8');
+ }
+ export function editPatient(data) {
+ 	return request('/app/patient/editPatient',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+  
+  
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 

+ 38 - 0
api/prescribe.js

@@ -0,0 +1,38 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+
+export function getPrescribeList(data) {
+ 	return request('/app/prescribe/getPrescribeList',data,'GET');
+}
+export function getPrescribeById(data) {
+ 	return request('/app/prescribe/getPrescribeById',data,'GET');
+}
+ 
+
+
+
+
+
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+  
+  
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 

+ 25 - 0
api/store.js

@@ -0,0 +1,25 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+export function getStoreList(data) {
+	return request('/app/store/getStoreList', data, 'GET');
+}
+// 开票
+export function bill(data) {
+	return request('/app/storeOrder/bill', data, 'POST', 'application/json;charset=UTF-8');
+}
+
+// 开票详情
+export function billInfo(data) {
+	return request('/app/storeOrder/billInfo', data, 'GET');
+}
+
+// 开票历史
+export function billList(data) {
+	return request('/app/storeOrder/billList', data, 'GET');
+}
+
+// 开票冲红
+export function billBack(data) {
+	return request('/app/storeOrder/billBack', data, 'GET');
+}

+ 29 - 0
api/storeAfterSales.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getStoreOrderItems(data) {
+ 	 return request('/app/storeAfterSales/getStoreOrderItems',data,'GET');
+ } 
+ export function applyAfterSales(data) {
+ 	 return request('/app/storeAfterSales/applyAfterSales',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getStoreAfterSalesList(data) {
+ 	 return request('/app/storeAfterSales/getStoreAfterSalesList',data,'GET');
+ } 
+ 
+ export function getStoreAfterSalesById(data) {
+ 	 return request('/app/storeAfterSales/getStoreAfterSalesById',data,'GET');
+ } 
+ export function revoke(data) {
+ 	 return request('/app/storeAfterSales/revoke',data,'POST','application/json;charset=UTF-8');
+ }
+ export function addDelivery(data) {
+ 	 return request('/app/storeAfterSales/addDelivery',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+ 
+ 

+ 55 - 0
api/storeOrder.js

@@ -0,0 +1,55 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getMyStoreOrderList(data) {
+ 	 return request('/app/storeOrder/getMyStoreOrderList',data,'GET');
+ } 
+ 
+ export function getCompanyUserStoreOrderList(data) {
+ 	 return request('/app/storeOrder/getCompanyUserStoreOrderList',data,'GET');
+ }
+ 
+ 
+ export function getMyStoreOrderById(data) {
+ 	 return request('/app/storeOrder/getMyStoreOrderById',data,'GET');
+ } 
+ 
+ export function getStoreOrderById(data) {
+ 	 return request('/app/storeOrder/getStoreOrderById',data,'GET');
+ } 
+ 
+ export function getCompanyUserStoreOrderById(data) {
+ 	 return request('/app/storeOrder/getCompanyUserStoreOrderById',data,'GET');
+ } 
+ 
+ 
+  
+ export function pay(data) {
+ 	 return request('/app/storeOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ export function payment(data) {
+  	return request('/app/storeOrder/payment',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function compute(data) {
+ 	 return request('/app/storeOrder/compute',data,'POST','application/json;charset=UTF-8');
+ }
+ export function cancelOrder(data) {
+ 	 return request('/app/storeOrder/cancelOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function finishOrder(data) {
+ 	 return request('/app/storeOrder/finishOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getExpress(data) {
+ 	 return request('/app/storeOrder/getExpress',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getOrderCount() {
+ 	 return request('/app/storeOrder/getOrderCount',null,'GET');
+ } 
+ export function getChildrenExpress(data) {
+ 	 return request('/app/storeOrder/getChildrenExpress',data,'POST','application/json;charset=UTF-8');
+ }
+ export function splitOrder2ERP(data) {
+ 	 return request('/app/storeOrder/splitOrder2ERP',data,'POST','application/json;charset=UTF-8');
+ }

+ 24 - 0
api/test.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getTestList(data) {
+ 	 return request('/app/test/getTestList',data,'GET');
+ }
+ export function getTestDetails(data) {
+ 	 return request('/app/test/getTestDetails',data,'GET');
+ }
+ 
+ export function getTestTempDetails(data) {
+ 	 return request('/app/test/getTestTempDetails',data,'GET');
+ }
+ export function getTestReport(data) {
+ 	 return request('/app/test/getTestReport',data,'GET');
+ }
+ export function getTestReportImg(data) {
+ 	 return request('/app/test/getTestReportImg',data,'GET');
+ }
+ export function doReport(data) {
+  	return request('/app/test/doReport',data,'POST','application/json;charset=UTF-8');
+ }
+  
+  

+ 53 - 0
api/user.js

@@ -0,0 +1,53 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+
+ export function wxLogin(data) {
+ 	 return request('/app/wx/login',data,'POST','application/json;charset=UTF-8');
+ }
+ export function loginByMiniApp(data) {
+ 	 return request('/app/wx/loginByMiniApp',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function getUserInfo() {
+ 	 return request('/app/user/getUserInfo',null,'GET');
+ }
+ 
+ 
+ 
+ export function checkLogin() {
+ 	 return request('/app/user/checkLogin',null,'GET');
+ }
+ 
+ export function editUser(data) {
+ 	return request('/app/user/editUser',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function registerDoctor(data) {
+ 	return request('/app/user/registerDoctor',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function getMyCouponList(data) {
+ 	 return request('/app/user/getMyCouponList',data,'GET');
+ }
+ 
+ export function getMyEnableCouponList(data) {
+ 	 return request('/app/user/getMyEnableCouponList',data,'GET');
+ }
+ 
+ 
+  // 健康管家二维码
+  export function getAppContactWay(userId) {
+  	 return request('/app/user/getAppContactWay/'+userId,null,'GET');
+  }
+ // 投诉模板
+ export function templateList() {
+ 	 return request('/app/complaint/treeList',null,'GET');
+ } 
+ // 投诉
+ export function complaint(data) {
+ 	return request('/app/complaint',data,'POST','application/json;charset=UTF-8');
+ }
+ 

+ 49 - 0
api/userAddress.js

@@ -0,0 +1,49 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+
+ export function getAddressByDefault() {
+ 	 return request('/app/userAddress/getAddressByDefault',null,'GET');
+ }
+ export function getAddressList() {
+ 	 return request('/app/userAddress/getAddressList',null,'GET');
+ }
+ export function getAddressById(data) {
+ 	 return request('/app/userAddress/getAddressById',data,'GET');
+ }
+ export function delAddress(data) {
+ 	return request('/app/userAddress/delAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ export function addAddress(data) {
+ 	return request('/app/userAddress/addAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ export function editAddress(data) {
+ 	return request('/app/userAddress/editAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ export function parseAddress(data) {
+ 	return request('/app/userAddress/parseAddress',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+  
+  
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 

+ 12 - 0
api/userVipOrder.js

@@ -0,0 +1,12 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+  
+ export function payment(data) {
+  	return request('/app/userVip/weChatPayment',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getVipOrderById(data) {
+ 	 return request('/app/userVip/getVipOrderById',data,'GET');
+ }
+  

+ 157 - 0
assets/css/common.less

@@ -0,0 +1,157 @@
+  
+ page {
+   background: #f5f5f5;
+   height: 100%;
+ }
+ .container{
+   height: 100%;
+ } 
+  
+  /*单行文本溢出省略号*/
+  .one-t {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    transition: all linear 0.2s;
+  }
+  
+  /*多行文本溢出省略号*/
+  .more-t {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+    transition: all linear 0.2s;
+  }
+  
+  /* ==================
+            flex布局(colorui里面也有相关基础样式)
+   ==================== */
+  /* x水平排列*/
+  .x-f {
+    display: flex;
+    align-items: center;
+  }
+  
+  /*x两端且水平居中*/
+  .x-bc {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  
+  /*x平分且水平居中*/
+  .x-ac {
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+  }
+  
+  /*x水平靠上对齐*/
+  .x-start {
+    display: flex;
+    align-items: flex-start;
+  }
+  
+  /*x水平靠下对齐*/
+  .x-end {
+    display: flex;
+    align-items: flex-end;
+  }
+  
+  /*上下左右居中*/
+  .x-c {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+  
+  /*y竖直靠左*/
+  .y-start {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+  
+  /*y竖直靠右*/
+  .y-end {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-end;
+  }
+  
+  /*y竖直居中*/
+  .y-f {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+  }
+  
+  // y竖直两端
+  .y-b {
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+  }
+  
+  /*y竖直两端居中*/
+  .y-bc {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: space-between;
+  }
+ /* layout */
+ .acea-row {
+   display: flex;
+   flex-wrap: wrap;
+   /* 辅助类 */
+ }
+ .acea-row.row-middle {
+   align-items: center;
+ }
+ .acea-row.row-top {
+   align-items: flex-start;
+ }
+ .acea-row.row-bottom {
+   align-items: flex-end;
+ }
+ .acea-row.row-center {
+   justify-content: center;
+ }
+ .acea-row.row-right {
+   justify-content: flex-end;
+ }
+ .acea-row.row-left {
+   justify-content: flex-start;
+ }
+ .acea-row.row-between {
+   justify-content: space-between;
+ }
+ .acea-row.row-around {
+   justify-content: space-around;
+ }
+ .acea-row.row-column-around {
+   flex-direction: column;
+   justify-content: space-around;
+ }
+ .acea-row.row-column {
+   flex-direction: column;
+ }
+ .acea-row.row-column-between {
+   flex-direction: column;
+   justify-content: space-between;
+ }
+ /* 上下左右垂直居中 */
+ .acea-row.row-center-wrapper {
+   align-items: center;
+   justify-content: center;
+ }
+ /* 上下两边居中对齐 */
+ .acea-row.row-between-wrapper {
+   align-items: center;
+   justify-content: space-between;
+ }
+  
+

+ 355 - 0
assets/css/common.scss

@@ -0,0 +1,355 @@
+@mixin colBox($isBtw) {
+  display: flex;
+  flex-direction: column;
+  @if $isBtw {
+    justify-content: space-between;
+  }
+}
+
+@mixin centerBox {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+@mixin vCenterBox {
+  display: flex;
+  align-items: center;
+}
+
+@mixin btwBox {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+@mixin nomalEllipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  white-space: nowrap;
+}
+
+@mixin ellipsisWithLine($line) {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: $line;
+  overflow: hidden;
+  word-break: break-all;
+}
+// 字体
+@for $i from 20 through 100{
+    .fs#{$i} {
+			font-size: #{$i}rpx;
+    }
+}
+// 颜色
+@for $i from 0 through 9{
+    .color#{$i} {
+			color: #{$i}#{$i}#{$i};
+    }
+}
+// padding
+@for $i from 1 through 100{
+    .p#{$i} {
+			padding: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .ptb#{$i} {
+			padding-top: #{$i}rpx ;
+			padding-bottom: #{$i}rpx ;
+    }
+}
+@for $i from 1 through 100{
+    .plr#{$i} {
+			padding-left: #{$i}rpx;
+			padding-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 200{
+    .pt#{$i} {
+			padding-top: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .pl#{$i} {
+			padding-left: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .pr#{$i} {
+			padding-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 200{
+    .pb#{$i} {
+			padding-bottom: #{$i}rpx;
+    }
+}
+// margin
+@for $i from 1 through 100{
+    .m#{$i} {
+			margin: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mtb#{$i} {
+			margin-top: #{$i}rpx ;
+			margin-bottom: #{$i}rpx ;
+    }
+}
+@for $i from 1 through 100{
+    .mlr#{$i} {
+			margin-left: #{$i}rpx;
+			margin-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mt#{$i} {
+			margin-top: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .ml#{$i} {
+			margin-left: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mr#{$i} {
+			margin-right: #{$i}rpx;
+    }
+}
+@for $i from 1 through 100{
+    .mb#{$i} {
+			margin-bottom: #{$i}rpx;
+    }
+}
+// 圆角
+@for $i from 0 through 100{
+    .radius#{$i} {
+			border-radius: #{$i}rpx;
+    }
+}
+// padding 左右+width自动计算
+@for $i from 10 through 60{
+    .w-calc-#{$i} {
+			width: calc(100% - #{$i*2}rpx);
+			padding-left:  #{$i}rpx;
+			padding-right:  #{$i}rpx;
+    }
+}
+
+// gap
+@for $i from 1 through 100{
+	.gap#{$i} {
+		gap: #{$i}rpx;
+	}
+}
+
+// 高
+@for $i from 1 through 900{
+	.h#{$i} {
+		height: #{$i}rpx;
+	}
+}
+// 宽
+@for $i from 1 through 900{
+	.w#{$i} {
+		width: #{$i}rpx;
+	}
+}
+// 宽
+@for $i from 1 through 900{
+	.lh#{$i} {
+		line-height: #{$i}rpx;
+	}
+}
+
+
+// font-weight
+$steps: 100 200 300 400 500 600 700 800 bold;
+@each $i in $steps {
+	.weight-#{$i} {
+		font-weight: $i;
+	}
+}
+
+.bold {
+	font-weight: bold;
+}
+.scrollx {
+	overflow-x: scroll;
+}
+
+.scrolly {
+	overflow-y: scroll;
+}
+.color9{
+	color: #999;
+}
+.color6{
+	color: #666;
+}
+.bgf{
+	background-color: #fff;
+}
+.base-color{
+	color: #018C39;
+}
+.colorf {
+			color: #fff;
+		}
+	
+		.bgf {
+			background: #fff;
+		}
+	
+		.fixed {
+			position: fixed;
+		}
+	
+		.absolute {
+			position: absolute;
+		}
+	
+		.relative {
+			position: relative;
+		}
+	
+		.w100 {
+			width: 100%;
+		}
+	
+		.h100 {
+			height: 100%;
+		}
+	
+		.card {
+			background: #fff;
+			border-radius: 15rpx;
+		}
+	
+		.cover-height {
+			height: 100%;
+			display: flex;
+			flex-direction: column;
+			box-sizing: border-box;
+		}
+	
+		.row {
+			display: flex;
+			flex-direction: row;
+		}
+	
+		.column {
+			display: flex;
+			flex-direction: column;
+		}
+	
+		.justify-start {
+			display: flex;
+			justify-content: flex-start;
+		}
+	
+		.justify-center {
+			display: flex;
+			justify-content: center;
+		}
+	
+		.justify-end {
+			display: flex;
+			justify-content: flex-end;
+		}
+	
+		.justify-around {
+			display: flex;
+			justify-content: space-around;
+		}
+		.justify-evenly {
+			display: flex;
+			justify-content: space-evenly;
+		}
+	
+		.justify-between {
+			display: flex;
+			justify-content: space-between;
+		}
+	
+		.align-start {
+			display: flex;
+			align-items: flex-start;
+		}
+	
+		.align-center {
+			display: flex;
+			align-items: center;
+		}
+	
+		.align-end {
+			display: flex;
+			align-items: flex-end;
+		}
+	
+		.center {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+		}
+	
+		.centerV {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			flex-direction: column;
+		}
+	
+		.wrap {
+			flex-wrap: wrap;
+		}
+	
+		.flex-1 {
+			flex: 1;
+		}
+	
+		.ellipsis {
+			overflow: hidden;
+			text-overflow: ellipsis;
+			display: -webkit-box;
+			-webkit-box-orient: vertical;
+			box-sizing: border-box;
+			width: 100%;
+			-webkit-line-clamp: 1;
+		}
+	
+		.lines-2 {
+			-webkit-line-clamp: 2 !important;
+		}
+	
+		.lines-3 {
+			-webkit-line-clamp: 3 !important;
+		}
+	
+		.bold {
+			font-weight: bold;
+		}
+	
+		.line-through {
+			text-decoration: line-through;
+		}
+	
+		.nowrap {
+			white-space: nowrap;
+		}
+	
+		.scrollx {
+			overflow-x: scroll;
+		}
+	
+		.scrolly {
+			overflow-y: scroll;
+		}
+	
+		.cvauto {
+			content-visibility: auto;
+		}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 0
assets/iconfont/iconfont.css


+ 9 - 0
common/config.js

@@ -0,0 +1,9 @@
+/**
+ * 本项目只有这里修改相应配置信息
+ */
+
+const config={};
+export default{
+	config:config,
+ 
+}

+ 32 - 0
common/css/flexCommon.css

@@ -0,0 +1,32 @@
+/* flex布局 */
+.u-f,
+.u-f-ac,
+.u-f-ajc {
+	display: flex;
+}
+
+.u-f-ac,
+.u-f-ajc {
+	align-items: center;
+}
+
+.u-f-ajc {
+	justify-content: center;
+}
+
+.u-f-jsb {
+	justify-content: space-between;
+}
+
+.u-f-fc {
+	flex-direction: column;
+}
+.u-f-ww{
+	flex-wrap: wrap;
+}
+/* @mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	} */

+ 89 - 0
common/request.js

@@ -0,0 +1,89 @@
+// uni-app请求封装
+export default class Request {
+	http(router, data = {}, method,contentType,url) {
+		let that = this;
+		// let path = 'http://127.0.0.1:8113';
+		var path=uni.getStorageSync('requestPath')
+		// var path = 'https://userapp.his.cdwjyyh.com';
+		// var path = 'https://app.rtys.cdwjyyh.com';
+		// var path = "http://cde2e8d4.natappfree.cc"
+		let token="";
+		let type = 0
+		if(url!=null){
+			let type = 1
+			path= url;
+			token= uni.getStorageSync('AppTokenmini_RTCourse')
+		}
+		else{
+			let type = 0
+			// path= 'https://app.rtys.cdwjyyh.com';
+			uni.setStorageSync('requestPath',path)
+			token= uni.getStorageSync('AppToken');
+		}
+		// uni.showLoading({
+		// 	title: '加载中'
+		// });
+		// var path = 'https://test.userapp.his.cdwjyyh.com';
+		return new Promise((resolve, reject) => {
+			// let token = uni.getStorageSync('AppToken');
+			let CompanyUserToken = uni.getStorageSync('CompanyUserToken');
+			var httpContentType='application/x-www-form-urlencoded';
+			if(contentType!=undefined){
+				//application/json;charset=UTF-8
+				httpContentType=contentType;
+			}
+			var routers=router;
+			// 请求
+			uni.request({
+				header: {
+					// 'Content-Type': 'application/x-www-form-urlencoded',
+					'Content-Type': httpContentType,
+					'AppToken': token,
+					'CompanyUserToken':CompanyUserToken
+				},
+				url: `${path}${router}`,
+				data: data,
+				method: method,
+				success: (res) => {
+					//收到开发者服务器成功返回的回调函数
+					if(res.data.code==401){//没有权限直接退出到登录界面
+						let pages = getCurrentPages();
+						let url = pages[ pages.length - 1]; //当前页页面实例
+						console.log(url)
+						//如果登录界面已打开,自动关闭
+						if(url!=undefined&&url.route=="pages/auth/login"){
+							resolve(res.data)
+							return;
+						}
+						uni.navigateTo({
+							url:'/pages/auth/login',
+							success: () => {
+								
+							},
+							fail: () => {
+							}
+						})
+						return;
+					}
+					if (res.data.token&&type==0) {
+						uni.setStorageSync('AppToken',res.data.token)
+					}
+					resolve(res.data)
+				},
+				fail:(res) =>{
+					//接口调用失败的回调函数
+				},
+				complete:(res) =>{
+					//接口调用结束的回调函数(调用成功、失败都会执行)
+					if (res.data.code == 401) {
+						return false
+					}
+					//uni.hideLoading();
+				}
+				
+			})
+		})
+		 
+	}
+	
+}

+ 169 - 0
components/CustomCamera/WeChat/Layout.vue

@@ -0,0 +1,169 @@
+<!-- 公共布局组件 -->
+<template>
+	<view class="custom-camera">
+		<view class="camera-wrap" :style="{height:cameraHeight+'px'}">
+			<slot></slot>
+		</view>
+		<view class="camera-footer" id="camera-footer">
+			<view class="usenum" :style="{visibility: isLogin? 'visible':'hidden'}">当前可免费试用<text style="color: #F54D04;margin: 0 6rpx;">{{counts || 0}}</text>次</view>
+			<view class="camera-options">
+				<view class="camera-options-left camera-item">
+					<image :src="baseUrl+'/images/album_icon.png'" mode="scaleToFill" style="width: 65rpx;height:60rpx;" @click="handleClikFn('album')"></image>
+					<text>相册上传</text>
+				</view>
+				<view class="camera-options-center camera-item" @click="takePhoto()">
+					<view class="photograph-btn"></view>
+				</view>
+				<view class="camera-options-ritht camera-item"  @click="switchCamera()">
+					<image :src="baseUrl+'/images/tongue_info.png'" mode="scaleToFill" style="width: 67rpx;height:60rpx;" @click="handleClikFn('reportlist')"></image>
+					<text>切换摄像头</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getCount} from '@/api/healthTongue.js'
+	// 提供一个相机的插槽位置
+	// 底部可以自定义最右侧按钮(相册/反转)
+	export default {
+		data() {
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				cameraHeight: '', //相机画面宽度
+				optionsHeight: '', //操作区域
+				counts: 0,
+				url:null,
+				isLogin: false
+			}
+		},
+		methods: {
+			initShow() {
+				this.$isLogin().then(
+					res => {
+						if(res){
+							this.isLogin = true
+							this.getCount()
+						} else{
+							this.isLogin = false
+						}
+					}
+				);
+			},
+			switchCamera(){
+				if(!this.isLogin){
+					uni.navigateTo({
+						url:'/pages/auth/login'
+					})
+					return
+				}
+				this.$emit('switchCamera')
+			},
+			getCount(){
+				getCount().then(
+					res => {
+						if(res.code==200){
+							this.counts=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			takePhoto() {
+				if(!this.isLogin){
+					uni.navigateTo({
+						url:'/pages/auth/login'
+					})
+					return
+				}
+				let that= this
+				const ctx = wx.createCameraContext()
+				console.log("ctx", ctx);
+				ctx.takePhoto({
+				  quality: 'high',
+				  success: (res) => {
+					  uni.setStorageSync("tongueUrl",res.tempImagePath)
+					  console.log("res", res.tempImagePath);
+					  this.$emit('takePhoto')
+				  }
+				})
+			},
+			handleClikFn(instruct) {
+				if(this.isLogin){
+					this.$emit('instruct', instruct)
+				} else{
+					uni.navigateTo({
+						url:'/pages/auth/login'
+					})
+				}
+			}
+		},
+		mounted() {
+			const query = uni.createSelectorQuery().in(this);
+			query
+			  .select("#camera-footer")
+			  .boundingClientRect((data) => {
+				this.cameraHeight = uni.getSystemInfoSync().screenHeight - data.height
+			  })
+			  .exec();
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.custom-camera {
+		height: 100vh;
+		background-color: #000;
+		
+		.usenum {
+			font-family: SourceHanSansCN;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			padding: 14rpx;
+			text-align: center;
+		}
+		.camera-options {
+			width: 100%;
+			padding-top: 13rpx;
+			padding-bottom: 60rpx;
+			box-sizing: border-box;
+			font-family: SourceHanSansCN;
+			font-weight: 400;
+			font-size: 27rpx;
+			color: #FFFFFF;
+			display: flex;
+			align-items: center;
+			justify-content: space-evenly;
+			.camera-item {
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				image {
+					margin-bottom: 21rpx;
+				}
+			}
+			.camera-options-center {
+				width: 131rpx;
+				height: 131rpx;
+				border-radius: 50%;
+				border: 3px solid #FFFFFF;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.photograph-btn {
+				width: 109rpx;
+				height: 109rpx;
+				background: #F54D04;
+				border-radius: 50%;
+			}
+		}
+	}
+</style>

+ 215 - 0
components/CustomCamera/WeChat/index.vue

@@ -0,0 +1,215 @@
+<template>
+	<Layout ref="Layout" @instruct="handleInstruct" @switchCamera="switchCamera()" @takePhoto="takePhoto" >
+		<camera class="camera"  mode="normal" :device-position="device" @error="error"
+			style="width: 100%; height: 100%;">
+			<cover-view class="cover-view">
+				<cover-view class="uni-nav-bar">
+					<cover-view :style="{height: statusBarHeight,width: '100%'}"></cover-view>
+					<cover-view class="uni-nav-barbox"  :style="{width: menuLeft}">
+						<cover-view class="uni-nav-back" @click="back">返回
+							<!-- <uni-icons color="#fff" type="left" size="20" /> -->
+						</cover-view>
+						<cover-view class="uni-nav-title" @click="navTo()">
+							<cover-view>使用教程</cover-view>
+							<cover-image class="ques" :src="baseUrl+'/images/ques.png'" mode="aspectFill"></cover-image>
+						</cover-view>
+					</cover-view>
+				</cover-view>
+				<cover-view class="title">请拍摄舌面</cover-view>
+				<cover-view class="tips">舌尖放松,舌面平展,舌尖略向下,口张大不要太用力</cover-view>
+				<cover-view class="imagebox">
+					<cover-image class="tongue" :src="baseUrl+'/images/tongue.png'" mode="aspectFill"></cover-image>
+				</cover-view>
+			</cover-view>
+			<!-- <cover-image v-if="coverImage" :src="coverImage" style="width: 100%;height: 100%;"></cover-image> -->
+		</camera>
+	</Layout>
+</template>
+
+<script>
+	import Layout from './Layout.vue'
+
+	export default {
+		components: {
+			Layout
+		},
+		data() {
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				// 前置或后置摄像头,值为front, back
+				device: 'back',
+				cameraContext: null,
+				shutterShow: false,
+				coverImage: null,
+				menuLeft: '100%'
+			}
+		},
+		mounted() {
+			uni.getSystemInfo({
+				success: (result) => {
+					// 获取右侧胶囊的信息 单位px
+					//#ifndef H5 || APP-PLUS
+					const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+					//left:   胶囊左侧距离屏幕左侧的距离
+					this.menuLeft = menuButtonInfo.left + 'px'
+					//#endif
+				},
+				fail: (error) => {
+					console.log(error)
+				}
+			})
+			this.cameraContext = uni.createCameraContext();
+			// this.coverImage = 'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/portrait.jpg'
+		},
+		methods: {
+			initShow() {
+				this.$refs.Layout.initShow()
+			},
+			navTo() {
+				uni.navigateTo({
+					url: "/pages_user/tongue/ques"
+				})
+			},
+			switchCamera(){
+				this.device = this.device === 'back' ? 'front' : 'back';
+			},
+			back(){
+				uni.navigateBack()
+			},
+			error(err) {
+				console.log(err)
+			},
+			takePhoto(){
+				this.$emit('takePhoto')
+				
+			},
+			handleInstruct(instruct) {
+				switch (instruct) {
+					// 返回
+					case 'back':
+						this.$emit('back')
+						break;
+						// 快门
+					case 'shutter':
+						this.cameraContext.takePhoto({
+							quality: 'high',
+							success: (res) => {
+								// console.log(res)
+								this.$emit('getImage', res.tempImagePath)
+							}
+						})
+						break;
+						// 反转
+					case 'reversal':
+						this.device = this.device === 'back' ? 'front' : 'back'
+						break;
+						// 相册
+					case 'album':
+						uni.chooseImage({
+							count: 1, //默认9
+							sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+							sourceType: ['album'], //从相册选择
+							success: (res) => {
+								 uni.setStorageSync("tongueUrl",res.tempFilePaths[0])
+								this.$emit('getImage')
+							}
+						})
+						break;
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.imagebox {
+		width: 100%;
+		margin-top: 30rpx;
+		@include u-flex(column, center, center);
+	}
+	.tongue {
+		width: 531rpx;
+		height: 592rpx;
+		margin: 0 auto;
+		margin-top: 30rpx;
+	}
+	.cover-view {
+		width: 100%;
+		position: absolute;
+		z-index: 99;
+		top: 0;
+		left: 0;
+	}
+	.title {
+		margin-top: calc(var(--status-bar-height) + 130rpx);;
+		font-family: SourceHanSansCN-Medium;
+		font-weight: 500;
+		font-size: 43rpx;
+		color: #FFFFFF;
+		text-align: center;
+	}
+	.tips {
+		margin-top: 38rpx;
+		font-family: SourceHanSansSC-Regular;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #FFFFFF;
+		text-align: center;
+	}
+	.uni-nav-bar {
+		position: fixed;
+		top: 0;
+		left: 0;
+		width: 100%;
+		z-index: 999;
+		overflow: hidden;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		color: #FFFFFF;
+		.uni-nav-barbox {
+			width: 100%;
+			height: 88rpx;
+			padding: 0 24rpx;
+			box-sizing: border-box;
+			@include u-flex(row, center, space-between);
+			position: relative;
+			font-size: 32rpx;
+		}
+		.uni-nav-title {
+			flex-shrink: 0;
+			font-family: SourceHanSansSC;
+			font-weight: 400;
+			// font-size: 32rpx;
+			color: #FFFFFF;
+			/* #ifdef APP-PLUS */
+			font-size: 32rpx;
+			/* #endif */
+			/* #ifndef APP-PLUS */
+			font-size: 32rpx;
+			/* #endif */
+			@include u-flex(row, center, flex-start);
+			.ques {
+				flex-shrink: 0;
+				width: 33rpx;
+				height: 33rpx;
+				margin-left: 9rpx;
+			}
+		}
+		.uni-nav-back {
+			width: 100%;
+			height: 88rpx;
+			line-height: 88rpx;
+		}
+	}
+
+	.camera {
+		position: relative;
+	}
+</style>

+ 50 - 0
components/Loading.vue

@@ -0,0 +1,50 @@
+<template>
+  <view class="Loads acea-row row-center-wrapper" v-if="loading || !loaded" style="margin-top: 20rpx;">
+    <template v-if="loading">
+      <view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view>
+      正在加载中
+    </template>
+    <template v-if="!loading">
+      上拉加载更多
+    </template>
+  </view>
+</template>
+
+<script>
+  export default {
+    name: "Loading",
+    props: {
+      loaded: Boolean,
+      loading: Boolean
+    }
+  };
+</script>
+<style lang="less">
+	.Loads {
+	  height: 0.8*100rpx;
+	  font-size: 0.25*100rpx;
+	  color: #000;
+	}
+	.Loads .iconfont {
+	  font-size: 0.3*100rpx;
+	  margin-right: 0.1*100rpx;
+	  height: 0.32*100rpx;
+	  line-height: 0.32*100rpx;
+	}
+	/*加载动画*/
+	@keyframes load {
+	  from {
+	    transform: rotate(0deg);
+	  }
+	  to {
+	    transform: rotate(360deg);
+	  }
+	}
+	.loadingpic {
+	  animation: load 3s linear 1s infinite;
+	}
+	.loading {
+	  animation: load linear 1s infinite;
+	}
+	
+</style>

+ 162 - 0
components/Menu.vue

@@ -0,0 +1,162 @@
+<template>
+	<view class="menu-list-box" v-if="carousel" :style="list.length <= menu ? `height:160rpx` : `height:320rpx`">
+		<swiper
+			class="menu-swiper-box"
+			:style="list.length <= menu ? `height:160rpx` : `height:320rpx`"
+			@change="onSwiper"
+			circular
+			:autoplay="false"
+			:interval="3000"
+			:duration="1000"
+		>
+			<swiper-item class="menu-swiper-item" v-for="(itemList, index) in carousel" :key="index" :style="list.length <= menu ? `height:200rpx` : `height:340rpx`">
+				<view class="menu-tab-box">
+					<view class="tab-list"  v-for="item in itemList" :key="item.cateId" @tap="routerTo(item)">
+						<image class="tab-img" :style="{ width: imgW + 'rpx', height: imgW + 'rpx' }" :src="item.imgUrl"></image>
+						<text :class="cateId == item.cateId?'tab-title active':'tab-title'"  >{{ item.cateName }}</text>
+						
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<view class="menu-dots" v-if="carousel.length > 1">
+			<text :class="menuCurrent === index ? 'dot-active' : 'dot'" v-for="(dot, index) in carousel.length" :key="index"></text>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	components: {},
+	data() {
+		return {
+			cateId:0,
+			menuCurrent: 0 //轮播下标
+		};
+	},
+	props: {
+		list: {
+			type: Array,
+			default: []
+		},
+		menu: {
+			default: 4
+		},
+		imgW: {
+			type: Number,
+			default: 88
+		}
+	},
+	computed: {
+		carousel() {
+			if (this.list) {
+				let data = this.sortData(this.list, this.menu * 2);
+				return data;
+			}
+		}
+	},
+	created() {},
+	methods: {
+		// 数据分层
+		sortData(oArr, length) {
+			let arr = [];
+			let minArr = [];
+			oArr.forEach(c => {
+				if (minArr.length === length) {
+					minArr = [];
+				}
+				if (minArr.length === 0) {
+					arr.push(minArr);
+				}
+				minArr.push(c);
+			});
+		 
+			return arr;
+		},
+		// 轮播
+		onSwiper(e) {
+			this.menuCurrent = e.detail.current;
+		},
+		routerTo(item) {
+			this.cateId=item.cateId;
+			this.$emit('menuClick',item);
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.menu-list-box {
+	padding: 0rpx;
+	background: #fff;
+	box-sizing: border-box;
+	
+}
+.menu-list-box,
+.menu-swiper-box {
+	position: relative;
+	background: #fff;
+	.menu-swiper-item {
+		background: #fff;
+		height: 100%;
+		width: 100%;
+	}
+	.menu-tab-box {
+		display: flex;
+		flex-wrap: wrap;
+		.tab-list {
+			width: 25%;
+			display: -webkit-box;
+			display: -webkit-flex;
+			display: flex;
+			-webkit-box-orient: vertical;
+			-webkit-box-direction: normal;
+			-webkit-flex-direction: column;
+			flex-direction: column;
+			-webkit-box-align: center;
+			-webkit-align-items: center;
+			align-items: center;
+			font-size: 22rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: rgba(51, 51, 51, 1);
+			padding-bottom: 30rpx;
+			.tab-img {
+				border-radius: 25rpx;
+				margin-bottom: 10rpx;
+			}
+			.tab-title{
+				font-size: 24upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #111;
+				margin-top: 10rpx;
+				 
+			}
+			.active{
+				color: #E2C99E;
+				
+			}
+		}
+	}
+	.menu-dots {
+		display: flex;
+		position: absolute;
+		left: 50%;
+		transform: translateX(-50%);
+		.dot {
+			width: 40rpx;
+			height: 3rpx;
+			background: #eeeeee;
+			margin-right: 10rpx;
+		}
+
+		.dot-active {
+			width: 40rpx;
+			height: 3rpx;
+			background: #2BC7B9;
+			margin-right: 10rpx;
+		}
+	}
+}
+</style>

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 72 - 0
main.js

@@ -0,0 +1,72 @@
+import App from './App'
+import store from './store'
+import uView from "@/node_modules/uview-ui";
+
+import {isEmpty,parseIDCardInfo,parseText,urlToObj,clearHisSearch,getHisSearch,addHisSearch,logout,getDictLabelName,getProvider,parsePhone,isLogin,getAge,parseIdCard,isLoginCourse,reLoginCheck} from './utils/common.js'
+// #ifndef VUE3
+import Vue from 'vue'
+// Vuex 插件注册
+import Vuex from 'vuex'
+Vue.config.productionTip = false
+App.mpType = 'app'
+
+Vue.use(Vuex)
+Vue.use(uView);
+Vue.prototype.$getProvider = getProvider;
+Vue.prototype.$parsePhone = parsePhone;
+Vue.prototype.$isLogin = isLogin;
+Vue.prototype.$isEmpty = isEmpty;
+Vue.prototype.$getAge = getAge;
+Vue.prototype.$parseIdCard = parseIdCard;
+Vue.prototype.$getDictLabelName = getDictLabelName;
+Vue.prototype.$parseText = parseText;
+Vue.prototype.$logout = logout;
+Vue.prototype.$clearHisSearch = clearHisSearch
+Vue.prototype.$getHisSearch = getHisSearch
+Vue.prototype.$addHisSearch = addHisSearch
+Vue.prototype.$urlToObj = urlToObj
+Vue.prototype.$parseText = parseText
+Vue.prototype.$parseIDCardInfo = parseIDCardInfo
+Vue.prototype.$isLoginCourse = isLoginCourse
+Vue.prototype.$reLoginCheck = reLoginCheck
+// Vue.prototype.$formatHour = formatHour;
+// Vue.prototype.$updateMsgDot = updateMsgDot;
+const app = new Vue({
+	store,	
+    ...App
+})
+
+// 引入请求封装
+require("./pages_im/util/request/index")(app);
+
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+
+import { createSSRApp } from 'vue'
+import uviewPlus from '@/uni_modules/uview-plus'
+export function createApp() {
+  const app = createSSRApp(App)
+  app.config.globalProperties.$getProvider = getProvider
+  app.config.globalProperties.$parsePhone = parsePhone
+  app.config.globalProperties.$isLogin = isLogin
+  app.config.globalProperties.$isEmpty = isEmpty
+  app.config.globalProperties.$getAge = getAge
+  app.config.globalProperties.$parseIdCard = parseIdCard
+  app.config.globalProperties.$getDictLabelName = getDictLabelName
+  app.config.globalProperties.$logout = logout
+  app.config.globalProperties.$clearHisSearch = clearHisSearch
+  app.config.globalProperties.$getHisSearch = getHisSearch
+  app.config.globalProperties.$addHisSearch = addHisSearch
+  app.config.globalProperties.$urlToObj = urlToObj
+  app.config.globalProperties.$parseText = parseText
+  app.config.globalProperties.$parseIDCardInfo = parseIDCardInfo
+  app.config.globalProperties.$isLoginCourse = isLoginCourse
+  
+  app.use(uviewPlus)
+  return {
+    app
+  }
+}
+// #endif

+ 74 - 0
manifest.json

@@ -0,0 +1,74 @@
+{
+    "name" : "his_user_app",
+    "appid" : "__UNI__0B04737",
+    "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" : "wx1e6d61497bba00ef",
+        "setting" : {
+            "urlCheck" : false,
+            "minified" : true
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "sassImplementationName" : "node-sass",
+    "vueVersion" : "2"
+}

+ 54 - 0
note.txt

@@ -0,0 +1,54 @@
+微信开发者工具
+1 npm init -y
+2 npm i commonjs  不用依赖
+3 npm i tim-wx-sdk  [不用INSTALL 4已集成]
+4 npm i @tencentcloud/call-uikit-wechat@1.4.4//如果引用此库,上面的TIM-WX-SDK就不用再引用
+5 npm i tuicall-engine-wx@1.6.0
+
+然后构建  就可以
+
+wxc3f0a952b7bc2b94
+wx73f85f8d62769119
+医健宝互联网医院
+彩虹惠医互联网医院
+
+
+云联测试
+wx6535a9714d7e4e67
+
+小程序全局监听
+https://cloud.tencent.com/developer/article/2211285
+	
+npm i tuicall-engine-wx
+
+
+42.194.245.189
+Yzx_19860213
+
+
+
+小程序使用前,需要将以下域名设为受信域名(已有的 im 受信域名可以都删掉):
+
+wss://wss.im.qcloud.com
+wss://wss.tim.qq.com
+https://web.sdk.qcloud.com
+https://webim.tim.qq.com
+https://api.im.qcloud.com
+
+将以下域名添加到 downloadFile 合法域名:
+https://cos.ap-shanghai.myqcloud.com
+https://cos.ap-shanghai.tencentcos.cn
+https://cos.ap-guangzhou.myqcloud.com
+
+将以下域名添加到 uploadFile 合法域名:
+https://cos.ap-shanghai.myqcloud.com
+https://cos.ap-shanghai.tencentcos.cn
+https://cos.ap-guangzhou.myqcloud.com
+
+uview-ui=>libs=>mixin=>mixin.js 文件中加入以下代码:
+
+options: {
+	styleIsolation: 'shared'
+},
+
+用于取消小程序组件样式隔离特性

+ 1122 - 0
package-lock.json

@@ -0,0 +1,1122 @@
+{
+  "name": "his_user_miniappNew",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@openim/client-sdk": {
+      "version": "0.0.13",
+      "resolved": "https://registry.npmmirror.com/@openim/client-sdk/-/client-sdk-0.0.13.tgz",
+      "integrity": "sha512-piiSzG5oD0BsaVjBbeeoWVQtyaiFLQNPOcQIh7UAVbK0Qd4bwMFYTLjlGuAJ2IfUtv2QJsR8+dWXaPs/aGBo7Q==",
+      "requires": {
+        "@openim/protocol": "^0.0.7-alpha.1",
+        "base64-arraybuffer": "^1.0.2",
+        "loglevel": "^1.9.2",
+        "spark-md5": "^3.0.2"
+      }
+    },
+    "@openim/protocol": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmmirror.com/@openim/protocol/-/protocol-0.0.7.tgz",
+      "integrity": "sha512-OWc1ZGToI06NA9PVxzKUOSzN9RcEe6wx5R/dGqyDfEtBReqRw553cO7KlfYHyltvKovImhWK9X0079IBqc6h6g=="
+    },
+    "@tencentcloud/call-uikit-wechat": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/@tencentcloud/call-uikit-wechat/-/call-uikit-wechat-1.4.4.tgz",
+      "integrity": "sha512-ti4OtU7FhM/mJuflo2RIUiG/6UNMY8WLJ/vZp7+n1nkeyG3QeHou8HAjKqH/TEpCo1PXaNOK0pUXoWH1WejyRg==",
+      "requires": {
+        "tuicall-engine-wx": "^1.4.8"
+      }
+    },
+    "@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+    },
+    "abort-controller": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz",
+      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+      "requires": {
+        "event-target-shim": "^5.0.0"
+      }
+    },
+    "aegis-web-sdk": {
+      "version": "1.39.2",
+      "resolved": "https://registry.npmmirror.com/aegis-web-sdk/-/aegis-web-sdk-1.39.2.tgz",
+      "integrity": "sha512-mu2jfgACsyvfOaKN2auYmVcQjPCkWtzPWU/ywofIgU44oGmTfDSBNaskUa0CtdVOq5XDWdtiCxzjT+dKmyFPhw==",
+      "requires": {
+        "web-vitals": "^3.4.0"
+      }
+    },
+    "aegis-weex-sdk": {
+      "version": "1.38.1",
+      "resolved": "https://registry.npmmirror.com/aegis-weex-sdk/-/aegis-weex-sdk-1.38.1.tgz",
+      "integrity": "sha512-xUBU536yLpmvUiP4vKOFDSnS0BZplFzF0LmvwixMGa1TJ+DwxGzIAkG65+NDnXMgcxuxZGZIl8qdd4OnfkwQiQ=="
+    },
+    "array-buffer-byte-length": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+      "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "is-array-buffer": "^3.0.5"
+      }
+    },
+    "arraybuffer.prototype.slice": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+      "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+      "requires": {
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "is-array-buffer": "^3.0.4"
+      }
+    },
+    "async-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz",
+      "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="
+    },
+    "available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "requires": {
+        "possible-typed-array-names": "^1.0.0"
+      }
+    },
+    "base64-arraybuffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+      "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="
+    },
+    "base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+    },
+    "buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "requires": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      }
+    },
+    "call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      }
+    },
+    "call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      }
+    },
+    "commonjs": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/commonjs/-/commonjs-0.0.1.tgz",
+      "integrity": "sha512-hscVSSFaViuW9i3q7G9BYDpcg/vEdzgk570bUD1u54tcrXQwB2pbHgI7placWz9ZQEJ04goyx8W7mPI/EPpxyw==",
+      "requires": {
+        "system": ">=0.0.1",
+        "test": ">=0.0.5"
+      }
+    },
+    "data-view-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+      "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.2"
+      }
+    },
+    "data-view-byte-length": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+      "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.2"
+      }
+    },
+    "data-view-byte-offset": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+      "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      }
+    },
+    "date-fns": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-4.1.0.tgz",
+      "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="
+    },
+    "dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    },
+    "define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "requires": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      }
+    },
+    "define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "requires": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      }
+    },
+    "es-abstract": {
+      "version": "1.23.9",
+      "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.23.9.tgz",
+      "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
+      "requires": {
+        "array-buffer-byte-length": "^1.0.2",
+        "arraybuffer.prototype.slice": "^1.0.4",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "data-view-buffer": "^1.0.2",
+        "data-view-byte-length": "^1.0.2",
+        "data-view-byte-offset": "^1.0.1",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-set-tostringtag": "^2.1.0",
+        "es-to-primitive": "^1.3.0",
+        "function.prototype.name": "^1.1.8",
+        "get-intrinsic": "^1.2.7",
+        "get-proto": "^1.0.0",
+        "get-symbol-description": "^1.1.0",
+        "globalthis": "^1.0.4",
+        "gopd": "^1.2.0",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.1.0",
+        "is-array-buffer": "^3.0.5",
+        "is-callable": "^1.2.7",
+        "is-data-view": "^1.0.2",
+        "is-regex": "^1.2.1",
+        "is-shared-array-buffer": "^1.0.4",
+        "is-string": "^1.1.1",
+        "is-typed-array": "^1.1.15",
+        "is-weakref": "^1.1.0",
+        "math-intrinsics": "^1.1.0",
+        "object-inspect": "^1.13.3",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.7",
+        "own-keys": "^1.0.1",
+        "regexp.prototype.flags": "^1.5.3",
+        "safe-array-concat": "^1.1.3",
+        "safe-push-apply": "^1.0.0",
+        "safe-regex-test": "^1.1.0",
+        "set-proto": "^1.0.0",
+        "string.prototype.trim": "^1.2.10",
+        "string.prototype.trimend": "^1.0.9",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.3",
+        "typed-array-byte-length": "^1.0.3",
+        "typed-array-byte-offset": "^1.0.4",
+        "typed-array-length": "^1.0.7",
+        "unbox-primitive": "^1.1.0",
+        "which-typed-array": "^1.1.18"
+      }
+    },
+    "es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
+    },
+    "es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+    },
+    "es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "requires": {
+        "es-errors": "^1.3.0"
+      }
+    },
+    "es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+      "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+      "requires": {
+        "is-callable": "^1.2.7",
+        "is-date-object": "^1.0.5",
+        "is-symbol": "^1.0.4"
+      }
+    },
+    "event-target-shim": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
+    },
+    "events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
+    },
+    "for-each": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz",
+      "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+      "requires": {
+        "is-callable": "^1.2.7"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+    },
+    "function.prototype.name": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+      "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "functions-have-names": "^1.2.3",
+        "hasown": "^2.0.2",
+        "is-callable": "^1.2.7"
+      }
+    },
+    "functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
+    },
+    "get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "requires": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      }
+    },
+    "get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "requires": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      }
+    },
+    "get-symbol-description": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+      "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6"
+      }
+    },
+    "globalthis": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz",
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+      "requires": {
+        "define-properties": "^1.2.1",
+        "gopd": "^1.0.1"
+      }
+    },
+    "gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
+    },
+    "has-bigints": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz",
+      "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="
+    },
+    "has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "requires": {
+        "es-define-property": "^1.0.0"
+      }
+    },
+    "has-proto": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz",
+      "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+      "requires": {
+        "dunder-proto": "^1.0.0"
+      }
+    },
+    "has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
+    },
+    "has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "requires": {
+        "has-symbols": "^1.0.3"
+      }
+    },
+    "hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "requires": {
+        "function-bind": "^1.1.2"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "internal-slot": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz",
+      "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.2",
+        "side-channel": "^1.1.0"
+      }
+    },
+    "is-array-buffer": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+      "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
+      }
+    },
+    "is-async-function": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz",
+      "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+      "requires": {
+        "async-function": "^1.0.0",
+        "call-bound": "^1.0.3",
+        "get-proto": "^1.0.1",
+        "has-tostringtag": "^1.0.2",
+        "safe-regex-test": "^1.1.0"
+      }
+    },
+    "is-bigint": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz",
+      "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+      "requires": {
+        "has-bigints": "^1.0.2"
+      }
+    },
+    "is-boolean-object": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+      "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      }
+    },
+    "is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
+    },
+    "is-data-view": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz",
+      "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
+        "is-typed-array": "^1.1.13"
+      }
+    },
+    "is-date-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz",
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
+      }
+    },
+    "is-finalizationregistry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+      "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+      "requires": {
+        "call-bound": "^1.0.3"
+      }
+    },
+    "is-generator-function": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.0.tgz",
+      "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "get-proto": "^1.0.0",
+        "has-tostringtag": "^1.0.2",
+        "safe-regex-test": "^1.1.0"
+      }
+    },
+    "is-map": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz",
+      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="
+    },
+    "is-number-object": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz",
+      "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      }
+    },
+    "is-regex": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      }
+    },
+    "is-set": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz",
+      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="
+    },
+    "is-shared-array-buffer": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+      "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+      "requires": {
+        "call-bound": "^1.0.3"
+      }
+    },
+    "is-string": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz",
+      "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      }
+    },
+    "is-symbol": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz",
+      "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "safe-regex-test": "^1.1.0"
+      }
+    },
+    "is-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz",
+      "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+      "requires": {
+        "which-typed-array": "^1.1.16"
+      }
+    },
+    "is-weakmap": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz",
+      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="
+    },
+    "is-weakref": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz",
+      "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+      "requires": {
+        "call-bound": "^1.0.3"
+      }
+    },
+    "is-weakset": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz",
+      "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
+      }
+    },
+    "isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+    },
+    "jweixin-module": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/jweixin-module/-/jweixin-module-1.6.0.tgz",
+      "integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
+    },
+    "loglevel": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz",
+      "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="
+    },
+    "math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
+    },
+    "minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+    },
+    "object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
+    "object.assign": {
+      "version": "4.1.7",
+      "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz",
+      "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0",
+        "has-symbols": "^1.1.0",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "openim-uniapp-polyfill": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmmirror.com/openim-uniapp-polyfill/-/openim-uniapp-polyfill-1.4.3.tgz",
+      "integrity": "sha512-EXqdsQvgnrcNadIzUhychlWdqPn7zEYfZnMxeO7JOabdBib3DLkz3aL3tHBA8NAZatDmE7LW9DEyN5G1CnePEg=="
+    },
+    "own-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz",
+      "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+      "requires": {
+        "get-intrinsic": "^1.2.6",
+        "object-keys": "^1.1.1",
+        "safe-push-apply": "^1.0.0"
+      }
+    },
+    "possible-typed-array-names": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+      "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
+    },
+    "readable-stream": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz",
+      "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+      "requires": {
+        "abort-controller": "^3.0.0",
+        "buffer": "^6.0.3",
+        "events": "^3.3.0",
+        "process": "^0.11.10",
+        "string_decoder": "^1.3.0"
+      }
+    },
+    "reflect.getprototypeof": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+      "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.9",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.7",
+        "get-proto": "^1.0.1",
+        "which-builtin-type": "^1.2.1"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+      "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "set-function-name": "^2.0.2"
+      }
+    },
+    "safe-array-concat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+      "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
+        "has-symbols": "^1.1.0",
+        "isarray": "^2.0.5"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+    },
+    "safe-push-apply": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+      "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "isarray": "^2.0.5"
+      }
+    },
+    "safe-regex-test": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+      "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "is-regex": "^1.2.1"
+      }
+    },
+    "set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "requires": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      }
+    },
+    "set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "requires": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
+      }
+    },
+    "set-proto": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz",
+      "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+      "requires": {
+        "dunder-proto": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0"
+      }
+    },
+    "side-channel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      }
+    },
+    "side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "requires": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      }
+    },
+    "side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      }
+    },
+    "side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      }
+    },
+    "spark-md5": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz",
+      "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
+    },
+    "string.prototype.replaceall": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmmirror.com/string.prototype.replaceall/-/string.prototype.replaceall-1.0.10.tgz",
+      "integrity": "sha512-PKLapcZUZmXUdfIM6rTTTMYOxaj4JiQrgl0SKEeCFug1CdMAuJq8hVZd4eek9yMXAW4ldGUq+TiZRtjLJRU96g==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "has-symbols": "^1.0.3",
+        "is-regex": "^1.1.4"
+      }
+    },
+    "string.prototype.trim": {
+      "version": "1.2.10",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+      "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "define-data-property": "^1.1.4",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-object-atoms": "^1.0.0",
+        "has-property-descriptors": "^1.0.2"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+      "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "requires": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "system": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/system/-/system-2.0.1.tgz",
+      "integrity": "sha512-BwSUSa8LMHZouGadZ34ck3TsrH5s3oMmTKPK+xHdbBnTCZOZMJ38fHGKLAHkBl0PXru1Z4BsymQU4qqvTxWzdQ=="
+    },
+    "test": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/test/-/test-3.3.0.tgz",
+      "integrity": "sha512-JKlEohxDIJRjwBH/+BrTcAPHljBALrAHw3Zs99RqZlaC605f6BggqXhxkdqZThbSHgaYPwpNJlf9bTSWkb/1rA==",
+      "requires": {
+        "minimist": "^1.2.6",
+        "readable-stream": "^4.3.0",
+        "string.prototype.replaceall": "^1.0.6"
+      }
+    },
+    "tim-js-sdk": {
+      "version": "2.27.6",
+      "resolved": "https://registry.npmmirror.com/tim-js-sdk/-/tim-js-sdk-2.27.6.tgz",
+      "integrity": "sha512-UdeYxn9i4ksCrmcrCwesckvBu/EQA3rUMrIJU13H9Qvz7sY4aojZkwhZpsctAvmV1FxgfT593WNK/7y156EMLQ=="
+    },
+    "tim-upload-plugin": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmmirror.com/tim-upload-plugin/-/tim-upload-plugin-1.4.2.tgz",
+      "integrity": "sha512-ERhcRcSxr6YV4Ri1LBTclcruWVW2Z+tOLTaBkJ9FEoUzo1XNGxT5esl3NENEthBTWwqSlCwb6vK7Ef91uJ7ZLw=="
+    },
+    "tim-wx-sdk": {
+      "version": "2.27.6",
+      "resolved": "https://registry.npmmirror.com/tim-wx-sdk/-/tim-wx-sdk-2.27.6.tgz",
+      "integrity": "sha512-zB+eRdmigdhEDeqrXC0bLJonUQZzS5uKNPLFtrje503WAnmuxVQjq/n4Zle4FYHG4FiKHKhsrVd0aCYXABlFEg=="
+    },
+    "trtc-wx-sdk": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmmirror.com/trtc-wx-sdk/-/trtc-wx-sdk-1.1.13.tgz",
+      "integrity": "sha512-ZIwHxMVqBHLBFvkfWD3dil7fMbnfpFyhjKwhuhltfxy3lTmnY/g1kMrOhuv6UJcqXO/Kai8PMqgKPJvT2NFRIQ=="
+    },
+    "tsignaling-wx": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/tsignaling-wx/-/tsignaling-wx-1.0.6.tgz",
+      "integrity": "sha512-Ebu6dOck4KxvBIkp/orc+voHeL42S4TSSaMLRqaLAnmhtvPfgCPhkMrRmmAP0K0rqg4aQR9WFH/BKPI/xF1PwQ=="
+    },
+    "tuicall-engine-wx": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmmirror.com/tuicall-engine-wx/-/tuicall-engine-wx-1.6.0.tgz",
+      "integrity": "sha512-6VbEHomPV+vgYVVjnqdZXcyoOcvi9T4jcgH/RttvvjN/3WRwLGdxb/L+yQCue7yzz9N/a1UKvdwwf7W9BQH+vg==",
+      "requires": {
+        "tim-wx-sdk": "^2.27.6",
+        "trtc-wx-sdk": "^1.1.13",
+        "tsignaling-wx": "^1.0.6"
+      },
+      "dependencies": {
+        "tim-wx-sdk": {
+          "version": "2.27.6",
+          "resolved": "https://registry.npmmirror.com/tim-wx-sdk/-/tim-wx-sdk-2.27.6.tgz",
+          "integrity": "sha512-zB+eRdmigdhEDeqrXC0bLJonUQZzS5uKNPLFtrje503WAnmuxVQjq/n4Zle4FYHG4FiKHKhsrVd0aCYXABlFEg=="
+        }
+      }
+    },
+    "typed-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.14"
+      }
+    },
+    "typed-array-byte-length": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+      "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+      "requires": {
+        "call-bind": "^1.0.8",
+        "for-each": "^0.3.3",
+        "gopd": "^1.2.0",
+        "has-proto": "^1.2.0",
+        "is-typed-array": "^1.1.14"
+      }
+    },
+    "typed-array-byte-offset": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+      "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+      "requires": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "for-each": "^0.3.3",
+        "gopd": "^1.2.0",
+        "has-proto": "^1.2.0",
+        "is-typed-array": "^1.1.15",
+        "reflect.getprototypeof": "^1.0.9"
+      }
+    },
+    "typed-array-length": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz",
+      "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+      "requires": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0",
+        "reflect.getprototypeof": "^1.0.6"
+      }
+    },
+    "unbox-primitive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+      "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+      "requires": {
+        "call-bound": "^1.0.3",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "which-boxed-primitive": "^1.1.1"
+      }
+    },
+    "uview-ui": {
+      "version": "2.0.38",
+      "resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-2.0.38.tgz",
+      "integrity": "sha512-6egHDf9lXHKpG3hEjRE0vMx4+VWwKk/ReTf5x18KrIKqdvdPRqO3+B8Unh7vYYwrIxzAWIlmhZ9RJpKI/4UqPQ=="
+    },
+    "vuex": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz",
+      "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
+      "requires": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      }
+    },
+    "web-vitals": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmmirror.com/web-vitals/-/web-vitals-3.5.2.tgz",
+      "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg=="
+    },
+    "weixin-js-sdk": {
+      "version": "1.6.5",
+      "resolved": "https://registry.npmmirror.com/weixin-js-sdk/-/weixin-js-sdk-1.6.5.tgz",
+      "integrity": "sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ=="
+    },
+    "which-boxed-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+      "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+      "requires": {
+        "is-bigint": "^1.1.0",
+        "is-boolean-object": "^1.2.1",
+        "is-number-object": "^1.1.1",
+        "is-string": "^1.1.1",
+        "is-symbol": "^1.1.1"
+      }
+    },
+    "which-builtin-type": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+      "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+      "requires": {
+        "call-bound": "^1.0.2",
+        "function.prototype.name": "^1.1.6",
+        "has-tostringtag": "^1.0.2",
+        "is-async-function": "^2.0.0",
+        "is-date-object": "^1.1.0",
+        "is-finalizationregistry": "^1.1.0",
+        "is-generator-function": "^1.0.10",
+        "is-regex": "^1.2.1",
+        "is-weakref": "^1.0.2",
+        "isarray": "^2.0.5",
+        "which-boxed-primitive": "^1.1.0",
+        "which-collection": "^1.0.2",
+        "which-typed-array": "^1.1.16"
+      }
+    },
+    "which-collection": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz",
+      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+      "requires": {
+        "is-map": "^2.0.3",
+        "is-set": "^2.0.3",
+        "is-weakmap": "^2.0.2",
+        "is-weakset": "^2.0.3"
+      }
+    },
+    "which-typed-array": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz",
+      "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+      "requires": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "for-each": "^0.3.5",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2"
+      }
+    }
+  }
+}

+ 35 - 0
package.json

@@ -0,0 +1,35 @@
+{
+  "name": "his_user_miniappNew",
+  "version": "1.0.0",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "http://1.14.104.71:10880/qxj/his_user_miniappNew.git"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "@openim/client-sdk": "0.0.13",
+    "@tencentcloud/call-uikit-wechat": "^1.4.4",
+    "aegis-web-sdk": "^1.39.2",
+    "aegis-weex-sdk": "^1.38.1",
+    "commonjs": "0.0.1",
+    "date-fns": "^4.1.0",
+    "dayjs": "^1.11.12",
+    "jweixin-module": "^1.6.0",
+    "openim-uniapp-polyfill": "^1.4.3",
+    "tim-js-sdk": "^2.27.6",
+    "tim-upload-plugin": "^1.4.1",
+    "tim-wx-sdk": "^2.27.6",
+    "tuicall-engine-wx": "^1.6.0",
+    "uview-ui": "^2.0.38",
+    "vuex": "^4.1.0",
+    "weixin-js-sdk": "^1.6.5"
+  },
+  "devDependencies": {},
+  "description": ""
+}

+ 1877 - 0
pages.json

@@ -0,0 +1,1877 @@
+{
+	"easycom": {
+		// "^u-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
+		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/common/launch",
+			"style": {
+				"navigationBarTitleText": "医健宝互联网医院",
+				"navigationBarTextStyle": "black",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+		},
+		{
+			"path": "pages/auth/login",
+			"style": {
+				"navigationBarTitleText": "授权登录",
+				"navigationBarTextStyle": "black",
+				"navigationBarBackgroundColor": "#ffffff"
+			}
+			
+		},
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTextStyle": "black",
+				"navigationBarTitleText": "医健宝互联网医院",
+		        "enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+			
+			}
+		},
+		{
+			"path": "pages/index/h5",
+			"style": {
+				"navigationBarTitleText": "文章详情"
+			}
+		},
+		{
+			"path": "pages/index/content",
+			"style": {
+				"navigationBarTitleText": "文章详情"
+			}
+		}
+		,{
+		    "path" : "pages/doctor/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "查找医生",
+		        "enablePullDownRefresh": false,
+				"navigationBarTextStyle": "black",
+				"navigationBarBackgroundColor": "#ffffff"
+		    }
+		    
+		}
+		,{
+		    "path" : "pages/store/index",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "健康疗法",
+		        "enablePullDownRefresh": false,
+				"navigationBarTextStyle": "black",
+				"navigationBarBackgroundColor": "#ffffff"
+		    }
+		    
+		}
+		,{
+		    "path" : "pages/user/index",
+		    "style" :                                                                                    
+		    {
+				"navigationBarTextStyle": "black",
+		        "navigationBarTitleText": "个人中心",
+		        "enablePullDownRefresh": false,
+				"navigationStyle": "custom"
+		    }
+		    
+		}
+		,{
+			"path": "pages/im/conversationList/index",
+			"style": {
+				"navigationBarTitleText": "咨询消息",
+				"navigationBarBackgroundColor": "#fff",
+				"navigationBarTextStyle": "black"
+				// "usingComponenets": {
+				// 	 "my-avatar": "pages_im/components/MyAvatar/index",
+				// 	 "my-avatar-placeholder": "pages/im/placeholder/myAvatar" ,// 占位组件路径
+				// 	 "u-parse": "pages_im/components/gaoyia-parse/parse.vue",
+				// 	 "u-parse-placeholder": "pages/im/placeholder/uParse" // 占位组件路径
+				// },
+				// "componentPlaceholder": {
+				// 	 "my-avatar": "my-avatar-placeholder",
+				// 	 "u-parse": "u-parse-placeholder"
+				// }
+			}
+		}
+		,{
+			"path": "pages/courseAnswer/index",
+			"style": {
+				"navigationBarTitleText": "课程详情",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"app-plus": {
+					"bounce": "none",
+					"popGesture": "none",
+					"screenOrientation": [
+						//可选,字符串数组类型,应用支持的横竖屏
+						"portrait-primary", //可选,字符串类型,支持竖屏
+						"portrait-secondary", //可选,字符串类型,支持反向竖屏
+						"landscape-primary", //可选,字符串类型,支持横屏
+						"landscape-secondary" //可选,字符串类型,支持反向横屏
+					]
+				}
+			}
+		}
+		,{
+			"path": "pages/courseAnswer/list",
+			"style": {
+				"navigationBarTitleText": "看课通知",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path" : "pages/index/webview",
+			"style" : 
+			{
+				"navigationBarTitleText" : "webView",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		}
+		
+		
+	     
+    ],
+	"subPackages": [
+		{
+			"root": "pages_index",
+			"pages": [
+				{
+				    "path" : "testList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测一测"
+				    }
+				    
+				},
+				{
+				    "path" : "testDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测一测详情"
+				    }
+				    
+				},
+				{
+				    "path" : "test",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康体质检测",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "testResult",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测试结果"
+					}
+				    
+				},
+				{
+				    "path" : "testResultImg",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "分享好友"
+					}
+				    
+				},
+				{
+				    "path" : "articleList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康知识",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "articleDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "文章详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "diseaseList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "疾病列表",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "diseaseDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "疾病详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "hospitalList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "医院列表",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "hospitalDetails",
+					"style" :
+					{
+					    "navigationBarTitleText": "医院详情",
+					    "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "white"
+					}
+				    
+				}
+				,{
+				    "path" : "search",
+					"style" :
+					{
+					    "navigationBarTitleText": "搜索",
+					    "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom"	
+					}
+				    
+				}
+				,{
+				    "path" : "famousPrescribeList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "名方今用",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "famousPrescribeDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "名方今用",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "vesselList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "经络穴位",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "vesselDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "经络穴位",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "chineseMedicineList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "中药图解",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "chineseMedicineDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "中药图解",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "medicatedFoodList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "药膳食疗",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "medicatedFoodDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "药膳食疗",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "questionsList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问答专区",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "questionsDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问答专区",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康疗法",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康疗法详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageForm",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问答",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				
+			]
+		},
+		{
+			"root": "pages_doctor",
+			"pages": [
+				{
+				    "path" : "doctorArticleList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "医生案例",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "doctorArticleDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "案例详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "doctorList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "医生列表",
+				        "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "doctorDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "医生详情",
+				        "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "white",
+						"navigationStyle": "custom"	
+				    }
+				    
+				}
+				,{
+				    "path" : "doctorPingList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "评价列表",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "doctorInfo",
+					"style" :
+					{
+					    "navigationBarTitleText": "医生详情",
+					    "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "white"
+					}
+				    
+				}
+				,{
+				    "path" : "doctorImgs",
+					"style" :
+					{
+					    "navigationBarTitleText": "医生资质证书",
+					    "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "white"
+					}
+				    
+				}
+			]
+		},
+		{
+			"root": "pages_order",
+			"pages": [
+				{
+				    "path" : "inquiryOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "咨询订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "inquiryOrderDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "咨询详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "inquiryOrderPingList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "评价列表",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "inquirySelect",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问诊选择",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "inquirySelectType",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "咨询通道",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryForm1",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "病情描述",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryForm2_1",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "症状描述",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryForm2_2",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "病情描述",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryForm3",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "病情描述",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryPay",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryPayment",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "tzPay",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "收银台",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "tzWeixinPay",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "微信支付",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryOrderPaySuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付结果",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderPaySuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付结果",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "courseOrderPayment",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "courseOrderPaySuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付结果",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "userVipOrderPayment",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "userVipOrderOrderPaySuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付结果",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "pingOrder",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "医生评价",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "prescribeList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "处方单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "prescribeDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "处方单详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "我的订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderDetail",
+				    "style" :                                                                                    
+				    {
+						"navigationBarTitleText": "订单详情",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "white"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderPay",
+				    "style" :                                                                                    
+				    {
+						"navigationBarTitleText": "支付订单",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderPayment",
+				    "style" :                                                                                    
+				    {
+						"navigationBarTitleText": "支付订单",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryOrderReport",
+				    "style" :                                                                                    
+				    {
+						"navigationBarTitleText": "咨询报告",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageOrderDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "订单详情"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "我的服务包",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageOrderPay",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageOrderPaySuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付结果",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderDelivery",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "物流信息",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "white"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderRefundApply",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "申请售后",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				}
+				,{
+				    "path" : "storeOrderRefundSubmit",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "提交售后",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				}
+				,{
+				    "path" : "storeOrderRefundList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "我的售后",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				}
+				,{
+				    "path" : "storeOrderRefundDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "售后详情"
+				    }
+				}
+				,{
+				    "path" : "storeOrderRefundAddDelivery",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "填写物流单号",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				}
+				,{
+				    "path" : "packageOtherPayment",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "亲友代付",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationStyle": "custom"
+					}
+				    
+				}
+				,{
+				    "path" : "packagePayment",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "支付订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},{
+					"path": "invoice/index",
+					"style": {
+						"navigationBarTitleText": "开具发票",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}, {
+					"path": "invoice/invoiceDetail",
+					"style": {
+						"navigationBarTitleText": "发票详情",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}, {
+					"path": "invoice/invoiceList",
+					"style": {
+						"navigationBarTitleText": "开票历史",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}, {
+					"path": "invoice/invoiceOther",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}
+			]
+		},
+		{
+			"root": "pages_user",
+			"pages": [
+				{
+				    "path" : "registerDoctor",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "注册医生",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "about",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "关于我们",
+				        "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "address",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "地址管理",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "addEditAddress",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "新增地址",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "personInfo",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "个人信息",
+				        "enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "agreement",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "协议",
+				        "enablePullDownRefresh": false
+				    }
+				    
+				}
+				,{
+				    "path" : "myDoctorList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "我的医生",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				
+				,{
+				    "path" : "patient",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "就诊人管理",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "addEditPatient",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "添加就诊人",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "myCouponList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "我的优惠券",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "cert",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "资质证书",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "followList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "我的随访",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "followDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "随访详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "drugReportList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "用药报告",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "drugReportPing",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "评价",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "drugReportDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "报告详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationStyle": "custom"
+				    }
+				    
+				}
+				,{
+				    "path" : "doFollow",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "提交随访",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralGoodsList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "积分商城",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralGoodsDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "商品详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "兑换订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralOrderDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "订单详情"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralLogsList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "积分记录",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralOrderPay",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "积分兑换",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integralOrderPaySuccess",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "兑换结果",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "integral",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "签到",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationStyle": "custom"
+				    }
+				    
+				}
+				,{
+				    "path" : "price",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "价格公示",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "healthRecords/index",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康档案",
+						"navigationBarTextStyle": "white",
+						"navigationBarBackgroundColor": "#FF5C03"
+				    }
+				    
+				}
+				,{
+				    "path" : "healthRecords/add",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "添加",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "healthRecords/edit",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "编辑",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+					"path": "tongue/index",
+					"style": {
+						"navigationBarTitleText": "AI舌诊",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"scrollIndicator": "none",
+						"bounce": "none",
+						"titleNView": false,
+						"enablePullDownRefresh": false
+					}
+				},{
+					"path": "tongue/report",
+					"style": {
+						"navigationBarTitleText": "AI舌诊体质辨识报告",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"bounce": "none",
+						"titleNView": false,
+						"enablePullDownRefresh": false
+					}
+				},{
+					"path": "tongue/photoPreview",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"bounce": "none",
+						"titleNView": false,
+						"enablePullDownRefresh": false
+					}
+				},{
+					"path": "tongue/ques",
+					"style": {
+						"navigationBarTitleText": "使用教程",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black",
+						"scrollIndicator": "none",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}
+				,{
+					"path": "tongue/tongueList",
+					"style": {
+						"navigationBarTitleText": "舌苔记录"
+					}
+				}
+				 ,{
+				 	"path": "addHealthButler",
+				 	"style": {
+				 		"navigationBarTitleText": "健康管家"
+				 	}
+				 }
+				 ,{
+					"path": "bindCompanyUser",
+					"style": {
+						"navigationBarTitleText": "绑定",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black"
+					}
+ 				 },
+				 {
+					"path": "downApp",
+					"style": {
+						"navigationBarTitleText": "下载",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black"
+					}
+				 },{
+					"path": "feedback",
+					"style": {
+						"navigationBarTitleText" : "投诉建议",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#f7f7f7",
+						"navigationBarTextStyle":"black"
+					}
+				 }
+			]
+		},
+		{
+			"root": "pages_company",
+			"pages": [
+				{
+				    "path" : "login",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "客服登录",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				},
+				{
+				    "path" : "index",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "首页",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康疗法",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康疗法详情",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "疗法订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "packageOrderDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "订单详情"
+				    }
+				    
+				}
+				,{
+				    "path" : "couponList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "优惠券列表"
+				    }
+				    
+				}
+				,{
+				    "path" : "couponDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "优惠券详情"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问诊订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "inquiryOrderDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "订单详情"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "药品订单",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderDetail",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "订单详情"
+				    }
+				    
+				}
+				,{
+				    "path" : "storeOrderDelivery",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "快递信息"
+				    }
+				    
+				}
+				,{
+					"path" : "bindInfo",
+					"style" :                                                                                    
+					{
+				        "navigationBarTitleText" : "",
+				        "enablePullDownRefresh": false,
+				        "navigationBarBackgroundColor":"#f7f7f7",
+				        "navigationBarTextStyle":"black"
+				    }
+				    
+ 				}
+				 
+			]
+		},
+		{
+			"root": "pages_course",
+			"pages": [
+				{
+				    "path" : "video",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "课程",
+				        "navigationStyle": "custom",
+				        "scrollIndicator": "none",
+				        "bounce": "none",
+						"usingComponenets": {
+							"uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+						},
+						"componentPlaceholder": {
+							"uni-popup": "view"
+						}
+				    }
+				    
+				},{
+				    "path" : "feedback",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "投诉反馈",
+				        "navigationStyle": "custom",
+				        "scrollIndicator": "none",
+						"app-plus": {
+							"bounce": "none",
+							"softinputMode": "adjustResize"
+						}
+				    }
+				    
+				},{
+				    "path" : "webview",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "授权登录",
+				        "scrollIndicator": "none",
+						"app-plus": {
+							"bounce": "none",
+							"softinputMode": "adjustResize"
+						}
+				    }
+				    
+				}
+			]
+		}
+		,{
+			"root": "pages_im",
+			"pages": [
+				{
+					"path": "pages/common/searchUserOrGroup/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}, {
+					"path": "pages/conversation/chating/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"disableScroll": true,
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"softinputMode": "adjustResize"
+						}
+					}
+				}
+		
+				, {
+					"path": "pages/conversation/singleSettings/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/searchMessage/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"disableScroll": true,
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/searchMediaMessage/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"disableScroll": true,
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/searchFileMessage/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"disableScroll": true,
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/previewLocation/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/notifyMessageList/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/common/webviewWrapper/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/previewVideo/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationBarTextStyle": "black",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/previewFile/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/memberAuthority/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/previewMerge/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black"
+					}
+				},
+				{
+					"path": "pages/conversation/setFontSize/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "pages/conversation/setChatBackgroup/index",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				
+				// {
+				//   "path": "pages/moments/index/index",
+				//   "style": {
+				//     "navigationBarTitleText": "",
+				//     "enablePullDownRefresh": false,
+				//     "disableScroll": true,
+				//     "app-plus": {
+				//       "softinputMode": "adjustResize"
+				//     }
+				//   }
+				// },
+				// {
+				//   "path": "pages/moments/interactiveMessage/index",
+				//   "style": {
+				//     "navigationBarTitleText": "",
+				//     "enablePullDownRefresh": false
+				//   }
+				// },
+				// {
+				//   "path": "pages/moments/momentsDetails/index",
+				//   "style": {
+				//     "navigationBarTitleText": "",
+				//     "enablePullDownRefresh": false,
+				//     "app-plus": {
+				//       "softinputMode": "adjustResize"
+				//     }
+				//   }
+				// },
+				// {
+				//   "path": "pages/moments/momentsRelease/index",
+				//   "style": {
+				//     "navigationBarTitleText": "",
+				//     "enablePullDownRefresh": false
+				//   }
+				// },
+				// {
+				//   "path": "pages/moments/mementsVisibility/index",
+				//   "style": {
+				//     "navigationBarTitleText": "",
+				//     "enablePullDownRefresh": false
+				//   }
+				// },
+				// {
+				//   "path": "pages/moments/designatedMoments/index",
+				//   "style": {
+				//     "navigationBarTitleText": "",
+				//     "enablePullDownRefresh": false,
+				//     "app-plus": {
+				//       "softinputMode": "adjustResize"
+				//     }
+				//   }
+				// },
+				
+				{
+				  "path": "pages/common/globalSearch/index",
+				  "style": {
+				    "navigationBarTitleText": "",
+				    "enablePullDownRefresh": false,
+				    "disableScroll": true
+				  }
+				},
+				{
+				  "path": "pages/common/globalChatLosPreview/index",
+				  "style": {
+				    "navigationBarTitleText": "",
+				    "enablePullDownRefresh": false,
+				    "disableScroll": true
+				  }
+				}
+				
+				,{
+				  "path": "pages/common/previewHistoryMessage/index",
+				  "style": {
+				    "navigationBarTitleText": "",
+				    "enablePullDownRefresh": false,
+				    "disableScroll": true
+				  }
+				}
+				
+				,{
+					"path": "pages/common/createGroup/index",
+					"style": {
+						"navigationBarTitleText": "发起群聊",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}
+				,{
+					"path": "pages/common/meetingCenter/index",
+					"style": {
+						"navigationBarTitleText": "视频会议",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+				   "path": "pages/contact/friendList/index",
+				   "style": {
+				      "navigationBarTitleText": "我的好友",
+				      "enablePullDownRefresh": false,
+					  "navigationStyle": "custom",
+					  "navigationBarTextStyle": "black"
+				   }
+				},
+				{
+				  "path": "pages/contact/searchAddedFriend/index",
+				  "style": {
+				    "navigationBarTitleText": "搜索好友",
+				    "enablePullDownRefresh": false,
+					"navigationStyle": "custom",
+					"navigationBarTextStyle": "black",
+				    "disableScroll": true
+				  }
+				},
+				{
+				   "path": "pages/common/userCard/index",
+				   "style": {
+				     "navigationBarTitleText": "个人主页",
+				     "enablePullDownRefresh": false,
+					 "navigationStyle": "custom",
+					 "navigationBarTextStyle": "black"
+				   }
+				},
+				{
+				  "path": "pages/common/contactChoose/index",
+				  "style": {
+				    "navigationBarTitleText": "联系人",
+				    "enablePullDownRefresh": false,
+				    "disableScroll": true,
+					 "navigationStyle": "custom",
+					 "navigationBarTextStyle": "black"
+					 
+				  }
+				},
+				{
+				  "path": "pages/common/userCardMore/index",
+				  "style": {
+				    "navigationBarTitleText": "个人资料/好友设置",
+				    "enablePullDownRefresh": false,
+					 "navigationStyle": "custom",
+					 "navigationBarTextStyle": "black"
+				  }
+				},
+				{
+				  "path": "pages/common/markOrIDPage/index",
+				  "style": {
+				    "navigationBarTitleText": "工作圈",
+				    "enablePullDownRefresh": false,
+					"navigationStyle": "custom",
+					"navigationBarTextStyle": "black"
+				  }
+				},
+				{
+				  "path": "pages/common/detailsFileds/index",
+				  "style": {
+				    "navigationBarTitleText": "个人资料明细",
+				    "enablePullDownRefresh": false,
+					"navigationStyle": "custom",
+					"navigationBarTextStyle": "black"
+				  }
+				}
+			]
+		}
+		
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "white",
+		"navigationBarTitleText": "医健宝互联网医院",
+		"navigationBarBackgroundColor": "#2583EB",
+		"backgroundColor": "#ffffff"
+	},
+	"uniIdRouter": {},
+	"tabBar": {
+		"color": "#7e7e7e",
+		"selectedColor": "#2583EB",
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"height": "64px",
+		"fontSize":"12px",
+		"iconWidth":"18px",
+		"spacing": "4px",
+		"list": [{
+				"pagePath": "pages/index/index",
+				"iconPath": "/static/tabbar/home.png",
+				"selectedIconPath": "/static/tabbar/home_select.png",
+				"text": "首页"
+			},
+			// {
+			// 	"pagePath": "pages/doctor/index",
+			// 	"iconPath": "https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/doctor.png",
+			// 	"selectedIconPath": "https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/doctor_select.png",
+			// 	"text": "查医生"
+			// },
+			{
+				"pagePath": "pages/im/conversationList/index",
+				"iconPath": "/static/tabbar/inquiry.png",
+				"selectedIconPath": "/static/tabbar/inquiry_select.png",
+				"text": "问诊"
+			},
+			{
+				"pagePath": "pages/store/index",
+				"iconPath": "/static/tabbar/store.png",
+				"selectedIconPath": "/static/tabbar/store_select.png",
+				"text": "产品"
+			},
+			{
+				"pagePath": "pages/user/index",
+				"iconPath": "/static/tabbar/my.png",
+				"selectedIconPath": "/static/tabbar/my_select.png",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 377 - 0
pages/auth/login.vue

@@ -0,0 +1,377 @@
+<template>
+	<view class="content">
+		<view class="force-login-wrap">
+			<view class="force-login__content y-f">
+				<view class="logo">
+					<view class="logo-img">
+						<image src="https://cos.his.cdwjyyh.com/fs/20240423/1287b2bf7c944538905f5092e8ff7db9.png"></image>
+					</view>
+					<view class="title">医健宝互联网医院</view>
+				</view>
+				<view class="login-notice">为了提供更优质的服务,请先登录</view>
+				<view class="btns">
+					<button class="author-btn" open-type="getPhoneNumber" @getphonenumber="phoneLogin">一键授权手机号登录</button>
+					<button class="author-btn" v-if="isAgreement == false" @click="handleAgree()">一键授权手机号登录</button>
+				</view>
+				<!-- <button
+					class="author-btn"
+					open-type="getUserInfo"
+					@click="wxLogin()"  >微信授权登录</button> -->
+				<button class="close-btn" @tap="back">暂不登录</button>
+				<view class="tips">
+					<checkbox :checked="isAgreement" @click="handleAgreement()" />
+					<view @click="handleAgreement()">您同意并接受</view>
+					<view class="btn" @click="openContent('userRegister')">《用户协议》</view>
+					<view class="btn" @click="openContent('userPrivacy')">《隐私保护》</view>
+				</view>
+			</view>
+		</view>
+		<u-popup bgColor="#f6f6f6" :safeAreaInsetBottom="false" :round="15" mode="bottom" :show="wxShow" @close="wxAuthClose" @open="wxAuthOpen">
+			<view class="wxAuth">
+				<view class="title">编辑头像和昵称</view>
+				<wx-auth class="wx-box" @updateUser="updateUser()" ref="wxauth"></wx-auth>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+import { wxLogin, loginByMiniApp } from '@/api/user';
+import { wxAuth } from '../components/wxAuth.vue';
+
+export default {
+	components: {
+		wxAuth
+	},
+	data() {
+		return {
+			wxShow: false,
+			isAgreement: false,
+			code: null
+		};
+	},
+	computed: {},
+	onLoad(option) {
+		uni.$on('refreshLogin', () => {
+			uni.navigateBack({
+				delta: 1
+			});
+		});
+		//选获取CODE,防止后请求的时候腾讯服务端未同步报错
+		this.getCode();
+	},
+	onUnload() {},
+	mounted() {},
+	methods: {
+		updateUser() {
+			this.wxShow = false;
+			uni.$emit('refreshLogin');
+			uni.$emit('refreshIM');
+		},
+		wxAuthOpen() {
+			this.wxShow = true;
+			var that = this;
+			setTimeout(function () {
+				that.$refs.wxauth.getUserInfo();
+			});
+		},
+		wxAuthClose() {
+			this.wxShow = false;
+		},
+		wxLogin(e) {
+			var that = this;
+			if (!this.isAgreement) {
+				uni.showToast({
+					icon: 'none',
+					title: '请先同意协议后再登录'
+				});
+				return false;
+			}
+			uni.showLoading({
+				title: '处理中...'
+			});
+			that.$getProvider()
+				.then((provider) => {
+					console.log('当前的环境商', provider);
+					if (!provider) {
+						reject();
+					}
+					// uni登录
+					uni.login({
+						provider: provider,
+						success: async (loginRes) => {
+							console.log(111);
+							console.log(e);
+							console.log(loginRes);
+						}
+					});
+				})
+				.catch((err) => {
+					uni.showToast({
+						icon: 'none',
+						title: err
+					});
+				});
+		},
+		handleAgree() {
+			if (!this.isAgreement) {
+				uni.showToast({
+					icon: 'none',
+					title: '请先同意协议后再登录'
+				});
+			}
+		},
+		openContent(type) {
+			console.log(type);
+
+			uni.navigateTo({
+				url: '/pages_user/agreement?type=' + type
+			});
+		},
+		handleAgreement() {
+			this.isAgreement = !this.isAgreement;
+		},
+		getCode() {
+			var that = this;
+			that.$getProvider()
+				.then((provider) => {
+					if (!provider) {
+						reject();
+					}
+					// uni登录
+					uni.login({
+						provider: provider,
+						success: async (loginRes) => {
+							that.code = loginRes.code;
+						}
+					});
+				})
+				.catch((err) => {});
+		},
+		// 微信用户手机号登录
+		phoneLogin(e) {
+			var that = this;
+			uni.showLoading({
+				title: '处理中'
+			});
+			console.log(e);
+			if (e.detail.errMsg == 'getPhoneNumber:ok') {
+				this.$getProvider().then((provider) => {
+						console.log('当前的环境商', provider);
+						if (!provider) {
+							reject();
+						}
+						// uni登录
+						uni.login({
+							provider: provider,
+							success: async (loginRes) => {
+								console.log("qxj loginRes---");
+								console.log(loginRes);
+								let code = loginRes.code; // 获取开发code
+								var tuiUserId = uni.getStorageSync('tuiUserId');
+							  
+							   
+								wxLogin({
+									encryptedData: e.detail.encryptedData,
+									iv: e.detail.iv,
+									code: code,
+									tuiUserId: tuiUserId,
+									appId: getApp().globalData.appId
+								}).then((res) => {
+										uni.hideLoading();
+										if (res.code == 200) {
+											uni.showToast({
+												icon: 'none',
+												title: '登录成功'
+											});
+											uni.setStorageSync('userHistoryApp', res.user.historyApp);
+											uni.setStorageSync('AppToken', res.token);
+											uni.setStorageSync('userId', res.user.userId);
+											uni.setStorageSync('avatar', res.user.avatar);
+											uni.setStorageSync('nickName', res.user.nickName);
+											if (res.user.isWeixinAuth == 0) {
+												that.wxAuthOpen();
+											} else {
+												uni.$emit('refreshLogin');
+												uni.$emit('refreshIM');
+											}
+										} else {
+											uni.showToast({
+												icon: 'none',
+												title: '授权登录失败,请重新登录'
+											});
+										}
+									})
+									.catch((error) => {
+										console.log("qxj error------");
+										console.log(error);
+										uni.hideLoading();
+										uni.showToast({
+											icon: 'none',
+											title: '授权登录失败,请重新登录'
+										});
+									});
+							}
+						});
+					})
+					.catch((err) => {});
+			} else {
+				uni.showToast({
+					title: '已拒绝授权',
+					icon: 'none',
+					duration: 2000
+				});
+			}
+		},
+		back() {
+			uni.reLaunch({
+				url: '/pages/index/index',
+				animationType: 'pop-in',
+				animationDuration: 100
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.container {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	justify-content: flex-start;
+	position: relative;
+}
+
+.force-login-wrap {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+	z-index: 11111;
+	top: 0;
+
+	.force-login__content {
+		position: absolute;
+		left: 50%;
+		top: 40%;
+		transform: translate(-50%, -50%);
+		.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;
+			}
+		}
+
+		.login-notice {
+			font-size: 28rpx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #000;
+			line-height: 44rpx;
+			width: 500rpx;
+			text-align: center;
+			margin-bottom: 80rpx;
+		}
+		.btns {
+			position: relative;
+			width: 630rpx;
+			height: 80rpx;
+			.author-btn {
+				z-index: 100;
+				position: absolute;
+				width: 630rpx;
+				height: 80rpx;
+				background: linear-gradient(to right, #c39a58 0%, #e2c99e 100%);
+				background: -moz-linear-gradient(to right, #c39a58 0%, #e2c99e 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);
+			}
+		}
+		.author-btn {
+			z-index: 100;
+			// position: absolute;
+			width: 630rpx;
+			height: 80rpx;
+			background: linear-gradient(to right, #c39a58 0%, #e2c99e 100%);
+			background: -moz-linear-gradient(to right, #c39a58 0%, #e2c99e 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);
+		}
+		.close-btn {
+			width: 630rpx;
+			height: 80rpx;
+			margin-top: 30rpx;
+			border-radius: 40rpx;
+			border: 2rpx solid #c39a58;
+			background: none;
+			font-size: 30rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #c39a58;
+		}
+	}
+}
+.tips {
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	checkbox {
+	}
+	.btn {
+		color: #c39a58;
+	}
+}
+.wxAuth {
+	border-radius: 30rpx;
+	width: 100%;
+	padding: 15rpx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	background-color: #ffffff;
+	.title {
+		font-size: 32rpx;
+		margin: 10rpx 0rpx;
+		font-weight: bold;
+		text-align: center;
+	}
+	.wx-box {
+		width: 100%;
+		padding: 0rpx 30rpx;
+	}
+}
+</style>

+ 45 - 0
pages/common/launch.vue

@@ -0,0 +1,45 @@
+<template>
+	<view class="content">
+		<view ></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				 
+			};
+		},
+		onLoad() {
+			//获取SCSS值
+			this.navigatHandler()
+		},
+		methods: {
+			navigatHandler: function() {
+				uni.reLaunch({
+					url: '/pages/index/index',
+					animationType: 'pop-in',
+					animationDuration: 100
+				})
+				 
+			},
+		},
+		
+	};
+ 
+</script>
+
+
+<style>
+	.content {
+			height: 100%;
+			width: 100%;
+			position: relative;
+			padding-top: 0;
+		}
+	.test{
+		display: none;
+		background-color: $uni-color-theme;
+	}
+</style>

+ 211 - 0
pages/components/wxAuth.vue

@@ -0,0 +1,211 @@
+<template>
+	<view >
+		<view class="content">
+			<view class="info-item">
+				<view class="item">
+					<image  class="head"    :src="user.avatar==null?'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/22cb9518a55040dea74d8f730551a7a2.jpg':user.avatar" mode=""></image>
+					<button class="wx-head" type="balanced" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
+					</button>
+				</view>
+			</view>
+			<view class="info-item">
+				<view class="item">
+					<input type="nickname"  @blur="bindblur" @input="bindinput" placeholder="请点击授权昵称" v-model="nickName" class="input" /> 
+				</view>
+			</view>
+			<view class="btn-box">
+				<view class="btn" @click="submit()">保存</view>
+			</view>
+		</view>
+		 
+	</view>
+</template>
+
+<script>
+	import {getUserInfo,editUser} from '@/api/user.js'
+	export default {
+		data() {
+			return {
+				user:{
+					nickName:"",
+					avatar:null,
+					user:null,
+				}
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			bindblur(e) {
+				this.nickName = e.detail.value; // 获取微信昵称
+			},
+			bindinput(e){
+				this.nickName = e.detail.value; //这里要注意如果只用blur方法的话用户在输入玩昵称后直接点击保存按钮,会出现修改不成功的情况。
+			},
+			onChooseAvatar(e){
+				let {
+					avatarUrl
+				} = e.detail;
+				uni.uploadFile({
+					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+					filePath: avatarUrl,
+					name: 'file',
+					formData: {
+						'user': 'test'  // 上传附带参数
+					},
+					success: (uploadFileRes) => {
+						this.user.avatar =JSON.parse(uploadFileRes.data).url
+					}
+				});
+			},
+			// chooseImage() {
+			// 	var that = this;
+			// 	uni.chooseImage({
+			// 		count: 1, // 默认9
+			// 		sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
+			// 		sourceType: ['album', 'camera'], //从相册选择
+			// 		success: (res) => {
+			// 			uni.uploadFile({
+			// 				url: uni.getStorageSync('requestPath')+'/api/common/uploadOSS', //仅为示例,非真实的接口地址
+			// 				filePath: res.tempFilePaths[0],
+			// 				name: 'file',
+			// 				formData: {
+			// 					'user': 'test'  // 上传附带参数
+			// 				},
+			// 				success: (uploadFileRes) => {
+			// 					console.log(uploadFileRes)
+			// 					this.user.avatar =JSON.parse(uploadFileRes.data).data.url
+			// 				}
+			// 			});
+						 
+			// 		}
+			// 	});
+			// },
+			submit(){
+				if(this.nickName==null||this.nickName==""){
+					uni.showToast({
+						icon:'none',
+						title: "请输入昵称",
+					});
+					return;
+				}
+				this.user.nickName=this.nickName;
+				this.user.isWeixinAuth=1;
+				editUser(this.user).then(
+					res => {
+						if(res.code==200){
+							uni.setStorageSync('avatar',this.avatar);
+							uni.setStorageSync('nickName',this.nickName);
+							this.$emit('updateUser');
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getUserInfo(){
+				getUserInfo().then(
+					res => {
+						if(res.code==200){
+							if(res.user!=null){
+								this.user=res.user;
+								console.log(this.user)
+							}
+							else{
+								this.utils.loginOut();
+							}
+							
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			 
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content{
+		width: 100%;
+		padding: 0 60upx;
+	}
+	.info-item{
+		width: 100%;
+		height: 104upx;
+		background: #FFFFFF;
+		
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin: 15rpx 0rpx;
+		.item{
+			
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width: 100%;
+			.input{
+				width: 100%;
+				height: 50rpx;
+				padding: 15rpx 30rpx;
+				border-radius: 30rpx;
+				background-color: #F5F6FA;
+				text-align: left;
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: 400;
+				color: #0F1826;
+			}
+			.wx-head{
+				position: absolute;
+				width: 120upx;
+				height: 120upx;
+				opacity: 0;
+			}
+		}
+		.head{
+			border-radius: 50%;
+			width: 120upx;
+			height: 120upx;
+		}
+		 
+		.input{
+			text-align: right;
+			font-size: 30upx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #0F1826;
+		}
+		 
+	}
+	.btn-box{
+		height: 140upx;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		.btn{
+			width: 100%;
+			height: 80upx;
+			line-height: 80upx;
+			text-align: center;
+			font-size: 34upx;
+			font-family: PingFang SC;
+			font-weight: 400;
+			color: #FFFFFF;
+			background: #C39A58;
+			border-radius: 60upx;
+		}
+	}
+</style>

+ 137 - 0
pages/courseAnswer/index.vue

@@ -0,0 +1,137 @@
+<template>
+	<view class="container">
+		<web-view :src="pageUrl" v-if="pageUrl" update-title allow="fullscreen" @message="handleMessage"></web-view>
+		<image v-if="false" src="https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png" mode="aspectFill"></image>
+		<view>{{msg}}</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getRealLink,
+		updateSopAppLink
+	} from "@/api/courseAnswer.js"
+	export default {
+		data() {
+			return {
+				pageUrl:"",
+				msg: '加载中...',
+				userInfo: {}
+			}
+		},
+		onLoad(option) {
+			this.userInfo = uni.getStorageSync("userInfo") ? JSON.parse(uni.getStorageSync("userInfo")) : {}
+			if (option.link) {
+				this.getLink(option.link)
+				this.getCourseRead(option.link)
+			} else {
+				this.msg = "link is not found"
+				uni.showToast({
+					title: "link is not found",
+					icon: 'error'
+				})
+			}
+		},
+		onUnload() {
+			// #ifdef APP-PLUS
+			plus.navigator.setFullscreen(false);
+			plus.screen.lockOrientation('portrait-primary');
+			// #endif
+		},
+		onBackPress() {
+			// #ifdef APP-PLUS
+			// 返回时退出全屏
+			plus.navigator.setFullscreen(false);
+			plus.screen.lockOrientation('portrait-primary');
+			// #endif
+		},
+		methods: {
+			getCourseRead(id) {
+				updateSopAppLink(id).then(res=>{
+					if(res.code == 200) {
+						this.$updateMsgDot();
+					}
+				})
+			},
+			handleMessage(event) {
+				const info = event.detail.data[0]
+				// #ifdef APP-PLUS
+				if(info.login != 1) {
+					this.$showLoginPage()
+					return
+				}
+				if (info&&info.isFullscreen) {
+					plus.screen.lockOrientation('landscape-primary');
+				} else {
+					plus.screen.lockOrientation('portrait-primary');
+				}
+				if(info&&info.productId) {
+					uni.navigateTo({
+						url: '/pages/user/integral/integralGoodsDetails?goodsId='+info.productId
+					})
+				}
+				if(info&&info.pagesUrl) {
+					uni.navigateTo({
+						url: info.pagesUrl
+					})
+				}
+				// #endif
+			},
+			getLink(sortLink) {
+				this.msg = '加载中...'
+				const userId = this.userInfo.userId || ''
+				getRealLink({
+					sortLink: sortLink
+				}).then(res => {
+					if (res.code == 200) {
+						// 如果响应中包含真实链接,则跳转到真实链接
+						this.pageUrl = res.realLink + "&userId="+userId+"&source=app&time=" + new Date().getTime()
+						// console.log("this.pageUrl============",this.pageUrl)
+					} else {
+						this.msg = '课程已过期或链接无效'
+						uni.showModal({
+							title: '提示',
+							content: '课程已过期或链接无效',
+							showCancel: false,
+							success: function(res) {
+								if (res.confirm) {
+									console.log('用户点击确定');
+								} else if (res.cancel) {
+									console.log('用户点击取消');
+								}
+							}
+						});
+					}
+				}).catch(err => {
+					this.msg = '发生错误,请稍后再试'
+					uni.showToast({
+						title: '发生错误,请稍后再试',
+						icon: 'none'
+					});
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.container {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding-bottom: 88rpx;
+		justify-content: center;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 32rpx;
+		color: #757575;
+		line-height: 48rpx;
+		text-align: center;
+
+		image {
+			width: 428rpx;
+			height: 360rpx;
+			margin-bottom: 30rpx;
+		}
+	}
+</style>

+ 191 - 0
pages/courseAnswer/list.vue

@@ -0,0 +1,191 @@
+<template>
+	<view class="container">
+		<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption"
+			:up="upOption">
+			<view class="box">
+				<view class="list-item" v-for="(item,index) in dataList" :key="index" @click="handleDetail(item)">
+					<view class="list-con border-line">
+						<view class="list-itemtxt">
+							<text class="list-title textOne">{{item.courseName}}</text>
+							<text class="list-desc textTwo">{{item.title}}</text>
+						</view>
+						<image :src="item.courseUrl" mode="aspectFill"></image>
+					</view>
+					<view class="list-footer">
+						<view style="flex: 1;overflow: hidden;">
+							<!-- <image :src="item.imageUrl" mode="aspectFill"></image> -->
+							<text class="list-time textOne">{{item.qwUserName}}</text>
+						</view>
+						<text class="list-time">过期时间:{{item.updateTime}}</text>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import { getSopCourseStudyList } from "@/api/courseAnswer.js"
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		methods: {
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				let that = this;
+				let data = {
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getSopCourseStudyList(data).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();
+					}
+				});
+			},
+			handleDetail(item) {
+				if(item.appRealLink) {
+					uni.navigateTo({
+						url: item.appRealLink
+					})
+				}else {
+					uni.showToast({
+						icon:'none',
+						title: "暂无看课链接",
+					});
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+
+	.container {
+		padding: 24rpx;
+	}
+
+	.list {
+		&-con {
+			width: 100%;
+			padding: 24rpx;
+			box-sizing: border-box;
+			@include u-flex(row, flex-start, space-between);
+		}
+		&-item {
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			margin-bottom: 20rpx;
+			box-sizing: border-box;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 32rpx;
+			color: #333333;
+			line-height: 38rpx;
+
+			image {
+				flex-shrink: 0;
+				width: 180rpx;
+				height: 136rpx;
+				margin-left: 16rpx;
+				background: #F5F6F6;
+				border-radius: 10rpx 10rpx 10rpx 10rpx;
+				overflow: hidden;
+			}
+		}
+
+		&-itemtxt {
+			flex: 1;
+			overflow: hidden;
+			word-break: break-all;
+			display: block;
+		}
+
+		&-title {
+			word-break: break-all;
+			display: block;
+		}
+
+		&-desc {
+			margin-top: 16rpx;
+			font-size: 26rpx;
+			color: #999999;
+		}
+
+		&-time {
+			font-size: 22rpx;
+			color: #999999;
+		}
+		&-footer {
+			padding: 20rpx 24rpx;
+			box-sizing: border-box;
+			@include u-flex(row, center, space-between);
+			position: relative;
+			view {
+				@include u-flex(row, center, flex-start);
+			}
+			image {
+				height: 50rpx;
+				width: 50rpx;
+				border-radius: 50%;
+				margin: 0 10rpx 0 0;
+			}
+		}
+	}
+
+
+
+</style>

+ 395 - 0
pages/doctor/index.vue

@@ -0,0 +1,395 @@
+<template>
+	<view class="content">
+		<view class="search">
+			<view class="search-box">
+				<image class="img" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_search.png" mode=""></image>
+				<input disabled type="text" placeholder="搜索医院/医生/疾病/知识" placeholder-class="input-place">
+			</view>
+		</view>
+		<view class="depts">
+			<view class="title-box">
+				<view class="line"></view>
+				<view class="title">全部科室</view>
+			</view>
+			<view class="dept-box">
+				<view class="dept" @click="navTo('./doctorList?deptId='+item.deptId)" v-for="(item,index) in depts">
+					<image   :src="item.iconUrl"></image>
+					<view class="dept-name">{{item.deptName}}</view>
+				</view>
+			</view>
+		</view>
+		<view class="doctors">
+			<view class="title-box">
+				<view class="line"></view>
+				<view class="title">专家推荐</view>
+			</view>
+			<view class="doctor-box">
+				<view class="doctor" @click="navTo('./doctorDetails?doctorId='+item.doctorId)" v-for="(item,index) in doctors">
+					<view class="item">
+						<image mode="aspectFill" class="doc-img" :src="item.avatar"></image>
+						<view class="right"> 
+							<view class="doc-box">
+								<view class="doc-name">
+									{{item.doctorName}}
+								</view>
+								<view class="doc-position">{{item.position}}</view>
+							</view>
+							<view class="hospital">
+								{{item.hospitalName}} {{item.deptName}}
+							</view>
+							<view class="doc-spec">
+								<view class="title">擅长:</view>
+								<view class="spec ellipsis">{{item.speciality}}</view>
+							</view>
+							<view class="doc-ping">
+								<view class="ping">好评:{{item.pingStar}}分</view>
+								<view class="count">咨询量:{{item.orderNumber}}</view>
+							</view>
+							<view class="doc-price">
+								<view class="left">¥
+									<text v-for="(price,index) in item.prices">
+										{{price.price.toFixed(2)}} <text v-if="index==0">/</text>
+									</text>
+								</view>
+								<view class="btns">
+									<view class="btn">
+										咨询医生
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	import {getDoctorList} from '@/api/doctor.js'
+	import {getDepartmentList} from '@/api/department.js'
+	export default {
+		data() {
+			return {
+				depts:[],
+				doctors:[],
+			}
+		},
+		onShow() {
+			
+			
+			this.getDepartmentList()
+			this.getDoctorList()
+		},
+		methods: {
+			
+			getDoctorList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui:1,
+					pageNum:1,
+					pageSize:10,
+				};
+				getDoctorList(data).then(res => {
+					if(res.code==200){
+						res.data.list.forEach(function(value,index,array){
+							value.prices=JSON.parse(value.priceJson)
+						});
+						this.doctors=res.data.list;
+						console.log(this.doctors)
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getDepartmentList(page) {   
+				//联网加载数据
+				var that = this;
+				var data = {
+				};
+				getDepartmentList(data).then(res => {
+					if(res.code==200){
+						this.depts=res.data;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		padding: 0rpx 20rpx;
+		.search{
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			padding: 15rpx 0rpx;
+			.search-box{
+				width: 100%;
+				height: 60upx;
+				line-height: 60upx;
+				border-radius: 30upx;
+				background-color: #fff;
+				padding: 0 30upx;
+				display: flex;
+				align-items: center;
+				transition: all .5s;
+				.img{
+					width: 30upx;
+					height: 30upx;
+					margin-right: 10upx;
+				}
+				input{
+					flex: 1;
+					font-size: 24upx;
+					color: #000;
+				}
+				.input-place{
+					font-size: 24upx;
+					color: #878787;
+				}
+			}
+		}
+		.depts{
+			margin-bottom: 15rpx;
+			padding: 15rpx;
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			background-color: #fff;
+			border-radius: 15rpx;
+			.title-box{
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: flex-start;
+				.title{
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+				.line{
+					margin-right: 15rpx;
+					height: 30rpx;
+					width: 6rpx;
+					background-color: #C39A58;
+					
+				}
+				 
+			}
+			.dept-box{
+				width: 100%;
+				padding: 20rpx 0rpx;
+				box-sizing: border-box;
+				display: flex;
+				flex-wrap: wrap;
+				align-items: flex-start;
+				justify-content: flex-start;
+				.dept{
+					margin: 15rpx 0rpx;
+					width: 25%;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					image{
+						width:100rpx;
+						height:100rpx;
+					}
+					.dept-name{
+						margin-top: 20rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #111111;
+						font-weight: bold;
+					}
+				}
+			}
+		}
+		.doctors{
+			padding: 15rpx;
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			background-color: #fff;
+			border-radius: 15rpx;
+			.title-box{
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: flex-start;
+				.title{
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+				.line{
+					margin-right: 15rpx;
+					height: 30rpx;
+					width: 6rpx;
+					background-color: #C39A58;
+					
+				}
+				 
+			}
+			.doctor-box{
+				width: 100%;
+				padding: 20rpx 0rpx;
+				box-sizing: border-box;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				.doctor{
+					width: 100%;
+					margin-bottom: 15rpx;
+					background: #f9f8fe;
+					padding: 15rpx;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					&:last-child{
+						margin-bottom: 0rpx;
+					}
+					.item{
+						width: 100%;
+						display: flex;
+						align-items: flex-start;
+						justify-content: flex-start;
+						.doc-img{
+							width:80rpx;
+							height:80rpx;
+							border-radius: 50%;
+						}
+						.right{
+							width: calc(100% - 100rpx); 
+							margin-left: 20rpx;
+							display: flex;
+							flex-direction: column;
+							align-items: flex-start;
+							justify-content: flex-start;
+							.doc-box{
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								.doc-name{
+									font-size: 28upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #111111;
+									
+								}
+								.doc-position{
+									margin-left: 50rpx;
+									font-size: 26upx;
+									font-family: PingFang SC;
+									color: #2d2b36;
+								}
+							}
+							.hospital{
+								margin-top: 10rpx;
+								font-size: 24upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.doc-spec{
+								width: 100%;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								margin-top: 15rpx;
+								.title{
+									min-width: 55rpx;
+									font-size: 24upx;
+									font-family: PingFang SC;
+									color: #2d2b36;
+								}
+								.spec{
+									margin-left: 10rpx;
+									font-size: 24upx;
+									font-family: PingFang SC;
+									color: #9a9a9c;
+								}
+							}
+							.doc-ping{
+								margin-top: 15rpx;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								.ping{
+									font-size: 24upx;
+									font-family: PingFang SC;
+									color: #2d2b36;
+								}
+								.count{
+									margin-left: 10rpx;
+									font-size: 24upx;
+									font-family: PingFang SC;
+									color: #9a9a9c;
+								}
+							}
+							.doc-price{
+								width: 100%;
+								margin-top: 15rpx;
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								.left{
+									flex: 1;
+									font-size: 32upx;
+									font-family: PingFang SC;
+									color: #C39A58;
+								}
+								.btns{
+									margin-right: 10rpx;
+									.btn{
+										display: flex;
+										align-items: center;
+										justify-content: center;
+										border: 2rpx solid #C39A58;
+										padding: 15rpx 30rpx;
+										border-radius: 30rpx;
+										font-size: 24upx;
+										font-family: PingFang SC;
+										color: #C39A58;
+									}
+									
+								
+								}
+							}
+							
+						}
+					}
+					
+				}
+				
+			}
+		}
+	}
+	 
+</style>

+ 325 - 0
pages/im/conversationList/components/ConversationItem.vue

@@ -0,0 +1,325 @@
+<template>
+	<u-swipe-action-item
+		:index="source.conversationID"
+		@click="clickConversationMenu($event, source)"
+		:name="source.conversationID"
+		:disabled="true"
+		:options="getSwipeActions || []"
+		@touchmove.stop>
+		<view @tap.prevent="clickConversationItem" class="conversation_item">
+				<view class="pinned" v-if="source.isPinned"></view>
+				<view class="left_info">
+					<my-avatar :isGroup="isGroup" :isNotify="isNotify" :src="source.faceURL" :desc="source.showName" size="48" >
+					   <image v-if="getRole()==1" class="taoj"  src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/doctor.svg"></image>
+					   <image v-if="getRole()==2" class="taoj"  src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/guanjia.svg"></image>
+					</my-avatar>	
+					<view class="details">
+						<text class="conversation_name">{{ source.showName }}</text>
+						<view class="lastest_msg_wrap">
+							<text v-if="messagePrefix" class="lastest_msg_prefix" :class="{ lastest_msg_prefix_active: needActivePerfix }">{{ messagePrefix }}</text>
+							<text class="lastest_msg_content">{{ latestMessage }}</text>
+						</view>
+					</view>
+				</view>
+				<view class="right_desc">
+					<text class="send_time">{{ latestMessageTime }}</text>
+					<image style="width: 16px; height: 16px" v-if="notAccept" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/conversation_not_accept.png" />
+					<u-badge v-else max="99" :value="source.unreadCount"></u-badge>
+				</view>
+		</view>
+	</u-swipe-action-item>
+</template>
+
+<script>
+import IMSDK, { GroupAtType, MessageReceiveOptType, SessionType } from 'openim-uniapp-polyfill';
+import MyAvatar from './MyAvatar/index.vue';
+// import UParse from '@/pages_im/components/gaoyia-parse/parse.vue';
+import { getConversationContent, formatConversionTime, prepareConversationState, parseAt } from '@/pages_im/util/imCommon';
+import { formatInputHtml,isDoctorAction } from '@/pages_im/util/common';
+
+export default {
+	components: {
+		MyAvatar,
+		// UParse
+	},
+	props: {
+		source: {
+			type: Object,
+			default: () => {}
+		}
+	},
+	computed: {
+		messagePrefix() {
+			let prefix = '';
+			if (this.source?.recvMsgOpt !== MessageReceiveOptType.Nomal && this.source.unreadCount > 0) {
+				prefix = `[${this.source.unreadCount}条] `;
+			}
+			if (this.source.groupAtType !== GroupAtType.AtNormal) {
+				switch (this.source.groupAtType) {
+					case GroupAtType.AtAll:
+						prefix = '[所有人]';
+						break;
+					case GroupAtType.AtMe:
+						prefix = '[有人@你]';
+						break;
+					case GroupAtType.AtAllAtMe:
+						prefix = '[有人@你]';
+						break;
+					case GroupAtType.AtGroupNotice:
+						prefix = '[群公告]';
+						break;
+				}
+				return prefix;
+			}
+			if (this.source.draftText !== '') {
+				return '[草稿]';
+			}
+			return prefix;
+		},
+		latestMessage() {
+			if (this.source.latestMsg === '') return '';
+			if (this.source.draftText && this.source.groupAtType === GroupAtType.AtNormal) {
+				return parseAt(formatInputHtml(this.source.draftText), true);
+			}
+			let parsedMessage;
+			try {
+				parsedMessage = JSON.parse(this.source.latestMsg);
+			} catch (e) {}
+			if (!parsedMessage) return '';
+			return getConversationContent(parsedMessage);
+		},
+		needActivePerfix() {
+			return this.source.groupAtType !== GroupAtType.AtNormal || this.source.draftText;
+		},
+		latestMessageTime() {
+			return this.source.latestMsgSendTime ? formatConversionTime(this.source.latestMsgSendTime) : '';
+		},
+		notAccept() {
+			return this.source.recvMsgOpt !== MessageReceiveOptType.Nomal;
+		},
+		isGroup() {
+			return this.source.conversationType === SessionType.WorkingGroup;
+		},
+		isNotify() {
+			return this.source.conversationType === SessionType.Notification;
+		},
+		getSwipeActions() {
+			let actions = [
+				{
+					text: `${this.source.isPinned ? '取消' : ''}置顶`,
+					style: {
+						backgroundColor: '#3c9cff'
+					}
+				},
+				{
+					text: '移除',
+					style: {
+						backgroundColor: '#FF381F'
+					}
+				}
+			];
+			if (this.source.unreadCount > 0) {
+				actions = [
+					{
+						text: '标为已读',
+						style: {
+							backgroundColor: '#8E9AB0'
+						}
+					},
+					...actions
+				];
+			}
+			return actions;
+		}
+	},
+	data() {
+		return {
+			isCustom:false,
+		};
+	},
+	methods: {
+		clickConversationItem() {
+			console.log("qxj clickConversationItem:::");
+			console.log(this.source);
+			let userId=this.source.userID;
+			let isDoctor=isDoctorAction(userId);
+			if(!isDoctor){
+				this.$store.commit("timStore/setImType",1);
+			}
+			else{
+				//this.$store.commit("timStore/setImType",1);
+				let ex=this.source.ex;
+				if(this.source.latestMsg!=null && this.source.latestMsg!=''){
+					let latestMsg=JSON.parse(this.source.latestMsg);
+					if(!!latestMsg.ex && latestMsg.ex!=''){
+						ex=latestMsg.ex;
+					}
+				}
+				if(ex!=null || ex!=''){
+					try{
+						var json=JSON.parse(ex);
+						this.$store.commit("timStore/setImType", json.imType);
+						this.$store.commit("timStore/setOrderType", json.orderType);
+						this.$store.commit("timStore/setOrderId", json.orderId);
+						this.$store.commit("timStore/setFollowId", json.followId);
+						this.$store.commit("timStore/setType", json.type);
+					}
+					catch(e){
+						
+					}
+				}
+			}
+			this.$store.commit("timStore/setConversationID", this.source.conversationID);
+			prepareConversationState(this.source);
+		},
+		
+		clickConversationMenu({ name, index }, item) {
+			console.log('clickConversationMenu');
+			const noUnRead = this.getSwipeActions.length === 2;
+			if (index === 0 && !noUnRead) {
+				IMSDK.asyncApi(IMSDK.IMMethods.MarkConversationMessageAsRead, IMSDK.uuid(), item.conversationID).catch(() => uni.$u.toast('操作失败'));
+			}
+			if ((index === 0 && noUnRead) || (index === 1 && !noUnRead)) {
+				IMSDK.asyncApi(IMSDK.IMMethods.PinConversation, IMSDK.uuid(), {
+					conversationID: item.conversationID,
+					isPinned: !item.isPinned
+				}).catch(() => uni.$u.toast('置顶失败'));
+			}
+
+			if (index === 2 || (noUnRead && index === 1)) {
+                  console.log("qxj conversationID:"+item.conversationID);
+				  let that=this;
+				  IMSDK.asyncApi(IMSDK.IMMethods.DeleteConversationAndDeleteAllMsg,IMSDK.uuid(),item.conversationID)
+					  .then(() => {
+						 console.log("移除成功!!!");
+						 that.$store.dispatch('conversation/delConversationByCID', item.conversationID)
+					}).catch(({ errCode, errMsg }) => {  // 调用失败
+						 console.log("errMsg:",errCode);
+						 uni.$u.toast('移除失败');
+					});
+			}
+			//this.$emit('closeAllSwipe');
+		},
+		getRole(){
+			let userType=0;
+			let userId=this.source.userID;
+			if(userId!=undefined  && (userId!="" || userId.length>0)){
+				if(userId.indexOf('U')!==-1){
+					userType=0;
+				}
+				if(userId.indexOf('D')!==-1){
+					userType=1;
+				}
+				if(userId.indexOf('C')!==-1){
+					userType=2;
+				}
+			}
+			return userType;
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.conversation_item {
+	@include btwBox();
+	flex-direction: row;
+	margin:0rpx 24rpx 0;
+	padding: 20rpx 24rpx 22rpx;
+	position: relative;
+	border-radius: 16rpx;
+	background: #fff;
+	&::after {
+		content: "";
+		position: absolute;
+		bottom: 0;
+		left: 0;
+		border-bottom: 1px solid #ECECEC;
+		width: 100%;
+		transform: scaleY(0.5);
+		border-top-color: #ECECEC;
+		border-right-color: #ECECEC;
+		border-left-color: #ECECEC;
+	}
+    
+	&_active {
+		background-color: #f3f3f3;
+	}
+
+	.left_info {
+		@include btwBox();
+		.details {
+			@include colBox(false);
+			margin-left: 24rpx;
+			height: 64px;
+			color: $uni-text-color;
+			justify-content: space-around;
+			.conversation_name {
+				@include nomalEllipsis();
+				max-width: 40vw;
+				font-size: 36rpx;
+			}
+
+			.lastest_msg_wrap {
+				display: flex;
+				font-size: 30rpx;
+				margin-top: 10rpx;
+				color: #666;
+				.lastest_msg_prefix {
+					margin-right: 6rpx;
+
+					&_active {
+						color: $u-primary;
+					}
+				}
+
+				.lastest_msg_content {
+					flex: 1;
+					max-width: 75vw;
+					// margin-right: 160rpx;
+					// /deep/uni-view {
+					@include ellipsisWithLine(1);
+					// }
+				}
+			}
+		}
+	}
+
+	.right_desc {
+		@include colBox(true);
+		align-items: flex-end;
+		width: max-content;
+		justify-content: space-between;
+		height: 46px;
+
+		.send_time {
+			width: max-content;
+			font-size: 28rpx;
+			color: #999;
+		}
+
+		.u-badge {
+			width: fit-content;
+		}
+	}
+
+	.pinned {
+		position: absolute;
+		top: 0;
+		right: 24rpx;
+		width: 17rpx;
+		height: 17rpx;
+		background-image: linear-gradient(to bottom left, #314ffe 50%, white 50%);
+	}
+	
+	.taoj{
+		position: absolute;
+		left: -1px;
+		top: -1px;
+		width: 50px;
+		height: 50px;
+		
+	}
+	
+}
+</style>

+ 107 - 0
pages/im/conversationList/components/MyAvatar/index.vue

@@ -0,0 +1,107 @@
+<template>
+	<view style="position: relative;">
+		<u-avatar
+		  @longpress="longpress"
+		  @click="click"
+		  @onError="errorHandle"
+		  :src="getAvatarUrl"
+		  :text="avatarText"
+		  bgColor="#e5e5e5"
+		  :defaultUrl="getDdefaultUrl"
+		  :shape="shape"
+		  :size="size"
+		  mode="aspectFill"
+		  font-size="14">
+		</u-avatar>
+		<slot></slot>
+	</view>
+  
+</template>
+
+<script>
+// import defaultGroupIcon from "https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/contact_my_group.png";
+// import defaultNotifyIcon from "https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/default_notify_icon.png";
+const defaultNotifyIcon = "https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/default_notify_icon.png";
+const defaultGroupIcon = "https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/contact_my_group.png";
+export default {
+  name: "MyAvatar",
+  props: {
+    src: String,
+    shape: {
+      type: String,
+      default: "square",
+    },
+    size: {
+      type: String,
+      default: "46",
+    },
+    isGroup: {
+      type: Boolean,
+      default: false,
+    },
+    isNotify: {
+      type: Boolean,
+      default: false,
+    },
+
+    desc: String,
+  },
+  data() {
+    return {
+       avatarText: undefined,
+	   defaultFaceIcon: "https://cos.his.cdwjyyh.com/fs/20250617/0d7f54fe8adc4d3689923f9bfc83d4c9.png"
+    };
+  },
+  computed: {
+    getAvatarUrl() {
+		  if (this.isGroup) {
+			 return defaultGroupIcon;
+		  }
+		  else if (this.isNotify) {
+			 return defaultNotifyIcon;
+		  }
+		  else{
+			  if (this.src) {
+			      return this.src;
+			  }else{
+			  	  return this.defaultFaceIcon;
+			  }
+		  }
+		  this.avatarText = this.desc ? this.desc.slice(0, 1) : "未知";
+		  return "";
+    },
+    getDdefaultUrl() {
+      return this.isGroup ? defaultGroupIcon : undefined;
+    },
+  },
+  methods: {
+    errorHandle() {
+      this.avatarText = this.desc ? this.desc.slice(0, 1) : "未知";
+    },
+    redirectShow() {
+      if (this.avatarText) {
+        this.avatarText = undefined;
+      }
+    },
+    click() {
+      this.$emit("click");
+    },
+    longpress() {
+      this.$emit("longpress");
+    },
+  },
+  watch: {
+    src() {
+      this.redirectShow();
+    },
+    desc() {
+      this.redirectShow();
+    },
+  },
+};
+</script>
+
+<style>
+	
+	
+</style>

+ 269 - 0
pages/im/conversationList/index.vue

@@ -0,0 +1,269 @@
+<template>
+	<view class="container">
+	
+		<mescroll-body  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<u-swipe-action ref="swipeWrapperRef" class="swipe_wrapper">
+				<block v-if="keyword!=null && keyword.length>0">
+					<conversation-item v-for="item in filteredList" :key="item.conversationID" @closeAllSwipe="closeAllSwipe" :source="item" ref="conversationItem" />
+				</block>
+				<block v-else>
+					<conversation-item v-for="item in storeConversationList" :key="item.conversationID" @closeAllSwipe="closeAllSwipe" :source="item" ref="conversationItem" />
+				</block>
+				
+			</u-swipe-action>
+		</mescroll-body>
+
+		<view class="loading_wrap" v-if="storeProgress > 0 && storeProgress < 100">
+			<u-loading-icon :vertical="true" :text="storeProgress + '%'"></u-loading-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+// import ChatHeader from './components/ChatHeader.vue';
+import ConversationItem from './components/ConversationItem.vue';
+import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js';
+export default {
+	mixins: [MescrollMixin],
+	components: {
+		// ChatHeader,
+		ConversationItem
+	},
+	data() {
+		return {
+			scrollTop: 0,
+			old: {
+				scrollTop: 0
+			},
+			lastClickTime: 0,
+			doubleClick: 0,
+			triggered: false,
+			refreshing: false,
+			keyword: '',
+			mescroll: null,
+			downOption: {
+				//下拉刷新
+				use: true,
+				auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+			},
+			upOption: {
+				onScroll: false,
+				use: true, // 是否启用上拉加载; 默认true
+				page: {
+					pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+					size: 50 // 每页数据的数量,默认10
+				},
+				noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+				textNoMore: '已经到底了',
+				empty: {
+					icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+					tip: '暂无数据'
+				}
+			},
+			filteredList:[],
+		}
+	},
+	computed: {
+		...mapGetters(['storeConversationList', 'storeIsSyncing', 'storeProgress'])
+	},
+	onReady() {
+		
+	},
+	onShow() {
+		this.$store.dispatch('conversation/getUnReadCount');
+	},
+	onLoad() {
+		// this._freshing = false;
+		// this.triggered = true;
+		// this.mescroll.resetUpScroll();
+	},
+	onTabItemTap(item) {
+		const currentTime = Date.now();
+		if (item.index == 0 && currentTime - this.lastClickTime < 300) {
+			this.scrollToTop();
+		} else {
+			this.lastClickTime = currentTime;
+		}
+	},
+	methods: {
+		scroll(e) {
+			this.old.scrollTop = e.detail.scrollTop;
+		},
+		scrollToTop() {
+			const conversationItem = this.$refs.conversationItem;
+			if (conversationItem) {
+				uni.createSelectorQuery()
+					.in(this)
+					.select(`.conversation_item`)
+					.boundingClientRect(async (rect) => {
+						if (rect) {
+							const itemHeight = rect.height;
+							const index = await this.getNextUnReadIndex(itemHeight);
+							const totalHeight = itemHeight * index;
+							this.scrollTop = this.old.scrollTop;
+							this.$nextTick(function () {
+								this.scrollTop = totalHeight;
+							});
+						}
+					}).exec();
+			}
+		},
+		getNextUnReadIndex(itemHeight) {
+			return new Promise((resolve) => {
+				uni.createSelectorQuery()
+					.in(this)
+					.select('.scroll-view')
+					.scrollOffset((res) => {
+						let start = Math.ceil(res.scrollTop / itemHeight);
+						if (res.scrollTop % itemHeight === 0) {
+							start++;
+						}
+						this.doubleClick = this.storeConversationList.slice(0, start).filter((item) => item.unreadCount > 0).length;
+						const unReadList = this.storeConversationList.filter((item) => item.unreadCount > 0);
+						const current = unReadList[(this.doubleClick %= unReadList.length)];
+						const index = this.storeConversationList.findIndex((item) => item.conversationID === current.conversationID);
+						resolve(index);
+					})
+					.exec();
+			});
+		},
+		onRefresh() {
+			if (this._freshing) return;
+			this._freshing = true;
+			this.queryList(true);
+		},
+		onRestore() {
+			this.triggered = 'restore';
+		},
+		scrolltolower() {
+			this.queryList();
+		},
+		async queryList(isFirstPage = false) {
+			await this.$store.dispatch('conversation/getConversationList', isFirstPage);
+			this.triggered = false;
+			this._freshing = false;
+		},
+		async queryListNew(page) {
+			const list = await this.$store.dispatch('conversation/getConversationList', page.num==1);
+			if(list.length>0){
+				this.mescroll.endSuccess(list.length, list.length==page.size);
+			}else{
+				this.mescroll.endSuccess(list.length, false);
+			}
+		},
+		
+		mescrollInit(mescroll) {
+			this.mescroll = mescroll;
+		},
+		/*下拉刷新的回调 */
+		downCallback(mescroll) {
+			mescroll.resetUpScroll();
+			
+		},
+		upCallback(page) {
+			//联网加载数据
+			this.queryListNew(page);
+		},
+		toSearch() {
+			      if (!this.keyword) {
+			          this.filteredList = this.storeConversationList; // 如果关键词为空,显示全部
+			          return;
+			      }
+			      this.filteredList = this.storeConversationList.filter((item) => {
+						// 检查 showName 是否包含关键词
+						const showNameMatch = item.showName.toLowerCase().includes(this.keyword.toLowerCase());
+						console.log(showNameMatch);
+						// 检查 latestMsg 中 textElem 的 content 是否包含关键词
+						const latestMsg = JSON.parse(item.latestMsg);
+						const contentMatch =latestMsg.textElem && latestMsg.textElem.content.toLowerCase()
+							.includes(this.keyword.toLowerCase());
+						return showNameMatch || contentMatch;
+			      });
+			     //uni.$u.route("/pages_im/pages/common/globalSearch/index");
+		},
+		closeAllSwipe() {
+			this.$refs.swipeWrapperRef.closeAll();
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.container {
+	@include colBox(false);
+	height: 100vh;
+	width: 100%;
+	overflow-y: hidden;
+	box-sizing: border-box;
+	background-repeat: no-repeat;
+	background-size: 100%;
+	position: relative;
+	z-index: 2;
+	background: #f5f7fa;
+	.bg-img {
+		position: absolute;
+		width: 100%;
+		height: 524rpx;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 0;
+	}
+}
+
+.search-cont {
+	padding: 16upx 30upx;
+	background-color: #ffffff;
+	.inner {
+		box-sizing: border-box;
+		width: 100%;
+		height: 72upx;
+		background: #f7f7f7;
+		border-radius: 36upx;
+		display: flex;
+		align-items: center;
+		padding: 0 30upx;
+		.icon-search {
+			width: 28upx;
+			height: 28upx;
+			margin-right: 20upx;
+		}
+		input {
+			height: 60upx;
+			line-height: 60upx;
+			flex: 1;
+		}
+	}
+}
+
+.z-paging-content {
+	flex: 1;
+}
+
+.swipe_wrapper {
+	@include colBox(false);
+	flex: 1;
+	width: 100%;
+	overflow-y: auto;
+}
+
+.scroll-view {
+	height: 0;
+	flex: 1;
+	background: transparent;
+}
+
+.loading_wrap {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+}
+
+::v-deep .u-swipe-action-item__right__button__wrapper__text {
+	-webkit-line-clamp: 2 !important;
+	max-width: 32px;
+}
+</style>

+ 79 - 0
pages/index/content.vue

@@ -0,0 +1,79 @@
+<template>
+	<view class="content">
+		 <view v-html="content"></view>
+	</view>
+</template>
+
+<script>
+ export default {
+ 	data() {
+ 		return {
+			content:"",
+ 		}
+ 	},
+	onLoad(val) {
+		var info=uni.getStorageSync('content');
+		console.log(this.content)
+	}
+ 	 
+ }
+ 
+ 
+</script>
+
+
+<style scoped lang="scss">
+page{
+	height: 100%;
+}
+.content{
+	height: 100%;
+}
+.logo{
+	padding-top: 15%;
+	text-align: center;
+	image{
+		width: 80px;
+		height: 80px;
+	}
+	p{
+		margin: 10px 0px;
+		font-size: 14px;
+	}
+}
+.set-box{
+	margin-top: 30upx;
+	background: #fff;
+	padding: 0 40upx;
+	.item{
+		
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 25upx 0;
+		.left{
+			display: flex;
+			align-items: center;
+			.text{
+				font-size: 30upx;
+				color: #666;
+			}
+		}
+		.right{
+			width: 10upx;
+			height: 20upx;
+		}
+		.right-text{
+			 
+		}
+	}
+}
+.contact-btn {
+  display: inline-block;
+  position: absolute;
+  width: 100%;
+  background: salmon;
+   opacity: 0;
+}
+
+</style>

+ 40 - 0
pages/index/h5.vue

@@ -0,0 +1,40 @@
+<template>
+	<view class="content">
+		 <web-view :src="url"></web-view>
+	</view>
+</template>
+
+<script>
+ 
+ export default {
+ 	data() {
+ 		return {
+			url:"",
+ 		}
+ 	},
+	onLoad(val) {
+		this.url=uni.getStorageSync('url');
+		console.log(this.url)
+	}
+ 	 
+ }
+ 
+ 
+</script>
+
+
+<style scoped lang="scss">
+page{
+	height: 100%;
+}
+.content{
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	
+}
+ 
+
+</style>

+ 1335 - 0
pages/index/index.vue

@@ -0,0 +1,1335 @@
+<template>
+	<view class="content">
+		<view class="cont">
+			<view class="bg">
+				<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/index_img/home_top_bg.png"></image>
+			</view>
+			<view class="top-box" :style="{ background: bg }" >
+				<view class="status_bar" :style="{height: statusBarHeight}"></view>
+				<view class="top-title">
+					<view class="name" :style="{ color: titleColor }">医健宝互联网医院</view>
+					<view class="desc-box" >
+						<image v-if="!isTop" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/dui1.png"></image>
+						<image v-if="isTop" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/dui1.png"></image>
+						
+						<view class="desc" :style="{ color: descColor }">卫健部门权威认证机构,世界各地千万用户健康选择</view>
+					</view>
+				</view>
+				<view class="search">
+					<view class="search-box" @click="navTo('/pages_index/search')">
+						<image class="img" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_search.png" mode=""></image>
+						<input disabled type="text" placeholder="搜索医生/疾病/知识" placeholder-class="input-place">
+					</view>
+					<!-- <view class="msg">
+						<image v-if="!isTop" class="msg" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/msg.png"></image>
+						<image v-if="isTop"  class="msg" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/msg1.png"></image>
+						<button class='contact-btn' open-type="contact">
+						</button>
+					</view> -->
+					
+				</view>
+			</view>
+			<view class="cont-box">
+				<view class="status_bar" :style="{height: statusBarHeight}"></view>
+				<view style="padding-bottom:178rpx" >
+				</view>
+				<view class="banner" v-if="advImgs.length>0">
+					<u-swiper
+							:list="advImgs"
+							indicator
+							indicatorMode="line"
+							circular
+							height="233rpx"
+							@click="handleAdvClick">
+						</u-swiper>
+				</view>
+				<view class="btns">
+					<view class="btn1"  @click="navTo('/pages_doctor/doctorList')">
+						<view class="title-box">
+							<view class="title">专家问诊</view>
+							<view class="desc">名医问诊处方</view>
+						</view>
+						<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/4c28bef97d714e569e672e006ee471e2.png"></image>
+						<image class="mask" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/mask.png"></image>
+					</view>
+					<view class="btn2" @click="navTo('/pages_order/inquirySelectType')">
+						<view class="title-box">
+							<view class="title">健康咨询</view>
+							<view class="desc">快速健康咨询</view>
+						</view>
+						<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/86e6f39efbc54d2dadf058dde269e573.png"></image>
+						<image class="mask" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/mask.png"></image>
+					</view>
+				</view>
+				<view class="modules">
+					<view class="module" v-for="(it,index) in layouts" :key="index">
+						<view class="menus" v-if="it.id==1&&it.isShow">
+							<view class="title">{{it.name}}</view>
+							<view class="menu-box">
+								<view class="menu"  @click="navTo('/pages_index/testList')">
+									<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/6104b270481040dd8340859c9d901c09.png"></image>
+								</view>
+								<view class="menu" @click="navTo('/pages_user/integralGoodsList')">
+									<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/f9f2f6c6b4d24f1ba9a637dfed74f8c3.png"></image>
+								</view>
+								<view class="menu" @click="navTo('/pages_order/inquirySelect?inquiryType=3')">
+									<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/76f15105ebe442398da1fe57e080bcd4.png"></image>
+								</view>
+								<view class="menu" @click="switchTab('/pages/store/index')">
+									<image src="https://cos.his.cdwjyyh.com/fs/20240509/908255a8d8134a5482f0314bfbb42c02.png"></image>
+								</view>
+							</view>
+						</view>
+						<view class="depts" v-if="it.id==2&&it.isShow">
+							<view class="title">
+								{{it.name}}
+							</view>
+							<view class="dept-box">
+								<view @click="navTo('/pages_doctor/doctorList?deptId='+item.deptId)"  class="dept" v-for="(item,index) in depts" :key="index">
+									<image class="icon" :src="item.iconUrl"></image>
+									<view class="title">{{item.deptName}}</view>
+								</view>
+								<view @click="navTo('/pages_doctor/doctorList?deptId=0')" class="dept">
+									<image class="icon" src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/acbb520df8284c6aaff601cb06411c2a.png"></image>
+									<view class="title">更多科室</view>
+								</view>
+							</view>
+							
+						</view>
+						<view class="depts" v-if="it.id==3&&it.isShow">
+							<view class="title">
+								{{it.name}}
+							</view>
+							<view class="dept-box">
+								<view  @click="yangshengClick(item)"  class="dept" v-for="(item,index) in yangshengs" :key="index">
+									<image class="icon" :src="item.icon"></image>
+									<view class="title" >{{item.title}}</view>
+								</view>
+							</view>
+						</view>
+						<view class="doctor-articles" v-if="it.id==4&&it.isShow" >
+							<view class="title-box">
+								<view class="title">{{it.name}}</view>
+								<view class="more"  @click="navTo('/pages_doctor/doctorArticleList')" >
+									<view class="text">更多</view>
+									<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/arrow_gray.png"></image>
+								</view>
+							</view>
+							<scroll-view :scroll-x="true" style="white-space: nowrap;">
+							<view class="article-box"  >
+								<view class="article" @click="navTo('/pages_doctor/doctorArticleDetails?articleId='+item.articleId)"  v-for="(item,index) in doctocArticles" :key="index">
+									<view class="image-box">
+										<image mode="aspectFill" :src="item.imageUrl"></image>
+										<view class="views">
+											{{item.views}}人观看
+										</view>
+										<view class="doctor">
+											<image mode="aspectFill" :src="item.avatar"></image>
+											<view class="right">
+												<view class="doc-name ellipsis">{{item.doctorName}}</view>
+												<view class="doc-position ellipsis">{{item.position}}</view>
+											</view>
+										</view>
+									</view>
+									<view class="article-title-box">
+										<view class="article-title ellipsis">{{item.title}}</view>
+									</view>
+								</view>
+							</view>
+							</scroll-view>
+						</view>
+						<view class="doctors" v-if="it.id==5&&it.isShow">
+							<view class="title-box">
+								<view class="title">{{it.name}}</view>
+								<view class="more" @click="navTo('/pages_doctor/doctorList')">
+									<view class="text">更多</view>
+									<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/arrow_gray.png"></image>
+								</view>
+							</view>
+							<view class="doctor-box" v-if="doctors.length>0">
+								<view class="doctor" @click="navTo('/pages_doctor/doctorDetails?doctorId='+item.doctorId)" v-for="(item,index) in doctors" :key="index">
+									<view class="item">
+										<view class="left">
+											<view class="head-box"> 
+												<image mode="aspectFill" class="doc-img" :src="item.avatar"></image>
+												<view class="isline" v-if="item.workStatus==1">
+													<view class="img">
+														<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/isline.png"></image>
+														<view class="name">在线</view>
+													</view>
+												</view>
+											</view>
+										</view>
+										<view class="right"> 
+											<view class="doc-box">
+												<view class="doc-name">
+													{{item.doctorName}}
+												</view>
+												<view class="doc-position">{{item.position}}</view>
+												<view class="doc-dept">{{item.deptName}}</view>
+											</view>
+											<view class="hospital-box">
+												<!-- <view class="tag" v-if="item.hospitalLevel!=null">
+													<text>{{$getDictLabelName(hosLevelOptions,item.hospitalLevel)}}</text>
+												</view> -->
+												<view class="name">{{item.hospitalName||''}} </view>
+											</view>
+											<view class="doc-spec">
+												<view class="spec ellipsis2">{{item.speciality}}</view>
+											</view>
+											<view class="doc-count">
+												<view class="name">好评:</view>
+												<view class="count">{{item.pingStar}}分</view>
+												<view class="name">接诊量:</view>
+												<view class="count">{{item.orderNumber}}</view>
+												<view class="name">平均响应:</view>
+												<view class="count"></view>
+											</view>
+											<view class="doc-price"  >
+												<view class="btn">
+													咨询医生¥
+													<text v-for="(price,index) in item.prices" :key="index">
+														{{price.price.toFixed(2)}} <text v-if="index==0">/</text>
+													</text>
+												</view>
+											</view>
+										</view>
+										
+									</view>
+									
+								</view>
+							</view>
+						</view>
+						<view class="articles" v-if="it.id==6&&it.isShow">
+							<view class="title-box">
+								<view class="title">{{it.name}}</view>
+								<view class="more" @click="navTo('/pages_index/articleList')">
+									<view class="text">更多</view>
+									<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/arrow_gray.png"></image>
+								</view>
+							</view>
+							<view class="article-box" v-if="articles.length>0">
+								<view class="item" @click="navTo('/pages_index/articleDetails?articleId='+item.articleId)" v-for="(item,index) in articles" :key="index">
+									<view class="left">
+										<view class="title">
+											{{item.title}}
+										</view>
+										<view class="views">
+											浏览量 {{item.views}}
+										</view>
+									</view>
+									<view class="right">
+										<image :src="item.imageUrl"></image>
+									</view>
+								</view>
+							</view>
+						</view>
+						
+						<view class="packages" v-if="it.id==7&&it.isShow">
+							<view class="title-box">
+								<view class="title">{{it.name}}</view>
+								<view class="more" @click="navTo('/pages_index/packageList')">
+									<view class="text">更多</view>
+									<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/arrow_gray.png"></image>
+								</view>
+							</view>
+							<view class="package-box"  >
+								<view class="item" @click="navTo('/pages_index/packageDetails?packageId='+item.packageId)" v-for="(item,index) in packages" :key="index">
+									<view class="top">
+										<image :src="item.imgUrl"></image>
+									</view>
+									<view class="bottom">
+										<view class="title ellipsis2">
+											{{item.packageName}}
+										</view>
+										<view class="price-box">
+											<view class="price">¥{{item.price.toFixed(2)}}元/日</view>
+											<view class="count">{{item.sales}}人已购</view>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+			
+		</view>
+	</view>
+</template>
+<script>
+	import {getConfigByKey} from '@/api/common'
+	import {getPackageList} from '@/api/package.js'
+	import {getDoctorArticleList} from '@/api/doctorArticle.js'
+	import {getDoctorList} from '@/api/doctor.js'
+	import {getArticleList} from '@/api/article.js'
+	import {getAdvList} from '@/api/adv.js'
+	import {getDepartmentList} from '@/api/department.js'
+	import {getDictByKey} from '@/api/common.js'
+	export default {
+		data() {
+			return {
+				layouts:[],
+				yangshengs:[
+					{id:"0",title:"AI舌诊",page:"/pages_user/tongue/index",icon:"https://cos.his.cdwjyyh.com/fs/20240919/647fb42de0ab4e96a6c3097f3c3d9cf5.png"},
+					{id:"1",title:"药膳食疗",page:"/pages_index/medicatedFoodList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/3cfbd47911cf4753aa9497eac500728d.png"},
+					{id:"2",title:"经络穴位",page:"/pages_index/vesselList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e93536a9dc1a4f8ca09545097b12fdea.png"},
+					{id:"3",title:"问答专区",page:"/pages_index/questionsList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e896972bd56f4e358188af36f2c5af42.png"},
+					{id:"4",title:"疾病",page:"/pages_index/diseaseList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/d6f1851cccae414b8baf2ba07782f91b.png"},
+					{id:"5",title:"中药图解",page:"/pages_index/chineseMedicineList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/ff43572d0d004285b5a3b0ef2663c471.png"},
+					{id:"6",title:"名方今用",page:"/pages_index/famousPrescribeList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/45db770e58c34963b0d2ba24a958b617.png"},
+					{id:"7",title:"康复医案",page:"/pages_doctor/doctorArticleList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e793942797b24035b51f94d894bdfa0b.png"}
+					
+				],
+				isTop:false,
+				titleColor:"#ffffff",
+				descColor:"#ffffff",
+				top:0,
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				advImgs:[],
+				doctors:[],
+				advs:[],
+				articles:[],
+				depts:[],
+				doctocArticles:[],
+				hosLevelOptions:[],
+				packages:[]
+			}
+		},
+		onLoad() {
+			this.getDictByKey("sys_hospital_level");
+			uni.$on('refreshMsgCount', () => {
+				try{
+					let totalUnreadCount = uni.$TUIKit.getTotalUnreadMessageCount();
+					if(totalUnreadCount>0){
+						try{
+							uni.setTabBarBadge({ //显示数字
+								index: 1, //tabbar下标
+								text: totalUnreadCount+"" //数字
+							})
+						}
+						catch(e){
+							
+						}
+						
+					}
+					else{
+						try{
+							uni.hideTabBarRedDot({ //隐藏红点
+								index: 1 //tabbar下标
+							})
+						}
+						catch(e){
+							
+						}
+						
+					}
+				}catch(e){
+				}
+				
+			});
+		},
+		onShow() {
+			this.getDoctorList();
+			this.getArticleList();
+			this.getAdvList();
+			this.getDepartmentList();
+			this.getDoctorArticleList();
+			this.getPackageList();
+			this.getConfigByKey("his.appShow");
+			var that=this;
+			uni.$emit('refreshMsgCount');
+		},
+		onPageScroll(e) {
+			this.top=e.scrollTop;
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			if(this.$isLogin()){
+				return {
+					title: "医健宝互联网医院",
+					path: '/pages/index/index',
+					imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				}
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			if(this.utils.isLogin()){
+				return {
+					title: "医健宝互联网医院",
+					imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+				}
+			}
+			
+		},
+		computed: {
+			bg: function() {
+				var top=this.top/120;
+				if(top>0){
+					this.isTop=true;
+					this.titleColor="#fff"
+					this.descColor="#fff"
+				}
+				else{
+					this.isTop=false;
+					this.titleColor="#fff"
+					this.descColor="#fff"
+				}
+				return 'rgba(37, 131, 235, ' + top + ')';
+			},
+		},
+		methods: {
+			dev(){
+				uni.showToast({
+					icon:"none",
+					title: '敬请期待'
+				})
+			},
+			getConfigByKey(key){
+				var that=this;
+				var data={key:key}
+				getConfigByKey(data).then(
+					res => {
+						if(res.code==200){
+							this.layouts=JSON.parse(res.data);
+							this.layouts.sort((a, b) => a.sort - b.sort)
+							this.layouts.forEach(function(element) {
+								if(element.id=="4"){
+									if(!element.isShow){
+										that.yangshengs.splice(6,1);	
+									}
+								}
+								if(element.id=="7"){
+									// if(!element.isShow){
+									// 	uni.setTabBarItem({
+									// 		index:2, //从左到右 0开始
+									// 		visible:false //默认true false隐藏
+									// 	})
+									// }
+									// else{
+									// 	uni.setTabBarItem({
+									// 		index:2, //从左到右 0开始
+									// 		visible:true //默认true false隐藏
+									// 	})
+									// }
+								}
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			yangshengClick(item){
+				// uni.navigateTo({
+				//   url: '/pages/index/webview?url=' + encodeURIComponent('rtlive://course?courseId=1')
+				// });
+				// return;
+				if(item.id==0){
+					// this.$isLogin().then(
+					// 	res => {
+					// 		if(res){
+								uni.navigateTo({
+									url:item.page
+								}); 
+					// 		}
+					// 		else{
+					// 			uni.navigateTo({
+					// 				url:'/pages/auth/login'
+					// 			})
+					// 		}
+					// 	}
+					// );
+				}
+				else{
+					if(item.page==""){
+						uni.showToast({
+							icon:"none",
+							title: '暂无更多'
+						})
+						return;
+					}
+					uni.navigateTo({
+						url:item.page
+					})
+				}
+				
+			},
+			switchTab(url){
+				uni.switchTab({
+					url:url
+				})
+			},
+			navToMiniProgram(){
+				uni.navigateToMiniProgram({
+					// appid  写你要跳转的小程序的 appid
+					appId: 'wx45cf09091aead547',
+					// 路径写  src下的路径,假如你跳转的是pages下的页面,就可以写pages/index
+					path: '/pages/common/launch',
+					extraData: {
+						// 'type': 'out'
+					},
+					// 这个不写的话会显示开发环境,不能正常跳转,写上就能正常跳转了
+					envVersion: 'develop',
+					success(res) {
+						// 打开成功
+						// uni.showToast({
+						// 	title: '跳转成功'
+						// })
+					},
+					fail(err) {
+						// 打开失败/取消
+						// uni.showToast({
+						// 	title: '跳转不成功'
+						// })
+					}
+				})
+			},
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_hospital_level"){
+								this.hosLevelOptions=res.data;
+							}
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			getDoctorArticleList(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					pageNum:1,
+					pageSize:10,
+				};
+				getDoctorArticleList(data).then(res => {
+					if(res.code==200){
+						this.doctocArticles=res.data.list;
+					}else{
+					}
+				});
+			},
+			getDepartmentList(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui:1
+				};
+				getDepartmentList(data).then(res => {
+					if(res.code==200){
+						this.depts=res.data;
+					} 
+				});
+			},
+			handleAdvClick(index){
+				var ad=this.advs[index];
+				console.log(ad.advUrl);
+				if(ad.showType==1){
+					uni.setStorageSync('url',ad.advUrl);
+					uni.navigateTo({
+						url:"h5"
+					})
+				}
+				else if(ad.showType==2){
+					uni.navigateTo({
+						url:ad.advUrl
+					})
+				}
+				else if(ad.showType==3){
+					 uni.setStorageSync('content',ad.content);
+					 uni.navigateTo({
+					 	url:"content"
+					 })
+				}
+				
+			},
+			getAdvList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					advType:1
+				};
+				getAdvList(data).then(res => {
+					if(res.code==200){
+						that.advImgs=[];
+						that.advs=[];
+						res.data.forEach(function(element) {
+							if(element.imageUrl!=null&&element.imageUrl!=""){
+								that.advs.push(element);
+								that.advImgs.push(element.imageUrl);
+							}
+						});
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getArticleList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui:1,
+					pageNum:1,
+					pageSize:10,
+				};
+				getArticleList(data).then(res => {
+					if(res.code==200){
+						this.articles=res.data.list;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getDoctorList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui:1,
+					pageNum:1,
+					pageSize:10,
+				};
+				getDoctorList(data).then(res => {
+					if(res.code==200){
+						this.doctors=res.data.list;
+						this.doctors.forEach(function(value,index,array){
+							value.prices=JSON.parse(value.priceJson)
+						});
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getPackageList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isShow:1,
+					pageNum:1,
+					pageSize:10,
+				};
+				getPackageList(data).then(res => {
+					if(res.code==200){
+						this.packages=res.data.list;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			loginNavTo(url){
+				this.$isLogin().then(
+					res => {
+						if(res){
+							console.log(res)
+							uni.navigateTo({
+								url: url
+							})
+						}
+						else{
+							uni.navigateTo({
+								url:'/pages/auth/login'
+							})
+						}
+					}
+				);
+				 
+			},
+			navTo(url){
+				if(url=="dev"){
+					uni.showToast({
+						icon:'none',
+						title: "尽情期待...",
+					});
+					return;
+				}
+				console.log(url)
+				uni.navigateTo({
+					url: url
+				})
+			},
+			 navToTest() {
+				 const course = {"companyId":100,"companyUserId":6806,"corpId":"ww5a88c4f879f204c5","courseId":63,"link":"1899022782092541952","linkType":3,"qwExternalId":9914983,"qwUserId":"18931","videoId":409}
+				 uni.navigateTo({
+				 	url: '/pages_course/video?course='+JSON.stringify(course)
+				 })
+			 }
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		.cont{
+			position: relative;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			.bg{
+				width: 100%;
+				height:450rpx;
+				// background-color: #2BC7B9;
+				// background: linear-gradient(#2BC7B9, #88e2da);
+				position: fixed;
+				image{
+					border-radius: 0rpx 0rpx 50rpx 50rpx;
+					width: 100%;
+					height:100%;
+				}
+			}
+			.top-box{
+				width: 100%;
+				position: fixed;
+				top: 0;
+				left: 0;
+				z-index: 1001;
+				.top-title{
+					height: 88upx;
+					// line-height: 88upx;
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: center;
+					margin-left: 15rpx;
+					.name{
+						font-size: 32upx;
+						font-family: Source Han Sans CN;
+						font-weight: bold;
+						color: #fff;
+					}
+					.desc-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 10rpx;
+						
+						image{
+							width:24rpx;
+							height:24rpx;
+						}
+						.desc{
+							margin-left: 5rpx;
+							font-size: 20upx;
+							font-family: Source Han Sans CN;
+							color: #626468;
+						}
+						
+					}
+					 
+					
+					 
+				}
+				.search{
+					box-sizing: border-box;
+					z-index: 101;
+					padding: 15rpx;
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					.search-box{
+						flex: 1;
+						margin-right: 10rpx;
+						height: 60upx;
+						line-height: 60upx;
+						border-radius: 30upx;
+						background-color: #fff;
+						padding: 0 30upx;
+						display: flex;
+						align-items: center;
+						transition: all .5s;
+						.img{
+							width: 30upx;
+							height: 30upx;
+							margin-right: 10upx;
+						}
+						input{
+							flex: 1;
+							font-size: 24upx;
+							color: #000;
+						}
+						.input-place{
+							font-size: 24upx;
+							color: #878787;
+						}
+					}
+					.msg{
+						position: relative;
+						width:50rpx;
+						height:50rpx;
+						image{
+							width: 100%;
+							height:100%;
+							
+						}
+						.contact-btn {
+							top: 0;
+							position: absolute;
+							width:100%;
+							height:100%;
+							opacity: 0;
+						}
+					}
+				}
+			}
+			.cont-box{
+				z-index: 100;
+				.banner{
+					margin: 20rpx auto auto;
+					width: 702rpx;
+				}
+				.btns{
+					
+					padding: 0 20upx;
+					margin-top: 20rpx;
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					.btn1{
+						position: relative;
+						background: linear-gradient(to bottom, #EEC992, #CDA569);
+						box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+						margin-right: 30rpx;
+						border-radius: 15rpx;
+						height:180rpx;
+						padding: 15rpx 30rpx;
+						width:50%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						&:last-child{
+							margin-right: 0rpx;
+						}
+						image{
+							width:104rpx;
+							height:104rpx;
+						}
+						.mask{
+							position: absolute;
+							top:0rpx;
+							right:0rpx;
+							width: 100rpx;
+							height:100rpx;
+						}
+						.title-box{
+							display: flex;
+							align-items: flex-start;
+							justify-content: center;
+							flex-direction: column;
+							.title{
+								font-size: 36upx;
+								font-weight: bold;
+								color: #ffffff;
+							}
+							.desc{
+								margin-top: 6rpx;
+								opacity: 0.8;
+								font-size: 26upx;
+								color: #ffffff;
+							}
+							
+						}
+					}
+					.btn2{
+						position: relative;
+						background: linear-gradient(to bottom, #EE8C5F, #EA5733);
+						box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+						margin-right: 30rpx;
+						border-radius: 15rpx;
+						height:180rpx;
+						padding: 15rpx 30rpx;
+						width:50%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						&:last-child{
+							margin-right: 0rpx;
+						}
+						image{
+							width:104rpx;
+							height:104rpx;
+						}
+						.mask{
+							position: absolute;
+							top:0rpx;
+							right:0rpx;
+							width: 100rpx;
+							height:100rpx;
+						}
+						.title-box{
+							display: flex;
+							align-items: flex-start;
+							justify-content: center;
+							flex-direction: column;
+							.title{
+								font-size: 36upx;
+								font-weight: bold;
+								color: #ffffff;
+							}
+							.desc{
+								margin-top: 6rpx;
+								opacity: 0.8;
+								font-size: 26upx;
+								font-weight: bold;
+								color: #ffffff;
+							}
+							
+						}
+					}
+				}
+				.modules{
+					.module{
+						.menus{
+							z-index: 101;
+							margin: 20rpx 15rpx 0rpx;
+							padding: 20rpx;
+							box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+							background-color: #fff;
+							border-radius: 15rpx;
+							.title{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #2A2B2E;
+							}
+							.menu-box{
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								flex-wrap:wrap;
+								.menu{
+									padding: 15rpx;
+									width:50%;
+									display: flex;
+									flex-direction: column;
+									align-items: center;
+									justify-content: center;
+									flex-wrap: wrap;
+									image{
+										width:100%;
+										height:180rpx;
+									}
+								}
+							}
+							
+						}
+						.depts{
+							z-index: 101;
+							margin: 20rpx 15rpx 0rpx;
+							padding: 20rpx;
+							box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+							background-color: #fff;
+							border-radius: 15rpx;
+							.title{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #2A2B2E;
+							}
+							.dept-box{
+								margin-top: 15rpx;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								flex-wrap:wrap;
+								.dept{
+									padding: 15rpx 5rpx;
+									width:25%;
+									display: flex;
+									flex-direction: column;
+									align-items: center;
+									justify-content: center;
+									.icon{
+										width:58rpx;
+										height:58rpx;
+									}
+									.title{
+										margin-top: 10rpx;
+										font-size: 24upx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #111111;
+									}
+								}
+							}
+							
+						}
+						.doctor-articles{
+							z-index: 101;
+							margin: 20rpx 15rpx 0rpx;
+							padding: 20rpx;
+							box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+							background-color: #fff;
+							border-radius: 15rpx;
+							.title-box{
+								display: flex;
+								flex-direction: row;
+								align-items: center;
+								justify-content: space-between;
+								.title{
+									font-size: 32upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #111111;
+								}
+								.more{
+									display: flex;
+									align-items: center;
+									justify-content: flex-end;
+									.text{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										color: #9B9B9B;
+									}
+									image{
+										margin-left: 10rpx;
+										width:15rpx;
+										height:20rpx;
+									}
+									
+								}
+							}
+							.article-box{
+								padding: 20rpx 0rpx;
+								overflow-x: auto;
+								box-sizing: border-box;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								.article{
+									width: 300rpx;
+									margin-right: 20rpx;
+									background: #f9f8fe;
+									display: flex;
+									flex-direction: column;
+									align-items: flex-start;
+									justify-content: flex-start;
+									&:last-child{
+										margin-right: 0rpx;
+									}
+									.image-box{
+										width: 300rpx;
+										height:400rpx;
+										position: relative;
+										border-radius: 20rpx;
+										image{
+											border-radius: 20rpx;
+											width: 300rpx;
+											height:400rpx;
+										}
+										.views{
+											position: absolute;
+											top:0rpx;
+											left:0rpx;
+											padding: 5rpx 10rpx;
+											background: rgba(0,0,0,0.25);
+											border-radius: 12rpx 0px 12rpx 0px;
+											opacity: 1;
+											font-size: 20rpx;
+											font-family: PingFang SC-Bold, PingFang SC;
+											font-weight: bold;
+											color: #FFFFFF;
+										}
+										.doctor{
+											margin: 10rpx;
+											display: flex;
+											align-items: center;
+											justify-content: flex-start;
+											position: absolute;
+											bottom:0rpx;
+											left:0rpx;
+											image{
+												border-radius: 50%;
+												width: 64rpx;
+												height:64rpx;
+											}
+											.right{
+												width: 200rpx;
+												margin-left: 10rpx;
+												display: flex;
+												flex-direction: column;
+												align-items: flex-start;
+												justify-content: space-between;
+												.doc-name{
+													width: 200rpx;
+													font-size: 30rpx;
+													font-weight: bold;
+													font-family: PingFang SC;
+													color: #fff;
+												}
+												.doc-position{
+													width: 100%;
+													font-size: 28rpx;
+													font-family: PingFang SC;
+													color: #fff;
+													font-weight: bold;
+													opacity: 0.8;
+												}
+											}
+										}
+									}
+									.article-title-box{
+										width: 100%;
+										margin-top: 10rpx;
+										display: flex;
+										align-items: center;
+										justify-content: flex-start;
+										.article-title{
+											font-size: 30rpx;
+											font-weight: bold;
+											font-family: PingFang SC;
+											color: #2A2B2E;
+										}
+										
+									}
+									 
+								}
+								
+							}
+						}
+						.doctors{
+							z-index: 101;
+							margin: 20rpx 15rpx;
+							padding: 20rpx;
+							box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+							background-color: #fff;
+							border-radius: 15rpx;
+							.title-box{
+								display: flex;
+								flex-direction: row;
+								align-items: center;
+								justify-content: space-between;
+								.title{
+									font-size: 32upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #111111;
+								}
+								.more{
+									display: flex;
+									align-items: center;
+									justify-content: flex-end;
+									.text{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										color: #9B9B9B;
+									}
+									image{
+										margin-left: 10rpx;
+										width:15rpx;
+										height:20rpx;
+									}
+									
+								}
+							}
+							
+						}
+						.articles{
+							z-index: 101;
+							margin: 20rpx 15rpx;
+							padding: 20rpx;
+							box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+							background-color: #fff;
+							border-radius: 15rpx;
+							.title-box{
+								display: flex;
+								flex-direction: row;
+								align-items: center;
+								justify-content: space-between;
+								.title{
+									font-size: 32upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #111111;
+								}
+								.more{
+									display: flex;
+									align-items: center;
+									justify-content: flex-end;
+									.text{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										color: #9B9B9B;
+									}
+									image{
+										margin-left: 10rpx;
+										width:15rpx;
+										height:20rpx;
+									}
+									
+								}
+							}
+							.article-box{
+								margin-top: 15rpx;
+								padding: 20rpx 0rpx 0rpx;
+								display: flex;
+								flex-direction: column;
+								align-items: flex-start;
+								justify-content: flex-start;
+								.item{
+									width: 100%;
+									margin-bottom: 20rpx;
+									display: flex;
+									align-items: flex-start;
+									justify-content: flex-start;
+									&:last-child{
+										margin-bottom: 0rpx;
+									}
+									.left{
+										flex:1;
+										height:160rpx;
+										margin-right: 15rpx;
+										display: flex;
+										flex-direction: column;
+										align-items: flex-start;
+										justify-content: space-between;
+										.title{
+											font-size: 28upx;
+											font-family: PingFang SC;
+											font-weight: bold;
+											color: #111111;
+										}
+										.views{
+											font-size: 24upx;
+											font-family: PingFang SC;
+											color: #9a9a9c;
+										}
+									}
+									.right{
+										image{
+											border-radius: 10rpx;
+											width:220rpx;
+											height:160rpx;
+											border: 1px solid #eeeeee;
+										}
+									}
+								}
+							}
+						}
+						.packages{
+							z-index: 101;
+							margin: 20rpx 15rpx;
+							padding: 20rpx;
+							box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+							background-color: #fff;
+							border-radius: 15rpx;
+							.title-box{
+								display: flex;
+								flex-direction: row;
+								align-items: center;
+								justify-content: space-between;
+								.title{
+									font-size: 32upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #111111;
+								}
+								.more{
+									display: flex;
+									align-items: center;
+									justify-content: flex-end;
+									.text{
+										font-size: 24rpx;
+										font-family: PingFang SC;
+										color: #9B9B9B;
+									}
+									image{
+										margin-left: 10rpx;
+										width:15rpx;
+										height:20rpx;
+									}
+									
+								}
+							}
+							.package-box{
+								padding: 20rpx 0rpx 0rpx;
+								display: flex;
+								align-items: flex-start;
+								justify-content: flex-start;
+								flex-wrap: wrap;
+								.item{
+									width: calc(50% - 20rpx);
+									border-radius: 15rpx;
+									margin: 10rpx;
+									display: flex;
+									flex-direction: column;
+									align-items: flex-start;
+									justify-content: flex-start;
+									&:last-child{
+									}
+									.top{
+										width:100%;
+										height:300rpx;
+										image{
+											border-radius: 15rpx 15rpx 0rpx 0rpx;
+											width:100%;
+											height:300rpx;
+										}
+										
+									}
+									.bottom{
+										width: 100%;
+										margin-top: 15rpx;
+										.title{
+											font-weight: bold;
+											font-size: 28upx;
+											font-family: PingFang SC;
+											color: #111111;
+										}
+										.price-box{
+											margin-top: 10rpx;
+											display: flex;
+											align-items: center;
+											justify-content: space-between;
+											width: 100%;
+											.price{
+												padding: 5rpx 10rpx;
+												background-color: #C39A58;
+												border-radius: 30rpx;
+												font-size: 20upx;
+												font-family: PingFang SC;
+												color: #ffffff;
+											}
+											.count{
+												font-size: 24upx;
+												font-family: PingFang SC;
+												color: #333333;
+											}
+											
+										}
+									}
+								}
+							}
+							
+							
+						}
+					}
+					
+				}
+				
+			}
+			
+		}
+	}
+	 
+</style>

+ 64 - 0
pages/index/webview.vue

@@ -0,0 +1,64 @@
+<template>
+  <view>
+    <!-- 用于显示提示信息 -->
+    <view v-if="showTips" class="tips">
+      <text>请点击右上角“...”选择“在浏览器打开”跳转应用</text>
+      <button @click="copyLink">复制链接</button>
+    </view>
+
+    <!-- 内置 WebView 组件 -->
+    <web-view v-if="url" :src="url" @message="handleMessage"></web-view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      url: '',         // 要加载的 H5 链接
+      schemeUrl: '',   // 接收的 Scheme(如 rtlive://course?courseId=1)
+      showTips: false, // 是否显示引导提示
+    };
+  },
+  onLoad(options) {
+    if (options.url) {
+      this.schemeUrl = decodeURIComponent(options.url);
+      console.log('Scheme 数据:', this.schemeUrl); // 输出:rtlive://course?courseId=1
+      // 尝试直接跳转(可能被微信拦截)
+      this.tryOpenScheme();
+    }
+  },
+  methods: {
+    // 尝试直接打开 Scheme(通常会被微信拦截)
+    tryOpenScheme() {
+		const timestamp = new Date().getTime(); // 获取当前时间戳
+        this.url = `https://yjf.natappvip.cc/H5Demo/index.html?t=${timestamp}`;
+        // 如果跳转失败,显示引导提示
+        this.showTips = true;
+      },
+
+    // 复制链接到剪贴板
+    copyLink() {
+      uni.setClipboardData({
+        data: this.schemeUrl,
+        success: () => {
+          uni.showToast({ title: '链接已复制,请在浏览器打开' });
+        },
+      });
+    },
+
+    // 监听 WebView 消息(可选)
+    handleMessage(e) {
+      console.log('WebView 消息:', e.detail);
+    },
+  },
+};
+</script>
+
+<style>
+.tips {
+  padding: 20px;
+  text-align: center;
+  background: #f8f8f8;
+}
+</style>

+ 277 - 0
pages/store/index.vue

@@ -0,0 +1,277 @@
+<template>
+	<view class="content">
+		<view class="top-content">
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_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>
+			<view class="cate-list">
+				<Menu :list="cates" @menuClick="menuClick" v-if="cates.length>0" style="width:100%;"></Menu>
+			</view>
+		</view>
+		<mescroll-body  v-if="top!=null" :top="top"  bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
+		<view class="package-box"  >
+			<view class="item" @click="navTo('/pages_index/packageDetails?packageId='+item.packageId)" v-for="(item,index) in dataList">
+				<view class="top">
+					<image :src="item.imgUrl"></image>
+				</view>
+				<view class="bottom">
+					<view class="title ellipsis2">
+						{{item.packageName}}
+					</view>
+					<view class="price-box">
+						<view class="price">¥{{item.price.toFixed(2)}}元/日</view>
+						<view class="count">{{item.sales}}人已购</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import Menu from '@/components/Menu.vue'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import {getPackageList,getPackagCateList} from '@/api/package.js'
+	export default {
+		components: {Menu},
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				top:null,
+				cates:[],
+				diseaseType:0,
+				keyword: '',
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+				
+			}
+		},
+		onLoad() {
+			this.getPackagCateList(1);
+		},
+		methods: {
+			menuClick(item){
+				this.diseaseType = item.cateCode;
+				this.mescroll.resetUpScroll()
+			},
+			getPackagCateList(type){
+				var data={type:type}
+				var that=this;
+				getPackagCateList(data).then(
+					res => {
+						if(res.code==200){
+							 this.cates=res.data;
+							 var query = uni.createSelectorQuery().in(that);
+							 setTimeout(function(){
+							 	query.select('.top-content').boundingClientRect(data => {
+							 		if (data) {
+							 		    console.log('View height:', data.height+"px");
+							 			that.top=data.height+"px";
+							 		}
+							 	}).exec();
+							 },500);
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			 
+			doSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback() {
+				this.mescroll.resetUpScroll()
+			},
+			/*上拉加载的回调*/
+			upCallback(page) {   
+				//联网加载数据
+				var that = this;
+				var data = {
+					isShow:1,
+					diseaseType:this.diseaseType,
+					keyword:this.keyword,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getPackageList(data).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();
+					}
+				});
+			},
+		}
+	}
+</script>
+
+
+<style lang="scss">
+	page{
+		
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	page{
+		height: 100%;
+		background-color: #f5f5f5;
+	}
+	.content{
+		height: 100%;
+		.top-content{
+			width: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 10;
+		}
+		.top-title{
+			height: 88upx;
+			line-height: 88upx;
+			font-size: 42upx;
+			font-family: Source Han Sans CN;
+			font-weight: bold;
+			color: #222222;
+			padding-left: 41upx;
+			background-color: #FFFFFF;
+		}
+		.search-cont{
+			padding: 16upx 30upx;
+			background-color: #FFFFFF;
+			.inner{
+				box-sizing: border-box;
+				width: 100%;
+				height: 72upx;
+				background: #F7F7F7;
+				border-radius: 36upx;
+				display: flex;
+				align-items: center;
+				padding: 0 30upx;
+				.icon-search{
+					width: 28upx;
+					height: 28upx;
+					margin-right: 20upx;
+				}
+				input{
+					height: 60upx;
+					line-height: 60upx;
+					flex: 1;
+				}
+			}
+		}
+		.cate-list{
+			box-sizing: border-box;
+			background: #fff;
+		}
+		.package-box{
+			display: flex;
+			align-items: flex-start;
+			justify-content: flex-start;
+			flex-wrap: wrap;
+			.item{
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				width: calc(50% - 30rpx);
+				border-radius: 15rpx;
+				margin: 15rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				&:last-child{
+				}
+				.top{
+					width:100%;
+					height:340rpx;
+					image{
+						border-radius: 15rpx 15rpx 0rpx 0rpx;
+						width:100%;
+						height:100%;
+					}
+					
+				}
+				.bottom{
+					padding: 15rpx 10rpx;
+					width: 100%;
+					.title{
+						font-weight: bold;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #111111;
+					}
+					.price-box{
+						margin-top: 10rpx;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						width: 100%;
+						.price{
+							padding: 5rpx 10rpx;
+							background-color: #C39A58;
+							border-radius: 30rpx;
+							font-size: 20upx;
+							font-family: PingFang SC;
+							color: #ffffff;
+						}
+						.count{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							color: #333333;
+						}
+						
+					}
+				}
+			}
+		}
+	}
+	 
+</style>

+ 670 - 0
pages/user/index.vue

@@ -0,0 +1,670 @@
+<template>
+	<view class="content">
+		<view class="cont">
+			<view class="bg">
+				<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/mine_top_bg.png"></image>
+			</view>
+			<view class="cont-box">
+				<view class="status_bar" :style="{height: statusBarHeight}"></view>
+				<view class="top-title">
+				</view>
+				<view class="user"  @click.stop="loginNavTo('/pages_user/personInfo')">
+					<view class="left"  >
+						<image   :src="user.avatar==null?'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/90d9eb0f8f87482b977611eb36b66d82.jpg':user.avatar"></image>
+					</view>
+					<view class="right" >
+						<view class="name-box" >
+							<view class="name">{{user.nickName}}</view>
+							<view class="btns" >
+								<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/set_icon.png"></image>
+							</view>
+						</view>
+						<view class="phone" v-if="user.phone!=''">{{$parsePhone(user.phone)}}</view>
+						<view class="counts">
+							<view class="count align-center" @click="loginNavTo('/pages_user/integral')">
+								<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/lv_icon.png" class="h28 w28 mr10"></image>
+								<text>积分 {{user.integral}}</text>
+							</view>
+							<!-- <view class="count">我的健康金 {{user.balance}}</view> -->
+						</view>
+					</view>
+				</view>
+				<view class="menus">
+					<view class="title-box"  >
+						<view class="line"></view>
+						<view class="title">我的订单</view>
+					</view>
+					<view class="menu-box">
+						<view class="menu" @click="loginNavTo('/pages_order/inquiryOrderList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/consultation_order.png"></image>
+							<view class="title">咨询订单</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_order/storeOrderList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/my_cforder.png"></image>
+							<view class="title">处方订单</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_order/packageOrderList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/service_pack.png"></image>
+							<view class="title">服务包</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_order/storeOrderRefundList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/my_service.png"></image>
+							<view class="title">售后服务</view>
+						</view>
+						 
+					</view>
+					
+				</view>
+				<view class="menus">
+					<view class="title-box">
+						<view class="line"></view>
+						<view class="title">医疗服务</view>
+					</view>
+					<view class="menu-box">
+						<view class="menu" @click="loginNavTo('/pages_user/myDoctorList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/my_doctor.png"></image>
+							<view class="title">我的医生</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_order/prescribeList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/my_prescription.png"></image>
+							<view class="title">我的处方</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_user/followList')">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/medication_report.png"></image>
+							<view class="title">我的随访</view>
+						</view>
+						<view class="menu"  @click="toIM()">
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/medical_consultation.png"></image>
+							<view class="title">用药咨询</view>
+						</view>
+						<!-- <view class="menu"  @click="navTo('/pages_user/drugReportList')" >
+							<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/my_service.png"></image>
+							<view class="title">用药报告</view>
+						</view> -->
+					</view>
+					
+				</view>
+				<view class="menus">
+					<view class="title-box">
+						<view class="line"></view>
+						<view class="title">常用应用</view>
+					</view>
+					<view class="menu-box">
+						<view class="menu" @click="loginNavTo('/pages_user/patient')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/encounter_mgmt.png"></image>
+							<view class="title">就诊管理</view>
+						</view>
+						
+						<view class="menu" @click="loginNavTo('/pages_user/address')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/address_management.png"></image>
+							<view class="title">地址管理</view>
+						</view>
+						<view class="menu"  @click="loginNavTo('/pages_user/healthRecords/index')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/health_records.png"></image>
+							<view class="title">健康档案</view>
+						</view>
+						<!-- <view class="menu"  @click="loginNavTo('/pages_user/tongue/tongueList')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png"></image>
+							<view class="title">舌苔报告</view>
+						</view> -->
+						 
+						<!-- <view class="menu"  @click="loginNavTo('/pages_user/addHealthButler')">
+							<image class="min-image" src="https://cos.his.cdwjyyh.com/fs/20250417/0eeec4b825534bfa8833eaf212cf803c.png"></image>
+							<view class="title">健康管家</view>
+						</view> -->
+						<view class="menu" @click="loginNavTo('/pages_user/myCouponList')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/my_coupon.png"></image>
+							<view class="title">我的优惠卷</view>
+						</view>
+						<view class="menu"  @click="loginNavTo('/pages_company/couponList?couponType=6')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/coupon_collection_center.png"></image>
+							<view class="title">领券中心</view>
+						</view>
+						<!-- <view class="menu"  @click="loginNavTo('/pages_order/invoice/invoiceList')">
+							<image class="min-image" src="https://cos.his.cdwjyyh.com/fs/20250811/34eb8ee3f7b3471fb919c76e4d0735cf.png"></image>
+							<view class="title">开票历史</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_user/cert')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/cert.png"></image>
+							<view class="title">资质证书</view>
+						</view> -->
+					<!-- 	<view class="menu"  @click="loginNavTo('/pages_user/price')">
+							<image class="min-image" src="https://cos.his.cdwjyyh.com/fs/20240808/415e1a6a58ec49ffaa1bb62cb376d4e8.png"></image>
+							<view class="title">价格公示</view>
+						</view> -->
+						<view class="menu"  >
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/evaluate.png"></image>
+							<view class="title">客服中心</view>
+							<button class='contact-btn' open-type="contact">
+							</button>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_user/feedback')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/consultation_complaints.png"></image>
+							<view class="title">投诉建议</view>
+						</view>
+						<!-- <view class="menu" @click="navTo('/pages_user/about')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_feedback.png"></image>
+							<view class="title">关于我们</view>
+						</view> -->
+					</view>
+				</view>
+				
+				<view class="menus">
+					<view class="title-box">
+						<view class="line"></view>
+						<view class="title">管理端</view>
+					</view>
+					<view class="menu-box">
+						<view class="menu" >
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/intelligent.png"></image>
+							<view class="title">商家入驻</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_user/registerDoctor?type=1')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/doctor_entrance.png"></image>
+							<view class="title">医生入驻</view>
+						</view>
+						<view class="menu" @click="loginNavTo('/pages_user/registerDoctor?type=2')">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/pharmacist_entrance.png"></image>
+							<view class="title">药师入驻</view>
+						</view>
+						<view class="menu" @click="toCompany()">
+							<image class="min-image" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/app/image/userimg/customer_service_login.png"></image>
+							<view class="title">客服登录</view>
+						</view>
+						 
+					</view>
+				</view>
+				<view class="btn-box" v-if="isLogin">
+					<view class="sub-btn" @click="showLogout()">退出登录</view>
+				</view>
+ 
+				<view class="tip"  >
+					<view class="title">技术支持 重庆云联融智科技有限公司 </view>
+					<!-- <view class="tel">联系电话 18696558100 </view> -->
+				</view>
+			</view>
+		</view>
+		<u-popup bgColor="#f6f6f6" :safeAreaInsetBottom="false"  :round="15" mode="bottom" :show="wxShow" @close="wxAuthClose" @open="wxAuthOpen">
+			 <view class="wxAuth">
+				 <view class="title">编辑头像和昵称</view>
+				 <wx-auth class="wx-box" @updateUser="updateUser()" ref="wxauth"   ></wx-auth>
+			 </view>
+			 
+		</u-popup>
+		<u-modal :show="show" title="提示" :showCancelButton="true"  @cancel="hideLogout()" @confirm="logout()" content='确认退出吗?'></u-modal>
+	</view>
+</template>
+<script>
+	import {getUserInfo} from '@/api/user.js'
+	import store from "@/store";
+	import {wxAuth} from '../components/wxAuth.vue';
+	import {startDrugReport,getUserFollowDoctor} from '@/api/drugReport';
+	import {navigateToDesignatedConversation,setConversation} from "@/pages_im/util/imCommon";
+	import IMSDK, {SessionType} from "openim-uniapp-polyfill";
+	export default {
+		components:{
+			wxAuth
+		},
+		data() {
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				wxShow:false,
+				isLogin:false,
+				show:false,
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				user:{
+					nickName:"登录/注册",
+					phone:"",
+					integral:0,
+					balance:0.00
+				}
+			}
+		},
+		onLoad() {
+			var that=this;
+		    this.getUserInfoCheck(true); 
+			uni.$on('loginOut', function() {
+				    //uni.removeStorage({key: "IMUserID"});
+				    //uni.setStorageSync("AppToken",null);
+					// uni.removeStorage({ key: 'IMToken' });
+					// uni.removeStorageSync("imUnread",null);
+					that.show=true;
+					that.logout();
+			});
+			
+		},
+		onShow() {
+			var that=this;
+			this.getUserInfoCheck(false);
+		},
+		onReachBottom() {
+		},
+		onPageScroll(e){
+			
+		},
+		methods: {
+			getUserInfoCheck(needIm){
+				this.$isLogin().then(res => {
+						if(res){
+							if(needIm){
+								uni.$emit('refreshIM')
+							}else{
+								this.getUserInfo();
+							}
+						}
+					},
+					rej => {}
+				);
+			},
+			updateUser(){
+				this.wxShow=false;
+				this.getUserInfo()
+			},
+			wxAuthOpen(){
+				this.wxShow=true;
+				var that=this;
+				setTimeout(function(){
+					that.$refs.wxauth.getUserInfo();
+				})
+				
+			},
+			wxAuthClose(){
+				this.wxShow=false;
+			},
+			doIM(){
+				var that=this;
+				const userInfo = uni.getStorageSync('userInfo');
+				uni.showLoading({
+					title:"处理中..."
+				});
+				getUserFollowDoctor().then(res => {
+						if(res.code==200){
+							if(res.data!=null){
+								var data=res.data;
+								var param={followId:res.data.followId};
+								startDrugReport(param).then(res => {
+										uni.hideLoading();
+		                                var user = JSON.parse(userInfo);
+		                                var uid = 'U' + user.userId;
+		                                var did='D' + data.followDoctorId;
+		                                var conversationID=`si_${did}_${uid}`;
+		                                this.$store.commit("timStore/setOrderId",data.orderId);
+		                                this.$store.commit("timStore/setFollowId",data.followId);
+		                                this.$store.commit("timStore/setImType", 2);
+		                                this.$store.commit("timStore/setConversationID", conversationID);
+		                                navigateToDesignatedConversation(did,SessionType.Single,false).then((res) => {
+											// setConversation(conversationID,JSON.stringify(ex)).then(() => {
+											// 	console.log("qxj setConversation ex:"+JSON.stringify(ex));		
+											// }).catch(() => {});
+		                                }).catch(() => uni.$u.toast("操作失败") );
+									},
+									rej => {}
+								);
+								
+							}
+							else{
+								uni.hideLoading()
+								uni.showToast({
+									icon:'none',
+									title: "当前没有药师为您服务",
+								});
+							}
+						}else{
+							uni.hideLoading()
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			toIM(){
+				var that=this;
+				this.$isLogin().then(res => {
+						if(res){
+							that.doIM();
+						}
+						else{
+							uni.navigateTo({
+								url:'/pages/auth/login'
+							})
+						}
+					}
+				);
+			},
+			callPhone(){
+				uni.makePhoneCall({
+					phoneNumber: "18696558100"
+				})
+			},
+			toCompany(){
+				this.$isLogin().then(
+					res => {
+						console.log(res)
+						if(res){
+							var token = uni.getStorageSync('CompanyUserToken');
+							if (token ) {
+								 uni.navigateTo({
+								 	url: '/pages_company/index'
+								 })
+							} else {
+								uni.navigateTo({
+									url: '/pages_company/login'
+								})
+							}
+						}
+						else{
+							uni.navigateTo({
+								url:'/pages/auth/login'
+							})
+						}
+					}
+				);
+			},
+			showLogout(){
+				this.show=true;
+			},
+			hideLogout(){
+				this.show=false;	
+			},
+			logout(){
+				this.$logout();
+				IMSDK.asyncApi(IMSDK.IMMethods.Logout, IMSDK.uuid()).then(() => {
+						callingModule?.endCall();
+						meetingModule?.endCall();
+						uni.removeStorage({key: "IMToken",});
+						uni.removeStorage({key: "IMUserID",});
+						uni.removeStorage({key: "IMHasLogin"}); 
+						
+				  }).catch((err) => console.log(err))
+				  .finally(() => {
+				      
+				  });
+				uni.reLaunch({
+					url: '/pages/index/index',
+					animationType: 'pop-in',
+					animationDuration: 100
+				})
+				this.isLogin=false;
+			},
+			getUserInfo(){
+				getUserInfo().then(res => {
+						if(res.code==200){
+							if(res.user!=null){
+								this.isLogin=true;
+								this.user=res.user;
+								uni.setStorageSync('userInfo',JSON.stringify(res.user));
+								console.log(this.user.nickName.substr(0,4));
+								if(this.user.isWeixinAuth==0){
+									this.wxAuthOpen()
+								}
+							}
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+				 
+			},
+			loginNavTo(url){
+				this.$isLogin().then(
+					res => {
+						console.log(res)
+						if(res){
+							uni.navigateTo({
+								url: url
+							})
+						}
+						else{
+							uni.navigateTo({
+								url:'/pages/auth/login'
+							})
+						}
+					}
+				);
+				 
+			}
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		.cont{
+			position: relative;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			.bg{
+				width: 100%;
+				height:450rpx;
+				// background-color: #2BC7B9;
+				// background: linear-gradient(#2BC7B9, #88e2da);
+				
+				position: fixed;
+				image{
+					border-radius: 0rpx 0rpx 50rpx 50rpx;
+					width: 100%;
+					height:100%;
+				}
+			}
+			.cont-box{
+				
+				z-index: 1000;
+				.top-title{
+					height: 88upx;
+					line-height: 88upx;
+				}
+				.user{
+					margin: 0rpx 30rpx 30rpx;
+					z-index: 101;
+					display: flex;
+					align-items: flex-start;
+					justify-content: flex-start;
+					.left{
+						image{
+							width:100rpx;
+							height:100rpx;
+							border-radius: 50%;
+						}
+					}
+					.right{
+						flex: 1;
+						margin-left: 30rpx;
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: flex-start;
+						.name-box{
+							width: 100%;
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							.name{
+								font-size: 38rpx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #111111;
+							}
+							.btns{
+								image{
+									width: 50rpx;
+									height:50rpx;
+								}
+							}
+							
+						}
+						.phone{
+							margin-top:10rpx ;
+							font-size: 32rpx;
+							font-family: PingFang SC;
+							color: #111111;
+							
+						}
+						.counts{
+							margin-top:10rpx ;
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							.count{
+								margin-right: 10rpx;
+								background: linear-gradient( 90deg, #F5CE3C 0%, #E39414 100%);
+								padding: 5rpx 15rpx;
+								border-radius: 20rpx;
+								font-size: 24rpx;
+								font-family: PingFang SC;
+								color: #ffffff;
+							}
+							
+						}
+						
+					}
+					 
+				}
+				 
+				.menus{
+					z-index: 101;
+					margin: 0rpx 30rpx 20rpx;
+					padding: 15rpx;
+					display: flex;
+					flex-direction: column;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					.title-box{
+						display: flex;
+						flex-direction: row;
+						align-items: center;
+						justify-content: flex-start;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.line{
+							margin-right: 15rpx;
+							height: 30rpx;
+							width: 6rpx;
+							background-color: #C39A58;
+							
+						}
+						 
+					}
+					.menu-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						flex-wrap: wrap;
+						.menu{
+							padding: 15rpx;
+							width:25%;
+							min-width: 25%;
+							display: flex;
+							flex-direction: column;
+							align-items: center;
+							justify-content: center;
+							position: relative;
+							image{
+								width:58rpx;
+								height:58rpx;
+							}
+							.min-image{
+								width:40rpx;
+								height:40rpx;
+							}
+							.title{
+								margin-top: 10rpx;
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+							}
+							.contact-btn {
+								position: absolute;
+								width:80rpx;
+								height:80rpx;
+								display: flex;
+								opacity: 0;
+							}
+						}
+					}
+					
+				}
+				.btn-box{
+					margin: 30rpx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					.sub-btn{
+						// box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+						border: 1rpx solid #f8f8f8;
+						background: #FFFFFF;
+						width: 100%;
+						height: 88upx;
+						line-height: 88upx;
+						text-align: center;
+						font-size: 30upx;
+						font-family: PingFang SC;
+						color: #111;
+					}
+				}
+			}
+			
+			 
+		}
+		
+	}
+	.tip{
+		margin: 30rpx 0rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		.title{
+			font-size: 24rpx;
+			color: #b5b5b5;
+			font-weight: bold;
+			
+		}
+		.tel{
+			margin-top: 15rpx;
+			font-size: 24rpx;
+			color: #b5b5b5;
+		}
+		
+		
+	}
+	.wxAuth{
+		border-radius: 30rpx;
+		width: 100%;
+		padding: 15rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		background-color: #FFFFFF;
+		.title{
+			font-size: 32rpx;
+			margin: 10rpx 0rpx;
+			font-weight: bold;
+			text-align: center;
+		}
+		.wx-box{
+			width: 100%;
+			padding: 0rpx 30rpx;
+		}
+	}
+	
+</style>

+ 260 - 0
pages_company/bindInfo.vue

@@ -0,0 +1,260 @@
+<template>
+	<view class="container" v-if="imageUrl || urlVal">
+		<view class="qrcode-box x-c">
+			<image class="qrcode" :src="imageUrl" mode="aspectFill" show-menu-by-longpress="true"></image>
+		</view>
+		<view class="share-inner">
+			<view class="share-item">
+				<view class="img">
+					<u-icon name="share-square" size="30" color="#222"></u-icon>
+				</view>
+				<text class="text">分享</text>
+				<button class='share-btn' open-type="share"></button>
+			</view>
+			<!-- <view class="share-item" @click="copyUrl()">
+				<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_copy_link.png" mode=""></image>
+				<text class="text">复制链接</text>
+			</view> -->
+			<!-- #ifndef H5 -->
+			<view class="share-item" @click="downImg()">
+				<view class="img">
+					<u-icon name="download" size="30" color="#222"></u-icon>
+				</view>
+				<text class="text">保存图片</text>
+			</view>
+			<!-- #endif -->
+		</view>
+	</view>
+	<u-empty style="padding-top: 20vh;" mode="data" v-else="imgurl"
+		icon="https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png" text="暂无数据"></u-empty>
+</template>
+
+<script>
+	import {
+		getBindInfo
+	} from "@/api/companyUser.js"
+	export default {
+		data() {
+			return {
+				imageUrl: '',
+				urlVal: '',
+				companyUserId: ''
+			}
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			console.log("fe===",this.imageUrl)
+			return {
+				title: '立即绑定,享受更多权益',
+				path: '/pages_user/bindCompanyUser?companyUserId=' + this.companyUserId,
+				imageUrl: this.imageUrl
+				// imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: '立即绑定,享受更多权益',
+				query:'companyUserId='+this.companyUserId,//页面参数
+				imageUrl: this.imageUrl
+			}
+			
+		},
+		onLoad() {
+			this.companyUserId = uni.getStorageSync('companyUserId') || '';
+			this.getInfo()
+		},
+		methods: {
+			getInfo() {
+				getBindInfo().then(res => {
+					if (res.code == 200) {
+						this.imageUrl = res.imageUrl
+						this.urlVal = res.url
+					} else {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+					}
+				})
+			},
+			copyUrl() {
+				uni.setClipboardData({
+					data: this.urlVal,
+					success: () => {
+						uni.showToast({
+							title: '复制成功',
+							icon: 'none'
+						});
+					},
+					fail: () => {
+						uni.showToast({
+							title: '复制失败',
+							icon: 'none'
+						});
+					}
+				});
+			},
+			downImg() {
+				uni.showLoading({
+					title: "图片保存中..."
+				})
+				uni.downloadFile({
+					url: this.imageUrl,
+					fail: function(res) {
+						uni.showModal({
+							title: '提示',
+							content: '保存失败',
+						})
+						uni.hideLoading();
+					},
+					success: function(res) {
+						var tempFilePath = res.tempFilePath;
+						uni.saveImageToPhotosAlbum({
+							filePath: tempFilePath,
+							success: () => {
+								uni.showToast({
+									title: "保存成功",
+									duration: 2000
+								})
+							},
+							fail: () => {
+								console.log("图片失败");
+								uni.showToast({
+									title: "图片失败",
+									duration: 2000,
+									icon: "error"
+								})
+								uni.hideLoading();
+							},
+							complete: function() {
+								uni.hideLoading();
+							}
+						})
+					},
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.container {
+		padding: 40rpx 0;
+		padding-top: 16vh;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		position: relative;
+	}
+
+	.qrcode-box {
+		width: 480rpx;
+		height: 480rpx;
+		box-sizing: border-box;
+		overflow: hidden;
+		flex-direction: column !important;
+		border-radius: 16rpx;
+		background-color: #fff;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222;
+
+		.qrcode {
+			width: 450rpx;
+			height: 450rpx;
+		}
+
+		.qrcode-title {
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #222;
+			margin-bottom: 32rpx;
+		}
+
+		.qrcode-tip {
+			margin: 32rpx;
+			color: #999;
+			text-align: center;
+		}
+	}
+
+	.downbtn {
+		width: 160rpx;
+		min-height: 68rpx;
+		border: 1px solid #FF5C03 !important;
+		color: #FF5C03 !important;
+		background-color: #fff !important;
+		border-radius: 168rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+
+		&::after {
+			border: none;
+		}
+	}
+
+	.share-inner {
+		width: 100%;
+		box-sizing: border-box;
+		padding: 0 10%;
+		display: flex;
+		flex-wrap: wrap;
+		position: absolute;
+		bottom: 0;
+		left: 0;
+
+		.share-item {
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			margin-bottom: 66upx;
+			position: relative;
+
+			.img {
+				width: 80upx;
+				height: 80upx;
+				margin-bottom: 20upx;
+				background-color: #fff;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				border-radius: 50%;
+			}
+
+			image {
+				width: 80upx;
+				height: 80upx;
+				margin-bottom: 20upx;
+			}
+
+			.text {
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #111111;
+				line-height: 1;
+			}
+		}
+	}
+
+	.share-btn {
+		position: absolute;
+		left: 50%;
+		top: 0;
+		width: 80upx;
+		height: 100%;
+		transform: translateX(-50%);
+		background-color: transparent !important;
+
+		&::after {
+			border: none;
+		}
+	}
+</style>

+ 387 - 0
pages_company/couponDetails.vue

@@ -0,0 +1,387 @@
+<template>
+  <view class="container">
+    <view class="tui-coupon-list" v-if="item!=null">
+      <view class="tui-coupon-item tui-top20"  >
+         <image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/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>
+            <view class="tui-coupon-price" :class="{ 'tui-price-small': false }">{{ item.price.toFixed(2) }}</view>
+          </view>
+          <view class="tui-coupon-intro">满{{ item.minPrice.toFixed(2) }}元可用</view>
+        </view>
+        <view class="tui-coupon-item-right">
+          <view class="tui-coupon-content">
+            <view class="tui-coupon-title-box">
+              <view class="tui-coupon-title">{{ item.title }}</view>
+            </view>
+            <view class="tui-coupon-rule">
+              <view class="tui-rule-box tui-padding-btm">
+                <view class="tui-coupon-circle"></view>
+                <view class="tui-coupon-text">不可叠加使用</view>
+              </view>
+              <view class="tui-rule-box">
+                <view class="tui-coupon-circle"></view>
+                <view class="tui-coupon-text">{{ item.limitTime }} 到期</view>
+            
+              </view>
+            </view>
+          </view>
+        </view>
+        <view class="tui-btn-box">
+			<view class="btn receive" v-if="item.remainNumber>0" @click="receive()" >立即领取</view>
+			<view class="btn cancel" v-else-if="item.remainNumber==0" >已领完</view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+import { getCouponById,genCode, receive } from '@/api/coupon'
+export default {
+  name: 'getCoupon',
+ 
+  props: {},
+  data: function() {
+    return {
+		couponId:null,
+		item:null,
+		isShare:null,
+		code:null,
+    }
+  },
+  onLoad(options) {
+	this.couponId=options.couponId;
+	this.code=options.code;
+	if(!this.$isEmpty(options.isShare)){
+		this.isShare=options.isShare
+		this.genCode();
+	}
+	else{
+		uni.hideShareMenu()
+	}
+	console.log(options.couponId)
+	this.companyId=uni.getStorageSync('companyId');
+	this.companyUserId=uni.getStorageSync('companyUserId');		 
+	this.getCouponById();
+  },
+  //发送给朋友
+  onShareAppMessage(res) {
+  	//禁止二次转发--
+  	uni.showShareMenu({
+  		withShareTicket: true
+  	});
+  	wx.updateShareMenu({
+  		isPrivateMessage: true,
+  		withShareTicket: true,
+  		success(res) {
+  			console.log('updateShareMenu: ', res);
+  		},
+  		fail() {}
+  	}); 
+  	//禁止二次转发--end
+  	return {
+  		title: this.item.title,
+  		path: "/pages_company/couponDetails?couponId="+this.item.couponId+"&companyId="+this.companyId+"&companyUserId="+this.companyUserId+"&code="+this.code,
+  	}
+  },
+  mounted: function() {
+  },
+  onShow() {
+  },
+  methods: {
+	genCode: function() {
+		let that = this
+		var data={couponId:this.couponId};
+		genCode(data)
+		  .then(function(res) {
+			that.code=res.data;
+			
+		  })
+		  .catch(function(err) {
+			
+		})
+	},
+	getCouponById: function() {
+	  	let that = this
+	  	var data={
+			couponId:this.couponId
+		}
+	  	getCouponById(data)
+	  	  .then(function(res) {
+				that.item=res.data;
+				
+	  	  })
+	  	  .catch(function(err) {
+	  	    uni.showToast({
+	  	      title: err.msg ,
+	  	      icon: 'none',
+	  	      duration: 2000,
+	  	    })
+	  	  })
+	    
+	},
+    receive: function() {
+		let that = this
+		var data={
+			couponId:this.item.couponId,
+			companyId:this.companyId,
+			companyUserId:this.companyUserId,
+			code:this.code,
+		}
+		receive(data)
+		  .then(function(res) {
+			  if(res.code==200){
+				  uni.showToast({
+				    title: '领取成功',
+				    icon: 'success',
+				    duration: 2000,
+				  })
+			  }
+			  else{
+				  uni.showToast({
+				    title: res.msg,
+				    duration: 2000,
+				  })
+			  }
+		    
+				   
+		  })
+		  .catch(function(err) {
+		    uni.showToast({
+		      title: err.msg ,
+		      icon: 'none',
+		      duration: 2000,
+		    })
+		  })
+      
+    },
+  },
+}
+</script>
+
+<style lang="less" scoped>
+page {
+  background-color: #f5f5f5;
+}
+
+.container {
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+}
+
+.tui-coupon-list {
+  width: 100%;
+  padding: 0 25rpx;
+  box-sizing: border-box;
+}
+
+.tui-coupon-banner {
+  width: 100%;
+}
+
+.tui-coupon-item {
+  width: 100%;
+  height: 210rpx;
+  position: relative;
+  display: flex;
+  align-items: center;
+  padding-right: 30rpx;
+  box-sizing: border-box;
+  overflow: hidden;
+ 
+}
+
+.tui-coupon-bg {
+  width: 100%;
+  height: 210rpx;
+  position: absolute;
+  left: 0;
+  top: 0;
+  z-index: 1;
+}
+
+.tui-coupon-sign {
+  height: 110rpx;
+  width: 110rpx;
+  position: absolute;
+  z-index: 9;
+  top: -30rpx;
+  right: 40rpx;
+}
+
+.tui-coupon-item-left {
+  width: 218rpx;
+  height: 210rpx;
+  position: relative;
+  z-index: 2;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  flex-shrink: 0;
+}
+
+.tui-coupon-price-box {
+  display: flex;
+  color: #e41f19;
+  align-items: flex-end;
+}
+
+.tui-coupon-price-sign {
+  font-size: 30rpx;
+}
+
+.tui-coupon-price {
+  font-size: 32rpx;
+  line-height: 68rpx;
+  font-weight: bold;
+}
+
+.tui-price-small {
+  font-size: 58rpx !important;
+  line-height: 56rpx !important;
+}
+
+.tui-coupon-intro {
+  background: #f7f7f7;
+  padding: 8rpx 10rpx;
+  font-size: 26rpx;
+  line-height: 26rpx;
+  font-weight: 400;
+  color: #666;
+  margin-top: 18rpx;
+}
+
+.tui-coupon-item-right {
+  flex: 1;
+  height: 210rpx;
+  position: relative;
+  z-index: 2;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding-left: 24rpx;
+  box-sizing: border-box;
+  overflow: hidden;
+}
+
+.tui-coupon-content {
+  width: 82%;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.tui-coupon-title-box {
+  display: flex;
+  align-items: center;
+}
+
+.tui-coupon-btn {
+  padding: 6rpx;
+  background: #ffebeb;
+  color: #C39A58;
+  font-size: 25rpx;
+  line-height: 25rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  transform: scale(0.9);
+  transform-origin: 0 center;
+  border-radius: 4rpx;
+  flex-shrink: 0;
+}
+
+.tui-color-grey {
+  color: #888 !important;
+}
+
+.tui-bg-grey {
+  background: #f0f0f0 !important;
+  color: #888 !important;
+}
+
+.tui-coupon-title {
+  width: 100%;
+  font-size: 26rpx;
+  color: #333;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.tui-coupon-rule {
+  padding-top: 52rpx;
+}
+
+.tui-rule-box {
+  display: flex;
+  align-items: center;
+  transform: scale(0.8);
+  transform-origin: 0 100%;
+}
+
+.tui-padding-btm {
+  padding-bottom: 6rpx;
+}
+
+.tui-coupon-circle {
+  width: 8rpx;
+  height: 8rpx;
+  background: rgb(160, 160, 160);
+  border-radius: 50%;
+}
+
+.tui-coupon-text {
+  font-size: 28rpx;
+  line-height: 28rpx;
+  font-weight: 400;
+  color: #666;
+  padding-left: 8rpx;
+  white-space: nowrap;
+}
+
+.tui-top20 {
+  margin-top: 20rpx;
+}
+
+.tui-coupon-title {
+  font-size: 28rpx;
+  line-height: 28rpx;
+}
+
+.tui-coupon-radio {
+  transform: scale(0.7);
+  transform-origin: 100% center;
+}
+
+.tui-btn-box {
+  position: absolute;
+  right: 20rpx;
+  bottom: 40rpx;
+  z-index: 10;
+  .btn{
+  	width: 155upx;
+  	height: 64upx;
+  	line-height: 64upx;
+  	font-size: 26upx;
+  	font-family: PingFang SC;
+  	font-weight: 500;
+  	text-align: center;
+  	border-radius: 32upx;
+  	margin-left: 15upx;
+
+  	&.cancel{
+  		border: 1px solid #C39A58;
+  		color: #C39A58;
+  	}
+  	&.receive{
+  		background: #C39A58;
+  		color: #FFFFFF;
+  	}
+  }
+}
+ 
+</style>

+ 460 - 0
pages_company/couponList.vue

@@ -0,0 +1,460 @@
+<template>
+	<view class="content">
+		<view class="top-content" v-if="couponType==5||couponType==6">
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_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>
+			<view class="cate-list">
+				<!-- 关键字列表 -->
+				<scroll-view   scroll-x="true" >
+					<view class="inner">
+						<view v-for="(item,index) in cateOptions" :key="index" :class="cateId == item.dictValue?'item active':'item'" @click="choseCate(item)">
+							{{ item.dictLabel }}
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+		<mescroll-body :top="couponType==5||couponType==6?'192rpx':'0rpx'" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
+		<view class="tui-coupon-list">
+		  <view class="tui-coupon-item tui-top20" v-for="(item, index) in dataList" :key="index">
+		     <image :src="baseUrl + '/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>
+		        <view class="tui-coupon-price" :class="{ 'tui-price-small': false }">{{ item.price.toFixed(2) }}</view>
+		      </view>
+		      <view class="tui-coupon-intro">满{{ item.minPrice.toFixed(2) }}元可用</view>
+		    </view>
+		    <view class="tui-coupon-item-right">
+		      <view class="tui-coupon-content">
+		        <view class="tui-coupon-title-box">
+		          <view class="tui-coupon-title">{{ item.title }}</view>
+		        </view>
+		        <view class="tui-coupon-rule">
+		          <view class="tui-rule-box tui-padding-btm">
+		            <view class="tui-coupon-circle"></view>
+		            <view class="tui-coupon-text">不可叠加使用</view>
+		          </view>
+		          <view class="tui-rule-box">
+		            <view class="tui-coupon-circle"></view>
+		            <view class="tui-coupon-text">{{ item.limitTime }} 到期</view>
+		          </view>
+		        </view>
+		      </view>
+		    </view>
+		    <view class="tui-btn-box">
+				<view class="btn receive"   @click="navTo('/pages_company/couponDetails?isShare='+isShare+'&couponId='+item.couponId)">查看</view>
+		    </view>
+		  </view>
+		</view>
+		</mescroll-body>
+  </view>
+</template>
+<script>
+import {getDictByKey} from '@/api/common.js'
+import { getCouponList } from '@/api/coupon.js'
+import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+export default {
+	name: 'UserCoupon',
+	props: {},
+	mixins: [MescrollMixin], // 使用mixin
+	data: function() {
+		return {
+			baseUrl:uni.getStorageSync('requestPath'),
+			keyword: '',
+			cateOptions:[],
+			cateId:null,
+			couponType:null,
+			mescroll:null,
+			downOption: {   //下拉刷新
+				use:true,
+				auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+			},
+			upOption: {
+				onScroll:false,
+				use: true, // 是否启用上拉加载; 默认true
+				page: {
+					pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+					size: 10 // 每页数据的数量,默认10
+				},
+				noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+				textNoMore:"已经到底了",
+				empty: {
+					icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+					tip: '暂无数据'
+				}
+			},
+			dataList: [],
+			isShare:null,
+		}
+	},
+	watch: {
+    
+	},
+	onLoad(options) {
+		this.couponType=options.couponType;
+		this.isShare=options.isShare;
+	},
+	onShow() {
+		if(this.couponType==5){
+			this.getDictByKey("sys_package_private_type");
+		}
+		else if(this.couponType==6){
+			this.getDictByKey("sys_package_disease_type");
+		}
+	},
+	methods: {
+		choseCate(item) {
+			this.cateId = item.dictValue;
+			this.mescroll.resetUpScroll()
+		},
+		getDictByKey(key){
+			var data={key:key}
+			getDictByKey(data).then(
+				res => {
+					if(res.code==200){
+						this.cateOptions=res.data;
+					}
+				},
+				err => {
+				}
+			);
+			
+		},
+		doSearch(){
+			this.mescroll.resetUpScroll()
+		},
+		navTo(url){
+			uni.navigateTo({
+				url: url
+			})
+		},
+		mescrollInit(mescroll) {
+			this.mescroll = mescroll;
+		},
+		/*下拉刷新的回调 */
+		downCallback() {
+			this.mescroll.resetUpScroll()
+		},
+		/*上拉加载的回调*/
+		upCallback(page) {   
+			//联网加载数据
+			var that = this;
+			var data = {
+				keyword:this.keyword,
+				couponType:this.couponType,
+				pageNum: page.num,
+				pageSize: page.size
+			};
+			if(this.cateId!=null){
+				data.cateId=this.cateId;
+			}
+			getCouponList(data).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();
+				}
+			});
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+	.content{
+		height: 100%;
+		.top-content{
+			width: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 10;
+		}
+		.search-cont{
+			padding: 16upx 30upx;
+			background-color: #FFFFFF;
+			.inner{
+				box-sizing: border-box;
+				width: 100%;
+				height: 72upx;
+				background: #F7F7F7;
+				border-radius: 36upx;
+				display: flex;
+				align-items: center;
+				padding: 0 30upx;
+				.icon-search{
+					width: 28upx;
+					height: 28upx;
+					margin-right: 20upx;
+				}
+				input{
+					height: 60upx;
+					line-height: 60upx;
+					flex: 1;
+				}
+			}
+		}
+		.cate-list{
+			box-sizing: border-box;
+			background: #fff;
+			padding: 10upx 27upx;
+			height: 100upx;
+			.inner{
+				display: flex;
+			}
+			.item{
+				flex-shrink: 0;
+				padding: 0 24upx;
+				height: 64upx;
+				line-height: 64upx;
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #C39A58;
+				background: #ffffff;
+				border: 1px solid #E2C99E;
+				border-radius: 32upx;
+				margin: 0 20upx 20upx 0;
+				&.active{
+					color: #FFFFFF;
+					background: #C39A58;
+					border: 1px solid #C39A58;
+				}
+			}
+		}
+		 
+		 
+	}
+	.tui-coupon-list {
+		margin-top: 0upx;
+		width: 100%;
+		padding: 0 25rpx;
+		box-sizing: border-box;
+	}
+	
+	.tui-coupon-banner {
+	  width: 100%;
+	}
+	
+	.tui-coupon-item {
+	  width: 100%;
+	  height: 210rpx;
+	  position: relative;
+	  display: flex;
+	  align-items: center;
+	  padding-right: 30rpx;
+	  box-sizing: border-box;
+	  overflow: hidden;
+	 
+	}
+	
+	.tui-coupon-bg {
+	  width: 100%;
+	  height: 210rpx;
+	  position: absolute;
+	  left: 0;
+	  top: 0;
+	  z-index: 1;
+	}
+	
+	.tui-coupon-sign {
+	  height: 110rpx;
+	  width: 110rpx;
+	  position: absolute;
+	  z-index: 9;
+	  top: -30rpx;
+	  right: 40rpx;
+	}
+	
+	.tui-coupon-item-left {
+	  width: 218rpx;
+	  height: 210rpx;
+	  position: relative;
+	  z-index: 2;
+	  display: flex;
+	  align-items: center;
+	  justify-content: center;
+	  flex-direction: column;
+	  flex-shrink: 0;
+	}
+	
+	.tui-coupon-price-box {
+	  display: flex;
+	  color: #e41f19;
+	  align-items: flex-end;
+	}
+	
+	.tui-coupon-price-sign {
+	  font-size: 30rpx;
+	}
+	
+	.tui-coupon-price {
+	  font-size: 32rpx;
+	  line-height: 68rpx;
+	  font-weight: bold;
+	}
+	
+	.tui-price-small {
+	  font-size: 58rpx !important;
+	  line-height: 56rpx !important;
+	}
+	
+	.tui-coupon-intro {
+	  background: #f7f7f7;
+	  padding: 8rpx 10rpx;
+	  font-size: 26rpx;
+	  line-height: 26rpx;
+	  font-weight: 400;
+	  color: #666;
+	  margin-top: 18rpx;
+	}
+	
+	.tui-coupon-item-right {
+	  flex: 1;
+	  height: 210rpx;
+	  position: relative;
+	  z-index: 2;
+	  display: flex;
+	  align-items: center;
+	  justify-content: space-between;
+	  padding-left: 24rpx;
+	  box-sizing: border-box;
+	  overflow: hidden;
+	}
+	
+	.tui-coupon-content {
+	  width: 82%;
+	  display: flex;
+	  flex-direction: column;
+	  justify-content: center;
+	}
+	
+	.tui-coupon-title-box {
+	  display: flex;
+	  align-items: center;
+	}
+	
+	.tui-coupon-btn {
+	  padding: 6rpx;
+	  background: #ffebeb;
+	  color: #C39A58;
+	  font-size: 25rpx;
+	  line-height: 25rpx;
+	  display: flex;
+	  align-items: center;
+	  justify-content: center;
+	  transform: scale(0.9);
+	  transform-origin: 0 center;
+	  border-radius: 4rpx;
+	  flex-shrink: 0;
+	}
+	
+	.tui-color-grey {
+	  color: #888 !important;
+	}
+	
+	.tui-bg-grey {
+	  background: #f0f0f0 !important;
+	  color: #888 !important;
+	}
+	
+	.tui-coupon-title {
+	  width: 100%;
+	  font-size: 26rpx;
+	  color: #333;
+	  white-space: nowrap;
+	  overflow: hidden;
+	  text-overflow: ellipsis;
+	}
+	
+	.tui-coupon-rule {
+	  padding-top: 52rpx;
+	}
+	
+	.tui-rule-box {
+	  display: flex;
+	  align-items: center;
+	  transform: scale(0.8);
+	  transform-origin: 0 100%;
+	}
+	
+	.tui-padding-btm {
+	  padding-bottom: 6rpx;
+	}
+	
+	.tui-coupon-circle {
+	  width: 8rpx;
+	  height: 8rpx;
+	  background: rgb(160, 160, 160);
+	  border-radius: 50%;
+	}
+	
+	.tui-coupon-text {
+	  font-size: 28rpx;
+	  line-height: 28rpx;
+	  font-weight: 400;
+	  color: #666;
+	  padding-left: 8rpx;
+	  white-space: nowrap;
+	}
+	
+	.tui-top20 {
+	  margin-top: 20rpx;
+	}
+	
+	.tui-coupon-title {
+	  font-size: 28rpx;
+	  line-height: 28rpx;
+	}
+	
+	.tui-coupon-radio {
+	  transform: scale(0.7);
+	  transform-origin: 100% center;
+	}
+	
+	.tui-btn-box {
+	  position: absolute;
+	  right: 20rpx;
+	  bottom: 40rpx;
+	  z-index: 10;
+	  .btn{
+	  	width: 155upx;
+	  	height: 64upx;
+	  	line-height: 64upx;
+	  	font-size: 26upx;
+	  	font-family: PingFang SC;
+	  	font-weight: 500;
+	  	text-align: center;
+	  	border-radius: 32upx;
+	  	margin-left: 15upx;
+	  	&.cancel{
+	  		border: 1px solid red;
+	  		color: red;
+	  	}
+	  	&.receive{
+	  		background: #C39A58;
+	  		color: #FFFFFF;
+	  	}
+	  }
+	}
+	
+	
+</style>

+ 275 - 0
pages_company/index.vue

@@ -0,0 +1,275 @@
+<template>
+	<view class="top-cont">
+		<view class="content">
+			<view class="user-info">
+				<view class="left">
+					<view class="name-phone">
+						<view class="name" v-if="user!=null">{{user.nickName}}</view>
+						<view class="phone" v-if="user!=null">{{$parsePhone(user.phonenumber)}}</view>
+					</view>
+				</view>
+				<view class="msg-box"  v-if="user!=null" >
+					 {{user.deptName}}
+				</view>
+			</view>
+			<!-- 常用工具 -->
+			<view class="used-tools">
+				<view class="title">常用工具</view>
+				<view class="tools-list">
+					<view class="item"  @click="navTo('/pages_company/couponList?isShare=1&couponType=5')">
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_my_coupon.png" mode=""></image>
+						<text class="text">私域疗法券</text>
+					</view>
+					<view class="item"  @click="navTo('/pages_company/couponList?isShare=1&couponType=2')">
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_my_coupon.png" mode=""></image>
+						<text class="text">中药免单券</text>
+					</view>
+					<view class="item"  @click="navTo('/pages_company/couponList?isShare=1&couponType=4')">
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_my_coupon.png" mode=""></image>
+						<text class="text">中药打折券</text>
+					</view>
+					<view class="item" @click="navTo('/pages_company/packageList')">
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_2.png" mode=""></image>
+						<text class="text">疗法</text>
+					</view>
+					<view class="item" @click="navTo('/pages_order/inquirySelectType?companyId='+companyId+'&companyUserId='+companyUserId+'&isShare=1')">
+					 	<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+					 	<text class="text">会诊</text>
+					</view>
+					<view class="item" @click="navTo('/pages_order/inquirySelect?inquiryType=3&companyId='+companyId+'&companyUserId='+companyUserId+'&isShare=1')">
+					 	<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+					 	<text class="text">按方开药</text>
+					</view>
+					<view class="item" @click="navTo('/pages_company/packageOrderList')">
+					 	<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+					 	<text class="text">套餐订单</text>
+					</view>
+					<view class="item" @click="navTo('/pages_company/inquiryOrderList')">
+					 	<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+					 	<text class="text">问诊订单</text>
+					</view>
+					<view class="item" @click="navTo('/pages_company/storeOrderList')">
+					 	<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+					 	<text class="text">药品订单</text>
+					</view>
+					<view class="item" @click="navTo('/pages_user/healthRecords/index')">
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+						<view class="text">健康档案</view>
+					</view>
+					<view class="item" @click="navTo('/pages_company/bindInfo')">
+					 	<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_company_3.png" mode=""></image>
+					 	<text class="text">公司码</text>
+					</view>
+				</view>
+			</view>
+			<!-- 退出登录按钮 -->
+			<view class="logout" @click="logout">退出登录</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	import {getUserInfo,getQrImg} from '@/api/companyUser'
+	export default {
+		data() {
+			return {
+				companyId:null,
+				companyUserId:null,
+				user:null,
+			};
+		},
+		onLoad() {
+		},
+		onShow() {
+			this.companyId=uni.getStorageSync('companyId');
+			this.companyUserId=uni.getStorageSync('companyUserId');	
+			console.log(this.companyUserId)
+			this.getUserInfo()
+		},
+		onShareAppMessage(res) {
+			return {
+				title: "问诊",
+				path: '/pages/TUIKit/TUIPages/TUIConversation/index',
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		methods: {
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			getUserInfo(){
+				var data={}
+				getUserInfo(data).then(
+					res => {
+						if(res.code==200){
+							  this.user=res.data;
+						}
+						else{
+							uni.setStorageSync('CompanyUserToken',null);
+							uni.showToast({
+								icon:'none',
+								title: res.msg,
+							});
+							uni.navigateBack({
+								delta:-1
+							})	
+						}
+					},
+					rej => {}
+				);
+			},
+			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.$isLogin().then(res => {
+					if(res){
+						uni.navigateTo({
+							url: url
+						})
+					}
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content{
+		padding: 20upx;
+		.user-info{
+			padding: 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			.left{
+				position: relative;
+				display: flex;
+				.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{
+						width: 100%;
+						height: 100%;
+					}
+				}
+				.name-phone{
+					padding-top: 15upx;
+					.name{
+						font-size: 36upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+						line-height: 1;
+					}
+					.phone{
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						line-height: 1;
+						margin-top: 30upx;
+					}
+				}
+			}
+			.msg-box{
+				padding: 10rpx 20upx;
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #FFFFFF;
+				border-radius: 8rpx;
+				background-color: #C39A58;
+			}
+		}
+		.used-tools{
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 40upx 30upx;
+			
+			.title{
+				font-size: 32upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #222222;
+				line-height: 1;
+			}
+			.tools-list{
+				margin-top: 50upx;
+				display: flex;
+				flex-wrap: wrap;
+				width: 100%;
+				.item{
+					box-sizing: border-box;
+					width: 25%;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					margin-bottom: 50upx;
+					position: relative;
+					image{
+						width: 44upx;
+						height: 44upx;
+					}
+					.text{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						line-height: 1;
+						margin-top: 20upx;
+					}
+					.share-btn{
+						display: inline-block;
+						position: absolute;
+						top: 0;
+						left: 0;
+						width: 100%;
+						height: 100%;
+						opacity: 0;
+					}
+				}
+			}
+		}
+		.logout{
+			height: 80upx;
+			line-height: 80upx;
+			text-align: center;
+			font-size: 26upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			margin-top: 20upx;
+		}
+	}
+</style>

+ 649 - 0
pages_company/inquiryOrderDetails.vue

@@ -0,0 +1,649 @@
+<template>
+	<view class="content">
+		<view class="cont">
+			<view class="other-info" v-if="order!=null">
+				<view class="title">付款详情</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">订单类型:</text>
+						<text class="text">{{$getDictLabelName(inquiryTypeOptions,order.inquiryType)}}</text>
+						<text class="text">-{{$getDictLabelName(orderTypeOptions,order.orderType)}}</text>
+					</view>
+					<view class="status red" v-if="order.status==1">
+						{{$getDictLabelName(orderStatusOptions,order.status)}}
+					</view>
+					<view class="status red" v-if="order.status==2">
+						{{$getDictLabelName(orderStatusOptions,order.status)}}
+					</view>
+					<view class="status green" v-if="order.status==3">
+						{{$getDictLabelName(orderStatusOptions,order.status)}}
+					</view>
+					<view class="status green" v-if="order.status==4">
+						{{$getDictLabelName(orderStatusOptions,order.status)}}
+					</view>
+					<view class="status gray" v-if="order.status<0">
+						{{$getDictLabelName(orderStatusOptions,order.status)}}
+					</view>
+				</view>
+				 
+			</view>
+			<view class="doc-box" v-if="doctor!=null">
+				<view class="title">医生详情</view>
+				<view class="doc-name-box">
+					<view class="doc-name">
+						{{doctor.doctorName}}
+					</view>
+					<view class="doc-star">
+						<u-rate activeColor="#ffc603" count="5" readonly v-model="doctor.pingStar"></u-rate>
+					</view>
+				</view>
+				<view class="doc-dept-box">
+					{{department.deptName}}|{{doctor.position}}
+				</view>
+				<view class="doc-his-box">
+					{{hospital.hospitalName}}
+				</view>
+				<view class="doc-spec-box">
+					<view class="left">
+						<view class="title">擅长:</view>
+						<view class="spec">{{doctor.speciality}}</view>
+					</view>
+					<view class="right">
+						<view class="btn" @click="navTo('/pages/doctor/doctorDetails?doctorId='+doctor.doctorId)" >详情</view>
+					</view>
+				</view>
+			</view>
+			<view class="other-info" v-if="patient!=null&&order.inquiryType==1">
+				<view class="title">咨询内容</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">患者信息:</text>
+						<text class="text">{{patient.patientName}} {{patient.sex==1?"男":"女"}} {{patient.age}}岁</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">病情描述:</text>
+						<text class="text">{{patient.title}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">患病时间:</text>
+						<text class="text">{{patient.duration}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">就诊情况:</text>
+						<text class="text">{{patient.isVisit}}</text>
+					</view>
+				</view>
+			</view>
+			<view class="other-info" v-if="patient!=null&&order.inquiryType==2">
+				<view class="title">咨询内容</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">患者信息:</text>
+						<text class="text">{{patient.patientName}} {{patient.sex==1?"男":"女"}} {{patient.age}}岁</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">身高(CM):</text>
+						<text class="text">{{patient.height}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">体重(KG):</text>
+						<text class="text">{{patient.weight}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">联系电话:</text>
+						<text class="text">{{patient.mobile}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">学习进度:</text>
+						<text class="text">{{patient.study}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">期望会诊方式:</text>
+						<text class="text">{{patient.usage}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">病情描述:</text>
+						<text class="text">{{patient.title}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">正在服用药品:</text>
+						<text class="text">{{patient.drugs}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">本次患病时间:</text>
+						<text class="text">{{patient.duration}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">是否就诊过:</text>
+						<text class="text">{{patient.isVisit}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">舌苔照片:</text>
+					</view>
+					 
+				</view>
+				<view>
+					<u-album :urls="tongueImages"></u-album>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">面部照片:</text>
+					</view>
+					 
+				</view>
+				<view>
+					<u-album :urls="faceImages"></u-album>
+				</view>
+			 
+				<view class="item">
+					<view class="left">
+						<text class="label">检测报告或患处照片:</text>
+					</view>
+					 
+				</view>
+				<view>
+					<u-album :urls="reportImages"></u-album>
+				</view>
+			</view>
+			<view class="other-info" v-if="patient!=null&&order.inquiryType==3">
+				<view class="title">咨询内容</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">患者信息:</text>
+						<text class="text">{{patient.patientName}} {{patient.sex==1?"男":"女"}} {{patient.age}}岁</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">病情描述:</text>
+						<text class="text">{{patient.title}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">正在服用药品:</text>
+						<text class="text">{{patient.drugs}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">本次患病时间:</text>
+						<text class="text">{{patient.duration}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">是否就诊过:</text>
+						<text class="text">{{patient.isVisit}}</text>
+					</view>
+				</view>
+				 
+				<view class="item">
+					<view class="left">
+						<text class="label">检测报告或患处照片:</text>
+					</view>
+					 
+				</view>
+				
+				<view>
+					<u-album :urls="reportImages"></u-album>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">舌苔照片:</text>
+					</view>
+					 
+				</view>
+				<view>
+					<u-album :urls="tongueImages"></u-album>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">面部照片:</text>
+					</view>
+					 
+				</view>
+				<view>
+					<u-album :urls="faceImages"></u-album>
+				</view>
+			</view>
+			<view class="other-info" v-if="report!=null&&order.status>=3"  >
+				<view class="title">体检信息</view>
+				<view class="item"  v-for="(item) in forms">
+					<view class="left">
+						<text class="label">{{item.title}}:</text>
+						<text class="text">
+							<u-tag  size="mini" plain type="success" style="margin-right: 5rpx;margin-bottom: 5rpx;" v-for="(tag,i) in item.option" :key="i" :text="tag"></u-tag>
+						</text>
+					</view>
+				</view>
+			</view>
+			<view class="other-info" v-if="order!=null">
+				<view class="title">订单信息</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">订单号码:</text>
+						<text class="text">{{order.orderSn}}</text>
+					</view>
+					<view class="item-btn" @click="copyOrderSn">复制</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">下单时间:</text>
+						<text class="text">{{order.createTime}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">订单金额:</text>
+						<text class="text">{{order.money.toFixed(2)}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">优惠金额:</text>
+						<text class="text">{{order.discountMoney.toFixed(2)}}</text>
+					</view>
+				</view>
+				<view class="item">
+					<view class="left">
+						<text class="label">支付金额:</text>
+						<text class="text">{{order.payMoney.toFixed(2)}}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="btn-box" v-if="order!=null">
+			<view class="btn" v-if="report!=null&&order.status>=3" @click="navTo('/pages_order/inquiryOrderReport?orderId='+order.orderId)"  >查看报告</view>
+		</view>
+	</view>
+</template>
+ 
+<script  >
+	import store from "@/store";
+	import {getCompanyUserInquiryOrderById,cancel} from '@/api/inquiryOrder.js'
+	import {getDictByKey} from '@/api/common.js'
+	import {navigateToDesignatedConversation,setConversation} from "@/pages_im/util/imCommon";
+	import IMSDK, {SessionType} from "openim-uniapp-polyfill";
+	export default {
+		data() {
+			return {
+				report:null,
+				patient:null,
+				hospital:null,
+				department:null,
+				doctor:null,
+				order:null,
+				orderId:null,
+				orderStatusOptions:[],
+				orderTypeOptions:[],
+				inquiryTypeOptions:[],
+				reportImages: [],
+				tongueImages:[],
+				faceImages:[],
+				forms:[],
+			}
+		},
+		 
+		onLoad(options) {
+			this.orderId=options.orderId;
+			this.getDictByKey("sys_inquiry_order_type");
+			this.getDictByKey("sys_inquiry_type");
+			this.getDictByKey("sys_inquiry_status");
+		},
+		onShow() {
+			this.getCompanyUserInquiryOrderById();
+		},
+		methods: {
+			cancel(){
+				var that=this;
+				uni.showModal({
+					title:"提示",
+					content:"确认取消订单吗?",
+					showCancel:true,
+					cancelText:'取消',
+					confirmText:'确定',
+					success:res=>{
+						if(res.confirm){
+							// 用户点击确定
+							var data={orderId:this.orderId}
+							cancel(data).then(
+								res => {
+									if(res.code==200){
+										that.getMyInquiryOrderById()
+										uni.showToast({
+										 	icon:'success',
+										 	title: "操作成功",
+										});
+									}else{
+										uni.showToast({
+											icon:'none',
+											title: res.msg,
+										});
+									}
+								},
+								rej => {}
+							);
+														
+						}else{
+							// 否则点击了取消  
+						}
+					}
+				})
+			},
+			ping(){
+				uni.navigateTo({
+					url: "/pages_order/pingOrder?orderId="+this.orderId+"&doctorId="+this.order.doctorId
+				})
+			},
+			pay(){
+				uni.navigateTo({
+					url: "/pages_order/inquiryPay?orderId="+this.orderId
+				})
+			},
+			toIM(){
+				var that=this;
+				var userId=uni.getStorageSync('userId');
+				var did='D' + this.order.doctorId;
+				var conversationID=`si_D${this.order.doctorId}_U${userId}`;
+				var ex={imType:1,orderId:this.order.orderId,orderType:this.order.orderType,followId:"",type:"startInquiry"}
+				this.$store.commit("timStore/setType","startInquiry");
+				this.$store.commit("timStore/setOrderType",this.order.orderType);
+				this.$store.commit("timStore/setOrderId",this.order.orderId);
+				this.$store.commit("timStore/setFollowId", 0);
+				this.$store.commit("timStore/setImType", 1);
+				this.$store.commit("timStore/setConversationID", conversationID);
+				navigateToDesignatedConversation(did,SessionType.Single,false).then((res) => {
+					// setConversation(conversationID,JSON.stringify(ex)).then(() => {
+						
+					// }).catch(() => {});
+				}).catch(() => uni.$u.toast("操作失败") );
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			copyOrderSn() {
+				uni.setClipboardData({
+					data: this.order.orderSn,
+					success: function () {
+						uni.showToast({
+							title:'复制成功',
+							icon:'none'
+						})
+					}
+				})
+			},
+			getCompanyUserInquiryOrderById(){
+				var that=this;
+				var data={orderId:this.orderId}
+				getCompanyUserInquiryOrderById(data).then(
+					res => {
+						if(res.code==200){
+							this.order=res.data.order;
+							this.report=res.data.report;
+							this.patient=JSON.parse(res.data.order.patientJson);
+							if(this.report!=null&&this.report.formJson!=null){
+							 	this.forms=JSON.parse(this.report.formJson)
+							}
+							if(that.patient.reportImages!=null){
+								that.reportImages=that.patient.reportImages.split(",");
+							}
+							if(that.patient.tongueImages!=null){
+								that.tongueImages=that.patient.tongueImages.split(",");
+							}
+							if(that.patient.faceImages!=null){
+								that.faceImages=that.patient.faceImages.split(",");
+							}
+							
+							this.doctor=res.data.doctor;
+							this.department=res.data.department;
+							this.hospital=res.data.hospital;
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_inquiry_order_type"){
+								this.orderTypeOptions=res.data;
+							}
+							if(key=="sys_inquiry_type"){
+								this.inquiryTypeOptions=res.data;
+							}
+							if(key=="sys_inquiry_status"){
+								this.orderStatusOptions=res.data;
+							}
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			} 
+		}
+	}
+</script>
+<style lang="scss">
+	page{
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.content{
+		position: relative;
+		.cont{
+			position: relative;
+			padding: 0rpx 20rpx 120rpx;
+			z-index: 999;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+		}
+		.doc-box{
+			margin: 20rpx 0rpx 0rpx;
+			padding: 0rpx 30rpx;
+			background-color: #fff;
+			border-radius: 20upx;
+			.title{
+				height: 80upx;
+				line-height: 80upx;
+				font-size: 30upx;
+				color: #000;
+				font-weight: bold;
+				border-bottom: 2upx solid #eeeeee;
+			}
+			.doc-name-box{
+				margin-top: 15rpx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				.doc-name{
+					font-size: 38rpx;
+					font-weight: bold;
+				}
+				.doc-star{
+					margin-left: 10rpx;
+				}
+				
+				
+			}
+			.doc-dept-box{
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				margin-top: 15rpx;
+				font-size: 28upx;
+				font-family: PingFang SC;
+				color: #2d2b36;
+				 
+			}
+			.doc-his-box{
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				margin-top: 15rpx;
+				font-size: 28upx;
+				font-family: PingFang SC;
+				color: #9a9a9c;
+				 
+			}
+			.doc-spec-box{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.left{
+					display: flex;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+					}
+					.spec{
+						margin-left: 10rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+					}
+				}
+				.right{
+					.btn{
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #C39A58;
+					}
+				}
+				
+			}
+		}
+		 
+		.other-info{
+			margin-top: 20upx;
+			background-color: #fff;
+			border-radius: 20upx;
+			padding: 0 30upx;
+			.title{
+				height: 80upx;
+				line-height: 80upx;
+				font-size: 30upx;
+				color: #000;
+				font-weight: bold;
+				border-bottom: 2upx solid #eeeeee;
+			}
+			.item{
+				min-height: 80upx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				&:last-child{
+					border-bottom: none;
+				}
+				.left{
+					flex: 1;
+					display: flex;
+					align-items: center;
+					.label{
+						min-width: 140rpx;
+						font-size: 28upx;
+						color: #000;
+					}
+					.text{
+						font-size: 28upx;
+						color: #1b1b1b;
+					}
+				}
+				.status{
+					font-size: 28upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+				}
+				.red{
+					color: #db5053;
+				}
+				.green{
+					color: #C39A58;
+				}
+				.gray{
+					color: #9c9c9c;
+				}
+				.item-btn{
+					max-width: 200rpx;
+					padding: 0rpx 15rpx;
+					height: 48upx;
+					border-radius: 24upx;
+					line-height: 48upx;
+					font-size: 24upx;
+					color: #000;
+					border: 1upx solid #d8d8d8;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+			}
+		}
+		.btn-box{
+		 	height: 100rpx;
+		 	z-index: 9999;
+		 	width: 100%;
+		 	padding: 0rpx 30upx;
+		 	position: fixed;
+		 	bottom: 0;
+		 	left: 0;
+		 	box-sizing: border-box;
+		 	background-color: #ffffff;
+		 	display: flex;
+		 	align-items: center;
+		 	justify-content: flex-end;
+		 	.btn{
+				padding: 15rpx 30rpx;
+				margin-left: 10rpx;
+		 		text-align: center;
+		 		font-size: 28upx;
+		 		font-family: PingFang SC;
+		 		color: #FFFFFF;
+		 		background: #C39A58;
+		 		border-radius: 45upx;
+		 	}
+		 }
+	}
+</style>

+ 407 - 0
pages_company/inquiryOrderList.vue

@@ -0,0 +1,407 @@
+<template>
+	<view class="content">
+		<view class="top-fixed">
+			 <u-tabs
+			  :scrollable="false"
+			  :list="tabs"  
+			  lineColor="#C39A58"
+			 @change="inquiryTypeChange">
+			 </u-tabs>
+		</view>
+		<mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
+		<view class="order-list">
+			<view class="order-item"  v-for="(item) in dataList" @click="navTo('./inquiryOrderDetails?orderId='+item.orderId)">
+				<view class="order-top"  >
+					<view class="left" v-if="item.doctorId!=null">
+						<image class="head" mode="aspectFill" :src="item.avatar"></image>
+						<view class="name">
+							{{item.doctorName}}
+						</view>
+						<view class="dept">
+							{{item.deptName}}
+						</view>
+					</view>
+					<view class="left" v-if="item.inquiryType==2">
+						<view class="title" v-if="item.status==1">
+							支付后为您安排医生接诊
+						</view>
+						<view class="title" v-if="item.status==2">
+							正在为您安排医生接诊
+						</view>
+						<view class="title" v-if="item.status==-1">
+							订单已取消
+						</view>
+						<view class="title" v-if="item.status==-2">
+							订单已退款
+						</view>
+						<view class="title" v-if="item.status==-3">
+							医生已拒单
+						</view>
+					</view>
+					<view class="status red" v-if="item.status==1">
+						{{$getDictLabelName(orderStatusOptions,item.status)}}
+					</view>
+					<view class="status red" v-if="item.status==2">
+						{{$getDictLabelName(orderStatusOptions,item.status)}}
+					</view>
+					<view class="status green" v-if="item.status==3">
+						{{$getDictLabelName(orderStatusOptions,item.status)}}
+					</view>
+					<view class="status green" v-if="item.status==4">
+						{{$getDictLabelName(orderStatusOptions,item.status)}}
+					</view>
+					<view class="status gray" v-if="item.status<0">
+						{{$getDictLabelName(orderStatusOptions,item.status)}}
+					</view>
+				</view>
+				<view class="order-cont">
+					<view class="order-type"  >
+						订单类型:
+						<text>{{$getDictLabelName(inquiryTypeOptions,item.inquiryType)}}</text>
+						<text>-{{$getDictLabelName(orderTypeOptions,item.orderType)}}</text>
+					</view>
+					<view class="order-desc">病情描述:{{item.title}}</view>
+					<view class="order-time-box">
+						<view class="order-time">
+							{{item.createTime}}
+						</view>
+						<view class="right">
+							<view class="btn"  @click.stop="navTo('./inquiryOrderDetails?orderId='+item.orderId)"  >查看</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import store from "@/store";
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import {cancel,getCompanyUserInquiryOrderList} from '@/api/inquiryOrder.js'
+	import {getDictByKey} from '@/api/common.js'
+	import {navigateToDesignatedConversation,setConversation} from "@/pages_im/util/imCommon";
+	import IMSDK, {SessionType} from "openim-uniapp-polyfill";
+	export default {
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				orderStatusOptions:[],
+				orderTypeOptions:[],
+				inquiryTypeOptions:[],
+				tabs:[
+					{
+						id:2,
+						name:'快速问诊'
+					},
+					{
+						id:1,
+						name:'专家问诊'
+					},
+					{
+						id:3,
+						name:'开药问诊'
+					}
+					 
+				],
+				inquiryType:2,
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		onLoad() {
+			this.getDictByKey("sys_inquiry_order_type");
+			this.getDictByKey("sys_inquiry_type");
+			this.getDictByKey("sys_inquiry_status");
+			var that=this;
+			uni.$on('refreshInquiryOrder', () => {
+				that.mescroll.resetUpScroll()
+			})
+		},
+		onShow() {
+		},
+		methods: {
+			cancel(item){
+				var that=this;
+				uni.showModal({
+					title:"提示",
+					content:"确认取消订单吗?",
+					showCancel:true,
+					cancelText:'取消',
+					confirmText:'确定',
+					success:res=>{
+						if(res.confirm){
+							// 用户点击确定
+							var data={orderId:item.orderId}
+							cancel(data).then(
+								res => {
+									if(res.code==200){
+										this.mescroll.resetUpScroll()
+										uni.showToast({
+										 	icon:'success',
+										 	title: "操作成功",
+										});
+									}else{
+										uni.showToast({
+											icon:'none',
+											title: res.msg,
+										});
+									}
+								},
+								rej => {}
+							);
+														
+						}else{
+							// 否则点击了取消  
+						}
+					}
+				})
+			},
+			ping(item){
+				uni.navigateTo({
+					url: "/pages_order/pingOrder?orderId="+item.orderId
+				})
+			},
+			pay(item){
+				uni.navigateTo({
+					url: "/pages_order/inquiryPay?orderId="+item.orderId
+				})
+			},
+			toIM(item){
+				var that=this;
+				var userId=uni.getStorageSync('userId');
+				var did='D' + item.doctorId;
+				var conversationID=`si_D${item.doctorId}_U${userId}`;
+				this.$store.commit("timStore/setImType", 1);
+				this.$store.commit("timStore/setConversationID", conversationID);
+				navigateToDesignatedConversation(did,SessionType.Single,false).then((res) => {
+					
+				}).catch(() => {
+				    console.warn("获取会话 异常 = ");
+				});
+			},
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_inquiry_order_type"){
+								this.orderTypeOptions=res.data;
+							}
+							if(key=="sys_inquiry_type"){
+								this.inquiryTypeOptions=res.data;
+							}
+							if(key=="sys_inquiry_status"){
+								this.orderStatusOptions=res.data;
+							}
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			inquiryTypeChange(item){
+				this.inquiryType=item.id
+				console.log(item)
+				this.mescroll.resetUpScroll()
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback() {
+				this.mescroll.resetUpScroll()
+			},
+			/*上拉加载的回调*/
+			upCallback(page) {   
+				//联网加载数据
+				var that = this;
+				var data = {
+					inquiryType:this.inquiryType,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getCompanyUserInquiryOrderList(data).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();
+					}
+				});
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		.top-fixed{
+			width: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 10;
+			height: 88upx;
+			background-color: #fff;
+		}
+		.order-list{
+			width: 100%;
+			padding: 15rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: flex-start;
+			justify-content: flex-start;
+			.order-item{
+				margin-bottom: 15rpx;
+				width: 100%;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				.order-top{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					width: 100%;
+					padding-bottom: 15rpx;
+					border-bottom: 1px solid #efefef;
+					.left{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						image{
+							width:80rpx;
+							height:80rpx;
+							border-radius: 50%;
+						}
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.name{
+							margin-left: 20rpx;
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.dept{
+							margin-left: 15rpx;
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #9a9a9c;
+						}
+						 
+					}
+					.status{
+						font-size: 28upx;
+						font-family: PingFang SC;
+					}
+					.red{
+						color: #db5053;
+					}
+					.green{
+						color: #C39A58;
+					}
+					.gray{
+						color: #9c9c9c;
+					}
+				}
+				.order-cont{
+					width: 100%;
+					margin-top: 15rpx;
+					.order-type{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						// font-weight: bold;
+						color: #111111;
+					}
+					.order-desc{
+						margin-top: 15rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						// font-weight: bold;
+						color: #111111;
+					}
+					.order-time-box{
+						width: 100%;
+						margin-top: 15rpx;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						.order-time{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							color: #9a9a9c;
+						}
+						.right{
+							.btn{
+								padding: 10rpx 30rpx;
+								border: 1rpx solid #C39A58;
+								color: #C39A58;
+								font-size: 28rpx;
+								border-radius: 30rpx;
+							}
+						}
+					}
+				}
+				
+			}
+		} 
+		
+	}
+	 
+</style>

+ 141 - 0
pages_company/login.vue

@@ -0,0 +1,141 @@
+<template>
+  <view class="content">
+  	<view class="inner">
+  		<view class="form-box">
+  			<view class="form-item">
+  				<text class="label">员工帐号</text>
+  				<input type="text" v-model="form.userName" placeholder="登录帐号" placeholder-class="form-input" />
+  			</view>
+  			<view class="form-item">
+  			 	<text class="label">员工密码</text>
+  			 	<input type="password" v-model="form.password"   placeholder="登录密码" placeholder-class="form-input" />
+  			</view>
+  		</view>
+  	</view>
+  	<view class="btn-box">
+  		<view class="sub-btn" @click="submit()">员工登录</view>
+  	</view>
+  </view>
+</template>
+
+<script>
+import {login} from '@/api/companyUser'
+export default {
+  data() {
+    return {
+		form:{
+			userName:null,
+			password:null,
+		}
+    }
+  },
+  computed: {
+  },
+  onLoad() {
+  },
+  onHide() {
+  },
+  onUnload() {
+  },
+  mounted() {
+    
+  },
+  methods: {
+	submit(){
+	 	login(this.form).then(
+	 		res => {
+	 			if(res.code==200){
+	 				 uni.showToast({
+	 				 	icon:'success',
+	 				 	title: "登录成功",
+	 				 });
+					 uni.setStorageSync('companyId',res.user.companyId);
+					 uni.setStorageSync('companyUserId',res.user.userId);
+					 uni.setStorageSync('CompanyUserToken',res.companyUserToken);
+					 uni.redirectTo({
+					 	url: '/pages_company/index'
+					 }) 
+	 				
+	 			}else{
+	 				uni.showToast({
+	 					icon:'none',
+	 					title: res.msg,
+	 				});
+	 			}
+	 		},
+	 		rej => {}
+	 	);
+	 },
+  },
+  
+}
+</script>
+
+<style lang="scss">
+	page{
+		height: 100%;
+	}
+	.content{
+		display: flex;
+		flex-direction: column;
+		justify-content: flex-start;
+		.inner{
+			padding: 20upx;
+			.form-box{
+				padding: 0 30upx;
+				background: #FFFFFF;
+				border-radius: 16upx;
+				.form-item{
+					padding: 30upx 0;
+					display: flex;
+					align-items: flex-start;
+					border-bottom: 1px solid #F1F1F1;
+					&:last-child{
+						border-bottom: none;
+					}
+					.label{
+						width: 150upx;
+						text-align: left;
+						font-size: 30upx;
+						line-height: 44upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #222222;
+						flex-shrink: 0;
+					}
+					input{
+						text-align: left;
+					}
+					.form-input{
+						font-size: 30upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #999999;
+						text-align: left;
+					}
+					 
+				}
+			}
+			 
+		}
+		.btn-box{
+			height: 120upx;
+			padding: 0 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.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: #C39A58;
+				border-radius: 44upx;
+			}
+		}
+	}
+</style>

+ 853 - 0
pages_company/packageDetails.vue

@@ -0,0 +1,853 @@
+<template>
+	<view class="content">
+		<!-- <view class="img-box"  @click="showImg()">
+			<image  :src="item.imgUrl"></image>
+		</view> -->
+		<!-- 购买轮播列表 -->
+		 <view class="buy-lists" v-if="notics&&notics.length>0" :style="{height: boxHeight+'px'}">
+			<view :class="{'buy-top': animate == true }" :style="{marginTop: animate == true ? `-${marginTop}px`:'0'}">
+				<view class="buy-list buy-txtbox" v-for="(item,index) in notics" :key="index">
+					<view class="buy-item"><text class="textOne buy-name" >{{item.fsUserName|| ''}}</text><text>{{item.timeTxt}} 已下单</text></view>
+				</view>
+			</view>
+		 </view>
+		<view class="cont-box">
+			<view class="goods-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"
+					@change="swiperChange"
+				>
+					<swiper-item  class="swiper-item" v-for="(item,index) in  imgs" :key="index">
+						<image :src="item" mode="aspectFit"></image>
+					</swiper-item>
+				</swiper>
+				<!-- 数量 -->
+				<view class="num-box">{{ activeImg }}/{{ imgs.length }}</view>
+			</view>
+			<view class="package-box">
+				<view class="title">{{item.packageName}}</view>
+				<view class="desc">
+					<view class="cycle" v-if="item.cycle>0">服务周期{{item.cycle}}天</view>
+					<view class="duration" v-if="item.duration>0">签约时长{{item.duration}}天</view>
+				</view>
+				<view class="num-box">
+					<view class="price-box">
+						<view class="price"  v-if="item!=null">¥{{item.price.toFixed(2)}}元/日</view>
+						<view class="price"  v-if="item!=null&&item.packageSubType==1">咨询包</view>
+						<view class="price"  v-if="item!=null&&item.packageSubType==2">治疗包</view>
+						<view class="price"  v-if="item!=null&&item.packageSubType==3">产品包</view>
+					</view>
+					<view class="count">{{item.sales}}人已购</view>
+				</view>
+			</view>
+			<view class="drug-box" v-if="products.length>0 ">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">处方列表</view>
+				</view>
+				<view class="drug-list"  >
+					<view  v-for="(product,index) in products"  class="drug-item" >
+						<view class="drug" v-if="displayMore==0?index<2:true" >
+							<view class="img-box">
+								<image :src="product.image" mode="aspectFill"></image>
+							</view>
+							<view class="drug-info"   >
+								<view>
+									<view class="name-box ellipsis2">
+										{{product.productName}} 
+									</view>
+									<view class="spec">{{product.sku}}</view>
+								</view>
+								<view class="num-box">
+									<view class="use">
+										{{product.usageMethod}}
+									</view>
+									<view class="price">
+										
+										<!-- <text class="unit">¥</text>
+										<text class="num">{{product.price.toFixed(2)}}</text> -->
+									</view>
+									<!-- <view class="amount">x{{product.count}}</view> -->
+								</view>
+							</view>
+						</view>
+						
+					</view>
+				</view>
+				<view v-if="products.length>2" class="display-more" @click="showMore()" >{{displayText}}</view>
+				
+			</view>
+			<view class="desc-box" v-if="describe.use!=null">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">疗程</view>
+				</view>
+				<view class="desc" v-if="describe!=null" v-html="describe.use">
+				</view>
+			</view>
+			<view class="desc-box" v-if="item.indication!=null">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">功能主治</view>
+				</view>
+				<view class="desc" v-if="item!=null" v-html="item.indication">
+				</view>
+			</view>
+			<view class="desc-box">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">疗法详情</view>
+				</view>
+				<view class="desc" v-html="item.desc">
+				</view>
+			</view>
+			<view class="desc-box" v-if="describe.usageMethod!=null">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">服用/使用方式</view>
+				</view>
+				<view class="desc" v-html="describe.usageMethod">
+				</view>
+			</view>
+			<view class="desc-box" v-if="describe.forPeople!=null">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">适宜人群</view>
+				</view>
+				<view class="desc" v-html="describe.forPeople">
+				</view>
+			</view>
+			<view class="desc-box" v-if="describe.tabooPeople!=null">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">禁忌人群</view>
+				</view>
+				<view class="desc" v-html="describe.tabooPeople">
+				</view>
+			</view>
+			<view class="desc-box" v-if="item.explain!=null">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">方解/搭配优势</view>
+				</view>
+				<view class="desc" v-html="item.explain">
+				</view>
+			</view>
+		</view>
+		<view class="btn-foot">
+			<view class="p-price-box">
+				<view class="p-name">¥</view>
+				<view class="p-price" v-if="item!=null">{{item.totalPrice.toFixed(2)}}</view>
+			</view>
+			<view class="btn-box">
+				<view class="btn buy"   >
+					分享
+					<button class="contact-btn"   data-name="shareBtn" open-type="share">分享</button>
+				</view>
+				
+			</view>
+		</view>
+	</view> 
+</template>
+
+<script>
+	import { caculateTimeago } from '@/utils/tools.js';
+	import {getConfigByKey} from '@/api/common'
+	import {getPackageById,getPackageDoctorList,getNewOrderByPackageId} from '@/api/package.js'
+	export default {
+		data() {
+			return {
+				displayText:"查看更多",
+				displayMore:0,
+				imgs:[],
+				activeImg: 1,
+				doctorShow:false,
+				doctors:[],
+				products:[],
+				packageId:null,
+				item:{},
+				describe:null,
+				doctorId:null,
+				doctorPageNum:1,
+				doctorLastPage:false,
+				doctorTotal:0,
+				choose: 0,
+				boxHeight: 94,
+				marginTop: 30,
+				animate:false,
+				timer:null,
+				notics:[],
+			};
+		},
+		onLoad(option) {
+			this.packageId=option.packageId;
+			this.companyId=uni.getStorageSync('companyId');
+			this.companyUserId=uni.getStorageSync('companyUserId');		
+		},
+		onReady() {
+			this.getNewOrderByPackageId()
+		},
+		onUnload() {
+			if(this.timer) clearInterval(this.timer)
+		},
+		onShow() {
+			this.getPackageById();
+			this.getPackageDoctorList();
+			if(this.packageId) {
+				this.getConfigByKey()
+			}
+		},
+		onShareAppMessage(res) {
+			return {
+				title: this.item.packageName,
+				path: '/pages_index/packageDetails?packageId='+this.packageId+"&companyId="+this.companyId+"&companyUserId="+this.companyUserId+'&choose='+this.choose|| '',
+				imageUrl: this.item.imgUrl //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+		},
+		methods:{
+			getNewOrderByPackageId() {
+				if(this.timer) clearInterval(this.timer)
+				getNewOrderByPackageId({packageId:this.packageId}).then(res=>{
+					if(res.code== 200) {
+						this.notics = res.data
+						if(res.data&&res.data.length > 0) {
+							this.notics = res.data.map(item=>({
+								...item,
+								timeTxt: caculateTimeago(new Date(item.payTime).getTime(),1)
+							}))
+							
+							this.getText()
+							this.timer = setInterval(this.scroll, 1200);
+						}
+					} else {
+						this.notics = []
+					}
+				})
+			},
+			scroll() {
+				this.animate = true;
+				setTimeout(() => {
+					this.notics.push(this.notics[0]);
+					this.notics.shift();
+					this.animate = false;
+				}, 1000);
+			},
+			getText() {
+				const query = uni.createSelectorQuery().in(this);
+				query
+				  .select(".buy-txtbox")
+				  .boundingClientRect((data) => {
+					this.marginTop = data.height + 7
+					if(this.notics.length>2) {
+						this.boxHeight = this.marginTop * 3 + 4
+					} else {
+						this.boxHeight = this.marginTop * this.notics.length + 4
+					}
+				  })
+				  .exec();
+			},
+			showMore(){
+				this.displayMore=this.displayMore==1?0:1;
+				this.displayText=this.displayMore==1?'收起':'查看更多'
+				console.log(this.displayText)
+			},
+			swiperChange(event) {
+				this.activeImg = event.detail.current + 1
+			},
+			handleDoctorClick(item){
+				this.doctorShow=false;
+				this.doctorId=item.doctorId
+				uni.navigateTo({
+					url:"/pages_index/packageForm?packageId="+this.packageId+"&doctorId="+this.doctorId
+				})
+				
+			},
+			lower(event) {
+				if(this.doctorTotal>this.doctors.length){
+					this.doctorPageNum++;
+					this.getPackageDoctorList();
+				}
+			},
+			 
+			doctorOpen(){
+				this.doctorShow=true;
+			},
+			doctorClose(){
+				this.doctorShow=false;
+			},
+			showImg() {
+				 //预览图片
+				 uni.previewImage({
+				 	urls: this.imgs,
+				 	current: this.imgs[0]
+				 });
+			},
+			getPackageDoctorList(){
+				if(this.doctorLastPage){
+					return;
+				}
+				var data = {
+					packageId:this.packageId,
+					pageNum: this.doctorPageNum,
+					pageSize: 10
+				};
+				var that=this;
+				getPackageDoctorList(data).then(
+					res => {
+						if(res.code==200){
+							//设置列表数据
+							if (this.doctorPageNum == 0) {
+								that.doctors = res.data.list; 
+								
+							} else {
+								that.doctors = that.doctors.concat(res.data.list);
+								 
+							}
+							this.doctorLastPage=res.data.isLastPage;
+							this.doctorTotal=res.data.total
+							console.log(that.doctors)
+							 
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getPackageById(){
+				let data = {packageId:this.packageId};
+				getPackageById(data).then(
+					res => {
+						if(res.code==200){
+							this.item=res.data;
+							if(res.data.images!=null){
+								this.imgs=res.data.images.split(",")
+							}
+							else{
+								this.activeImg=0;
+							}
+							this.describe=JSON.parse(this.item.describeJson);
+							if(this.item.productJson!=null){
+								this.products=JSON.parse(this.item.productJson);
+							}
+							console.log(this.imgs)
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getConfigByKey(){
+				let param = {key:"app.config"};
+				getConfigByKey(param).then(
+					res => {
+						if(res.code==200){
+							let data=res.data ? JSON.parse(res.data) : {};
+							const fsPackage = data.fsPackage&&data.fsPackage.length > 0 ? data.fsPackage[0] : {}
+							this.choose = fsPackage&&fsPackage.packageId == this.packageId ? 2 : 0
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		height: 100%;
+	}
+	.textOne {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+	.buy-lists{
+		height: 94px;
+		background-color:transparent;
+		overflow: hidden;
+		width: 60%;
+		position: absolute;
+		z-index: 99;
+		top: 20vh;
+		left: 20rpx;
+	}
+	.buy-list{
+		height: 23px;
+		font-size: 26rpx;
+		margin-top: 7px;
+		overflow: hidden;
+		color: #fff;
+		.buy-item {
+			display: inline-flex;
+			align-items: center;
+			height: 100%;
+			line-height: 100%;
+			overflow: hidden;
+			background-color: rgba(0, 0, 0, 0.35);
+			border-radius: 10rpx;
+			padding: 0 20rpx;
+			box-sizing: border-box;
+			word-break: break-all;
+			white-space: nowrap;
+		}
+		.buy-name {
+			width: 50%;
+			margin-right: 10rpx;
+		}
+		text {
+			word-break: break-all;
+			white-space: nowrap;
+		}
+	}
+	.buy-top {
+	    transition: all 0.8s ease-in;
+	    margin-top: -30px;
+	  }
+	.content{
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		 
+		.cont-box{
+			padding-bottom: 121rpx;
+			.package-box{
+				background-color: #fff;
+				padding: 20rpx;
+				width: 100%;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				 
+				.title{
+					font-weight: bold;
+					font-size: 34upx;
+					font-family: PingFang SC;
+					color: #111;
+				}
+				.desc{
+					margin-top: 15rpx;
+					display: flex;
+					align-items: flex-start;
+					justify-content: flex-start;
+					.cycle{
+						background-color: #eee;
+						border-radius: 30rpx;
+						padding: 5rpx 15rpx;
+						font-size: 26upx;
+						font-family: PingFang SC;
+						color: #C39A58;
+					}
+					.duration{
+						margin-left: 10rpx;
+						background-color: #eee;
+						border-radius: 30rpx;
+						padding: 5rpx 15rpx;
+						font-size: 26upx;
+						font-family: PingFang SC;
+						color: #C39A58;
+					}
+					
+				}
+				.num-box{
+					margin-top: 15rpx;
+					flex: 1;
+					display: flex;
+					align-items: flex-end;
+					justify-content: space-between;
+					width: 100%;
+					.price-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						.price{
+							margin-right: 10rpx;
+							padding: 5rpx 10rpx;
+							background-color: #C39A58;
+							border-radius: 30rpx;
+							font-size: 20upx;
+							font-family: PingFang SC;
+							color: #ffffff;
+						}
+					}
+					.count{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						color: #333333;
+					}
+					
+				}
+				
+				 
+			}
+			.desc-box{
+				background-color: #fff;
+				padding: 20rpx;
+				margin-top: 10rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.desc{
+					margin-top: 15rpx;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					color: #9a9a9c;
+				}
+			}
+			.drug-box{
+				background-color: #fff;
+				padding: 20rpx;
+				margin-top: 10rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.drug-list{
+					margin-top: 15rpx;
+					.drug-item{
+						.drug{
+							padding-bottom: 15upx;
+							border-bottom: 1px soli #F0F0F0;
+							display: flex;
+							align-items: center;
+							.img-box{
+								width: 160upx;
+								height: 160upx;
+								margin-right: 30upx;
+								flex-shrink: 0;
+								image{
+									width: 100%;
+									height: 100%;
+								}
+							}
+							.drug-info{
+								width: calc(100% - 190upx);
+								height: 160upx;
+								display: flex;
+								flex-direction: column;
+								justify-content: space-between;
+								.name-box{
+									font-size: 28upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #111111;
+									line-height: 40upx;
+									.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;
+									}
+								}
+								.spec{
+									font-size: 24upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #999999;
+									line-height: 1;
+									margin-top: 10upx;
+								}
+								.num-box{
+									display: flex;
+									align-items: center;
+									justify-content: space-between;
+									.price{
+										display: flex;
+										align-items: flex-end;
+										.unit{
+											font-size: 24upx;
+											font-family: PingFang SC;
+											font-weight: 500;
+											color: #111111;
+											line-height: 1.2;
+											margin-right: 4upx;
+										}
+										.num{
+											font-size: 32upx;
+											font-family: PingFang SC;
+											font-weight: 500;
+											color: #111111;
+											line-height: 1;
+										}
+									}
+									.use{
+										font-size: 24upx;
+										font-family: PingFang SC;
+										color: #999999;
+									}
+									.amount{
+										font-size: 24upx;
+										font-family: PingFang SC;
+										font-weight: 500;
+										color: #999999;
+										line-height: 1;
+									}
+								}
+							}
+						}
+						
+					}
+				}
+				.display-more{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+			}
+		}
+	}
+	 
+	.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;
+		.p-price-box{
+			display: flex;
+			align-items: center;
+			.p-name{
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #FF6633;
+			}
+			.p-price{
+				margin-left: 10rpx;
+				color: #FF6633;
+				font-size: 32upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				
+			}
+		}
+		 
+		.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;
+				}
+			 
+				&.buy{
+					background: #C39A58;
+				}
+				.contact-btn{
+					display: inline-block;
+					position: absolute;
+					top: 0;
+					left: 0;
+					width: 100%;
+					height: 100%;
+					opacity: 0;
+					z-index: 9999;
+				}
+			}
+			
+		}
+	}
+	.doctors{
+		overflow-y: auto;
+		padding: 20rpx;
+		height: 650rpx;
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		align-items: flex-start;
+		justify-content: flex-start;
+		box-sizing: border-box;
+		.scroll-list{
+			height: 650upx;
+		}
+		.doctor{
+			width: 100%;
+			margin-bottom: 15rpx;
+			background: #f9f8fe;
+			padding: 20rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: flex-start;
+			justify-content: flex-start;
+			&:last-child{
+				margin-bottom: 0rpx;
+			}
+			.item{
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.left{
+					flex: 1;
+					width: 100%;
+					display: flex;
+					align-items: flex-start;
+					justify-content: flex-start;
+					.doc-img{
+						width:80rpx;
+						height:80rpx;
+						border-radius: 50%;
+					}
+					.right{
+						width: calc(100% - 100rpx); 
+						margin-left: 20rpx;
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: flex-start;
+						.doc-box{
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							.doc-name{
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #111111;
+								
+							}
+							.doc-position{
+								margin-left: 50rpx;
+								font-size: 26upx;
+								font-family: PingFang SC;
+								color: #2d2b36;
+							}
+						}
+						.hospital{
+							margin-top: 10rpx;
+							font-size: 24upx;
+							font-family: PingFang SC;
+							color: #9a9a9c;
+						}
+					}
+				}
+				.btn{
+					padding: 10rpx 30rpx;
+					text-align: center;
+					border-radius: 30upx;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					color: #C39A58;
+					border:1rpx solid  #C39A58;
+					 
+				}
+				
+			}
+			
+		}
+	}
+	.goods-banner{
+		height: 756upx;
+		background-color: #FFFFFF;
+		position: relative;
+		.swiper-item{
+			box-sizing: border-box;
+		}
+		.swiper,
+		.swiper-item,
+		.swiper-item image{
+			width: 100%;
+			height: 100%;
+		}
+		.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;
+		}
+	}
+</style>

+ 536 - 0
pages_company/packageList.vue

@@ -0,0 +1,536 @@
+<template>
+	<view>
+		<view class="top-content">
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_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>
+			<view class="cate-list">
+				<!-- 关键字列表 -->
+				<scroll-view   scroll-x="true" >
+					<view class="inner">
+						<view v-for="(item,index) in cates" :key="index" :class="privateType == item.cateCode?'item active':'item'" @click="choseType(item)">
+							{{ item.cateName }}
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+			 
+		</view>
+		<mescroll-body  top="192rpx"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="package-list">
+				<view  v-for="(item,index) in dataList" :key="index" class="item" >
+					<view class="top-box">
+						<view class="title">{{item.packageName}}</view>
+						<view class="subtitle">别名:{{item.secondName}}</view>
+					</view>
+					<!-- 药品列表 -->
+					<view class="drug-list"  >
+						<view v-for="(subItem,subIndex) in item.products" :key="subIndex" class="drug-item" :class="item.displayMore==0?'hide':'show'">
+							<view class="img-box">
+								<image :src="subItem.image" mode="aspectFill"></image>
+							</view>
+							<view class="drug-info"  >
+								<view>
+									<view class="name-box ellipsis2">
+										{{subItem.productName}}
+									</view>
+									<view class="spec">{{subItem.sku}}</view>
+								</view>
+								<view class="num-box">
+									<view class="price" v-if="subItem.price!=null">
+										<text class="unit">¥</text>
+										<text class="num" >{{subItem.price.toFixed(2)}}</text>
+									</view>
+									<view class="amount">x{{subItem.count}}</view>
+								</view>
+							</view>
+						</view>
+						<view class="display-more" @click="showMore(item)" >{{item.displayText}}</view>
+						<!-- 实付金额、按钮 -->
+						<view class="bottom-box">
+							<view class="amount-paid">
+								<text class="label">套餐价格:</text>
+								<view class="price-box" v-if="item.totalPrice!=null">
+									<view class="unit">¥</view>
+									<view class="num" >{{item.totalPrice.toFixed(2)}}</view>
+								</view>
+							</view>
+							<view class="btn-box">
+								<view  class="btn pay" @click.stop="navTo('/pages_company/packageDetails?packageId='+item.packageId)">
+									查看详情
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- <view class="package-box"  >
+				<view class="item"  @click="navTo('/pages_company/packageDetails?packageId='+item.packageId)" v-for="(item,index) in dataList">
+					<view class="top">
+						<image :src="item.imgUrl"></image>
+					</view>
+					<view class="bottom">
+						<view class="title ellipsis2">
+							{{item.packageName}}
+						</view>
+						<view class="price-box">
+							<view class="price">¥{{item.price.toFixed(2)}}元/日</view>
+							<view class="count">{{item.sales}}人已购</view>
+						</view>
+					</view>
+				</view>
+			</view> -->
+		</mescroll-body>
+		
+	</view>
+</template>
+
+<script>
+	import {getPackageList,getPackagCateList} from '@/api/package.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				cates:[],
+				privateType:0,
+				keyword: '',
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			};
+		},
+		onShow() {
+			this.getPackagCateList(2);
+		},
+		methods:{
+			getPackagCateList(type){
+				var data={type:type}
+				getPackagCateList(data).then(
+					res => {
+						if(res.code==200){
+							 this.cates=res.data;
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			showMore(item){
+				item.displayMore=item.displayMore==1?0:1;
+				item.displayText=item.displayMore==1?'收起':'点击查看方案明细'
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			doSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isShow:0,
+					keyword:this.keyword,
+					privateType:this.privateType,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getPackageList(data).then(res => {
+					if(res.code==200){
+						//设置列表数据
+						res.data.list.forEach(function(element) {
+						   element.displayMore=0
+						   element.displayText='点击查看方案明细'
+						   if(element.productJson!=null){
+							   element.products=JSON.parse(element.productJson)
+						   }
+						   else{
+							   element.products=[]
+						   }
+						   
+						   
+						});
+						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();
+					}
+				});
+			},
+			choseType(item) {
+				this.privateType = item.cateCode;
+				this.mescroll.resetUpScroll()
+			},
+			 
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top-content{
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+	.search-cont{
+		padding: 16upx 30upx;
+		background-color: #FFFFFF;
+		.inner{
+			box-sizing: border-box;
+			width: 100%;
+			height: 72upx;
+			background: #F7F7F7;
+			border-radius: 36upx;
+			display: flex;
+			align-items: center;
+			padding: 0 30upx;
+			.icon-search{
+				width: 28upx;
+				height: 28upx;
+				margin-right: 20upx;
+			}
+			input{
+				height: 60upx;
+				line-height: 60upx;
+				flex: 1;
+			}
+		}
+	}
+	.cate-list{
+		box-sizing: border-box;
+		background: #fff;
+		padding: 10upx 27upx;
+		height: 100upx;
+		.inner{
+			display: flex;
+		}
+		.item{
+			flex-shrink: 0;
+			padding: 0 24upx;
+			height: 64upx;
+			line-height: 64upx;
+			font-size: 28upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #C39A58;
+			background: #ffffff;
+			border: 1px solid #E2C99E;
+			border-radius: 32upx;
+			margin: 0 20upx 20upx 0;
+			&.active{
+				color: #FFFFFF;
+				background: #C39A58;
+				border: 1px solid #C39A58;
+			}
+		}
+	}
+	.package-box{
+		margin-top: 20rpx;
+		display: flex;
+		align-items: flex-start;
+		justify-content: flex-start;
+		flex-wrap: wrap;
+		.item{
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			background-color: #fff;
+			width: calc(50% - 20rpx);
+			border-radius: 15rpx;
+			margin: 10rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: flex-start;
+			justify-content: flex-start;
+			&:last-child{
+			}
+			.top{
+				width:100%;
+				height:300rpx;
+				image{
+					border-radius: 15rpx 15rpx 0rpx 0rpx;
+					width:100%;
+					height:300rpx;
+				}
+				
+			}
+			.bottom{
+				width: 100%;
+				padding: 15rpx 10rpx;
+				.title{
+					font-weight: bold;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					color: #111111;
+				}
+				.price-box{
+					margin-top: 10rpx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					width: 100%;
+					.price{
+						padding: 5rpx 10rpx;
+						background-color: #C39A58;
+						border-radius: 30rpx;
+						font-size: 20upx;
+						font-family: PingFang SC;
+						color: #ffffff;
+					}
+					.count{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						color: #333333;
+					}
+					
+				}
+			}
+		}
+	}
+	.package-list{
+		padding: 20upx;
+		.item{
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 0 30upx;
+			margin-bottom: 20upx;
+			.top-box{
+				padding: 34upx 0 20upx;
+				.title{
+					font-size: 28upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					font-weight: bold;
+					color: #111111;
+				}
+				.subtitle{
+					margin-top: 5rpx;
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+				 
+			}
+			.drug-list{
+				.drug-item{
+					padding-bottom: 30rpx;
+					border-bottom: 1px soli #F0F0F0;
+					display: flex;
+					align-items: center;
+					.img-box{
+						width: 160upx;
+						height: 160upx;
+						margin-right: 30upx;
+						flex-shrink: 0;
+						image{
+							width: 100%;
+							height: 100%;
+						}
+					}
+					.drug-info{
+						width: calc(100% - 190upx);
+						height: 160upx;
+						display: flex;
+						flex-direction: column;
+						justify-content: space-between;
+						.name-box{
+							font-size: 28upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							line-height: 40upx;
+							.tag{
+								display: inline-block;
+								padding: 0 6upx;
+								height: 30upx;
+								background: linear-gradient(90deg, #C39A58 0%, #C39A58 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;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+							margin-top: 10upx;
+						}
+						.num-box{
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							.price{
+								display: flex;
+								align-items: flex-end;
+								.unit{
+									font-size: 24upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #111111;
+									line-height: 1.2;
+									margin-right: 4upx;
+								}
+								.num{
+									font-size: 32upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #111111;
+									line-height: 1;
+								}
+							}
+							.amount{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 1;
+							}
+						}
+					}
+				}
+				.show{
+					visibility: flex;
+				}
+				.hide{
+					display: none;
+				}
+				.display-more{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+				}
+				.bottom-box{
+					height: 110upx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.amount-paid{
+						display: flex;
+						align-items: center;
+						.label{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+						}
+						.price-box{
+							display: flex;
+							align-items: flex-end;
+							.unit{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #FF6633;
+								line-height: 1.2;
+								margin-right: 4upx;
+							}
+							.num{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #FF6633;
+								line-height: 1;
+							}
+						}
+					}
+					.btn-box{
+						box-sizing: border-box;
+						display: flex;
+						align-items: center;
+						.btn{
+							width: 155upx;
+							height: 64upx;
+							line-height: 64upx;
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							text-align: center;
+							border-radius: 32upx;
+							margin-left: 15upx;
+							&:first-child{
+								margin-left: 0;
+							}
+							&.cancel{
+								border: 1px solid #DDDDDD;
+								color: #666666;
+							}
+							&.pay{
+								background: #C39A58;
+								color: #FFFFFF;
+								position: relative;
+								.share{
+									display: inline-block;
+									position: absolute;
+									top: 0;
+									left: 0;
+									width: 100%;
+									height: 100%rpx;
+									opacity: 0;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		
+	}
+</style>

+ 465 - 0
pages_company/packageOrderDetails.vue

@@ -0,0 +1,465 @@
+<template>
+	<view>
+		<view class="cont">
+			<view class="bg"></view>
+			<view class="inner">			
+				<!-- 订单状态 -->
+				<view class="order-status">
+					<!-- 待付款 -->
+					<view v-if="order.status == 1" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/67eda0644e5847008096525b04cd12ca.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">待付款</text>
+							<!-- <text class="desc">请在{{payLimitTime}}前完成支付</text> -->
+						</view>
+					</view>
+					<!-- 服务中 -->
+					<view v-if="order.status == 2" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/b71efb4b5ca54564b553569d578738b4.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">服务中</text>
+							<text class="desc">正在服务中</text>
+						</view>
+					</view>
+					<!-- 已完成 -->
+					<view v-if="order.status == 3" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/0712ba14f3a648afa69c9912fcbf9b61.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">已完成</text>
+							<text class="desc">服务已完成</text>
+						</view>
+					</view>
+					<!--交易取消 -->
+					<view v-if="order.status == -1" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/02f95bd03e854a9c8076aef1e6c05e74.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">交易关闭</text>
+							<text class="desc">订单已取消</text>
+						</view>
+					</view>
+					<view v-if="order.status == -2" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/6020712aa10f4bb08db92957cb7eb8ed.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">退款成功</text>
+							<text class="desc">已成功退款</text>
+						</view>
+					</view>
+				</view>
+				<view class="content">
+					<view class="package-box">
+						<view class="left">
+							<image :src="package.imgUrl"></image>
+						</view>
+						<view class="right">
+							<view class="title">{{package.packageName}}</view>
+							<view class="desc">
+								<view class="cycle">用药周期{{package.cycle}}天</view>
+								<view class="duration">签约时长{{package.duration}}天</view>
+							</view>
+							<!-- <view class="price-box">
+								<view class="price">¥30元/日</view>
+								<view class="count">6.2w人已购</view>
+							</view> -->
+						</view>
+					</view>
+					<!-- 订单信息 -->
+					<view class="order-info">
+						<view class="title">订单信息</view>
+						<view class="item">
+							<text class="label">订单编号</text>
+							<view class="sn-box">
+								<text class="text">{{order.orderSn}}</text>
+								<view class="copy-btn" @click="copyOrderSn(order.orderSn)">复制</view>
+							</view>
+						</view>
+						<view class="item">
+							<text class="label">下单时间</text>
+							<text class="text">{{order.createTime}}</text>
+						</view>
+						<view class="item">
+							<text class="label">支付方式</text>
+							<text class="text" v-if="order.payType==1">微信支付</text>
+							<text class="text" v-if="order.payType==2">物流代收</text>
+							<text class="text" v-if="order.payType==3">货到付款</text>
+						</view>
+						<view   class="item">
+							<text class="label">订单金额</text>
+							<text class="text" v-if="order.payPrice!=null">¥{{order.payPrice.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">支付金额</text>
+							<text class="text" v-if="order.payMoney!=null">¥{{order.payMoney.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">抵扣金额</text>
+							<text class="text" v-if="order.discountMoney!=null">¥{{order.discountMoney.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">代收金额</text>
+							<text class="text" v-if="order.payRemain!=null">¥{{order.payRemain.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">运费金额</text>
+							<text class="text" v-if="order.payDelivery!=null">¥{{order.payDelivery.toFixed(2)}}</text>
+						</view>
+						<view  class="item">
+							<text class="label">支付时间</text>
+							<text class="text">{{order.payTime}}</text>
+						</view>
+						 
+						 
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 按钮 -->
+		<view   class="btn-box">
+			<!-- <view  class="btn cancel" v-if="order.status==1" @click="cancel()">取消订单</view> -->
+			<!-- <view class="btn pay" v-if="order.status==1" @click="pay()">支付</view> -->
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	import {getCompanyUserPackageOrderById,pay} from '@/api/packageOrder'
+	
+	export default {
+		data() {
+			return {
+				orderId:null,
+				order:{},
+				package:null,
+				items:[],
+		 
+			};
+		},
+		onLoad(option) {
+			this.orderId = option.orderId
+			this.getPackageOrderById();
+		},
+		onShow() {
+			 
+		},
+		methods: {
+			 
+			getPackageOrderById(){
+				var data={orderId:this.orderId};
+				getCompanyUserPackageOrderById(data).then(res => {
+					if(res.code==200){
+						this.order=res.order;
+						this.package=JSON.parse(this.order.packageJson)
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						 
+					}
+				});
+			},
+			pay() {
+				 uni.navigateTo({
+				 	url: '/pages_order/packageOrderPay?orderId='+this.order.orderId
+				 })
+			},
+			// 返回上一页
+			back() {
+				let pages = getCurrentPages();
+				console.log(pages.length);
+				if(pages.length>1){
+					uni.navigateBack()
+				}
+				else{
+					uni.reLaunch({
+						url:"/pages/common/launch"
+					})
+				}
+				
+			},
+			// 复制订单编号
+			copyOrderSn(text) {
+				// 复制方法
+				uni.setClipboardData({
+					data:text,
+					success:()=>{
+						uni.showToast({
+							title:'内容已成功复制到剪切板',
+							icon:'none'
+						})
+					}
+				});
+			},
+			 
+		}
+	}
+</script>
+
+<style lang="scss">
+	.cont{
+		width: 100%;
+		position: relative;
+		.bg{
+			width: 100%;
+			height: 350upx;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 1;
+			background-color: #C39A58;
+			background: linear-gradient(#C39A58, #E2C99E);
+			border-radius: 0rpx 0rpx 100rpx 100rpx;
+		}
+		.inner{
+			position: relative;
+			padding: 30upx 0rpx;
+			width: 100%;
+			height: 100%;
+			z-index: 999;
+			.order-status{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 0 30upx;
+				.inner{
+					display: flex;
+					align-items: center;
+					.img-box{
+						width: 96upx;
+						height: 96upx;
+						margin-right: 30upx;
+						image{
+							width: 100%;
+							height: 100%;
+						}
+					}
+					.status-box{
+						height: 96upx;
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						.status{
+							font-size: 40upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FFFFFF;
+							line-height: 1;
+						}
+						.desc{
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #FFFFFF;
+							line-height: 1;
+							margin-top: 30upx;
+						}
+					}
+				}
+			}
+			 
+		}
+	}
+	.content{
+		margin: 20rpx 0rpx;
+		padding: 0 20upx 140rpx 20upx;
+		.package-box{
+			width: 100%;
+			display: flex;
+			padding: 20rpx;
+			background-color: #fff;
+			align-items: flex-start;
+			justify-content: flex-start;
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			border-radius: 15rpx;
+			.left{
+				width:200rpx;
+				height:200rpx;
+				image{
+					border-radius: 15rpx;
+					width:100%;
+					height:100%;
+				}
+			}
+			.right{
+				height: 200rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				padding-left: 15rpx;
+				width:calc(100% - 200rpx);
+				.title{
+					font-weight: bold;
+					font-size: 34upx;
+					font-family: PingFang SC;
+					color: #111;
+				}
+				.desc{
+					margin-top: 15rpx;
+					display: flex;
+					align-items: flex-start;
+					justify-content: flex-start;
+					.cycle{
+						background-color: #eee;
+						border-radius: 30rpx;
+						padding: 5rpx 15rpx;
+						font-size: 26upx;
+						font-family: PingFang SC;
+						color: #C39A58;
+					}
+					.duration{
+						margin-left: 10rpx;
+						background-color: #eee;
+						border-radius: 30rpx;
+						padding: 5rpx 15rpx;
+						font-size: 26upx;
+						font-family: PingFang SC;
+						color: #C39A58;
+					}
+					
+				}
+				.price-box{
+					flex: 1;
+					display: flex;
+					align-items: flex-end;
+					justify-content: space-between;
+					width: 100%;
+					.price{
+						padding: 5rpx 10rpx;
+						background-color: #C39A58;
+						border-radius: 30rpx;
+						font-size: 20upx;
+						font-family: PingFang SC;
+						color: #ffffff;
+					}
+					.count{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						color: #333333;
+					}
+					
+				}
+			}
+			
+			 
+		}
+		.order-info{
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			margin-top: 20upx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 40upx 30upx;
+			.title{
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #222222;
+				line-height: 1;
+			}
+			.item{
+				margin-top: 40upx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.label{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #666666;
+					line-height: 1;
+				}
+				.text{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #222222;
+					line-height: 32upx;
+				}
+				.cont-text{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #666666;
+					.bold{
+						color: #111111;
+					}
+				}
+				.sn-box{
+					display: flex;
+					align-items: center;
+					.copy-btn{
+						width: 58upx;
+						height: 32upx;
+						line-height: 32upx;
+						text-align: center;
+						font-size: 22upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #222222;
+						background: #F5F5F5;
+						border-radius: 4upx;
+						margin-left: 24upx;
+					}
+				}
+				.check-box{
+					display: flex;
+					align-items: center;
+					image{
+						width: 14upx;
+						height: 24upx;
+						margin-left: 10upx;
+					}
+				}
+			}
+			.line{
+				width: 100%;
+				height: 1px;
+				background: #F0F0F0;
+				margin-top: 30upx;
+			}
+		}
+	}
+	.btn-box{
+		z-index: 999;
+		bottom: 0;
+		width: 100%;
+		position: fixed;
+		height: 120upx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		padding: 0 30upx;
+		display: flex;
+		align-items: center;
+		justify-content: flex-end;
+		.btn{
+			width: 155upx;
+			height: 64upx;
+			line-height: 64upx;
+			font-size: 26upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			text-align: center;
+			border-radius: 32upx;
+			margin-left: 15upx;
+			&.cancel{
+				border: 1px solid #DDDDDD;
+				color: #666666;
+			}
+			&.pay{
+				background: #C39A58;
+				color: #FFFFFF;
+			}
+		}
+	}
+</style>

+ 398 - 0
pages_company/packageOrderList.vue

@@ -0,0 +1,398 @@
+<template>
+	<view class="content">
+		<view class="top-fixed">
+			 <u-tabs
+			  :scrollable="true"
+			  :list="tabs"  
+			  lineColor="#C39A58"
+			 @change="tabChange">
+			 </u-tabs>
+		</view>
+		<mescroll-body  top="88rpx" bottom="0"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="order-box">
+				<view class="order-item" @click.stop="showDetails(item)" v-for="(item) in dataList">
+					<view class="top-box" >
+						<view class="num">订单号:{{item.orderSn}}</view>
+						<view class="status-box">
+							<text   class="text info" v-if="item.status==1">
+							{{$getDictLabelName(orderStatusOptions,item.status)}}
+							</text>
+							<text   class="text success" v-if="item.status>1">
+							{{$getDictLabelName(orderStatusOptions,item.status)}}
+							</text>
+							<text   class="text info" v-if="item.status<0">
+							{{$getDictLabelName(orderStatusOptions,item.status)}}
+							</text>
+						</view>
+					</view>
+					<view class="package-box">
+						<view class="left">
+							<image :src="item.imgUrl"></image>
+						</view>
+						<view class="right">
+							<view class="title">{{item.packageName}}</view>
+							<view class="desc">
+								<view class="cycle">用药周期{{item.cycle}}天</view>
+								<view class="duration">签约时长{{item.duration}}天</view>
+							</view>
+							<!-- <view class="price-box">
+								<view class="price">¥30元/日</view>
+								<view class="count">6.2w人已购</view>
+							</view> -->
+						</view>
+					</view>
+					<view class="bottom-box">
+						<view class="amount-paid">
+							<text class="label">订单金额:</text>
+							<view class="price-box">
+								<view class="unit">¥</view>
+								<view class="num" >{{item.payPrice.toFixed(2)}}</view>
+							</view>
+						</view>
+						<view class="btn-box">
+							<!-- <view v-if="item.status == 1" class="btn cancel" @click="cancel(item)">取消订单</view> -->
+							<view v-if="item.status == 1" class="btn pay"  >查看订单</view>
+							
+						</view>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {getCompanyUserPackageOrderList} from '@/api/packageOrder'
+	
+	
+	import {getDictByKey} from '@/api/common.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				orderStatusOptions:[],
+				searchKey:"",
+				status:"0",
+				tabs: [
+					{name:"全部",id:"0"},
+					{name:"待支付",id:"1"},
+					{name:"服务中",id:"2"},
+					{name:"已完成",id:"3"},
+					{name:"已取消",id:"-1"},
+					{name:"已退款",id:"-2"}
+				],
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		onLoad(options) {
+			var that=this;
+			uni.$on('refreshPackageOrder', () => {
+			 	that.mescroll.resetUpScroll()
+			})
+			this.getDictByKey("sys_package_order_status");
+		},
+		onShow() {
+		},
+		methods: {
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_package_order_status"){
+								this.orderStatusOptions=res.data;
+							}
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			 
+			showDetails(item){
+				uni.navigateTo({
+					url:"/pages_company/packageOrderDetails?orderId="+item.orderId
+				})
+			},
+			tabChange(item){
+				this.status=item.id
+				console.log(item)
+				this.mescroll.resetUpScroll()
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					status:this.status,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getCompanyUserPackageOrderList(data).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();
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.content{
+		.top-fixed{
+			width: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 10;
+			height: 88upx;
+			background-color: #fff;
+		}
+		.order-box{
+			padding: 20rpx;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			.order-item{
+				width: 100%;
+				border-radius: 10rpx;
+				background-color: #fff;
+				padding: 30rpx;
+				margin-bottom: 20rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: flex-start;
+				justify-content: flex-start;
+				.top-box{
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.num{
+						font-size: 26upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #999999;
+						line-height: 1;
+					}
+					.status-box{
+						display: flex;
+						align-items: center;
+						.text{
+							font-size: 28upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							line-height: 1;
+							&.success{
+								color: #C39A58;
+							}
+							&.black{
+								color: #111111;
+							}
+							&.info{
+								color: #999999;
+							}
+						}
+					}
+				}
+				.package-box{
+					margin-top: 20rpx;
+					
+					width: 100%;
+					display: flex;
+					align-items: flex-start;
+					justify-content: flex-start;
+					.left{
+						width:200rpx;
+						height:200rpx;
+						image{
+							border-radius: 15rpx;
+							width:100%;
+							height:100%;
+						}
+					}
+					.right{
+						height: 200rpx;
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: flex-start;
+						padding-left: 15rpx;
+						width:calc(100% - 200rpx);
+						.title{
+							font-weight: bold;
+							font-size: 34upx;
+							font-family: PingFang SC;
+							color: #111;
+						}
+						.desc{
+							margin-top: 15rpx;
+							display: flex;
+							align-items: flex-start;
+							justify-content: flex-start;
+							.cycle{
+								background-color: #eee;
+								border-radius: 30rpx;
+								padding: 5rpx 15rpx;
+								font-size: 26upx;
+								font-family: PingFang SC;
+								color: #C39A58;
+							}
+							.duration{
+								margin-left: 10rpx;
+								background-color: #eee;
+								border-radius: 30rpx;
+								padding: 5rpx 15rpx;
+								font-size: 26upx;
+								font-family: PingFang SC;
+								color: #C39A58;
+							}
+							
+						}
+						.price-box{
+							flex: 1;
+							display: flex;
+							align-items: flex-end;
+							justify-content: space-between;
+							width: 100%;
+							.price{
+								padding: 5rpx 10rpx;
+								background-color: #C39A58;
+								border-radius: 30rpx;
+								font-size: 20upx;
+								font-family: PingFang SC;
+								color: #ffffff;
+							}
+							.count{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								color: #333333;
+							}
+							
+						}
+					}
+					
+					 
+				}
+				.bottom-box{
+					margin-top: 20rpx;
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.amount-paid{
+						display: flex;
+						align-items: center;
+						.label{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+						}
+						.price-box{
+							display: flex;
+							align-items: flex-end;
+							.unit{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #FF6633;
+								line-height: 1.2;
+								margin-right: 4upx;
+							}
+							.num{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #FF6633;
+								line-height: 1;
+							}
+						}
+					}
+					.btn-box{
+						box-sizing: border-box;
+						display: flex;
+						align-items: center;
+						.btn{
+							width: 155upx;
+							height: 64upx;
+							line-height: 64upx;
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							text-align: center;
+							border-radius: 32upx;
+							margin-left: 15upx;
+							&:first-child{
+								margin-left: 0;
+							}
+							&.cancel{
+								border: 1px solid #DDDDDD;
+								color: #666666;
+							}
+							&.pay{
+								background: #C39A58;
+								color: #FFFFFF;
+							}
+						}
+					}
+				}
+				
+			}
+			
+		}
+	}
+</style>

+ 300 - 0
pages_company/storeOrderDelivery.vue

@@ -0,0 +1,300 @@
+<template>
+	<view>
+		<view class="top-cont">
+			<!-- 背景图片 -->
+			<view class="bg"></view>
+			<view class="top-inner">			
+				<!-- 运单号 -->
+				<view class="waybill-number">
+					<view class="inner">
+						<view class="num-box">
+							<text class="text">运单号</text>
+							<text class="text">{{deliverySn}}</text>
+							<view class="copy" @click="copyOrderSn(deliverySn)">复制</view>
+						</view>
+						<view class="kf-box">
+							<text class="text">{{express.name}}</text>
+							<!-- <text class="text">客服电话:95311</text> -->
+						</view>
+					</view>
+				</view>
+				<view class="content"  v-if="expressList!=null">
+					<!-- 物流信息 -->
+					<view class="refund-steps" v-if="expressList.Traces!=null">
+						<view v-for="(item,index) in expressList.Traces" :key="index" class="steps">
+							<view class="title">
+								<!-- <text v-if="index == 0" class="text black-text">已签收</text> -->
+								<!-- <text  class="text gray-bold">运输中</text> -->
+								<!-- 左侧灰色圆点 -->
+								<view class="dot"></view>
+								<!-- 对号 -->
+								<image  class="img" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/complete.png" mode=""></image>
+								<!-- 运输中图标 -->
+								<image  class="img" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/car40.png" mode=""></image>
+							</view>
+							<view  class="desc-text">
+								{{item.AcceptStation}}
+							</view>
+							 
+							<view class="time">{{item.AcceptTime}}</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+			
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	import {getMyStoreOrderById,getExpress} from '@/api/storeOrder'
+	export default {
+		data() {
+			return {
+				orderId:null,
+				deliverySn:null,
+				express:{},
+				expressList:[],
+			};
+		},
+		onLoad(option) {
+			this.orderId=option.orderId;
+			this.getExpress();
+		},
+		methods: {
+			getExpress(){
+				var data={orderId:this.orderId};
+				getExpress(data).then(res => {
+					if(res.code==200){
+						this.express=res.express;
+						this.expressList=res.data;
+						this.deliverySn=res.deliverySn
+				 
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						 
+					}
+				});
+			},
+			// 返回上一页
+			back() {
+				uni.navigateBack()
+			},
+			// 复制运单号
+			copyOrderSn(text) {
+				// 复制方法
+				uni.setClipboardData({
+					data:text,
+					success:()=>{
+						uni.showToast({
+							title:'内容已成功复制到剪切板',
+							icon:'none'
+						})
+					}
+				});
+			},
+			// 拨打电话
+			callPhone(phone) {
+				uni.makePhoneCall({
+					phoneNumber: phone
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top-cont{
+		width: 100%;
+		height: 336upx;
+		position: relative;
+		.bg{
+			width: 100%;
+			height: 350upx;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 1;
+			background-color: #C39A58;
+			background: linear-gradient(#C39A58, #E2C99E);
+			border-radius: 0rpx 0rpx 100rpx 100rpx;
+		}
+		.top-inner{
+			width: 100%;
+			height: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 2;
+			.back-box{
+				height: 88upx;
+				padding-left: 22upx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 0 20upx;
+				image{
+					width: 40upx;
+					height: 40upx;
+				}
+				.title{
+					font-size: 36upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #FFFFFF;
+				}
+			}
+			.waybill-number{
+				padding: 0 20upx;
+				margin-top: 66upx;
+				.inner{
+					box-sizing: border-box;
+					height: 150upx;
+					background: #FFFFFF;
+					border-radius: 16upx;
+					padding: 40upx 30upx;
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					.num-box{
+						display: flex;
+						align-items: center;
+						.text{
+							font-size: 28upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							line-height: 1;
+							margin-right: 30upx;
+							&:last-child{
+								margin-right: 20upx;
+							}
+						}
+						.copy{
+							width: 58upx;
+							height: 32upx;
+							line-height: 32upx;
+							text-align: center;
+							font-size: 22upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #222222;
+							background: #F5F5F5;
+							border-radius: 4upx;
+						}
+					}
+					.kf-box{
+						display: flex;
+						align-items: center;
+						.text{
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+							margin-right: 20upx;
+						}
+					}
+				}
+			}
+			
+		}
+	}
+	.content{
+		margin: 20rpx 0rpx;
+		padding: 0 20upx;
+		.refund-steps{
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 40upx 44upx;
+			.steps{
+				padding-left: 40upx;
+				padding-bottom: 56upx;
+				position: relative;
+				&::after{
+					content: "";
+					width: 4upx;
+					height: 100%;
+					background: #F1F1F1;
+					position: absolute;
+					left: 0;
+					top: 20upx;
+				}
+				&:last-child{
+					padding-bottom: 0;
+					&::after{
+						display: none;
+					}
+				}
+				.title{
+					position: relative;
+					.text{
+						font-size: 30upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						line-height: 38upx;
+						&.black-text{
+							color: #111111;
+							font-weight: bold;
+						}
+						&.gray-bold{
+							font-weight: bold;
+							color: #666666;
+						}
+					}
+					.dot{
+						width: 16upx;
+						height: 16upx;
+						background: #EBEBEB;
+						border-radius: 50%;
+						position: absolute;
+						left: -46upx;
+						top: 11upx;
+						z-index: 10;
+						&.active{
+							background-color: #2BC7B9;
+						}
+					}
+					.img{
+						width: 40upx;
+						height: 40upx;
+						position: absolute;
+						left: -57upx;
+						top: 2upx;
+						z-index: 10;
+					}
+				}
+				.desc-text{
+					font-size: 28upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #666666;
+					line-height: 1.6;
+					margin-top: 10upx;
+					.phone{
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #2BC7B9;
+						line-height: 1.6;
+					}
+				}
+				.time{
+					font-size: 24upx;
+					font-family: Gilroy;
+					font-weight: 500;
+					color: #999999;
+					margin-top: 10upx;
+				}
+			}
+		}
+		
+	}
+	
+</style>

+ 694 - 0
pages_company/storeOrderDetail.vue

@@ -0,0 +1,694 @@
+<template>
+	<view>
+		<view class="cont">
+			<view class="bg"></view>
+			<view class="inner">			
+				<!-- 订单状态 -->
+				<view class="order-status">
+					<!-- 待付款 -->
+					<view v-if="order.status == 1" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/67eda0644e5847008096525b04cd12ca.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">待付款</text>
+							<text class="desc">请在{{payLimitTime}}前完成支付</text>
+						</view>
+					</view>
+					<!-- 待发货 -->
+					<view v-if="order.status == 2" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/520e24fba47441b3b0f73b5250bb0b57.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">待发货</text>
+							<text class="desc">等待后台发货</text>
+						</view>
+					</view>
+					<!-- 已发货、待收货 -->
+					<view v-if="order.status == 3" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/1e6ba423ff7e4537bef87a022d530015.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">待收货</text>
+							<text class="desc">运输中</text>
+						</view>
+					</view>
+					<!-- 已完成 -->
+					<view v-if="order.status == 4" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/0712ba14f3a648afa69c9912fcbf9b61.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">已完成</text>
+							<text class="desc">订单已确认收货,交易完成</text>
+						</view>
+					</view>
+					<!--交易取消 -->
+					<view v-if="order.status == -3" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/02f95bd03e854a9c8076aef1e6c05e74.png" mode=""></image>
+							</view>
+						<view class="status-box">
+							<text class="status">交易关闭</text>
+							<text class="desc">订单已取消</text>
+						</view>
+					</view>
+					<view v-if="order.status == -1" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/6020712aa10f4bb08db92957cb7eb8ed.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">申请售后</text>
+							<text class="desc">请等待客服审核</text>
+						</view>
+					</view>
+					<view v-if="order.status == -2" class="inner">
+						<view class="img-box">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/6020712aa10f4bb08db92957cb7eb8ed.png" mode=""></image>
+						</view>
+						<view class="status-box">
+							<text class="status">退款成功</text>
+							<text class="desc">已成功退款</text>
+						</view>
+					</view>
+				</view>
+				<!-- 下单人信息 -->
+				<view class="order-placer" v-if="order.userName!=null">
+					<view class="inner">
+						<image class="location" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/location.png" mode=""></image>
+						<view class="info">
+							<view class="name-phone">
+								<text class="text">{{order.userName}}</text>
+								<text class="text" v-if="order.userPhone!=null">{{order.userPhone}}</text>
+							</view>
+							<view class="address ellipsis2">
+								{{order.userAddress}}
+							</view>
+						</view>
+					</view>
+				</view>
+				<view class="content">
+					<!-- 药品列表 -->
+					<view class="goods-list">
+						<view   v-for="(item,index) in items" :key="index" class="item"  >
+							<view class="img-box">
+								<image :src="JSON.parse(item.jsonInfo).image==''?'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/drug.svg':JSON.parse(item.jsonInfo).image" mode="aspectFill"></image>
+							</view>
+							<view class="info-box">
+								<view>
+									<view class="name-box ellipsis2">
+										 {{JSON.parse(item.jsonInfo).productName}}
+									</view>
+									<view class="spec ellipsis2">{{JSON.parse(item.jsonInfo).sku}}</view>
+								</view>
+								<view class="price-num">
+									<view class="price">
+										<!-- <text class="unit">¥</text> -->
+										<!-- <text class="num" v-if="JSON.parse(item.jsonInfo).price!=null">{{JSON.parse(item.jsonInfo).price.toFixed(2)}}</text> -->
+									</view>
+									<view class="num" v-if="order.ordetType==1">x{{JSON.parse(item.jsonInfo).num}}</view>
+								</view>
+							</view>
+						</view>
+					 
+						<!-- 已优惠、小计 -->
+						<view class="sub-total">
+							<view class="discount">
+								订单金额:¥{{order.payPrice }}
+							</view>
+							<!-- <text class="label">实付金额:</text>
+							<view class="price">
+								<text class="unit">¥</text>
+								<text class="num">{{order.payMoney}}</text>
+							</view> -->
+						</view>
+					</view>
+					<!-- 订单信息 -->
+					<view class="order-info">
+						<view class="title">订单信息</view>
+						<view class="item">
+							<text class="label">订单编号</text>
+							<view class="sn-box">
+								<text class="text">{{order.orderCode}}</text>
+								<view class="copy-btn" @click="copyOrderSn(order.orderCode)">复制</view>
+							</view>
+						</view>
+						<view class="item">
+							<text class="label">下单时间</text>
+							<text class="text">{{order.createTime}}</text>
+						</view>
+						<view class="item">
+							<text class="label">支付方式</text>
+							<text class="text" v-if="order.payType==1">微信支付</text>
+							<text class="text" v-if="order.payType==2">物流代收</text>
+						</view>
+						<view   class="item">
+							<text class="label">订单金额</text>
+							<text class="text" v-if="order.totalPrice!=null">¥{{order.totalPrice.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">优惠金额</text>
+							<text class="text" v-if="order.discountMoney!=null">¥{{order.discountMoney.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">应付金额</text>
+							<text class="text" v-if="order.payPrice!=null">¥{{order.payPrice.toFixed(2)}}</text>
+						</view>
+						<view   class="item">
+							<text class="label">支付金额</text>
+							<text class="text" v-if="order.payMoney!=null">¥{{order.payMoney.toFixed(2)}}</text>
+						</view>
+						<view  class="item">
+							<text class="label">支付时间</text>
+							<text class="text" v-if="order.payTime!=null">{{order.payTime}}</text>
+						</view>
+						<!-- <view v-if="order.status >1" class="item">
+							<text class="label">发货时间</text>
+							<text class="text"></text>
+						</view> -->
+						 
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 按钮 -->
+		<view   class="btn-box">
+			<view class="btn pay" v-if="order.deliverySn!=null"  @click="showDelivery()">查看物流</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getPrescribeById} from '@/api/prescribe.js'
+	
+	import {getCompanyUserStoreOrderById,cancelOrder,finishOrder} from '@/api/storeOrder'
+	export default {
+		data() {
+			return {
+				payLimitTime:null,
+				orderId:null,
+				order:{},
+				items:[],
+		 
+			};
+		},
+		onLoad(option) {
+			this.orderId = option.orderId
+		},
+		onShow() {
+			this.getCompanyUserStoreOrderById()
+		},
+		methods: {
+			showPrescribe(){
+				var data={prescribeId:this.order.prescribeId}
+				getPrescribeById(data).then(
+					res => {
+						if(res.code==200){
+							if(res.data.prescribe.prescribeImgUrl!=null){
+								var data=[];
+								data.push(res.data.prescribe.prescribeImgUrl)
+								uni.previewImage({
+									current: 0,
+									urls: data
+								});
+							}
+							else{
+								uni.showToast({
+									icon:'none',
+									title: "电子处方单不存在",
+								});
+								 
+							}
+							
+						}
+					},
+					err => {
+					}
+				);
+			},
+			getCompanyUserStoreOrderById(){
+				var data={orderId:this.orderId};
+				getCompanyUserStoreOrderById(data).then(res => {
+					if(res.code==200){
+						 this.order=res.order;
+						 this.items=res.items;
+						 this.payLimitTime=res.payLimitTime;
+						 this.prescribe=res.prescribe;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						 
+					}
+				});
+			},
+			showDelivery(){
+				uni.navigateTo({
+					url: './storeOrderDelivery?orderId='+this.orderId
+				})
+			},
+			cancel(){
+				var that=this;
+				uni.showModal({
+				    title: '提示',
+				    content: '确定取消订单吗',
+				    success: function (res) {
+				        if (res.confirm) {
+							var data = {
+								orderId:that.order.orderId
+							};
+							cancelOrder(data).then(res => {
+								if(res.code==200){
+									 that.getMyStoreOrderById()
+									 uni.$emit('refreshStoreOrder');
+								}else{
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							});
+				        } 
+						else if (res.cancel) {
+				        }
+				    }
+				});
+			},
+			finish(){
+				var that=this;
+				uni.showModal({
+				    title: '提示',
+				    content: '确定已收货吗',
+				    success: function (res) {
+				        if (res.confirm) {
+							var data = {
+								orderId:that.orderId
+							};
+							finishOrder(data).then(res => {
+								if(res.code==200){
+									 that.getMyStoreOrderById()
+									 uni.$emit('refreshStoreOrder');
+								}else{
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							});
+				        } 
+						else if (res.cancel) {
+				        }
+				    }
+				});
+			},
+			pay() {
+				 uni.navigateTo({
+				 	url: '/pages_order/storeOrderPay?orderId='+this.order.orderId
+				 })
+			},
+			payRemain() {
+				 uni.navigateTo({
+				 	url: '/pages_user/user/paymentOrderRemain?orderId='+this.order.orderId
+				 })
+			},
+			// 复制订单编号
+			copyOrderSn(text) {
+				// 复制方法
+				uni.setClipboardData({
+					data:text,
+					success:()=>{
+						uni.showToast({
+							title:'内容已成功复制到剪切板',
+							icon:'none'
+						})
+					}
+				});
+			},
+			// 退货
+			refund() {
+				uni.navigateTo({
+					url: '/pages_order/storeOrderRefundApply?orderId='+this.orderId
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.cont{
+		width: 100%;
+		position: relative;
+		.bg{
+			width: 100%;
+			height: 350upx;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 1;
+			background-color: #C39A58;
+			background: linear-gradient(#C39A58, #E2C99E);
+			border-radius: 0rpx 0rpx 100rpx 100rpx;
+		}
+		.inner{
+			position: relative;
+			padding: 30upx 0rpx;
+			width: 100%;
+			height: 100%;
+			z-index: 999;
+			.order-status{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 0 30upx;
+				.inner{
+					display: flex;
+					align-items: center;
+					.img-box{
+						width: 96upx;
+						height: 96upx;
+						margin-right: 30upx;
+						image{
+							width: 100%;
+							height: 100%;
+						}
+					}
+					.status-box{
+						height: 96upx;
+						display: flex;
+						flex-direction: column;
+						justify-content: center;
+						.status{
+							font-size: 40upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FFFFFF;
+							line-height: 1;
+						}
+						.desc{
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #FFFFFF;
+							line-height: 1;
+							margin-top: 30upx;
+						}
+					}
+				}
+			}
+			.order-placer{
+				margin-top: 30upx;
+				padding: 0 20upx;
+				.inner{
+					box-sizing: border-box;
+					border-radius: 16upx;
+					height: 150upx;
+					padding: 40upx 30upx;
+					display: flex;
+					align-items: center;
+					background: #FFFFFF;
+					.location{
+						width: 24upx;
+						height: 27upx;
+						margin-right: 18upx;
+						flex-shrink: 0;
+					}
+					.info{
+						.name-phone{
+							display: flex;
+							align-items: center;
+							.text{
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #333333;
+								line-height: 1;
+								margin-right: 20upx;
+								&:last-child{
+									margin-right: 0;
+								}
+							}
+						}
+						.address{
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1.3;
+							margin-top: 10upx;
+						}
+					}
+				}
+				
+			}
+		}
+	}
+	.content{
+		margin: 20rpx 0rpx;
+		padding: 0 20upx 140rpx 20upx;
+		.goods-list{
+			padding: 0 30upx;
+			background-color: #FFFFFF;
+			border-radius: 16upx;
+			.item{
+				padding: 30upx 0;
+				border-bottom: 1px solid #EDEEEF;
+				display: flex;
+				align-items: center;
+				.img-box{
+					width: 160upx;
+					height: 160upx;
+					margin-right: 30upx;
+					image{
+						width: 100%;
+						height: 100%;
+					}
+				}
+				.info-box{
+					width: calc(100% - 190upx);
+					height: 160upx;
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					.name-box{
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						line-height: 40upx;
+						.tag{
+							display: inline-block;
+							padding: 0 6upx;
+							height: 30upx;
+							background: linear-gradient(90deg, #C39A58 0%, #E2C99E 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{
+						margin-top: 18upx;
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #999999;
+						line-height: 1;
+					}
+					.price-num{
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						.price{
+							display: flex;
+							align-items: flex-end;
+							.unit{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+								line-height: 1.2;
+								margin-right: 4upx;
+							}
+							.num{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+								line-height: 1;
+							}
+						}
+						.num{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+						}
+					}
+				}
+			}
+			.sub-total{
+				height: 88upx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-end;
+				.discount{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					line-height: 1;
+					margin-right: 30upx;
+				}
+				.label{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+				}
+				.price{
+					display: flex;
+					align-items: flex-end;
+					.unit{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #FF6633;
+						line-height: 1.2;
+						margin-right: 4upx;
+					}
+					.num{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #FF6633;
+						line-height: 1;
+					}
+				}
+			}
+		}
+		.order-info{
+			margin-top: 20upx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 40upx 30upx;
+			.title{
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #222222;
+				line-height: 1;
+			}
+			.item{
+				margin-top: 40upx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.label{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #666666;
+					line-height: 1;
+				}
+				.text{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #222222;
+					line-height: 32upx;
+				}
+				.cont-text{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #666666;
+					.bold{
+						color: #111111;
+					}
+				}
+				.sn-box{
+					display: flex;
+					align-items: center;
+					.copy-btn{
+						width: 58upx;
+						height: 32upx;
+						line-height: 32upx;
+						text-align: center;
+						font-size: 22upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #222222;
+						background: #F5F5F5;
+						border-radius: 4upx;
+						margin-left: 24upx;
+					}
+				}
+				.check-box{
+					display: flex;
+					align-items: center;
+					image{
+						width: 14upx;
+						height: 24upx;
+						margin-left: 10upx;
+					}
+				}
+			}
+			.line{
+				width: 100%;
+				height: 1px;
+				background: #F0F0F0;
+				margin-top: 30upx;
+			}
+		}
+	}
+	.btn-box{
+		z-index: 999;
+		bottom: 0;
+		width: 100%;
+		position: fixed;
+		height: 120upx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		padding: 0 30upx;
+		display: flex;
+		align-items: center;
+		justify-content: flex-end;
+		.btn{
+			position: relative;
+			width: 155upx;
+			height: 64upx;
+			line-height: 64upx;
+			font-size: 26upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			text-align: center;
+			border-radius: 32upx;
+			margin-left: 15upx;
+			&.cancel{
+				
+				border: 1px solid #DDDDDD;
+				color: #666666;
+			}
+			&.pay{
+				background: #C39A58;
+				color: #FFFFFF;
+			}
+			.contact-btn {
+				top: 0;
+				position: absolute;
+				width:100%;
+				height:100%;
+				opacity: 0;
+			}
+		}
+	}
+</style>

+ 481 - 0
pages_company/storeOrderList.vue

@@ -0,0 +1,481 @@
+<template>
+	<view>
+		<view class="top-fixed">
+			 <u-tabs
+			  :scrollable="false"
+			  :list="tabs"  
+			  lineColor="#C39A58"
+			 @change="tabChange">
+			 </u-tabs>
+		</view>
+		<!-- 订单列表 -->
+		<mescroll-body  top="88rpx" bottom="0"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="order-list">
+				<view @click="showDetail(item)" v-for="(item,index) in dataList" :key="index" class="item" >
+					<!-- 订单号,状态 -->
+					<view class="ordersn-box"  >
+						<view class="num">订单号:{{item.orderCode}}</view>
+						<view class="status-box">
+							<text   class="text info" v-if="item.status==1">	
+							{{$getDictLabelName(orderStatusOptions,item.status)}}
+							</text>
+							<text   class="text success" v-if="item.status>1">
+							{{$getDictLabelName(orderStatusOptions,item.status)}}
+							</text>
+							<text   class="text info" v-if="item.status<0">
+							{{$getDictLabelName(orderStatusOptions,item.status)}}
+							</text>
+						</view>
+					</view>
+					<!-- 药品列表 -->
+					<view  class="drug-list"  >
+						<view    v-if="item.isPackage!=1" v-for="(subItem,subIndex) in item.items" :key="subIndex" class="drug-item" >
+							<view class="img-box">
+								<image :src="JSON.parse(subItem.jsonInfo).image==''?'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/drug.svg':JSON.parse(subItem.jsonInfo).image" mode="aspectFill"></image>
+								
+							</view>
+							<view class="drug-info"  >
+								<view>
+									<view class="name-box ellipsis2">
+										{{JSON.parse(subItem.jsonInfo).productName}}
+									</view>
+									<view class="spec ellipsis2">{{JSON.parse(subItem.jsonInfo).sku}}</view>
+								</view>
+								<view class="num-box">
+									<view class="price">
+										<!-- <text class="unit">¥</text> -->
+										<!-- <text class="num" v-if="JSON.parse(subItem.jsonInfo).price!=null">{{JSON.parse(subItem.jsonInfo).price.toFixed(2)}}</text> -->
+									</view>
+									<view class="amount" v-if="item.ordetType==1">x{{JSON.parse(subItem.jsonInfo).num}}</view>
+								</view>
+							</view>
+						</view>
+						<!-- 实付金额、按钮 -->
+						<view class="bottom-box">
+							<view class="amount-paid">
+								<text class="label">订单金额:</text>
+								<view class="price-box">
+									<view class="unit">¥</view>
+									<view class="num" >{{item.payPrice.toFixed(2)}}</view>
+								</view>
+							</view>
+							<view class="btn-box">
+								 
+								<view   class="btn" @click="showDetail(item)">查看订单</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {getDictByKey} from '@/api/common.js'
+	import {getCompanyUserStoreOrderList,cancelOrder,finishOrder} from '@/api/storeOrder'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				orderStatusOptions:[],
+				searchKey:"",
+				status:"0",
+				tabs: [
+					{name:"全部",id:"0"},
+					{name:"待付款",id:"1"},
+					{name:"待发货",id:"2"},
+					{name:"待收货",id:"3"},
+					{name:"已完成",id:"4"}
+				],
+				mescroll:null,
+				// 上拉加载的配置
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				// 列表数据
+				dataList: []
+			};
+		},
+		onLoad(option) {
+			var that=this;
+			uni.$on('refreshStoreOrder', () => {
+				that.mescroll.resetUpScroll()
+			})
+			this.getDictByKey("sys_order_status");
+		},
+		methods: {
+			
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_order_status"){
+								this.orderStatusOptions=res.data;
+							}
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			goSearch(e) {
+				this.searchKey=e.detail.value;
+				this.mescroll.resetUpScroll()
+			},
+			refund(item) {
+				uni.navigateTo({
+					url: '/pages_order/storeOrderRefundApply?orderId='+item.orderId
+				})	
+			},
+			tabChange(item) {
+				this.status = item.id
+				this.mescroll.resetUpScroll()
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword:this.searchKey,
+					status:this.status,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getCompanyUserStoreOrderList(data).then(res => {
+					if(res.code==200){
+						//设置列表数据
+						res.data.list.forEach(function(value, index, array){
+							value.items=JSON.parse(value.itemJson)
+						})
+						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) {
+				uni.navigateTo({
+					url: './storeOrderDetail?orderId=' + item.orderId
+				})
+			},
+			finish(item){
+				var that=this;
+				uni.showModal({
+				    title: '提示',
+				    content: '确定已收货吗',
+				    success: function (res) {
+				        if (res.confirm) {
+							var data = {
+								orderId:item.orderId
+							};
+							finishOrder(data).then(res => {
+								if(res.code==200){
+									uni.showToast({
+										icon:'success',
+										title: "操作成功",
+									});
+									that.mescroll.resetUpScroll()
+								}else{
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							});
+				        } 
+						else if (res.cancel) {
+				        }
+				    }
+				});
+			},
+			cancel(item){
+				var that=this;
+				uni.showModal({
+				    title: '提示',
+				    content: '确定取消订单吗',
+				    success: function (res) {
+				        if (res.confirm) {
+							var data = {
+								orderId:item.orderId
+							};
+							cancelOrder(data).then(res => {
+								if(res.code==200){
+									uni.showToast({
+										icon:'success',
+										title: "操作成功",
+									});
+									 that.mescroll.resetUpScroll()
+								}else{
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							});
+				        } 
+						else if (res.cancel) {
+				        }
+				    }
+				});
+			},
+			pay(item) {
+				 uni.navigateTo({
+				 	url: '/pages_order/storeOrderPay?orderId='+item.orderId
+				 })
+			},
+			// 查看物流
+			showDelivery(item) {
+				uni.navigateTo({
+					url: './storeOrderDelivery?orderId='+item.orderId
+				})
+			}
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top-fixed{
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+		height: 88upx;
+		background-color: #fff;
+	}
+	.order-list{
+		padding: 20upx;
+		.item{
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 0 30upx;
+			margin-bottom: 20upx;
+			.ordersn-box{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 34upx 0 20upx;
+				.num{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					line-height: 1;
+				}
+				.status-box{
+					display: flex;
+					align-items: center;
+					.text{
+						font-size: 28upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						line-height: 1;
+						&.success{
+							color: #C39A58;
+						}
+						&.black{
+							color: #111111;
+						}
+						&.info{
+							color: #999999;
+						}
+					}
+				}
+			}
+			.drug-list{
+				.drug-item{
+					padding: 30upx 0;
+					border-bottom: 1px soli #F0F0F0;
+					display: flex;
+					align-items: center;
+					.img-box{
+						width: 160upx;
+						height: 160upx;
+						margin-right: 30upx;
+						flex-shrink: 0;
+						image{
+							width: 100%;
+							height: 100%;
+						}
+					}
+					.drug-info{
+						width: calc(100% - 190upx);
+						height: 160upx;
+						display: flex;
+						flex-direction: column;
+						justify-content: space-between;
+						.name-box{
+							font-size: 28upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							line-height: 40upx;
+							.tag{
+								display: inline-block;
+								padding: 0 6upx;
+								height: 30upx;
+								background: linear-gradient(90deg, #C39A58 0%, #E2C99E 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;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+							margin-top: 10upx;
+						}
+						.num-box{
+							display: flex;
+							align-items: center;
+							justify-content: space-between;
+							.price{
+								display: flex;
+								align-items: flex-end;
+								.unit{
+									font-size: 24upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #111111;
+									line-height: 1.2;
+									margin-right: 4upx;
+								}
+								.num{
+									font-size: 32upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #111111;
+									line-height: 1;
+								}
+							}
+							.amount{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 1;
+							}
+						}
+					}
+				}
+				.bottom-box{
+					height: 110upx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.amount-paid{
+						display: flex;
+						align-items: center;
+						.label{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							line-height: 1;
+						}
+						.price-box{
+							display: flex;
+							align-items: flex-end;
+							.unit{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #FF6633;
+								line-height: 1.2;
+								margin-right: 4upx;
+							}
+							.num{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #FF6633;
+								line-height: 1;
+							}
+						}
+					}
+					.btn-box{
+						box-sizing: border-box;
+						display: flex;
+						align-items: center;
+						.btn{
+							position: relative;
+							width: 155upx;
+							height: 64upx;
+							line-height: 64upx;
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							text-align: center;
+							border-radius: 32upx;
+							margin-left: 15upx;
+							&:first-child{
+								margin-left: 0;
+							}
+							&.cancel{
+								border: 1px solid #DDDDDD;
+								color: #666666;
+							}
+							&.pay{
+								background: #C39A58;
+								color: #FFFFFF;
+							}
+							.contact-btn {
+								top: 0;
+								position: absolute;
+								width:100%;
+								height:100%;
+								opacity: 0;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
+</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/course.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.getComments()
+			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 = ''
+				}
+			},
+			getComments() {
+				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.wsUrl + "/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>

+ 157 - 0
pages_course/components/descInfo.vue

@@ -0,0 +1,157 @@
+<template>
+	<view class="descbox" >
+		<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="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/course_arrow_up_icon.png" v-show="isExpand"></image>
+					<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/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="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/course_arrow_up_icon.png" v-show="isExpand"></image>
+				<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/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: {},
+			},
+		},
+		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: 20rpx 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 {
+			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>

+ 201 - 0
pages_course/components/descInfoNav.vue

@@ -0,0 +1,201 @@
+<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" >
+			<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="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/course_arrow_up_icon.png" v-show="isExpand"></image>
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/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="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/course_arrow_up_icon.png" v-show="isExpand"></image>
+					<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/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: {},
+			},
+		},
+		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>

+ 134 - 0
pages_course/components/ques.vue

@@ -0,0 +1,134 @@
+<template>
+	<view class="ques-content">
+		<view class="ques-content-tit" v-show="openCommentStatus!=1">问答题</view>
+		<view v-for="(item,index) in quesList" :key="index">
+			<view class="ques-title">
+				<text>{{index + 1}}.</text>
+				<view class="ques-type" v-show="item.type == 1 || item.type == 2">
+					{{item.type == 1 ? '单选' : item.type == 2 ? '多选' : ''}}
+				</view>
+				<text>{{item.title}}</text>
+			</view>
+			<view :class="isAnswer(item,option.name) ?'ques-option ques-option-active':'ques-option'"
+				v-for="(option,idx) in item.questionOption" :key="idx" @click="handleAnswer(item,option)">
+				<view>
+					{{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: {
+			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) {
+				const param = {
+					item,
+					option
+				}
+				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>

+ 135 - 0
pages_course/feedback.vue

@@ -0,0 +1,135 @@
+<template>
+	<view>
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<view class="arrow-left" :style="{top: statusBarHeight + 'px'}" @click="goBack"><u-icon name="arrow-left" size="24"></u-icon></view>
+			<view class="header-title" :style="{height:menuButtonH+'px',lineHeight:menuButtonH+'px'}">投诉反馈</view>
+		</view>
+		<view class="container" :style="{paddingTop: `calc(88rpx + ${statusBarHeight}px)`}">
+			<view class="list-item title">{{pageIndex==0 ? '请选择反馈类型':'请选择'}}</view>
+			<view class="list-item" v-for="(item, index) in feedbackItems" :key="index" @click="handleClick(item,index)">
+				{{ item.complaintTypeName }}
+			</view>
+			<view class="list-item" @click="goBack">
+				返回上一层
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import{ getTypeTree, complaintRecord } from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				menuButtonH: 45,
+				pageIndex: 0,
+				list:[],
+				feedbackItems: [],
+				userId:'',
+				courseId: '',
+				videoId:''
+			};
+		},
+		onLoad(option) {
+			this.userId = option.userId || ''
+			this.courseId = option.courseId || ''
+			this.videoId = option.videoId || ''
+			this.getMenuButton()
+			this.getList()
+		},
+		methods: {
+			getMenuButton(){
+				const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+				this.menuButtonH = menuButtonInfo.height
+			},
+			goBack() {
+				// 返回上一层逻辑
+				if(this.pageIndex == 0){
+					uni.navigateBack();
+				}else {
+					this.pageIndex = 0
+					this.feedbackItems = this.list
+				}
+			},
+			handleClick(item,index) {
+				if(this.pageIndex ==0) {
+					this.feedbackItems = this.list[index].childrenType || [];
+					this.pageIndex = 1;
+				} else if(this.pageIndex ==1){
+					const param = {
+						userId: this.userId,
+						complaintTypeId: item.complaintTypeId,
+						complaintContent: item.complaintContent,
+						courseId: this.courseId,
+						videoId: this.videoId,
+					}
+					complaintRecord(param).then(res=>{
+						uni.showModal({
+							title: '',
+							content: '我们已收到您的反馈,谢谢',
+							showCancel: false
+						});
+					})
+				}
+			},
+			getList(){
+				getTypeTree().then(res=>{
+					if(res.code == 200) {
+						this.list = res.data
+						this.pageIndex = 0
+						this.feedbackItems = this.list
+					}
+				})
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	.header-nav {
+		height: 88rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		overflow: hidden;
+		background-color: #fff;
+		box-sizing: border-box;
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		.header-title {
+			flex: 1;
+			text-align: center;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			font-family: PingFang SC,PingFang SC;
+			font-weight: 500;
+			font-size: 15px;
+			color: #000;
+			box-sizing: border-box;
+		}
+	}
+	.arrow-left {
+		position: absolute;
+		left: 24rpx;
+		height: 88rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		overflow: hidden;
+	}
+	.list-item {
+		background-color: #fff;
+		padding: 24rpx;
+		border-bottom: 1rpx solid #f4f4f4;
+		font-size: 15px;
+		color: #333;
+	}
+
+	.title {
+		background-color: #f4f4f4;
+	}
+</style>

+ 2057 - 0
pages_course/video.vue

@@ -0,0 +1,2057 @@
+<template>
+	<view class="content">
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<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" 
+			@fullscreenchange="fullscreenchange"
+			@controlstoggle="controlstoggle"
+			@waiting="getWaiting"
+			:title="courseInfo.title"
+			style="width: 100%;height: 420rpx;" 
+			:poster="poster"  
+			id="video-content-box"  
+			controls
+			:show-fullscreen-btn="true"
+			:auto-pause-if-open-native="true"
+			:auto-pause-if-navigate="true"
+			:enable-progress-gesture="false" 
+			:show-progress="true"
+			:picture-in-picture-mode="[]"
+			:show-background-playback-button="false"
+			:src="videoUrl"
+			>
+			<!-- :danmu-list="danmuList"
+			enable-danmu
+			danmu-btn -->
+			<!-- 弹幕展示 -->
+			<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="https://cos.his.cdwjyyh.com/fs/20250418/beaf9df1a6204b8babc3e28d9b563c62.png"
+					 @click="openDanmu(1)"></cover-image>
+				</cover-view>
+			</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-if="openCommentStatus!=1">
+				<!-- 答题时展示小节课程名,其他展示课程名 -->
+				<!-- 小节课程名 -->
+				<view class="subtitlebox" v-if="isLogin&&isAddKf==1">
+					{{courseInfo.title}}
+				</view>
+				<!-- 课程名字 -->
+				<view class="miantitlebox" v-else>
+					{{courseInfo.courseName}}
+				</view>
+				<!-- 投诉 -->
+				<view class="warning" @click="feedback" v-if="isLogin&&videoId">
+					<image src="https://cos.his.cdwjyyh.com/fs/20250606/66a44bedde6c4e9d937f4bf866aace40.png"></image>
+					<text>投诉</text>
+				</view>
+			</view>
+			<view class="tabbox-bar" v-if="openCommentStatus==1">
+				<view class="tabbox">
+					<view :class="currentTab == nav.id ? 'tabbox-active':''" v-for="nav in navList" :key="nav.id" @click="handleTab(nav.id)">{{nav.name}}</view>
+				</view>
+				<!-- 投诉 -->
+				<view class="warning" @click="feedback">
+					<image src="https://cos.his.cdwjyyh.com/fs/20250606/66a44bedde6c4e9d937f4bf866aace40.png"></image>
+					<text>投诉</text>
+				</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">
+					<!-- 介绍 -->
+					<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" v-if="isLogin&&isAddKf==1" @click="openPop">
+			<image :src="baseUrl+'/images/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="baseUrl+'/images/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>
+		<!-- 发送弹幕 -->
+		<view class="video-line danmu-line" v-if="isLogin&&isAddKf==1&&openCommentStatus==2" @click="openDanmu(0)" >
+			<image class="set_image" src="https://cos.his.cdwjyyh.com/fs/20250418/5e508642737a44169061382566043ac9.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?'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/danmu-off.png':'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/danmu-on.png'" mode="heightFix" @click="switchDanmu()"></image>
+					<view class="u-border">
+						<u-input 
+						class="danmuPopup-input" 
+						placeholder="发个弹幕吧~" 
+						border="border"
+						:focus="focus"
+						:adjustPosition="false" 
+						:autoBlur="true" 
+						maxlength="50"
+						v-model.trim="inputText">
+						</u-input>
+						<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="baseUrl+'/images/course_answer_img.png'"
+					mode="aspectFill"></image>
+				<!-- 错误 -->
+				<image class="tipimg" v-else :src="baseUrl+'/images/course_answer_incorrectly_img.png'" mode="aspectFill">
+				</image>
+				<view class="answerPopup-title">{{errTitle}}</view>
+				<view class="answerPopup-desc" v-html="errDesc"></view>
+				<!-- 选择奖励 -->
+				<view class="reward-list" v-if="errTitle == '恭喜你,回答正确'">
+					<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>
+		<!-- 客服二维码弹窗 -->
+		<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="baseUrl+'/images/course_close_white_icon.png'" mode="aspectFill"
+					@click="closeKFPop"></image>
+			</view>
+		</uni-popup>
+		<!-- 可以答题提示 -->
+		<view class="answerTip" v-if="currentTab!=1&&openCommentStatus==1&&showAnswerTip" @click="handleTab(1)">
+			可以答题啦
+		</view>
+		<!-- 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="isLogin&&isAddKf==1&&currentTab==1&&quesList&&quesList.length>0" class="footer-btn footer-btn-border" @click="submit">
+				<image class="footer-btn-img" :src="baseUrl+'/images/red_envelope_btnimg.png'" mode="aspectFill"></image>
+				<text>提交答案领取奖励</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 { generateRandomString } from "@/utils/common.js"
+	import dayjs from 'dayjs';
+	import {
+		getErrMsg,
+		getH5CourseByVideoId,
+		getH5CourseVideoDetails,
+		courseAnswer,
+		getFinishCourseVideo,
+		getIsAddKf,
+		getInternetTraffic,
+		getIntegralByH5Video,
+		sendReward,
+		loginByMp,
+		getRealLink,
+		errorLogUpload,
+	} from "@/api/course.js"
+	export default {
+		components: {
+			descInfoNav,
+			descInfo,
+			commentBox,
+			ques,
+		},
+		data() {
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				// 1 红包 2 积分
+				rewardType: [{
+					name: '红包奖励',
+					value: 1
+				}, {
+					name: '积分奖励',
+					value: 2
+				}],
+				currentReward: 1,
+				player: null,
+				loading: true,
+				progress: 0,
+				code: null,
+				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: "",
+				isfull: false,
+				isAddKf: 0,
+				lineIndex: 0,
+				textHeight: 0, //文本高度
+				qwUserId: "",
+				qrcode: "",
+				corpId: "",
+				qrcodeMsg: "",
+				urlOption: {},
+				bufferRate: 0, // 缓冲时间
+				uuId: "",
+				isEnded: false,
+				// 是否允许拖动进度条
+				linkType: 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
+						}
+					},
+				},
+				poster: "",
+				// 错误请求次数
+				errorCount: 0,
+				answerPopup: false,
+				sortLink:"",
+				// 课程是否过期
+				isExpire: false,
+				menuButtonLeft: 281,
+				menuButtonH: 45,
+				timer: null,
+				flag: false,
+				focus: false,
+				openDanmuType: 0,
+				danmuboxHeight: 0,
+				user: {},
+				crtShow: true,
+				// 是否获取到对应观看者的真实链接
+				isCheckRealUrl: false,
+				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,
+				chatId: ""
+			}
+		},
+		onLoad(option) {
+			console.log("nickName==onLoad")
+			this.code = option.code
+			this.urlOption = option.course ? JSON.parse(option.course) : {}
+			this.videoId = this.urlOption.videoId || ''
+			this.qwUserId = this.urlOption.qwUserId || ''
+			this.corpId = this.urlOption.corpId || ''
+			this.linkType = this.urlOption.linkType || 0
+			// if (this.code) {
+			// 	this.loginByMp()
+			// }
+			var that=this;
+			if (this.videoId) {
+				this.getH5CourseByVideo()
+			}
+			this.sortLink = this.urlOption.link || ''
+			this.getMenuButton()
+			// #ifndef H5
+			uni.onKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		onShow() {
+			console.log("nickName==onShow")
+			this.tipsOpen = false
+			// this.isLogin = this.$isLoginCourse()
+			this.uuId = generateRandomString(16)
+			if(uni.getStorageSync('userInfo') && JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.user = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.user = {}
+			}
+			if(this.sortLink){
+				this.getLink()
+			} else {
+				uni.showToast({
+					title: 'sortLink is not found',
+					icon: 'none'
+				});
+			}
+		},
+		mounted() {
+			this.getIP()
+			this.getHeight()
+		},
+		onHide() {
+			// this.player = uni.createVideoContext('video-content-box');
+			if (this.player) {
+				this.player.pause()
+			}
+			this.getFinishCourseVideo()
+			this.getInternetTraffic()
+			// if (this.interval != null) {
+			// 	clearInterval(this.interval)
+			// 	this.interval = null
+			// }
+		},
+		onUnload() {
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			this.getFinishCourseVideo()
+			this.getInternetTraffic()
+			this.clearIntegral()
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+		},
+		beforeDestroy() {
+			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: {
+			getUserNameAndAvatar(){
+				if(!this.chatId) {
+					let userInfos = uni.getStorageSync("userInfos")
+					if(userInfos && JSON.stringify(userInfos)!='{}') {
+						this.avatar = userInfos.avatar
+						this.nickName = userInfos.nickName
+					} else {
+						uni.navigateTo({
+							url: './webview'
+						})
+					}
+				}
+			},
+			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.linkType != 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(this.isEnded||this.playTime >= this.duration - 60) {
+					this.showAnswerTip = true
+				} else {
+					this.showAnswerTip = false
+				}
+				if (Math.floor(e.detail.currentTime) != this.flagTime &&this.openCommentStatus == 2) {
+					this.flagTime = Math.floor(e.detail.currentTime)
+					this.$refs.danmuBox&&this.$refs.danmuBox.checkDanmu(this.flagTime)
+				}
+			},
+			changeTime(that,e) {
+				that.playDurationSeek = 0
+			},
+			videoErrorCallback(e) {
+				this.errorCount++
+				if (this.errorCount > 3) return
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.clearIntegral()
+				console.log(e)
+				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.getFinishCourseVideo()
+			},
+			getWaiting() {
+				this.getErrMsg('','waiting')
+			},
+			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 - 100px - 88rpx)`
+							}
+						})
+						.exec();
+				},200)
+			},
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			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.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.courseLogo = res.config&&res.config.courseLogo
+							this.viewCommentNum = res.config&&res.config.viewCommentNum || 200
+							if(this.openCommentStatus == 3) {
+								this.$refs.commentBox&&this.$refs.commentBox.closeWSocket()
+								this.$refs.danmuBox&&this.$refs.danmuBox.closeWSocket()
+							}
+							const status = res.config&&res.config.openCommentStatus || 3
+							if(status != this.openCommentStatus) {
+								this.openCommentStatus = 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.linkType == 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} = val
+				let time = this.playTime
+				if(this.isEnded) {
+					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 (item.type == 1) {
+					// 单选option
+					item.answer = option.name
+				} else if (item.type == 2) {
+					// 多选
+					let answer = item.answer ? item.answer.split(',') : []
+					if (answer.indexOf(option.name) === -1) {
+						answer.push(option.name)
+						item.answer = answer.join(',')
+					} else {
+						answer.splice(answer.indexOf(option.name), 1)
+						item.answer = answer.join(',')
+					}
+				}
+			},
+			submit() {
+				if(this.isExpire){
+					uni.showToast({
+						title: '课程已过期或链接无效',
+						icon: 'none'
+					});
+					return
+				}
+				// 登录
+				this.$isLoginCourse().then(
+					res => {
+						if(res){
+							if (this.isAddKf == 1&&this.isCheckRealUrl) {
+								// 答题
+								// 您已提交过答案,请领取红包
+								this.courseAnswer()
+							} else {
+								// 添加客服
+								if (this.videoId && this.qwUserId) {
+									this.getIsAddKf()
+								} else {
+									uni.showToast({
+										title: '请添加客服',
+										icon: 'none'
+									})
+								}
+							} 
+						} else{
+							this.goLogin()
+						}
+					},
+					rej => {}
+				);
+			},
+			// 答题
+			courseAnswer() {
+				let time = this.playTime
+				if (this.isEnded) {
+					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;
+				});
+				if(!this.isCheckRealUrl) return;
+				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")
+							}
+						} 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() {
+				this.$refs.answerPopup.close()
+				if(!this.isCheckRealUrl) return;
+				if (this.errTitle == '恭喜你,回答正确') {
+					const param = {
+						...this.urlOption,
+						rewardType: Number(this.currentReward),
+						source: 2
+					}
+					sendReward(param).then(res => {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+						// if(res.code == 200) {
+						// 	//重构 发红包,后台通过OPENID发零钱到 账
+						// 	//this.initWXConfig(res.package)
+						// }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.linkType == 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()
+				}
+
+			},
+			// 客服
+			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.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 400) {
+							this.isAddKf = 0
+							this.isCheckRealUrl = false
+							this.qrcode = res.qrcode
+							this.qrcodeMsg = res.msg
+							this.$refs.kfPopup.open()
+						} else if (res.code == 504) {
+							// 登录
+							this.isCheckRealUrl = false
+							this.goLogin()
+						} else if (res.code == 566) {
+							// 官方群发通用链接
+							const url = res.courseLink.realLink.split('?course=')[1]
+							this.urlOption = JSON.parse(url)
+							this.isAddKf = 1
+							this.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 567) {
+							// 群聊通用链接
+							this.urlOption = {
+								...this.urlOption,
+								qwExternalId: res.qwExternalId
+							}
+							this.isAddKf = 1
+							this.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						} else {
+							this.isCheckRealUrl = false
+							this.isAddKf = 0
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					err => {}
+				);
+			},
+			closeKFPop() {
+				this.$refs.kfPopup.close()
+			},
+			getFinishCourseVideo() {
+				if (!this.isLogin||!this.playTime || !this.isCheckRealUrl) return
+				// {videoId: this.videoId,duration:this.playTime}
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getFinishCourseVideo(param)
+			},
+			// 每十分钟获得积分
+			getIntegralByH5Video() {
+				if(!this.isLogin||!this.isCheckRealUrl) 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.isCheckRealUrl) 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,type) {
+				let msgerr = {
+					errType: type || 'error',
+					videoUrl: this.videoUrl,
+					lineIndex: this.lineIndex,
+					errTime: new Date(),
+					ip: this.ip,
+					errMsg: err || ''
+				}
+				getErrMsg({
+					msg: JSON.stringify(msgerr)
+				})
+			},
+			goLogin() {
+				this.$getProvider().then(provider=>{
+					console.log('当前的环境商',provider)
+					if (!provider) {
+					  reject()
+					}
+					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}).then(res=>{
+										 uni.hideLoading();
+										 if (res.code == 200) {
+											uni.setStorageSync('AppTokenmini_RTCourse', res.token);
+											uni.setStorageSync('userInfo', JSON.stringify(res.user));
+											this.user = res.user
+											this.isLogin = true
+											this.getIsAddKf() 
+										 } else {
+											uni.showToast({
+												title: res.msg,
+												icon: 'none'
+											});
+										 }
+									 }).catch(err=>{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录失败,请重新登录",
+										});
+									});
+							   }
+							});
+						}
+					})
+				}).catch(err => {})
+			},
+			getLink() {
+				let that = this;
+				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.isCheckRealUrl) {
+							this.getH5CourseVideoDetails()
+						}
+						if (this.videoId &&(this.isAddKf != 1 || !this.isCheckRealUrl)) {
+							this.$isLoginCourse().then(
+								isLogin => {
+									this.isLogin = isLogin
+									if(isLogin){
+										this.getIsAddKf() 
+									} else {
+										this.goLogin()
+									}
+								},
+								rej => {}
+							);
+						}
+					} else {
+						this.isExpire = true
+						uni.showToast({
+							title: '课程已过期或链接无效',
+							icon: 'none'
+						});
+					}
+				}).catch(err=>{
+					this.isExpire = true
+					uni.showToast({
+						title: '发生错误,请稍后再试',
+						icon: 'none'
+					});
+				})
+			},
+			/**
+			 * 节流原理:在一定时间内,只能触发一次
+			 *
+			 * @param {Function} func 要执行的回调函数
+			 * @param {Number} wait 延时的时间
+			 * @param {Boolean} immediate 是否立即执行
+			 * @return null
+			 */
+			throttle(func, wait = 500, 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) {
+				console.log(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.getComments()
+					}
+				} 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.getComments()
+					})
+				}
+				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)
+				}
+			},
+			feedback() {
+				const userId = this.user.userId || ''
+				const courseId = this.urlOption.courseId || ''
+				const videoId = this.urlOption.videoId || ''
+				uni.navigateTo({
+					url: './feedback?userId='+userId+'&courseId='+courseId+'&videoId='+videoId
+				})
+			}
+		}
+	}
+</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;
+			box-sizing: border-box;
+			@include u-flex(row, center, space-between);
+			.title {
+				font-size: 36rpx;
+				font-weight: 500;
+				color: #414858;
+			}
+
+			.time-or-subtitle {
+				margin-top: 12rpx;
+				color: #666666;
+			}
+		}
+		.warning {
+			flex-shrink: 0;
+			color: #888;
+			font-size: 24rpx;
+			@include u-flex(column, center, center);
+			image {
+				flex-shrink: 0;
+				height: 36rpx;
+				width: 36rpx;
+			}
+		}
+		.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) + 14rpx);
+			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;
+	}
+	.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 6rpx;
+			border-radius: 6px;
+		}
+		&-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: 10px;
+			}
+		}
+		&-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: 6px;
+			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-bar {
+		@include u-flex(row, center, flex-start);
+		background-color: #fff;
+		.warning {
+			flex-shrink: 0;
+			padding-right: 20rpx;
+		}
+	}
+	.tabbox {
+		flex: 1;
+		@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: 100rpx;
+		width: 100rpx;
+		font-size: 25rpx;
+		text-align: center;
+		padding: 10rpx;
+		@include u-flex(row, 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%);
+		}
+	}
+</style>

+ 2243 - 0
pages_course/videoOld.vue

@@ -0,0 +1,2243 @@
+<template>
+	<view class="content">
+		<view class="header-nav" :style="{height: `calc(88rpx + ${statusBarHeight}px)`,paddingTop: statusBarHeight + 'px'}">
+			<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" 
+			@fullscreenchange="fullscreenchange"
+			@controlstoggle="controlstoggle"
+			@waiting="getWaiting"
+			:title="courseInfo.title"
+			style="width: 100%;height: 420rpx;" 
+			:poster="poster"  
+			id="video-content-box"  
+			controls
+			:show-fullscreen-btn="true"
+			:auto-pause-if-open-native="true"
+			:auto-pause-if-navigate="true"
+			:enable-progress-gesture="false" 
+			:show-progress="true"
+			:picture-in-picture-mode="[]"
+			:show-background-playback-button="false"
+			:src="videoUrl"
+			>
+			<!-- :danmu-list="danmuList"
+			enable-danmu
+			danmu-btn -->
+				<!-- <template v-if="showDanmu==1">
+					<text v-for="(item, index) in activeDanmus" :key="item.id" class="danmu-item danmuMove" 
+						:style="{
+						  top: item.top + 'px',
+						  ...item.style,
+						  'animation-duration': '8s'
+						 }" @animationend="animationend(item,index)">
+						{{ item.text }}
+					</text>
+				</template>
+				<cover-view class="video-danmu-btnbox" :style="{display: isfull&&crtShow&&isLogin&&isAddKf==1 ? 'block':'none'}">
+					<cover-image class="video-danmu-image"
+					 src="https://cos.his.cdwjyyh.com/fs/20250418/beaf9df1a6204b8babc3e28d9b563c62.png"
+					 @click="openDanmu(1)"></cover-image>
+				</cover-view> -->
+			</video>
+		</view>
+		<view class="title-content" id="title-content">
+			<!-- 答题时展示小节课程名,其他展示课程名 -->
+			<!-- 小节课程名 -->
+			<view class="subtitlebox" v-if="isLogin&&isAddKf==1">
+				{{courseInfo.title}}
+			</view>
+			<!-- 课程名字 -->
+			<view class="miantitlebox" v-else>
+				{{courseInfo.courseName}}
+			</view>
+		</view>
+		<scroll-view class="scroll-view" :style="{height: height}" :scroll-top="scrollTop" scroll-y="true">
+			<!-- 介绍 -->
+			<view class="descbox">
+				<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="baseUrl+'/images/course_arrow_up_icon.png'" v-show="isExpand"></image>
+							<image :src="baseUrl+'/images/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="baseUrl+'/images/course_arrow_up_icon.png'" v-show="isExpand"></image>
+						<image :src="baseUrl+'/images/course_arrow_down_icon.png'" v-show="!isExpand"></image>
+					</view>
+				</view>
+			</view>
+			<!-- 问题 -->
+			<view class="ques-content" v-if="isLogin&&isAddKf==1">
+				<view class="ques-content-tit">问答题</view>
+				<view v-for="(item,index) in quesList" :key="index">
+					<view class="ques-title">
+						<text>{{index + 1}}.</text>
+						<view class="ques-type" v-show="item.type == 1 || item.type == 2">
+							{{item.type == 1 ? '单选' : item.type == 2 ? '多选' : ''}}
+						</view>
+						<text>{{item.title}}</text>
+					</view>
+					<view
+					:class="isAnswer(item,option.name) ?'ques-option ques-option-active':'ques-option'" 
+					v-for="(option,idx) in item.questionOption" 
+					:key="idx" 
+					@click="handleAnswer(item,option)">
+						<view>
+							{{numberToLetter(idx)}}.
+						</view>
+						<view>{{option.name}}</view>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		<!-- 线路 -->
+		<view class="video-line" @click="openPop" v-if="isLogin&&isAddKf==1">
+			<image :src="baseUrl+'/images/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="baseUrl+'/images/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(lineIndex + 1)}}</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- 发送弹幕 -->
+		<!-- <view class="video-line danmu-line" @click="openDanmu(0)" v-if="isLogin&&isAddKf==1">
+			<image class="set_image" src="https://cos.his.cdwjyyh.com/fs/20250418/5e508642737a44169061382566043ac9.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?'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/danmu-off.png':'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/danmu-on.png'" mode="heightFix" @click="switchDanmu()"></image>
+					<u-input 
+					class="danmuPopup-input" 
+					placeholder="发个弹幕吧~" 
+					border="surround" 
+					shape="circle" 
+					:focus="focus"
+					:adjustPosition="false" 
+					:autoBlur="true" 
+					maxlength="140" 
+					clearable 
+					v-model.trim="danmuIput"></u-input>
+					<button class="danmuPopup-send"  :disabled="danmubtnLoading"  @click="sendDanmu">发送</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="baseUrl+'/images/course_answer_img.png'"
+					mode="aspectFill"></image>
+				<!-- 错误 -->
+				<image class="tipimg" v-else :src="baseUrl+'/images/course_answer_incorrectly_img.png'" mode="aspectFill">
+				</image>
+				<view class="answerPopup-title">{{errTitle}}</view>
+				<view class="answerPopup-desc" v-html="errDesc"></view>
+				<!-- 选择奖励 -->
+				<view class="reward-list" v-if="errTitle == '恭喜你,回答正确'">
+					<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>
+		<!-- 客服二维码弹窗 -->
+		<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="baseUrl+'/images/course_close_white_icon.png'" mode="aspectFill"
+					@click="closeKFPop"></image>
+			</view>
+		</uni-popup>
+		<!-- footer -->
+		<view class="footer" v-if="videoId">
+			<view class="footer-btn" v-if="!isLogin || isAddKf !=1" @click="submit">
+				<text>立即学习</text>
+			</view>
+			<view v-if="isLogin&&isAddKf==1&&quesList&&quesList.length>0" class="footer-btn footer-btn-border" @click="submit">
+				<image class="footer-btn-img" :src="baseUrl+'/images/red_envelope_btnimg.png'" mode="aspectFill"></image>
+				<text>提交答案领取奖励</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>
+</template>
+
+<script>
+	import { generateRandomString } from "@/utils/common.js"
+	import dayjs from 'dayjs';
+	import {
+		getErrMsg,
+		getH5CourseByVideoId,
+		getH5CourseVideoDetails,
+		courseAnswer,
+		getFinishCourseVideo,
+		getIsAddKf,
+		getInternetTraffic,
+		getIntegralByH5Video,
+		sendReward,
+		loginByMp,
+		getRealLink,
+		getDanmuList,
+		errorLogUpload
+	} from "@/api/course.js"
+	export default {
+		data() {
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				// 1 红包 2 积分
+				rewardType: [{
+					name: '红包奖励',
+					value: 1
+				}, {
+					name: '积分奖励',
+					value: 2
+				}],
+				currentReward: 1,
+				player: null,
+				loading: true,
+				progress: 0,
+				code: null,
+				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: "",
+				isfull: false,
+				isAddKf: 0,
+				lineIndex: 0,
+				// 是否展开
+				isExpand: false,
+				textHeight: 0, //文本高度
+				qwUserId: "",
+				qrcode: "",
+				corpId: "",
+				qrcodeMsg: "",
+				urlOption: {},
+				bufferRate: 0, // 缓冲时间
+				uuId: "",
+				isEnded: false,
+				// 是否允许拖动进度条
+				linkType: 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,
+				danmuList: [],
+				danmuIput: '',
+				focus: false,
+				danmubtnLoading: false,
+				openDanmuType: 0,
+				socket:null,
+				isSocketOpen: false,
+				isSend:true,
+				reOpenSocket: false,
+				pingpangTimes:null,
+				danmuboxHeight: 0,
+				user: {},
+				crtShow: true,
+				isCheckRealUrl: false,
+				activeDanmus:[],
+				flagTime: 0,
+				danmuItemStyle:{
+					color: '#ffffff',
+					fontSize: '16px',
+					border: 'solid 1px #ffffff',
+					borderRadius: '5px',
+					padding: '2px 2px',
+					backgroundColor: 'rgba(255, 255, 255, 0.1)'
+				},
+				showDanmu: 1,
+				ctx: null
+			}
+		},
+		computed: {
+			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
+					}
+				}
+			}
+		},
+		onLoad(option) {
+			this.code = option.code
+			this.urlOption = option.course ? JSON.parse(option.course) : {}
+			this.videoId = this.urlOption.videoId
+			this.qwUserId = this.urlOption.qwUserId || ''
+			this.corpId = this.urlOption.corpId || ''
+			this.linkType = this.urlOption.linkType || 0
+			// if (this.code) {
+			// 	this.loginByMp()
+			// }
+			var that=this;
+			if (this.videoId) {
+				this.getH5CourseByVideo()
+			}
+			this.sortLink = this.urlOption.link || ''
+			this.getMenuButton()
+			// #ifndef H5
+			uni.onKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+			if(this.socket!=null){
+				this.socket.close()
+				clearInterval(this.pingpangTimes)
+				this.socket = null
+			}
+			// this.initTracks()
+		},
+		onShow() {
+			this.tipsOpen = false
+			this.isExpand = true
+			// this.isLogin = this.$isLoginCourse()
+			this.uuId = generateRandomString(16)
+			if(uni.getStorageSync('userInfo') && JSON.stringify(uni.getStorageSync('userInfo'))!='{}') {
+				this.user = JSON.parse(uni.getStorageSync('userInfo'))
+			} else {
+				this.user = {}
+			}
+			if(this.sortLink){
+				this.getLink()
+			} else {
+				uni.showToast({
+					title: 'sortLink is not found',
+					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() {
+			if (this.interval != null) {
+				clearInterval(this.interval)
+				this.interval = null
+			}
+			if(this.socket!=null){
+				this.socket.close()
+				clearInterval(this.pingpangTimes)
+				this.socket = null
+			}
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+			this.clearIntegral()
+		},
+		beforeDestroy() {
+			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
+			}
+			if(this.socket!=null){
+				this.socket.close()
+				clearInterval(this.pingpangTimes)
+				this.socket = null
+			}
+			// #ifndef H5
+			uni.offKeyboardHeightChange(this.keyboardHeightChange);
+			// #endif
+			this.clearIntegral()
+		},
+		methods: {
+			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.linkType != 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)
+					this.checkDanmu()
+				}
+			},
+			changeTime(that,e) {
+				that.playDurationSeek = 0
+			},
+			videoErrorCallback(e) {
+				this.errorCount++
+				if (this.errorCount > 3) return
+				if (this.interval != null) {
+					clearInterval(this.interval)
+				}
+				this.clearIntegral()
+				console.log(e)
+				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.getFinishCourseVideo()
+			},
+			getWaiting() {
+				this.getErrMsg('','waiting')
+			},
+			fullscreenchange(event) {
+				this.isfull = event.detail.fullScreen
+				this.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() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#title-content")
+						.boundingClientRect((data) => {
+							this.height =
+								`calc(100vh - ${data.height}px - 420rpx - ${this.statusBarHeight}px - 164rpx - 88rpx)`
+						})
+						.exec();
+				})
+			},
+			getDescHeight() {
+				this.$nextTick(() => {
+					const query = uni.createSelectorQuery().in(this);
+					query
+						.select("#descbox-desc")
+						.boundingClientRect((data) => {
+							this.textHeight = data.height
+						})
+						.exec();
+				})
+			},
+			numberToLetter(num) {
+				// 将数字转换为字母的 ASCII 码
+				let letterCode = num + 65;
+				// 将 ASCII 码转换为大写字母
+				let letter = String.fromCharCode(letterCode);
+				return letter;
+			},
+			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
+				}
+			},
+			// 展开简介
+			handleExpand() {
+				this.isExpand = !this.isExpand
+			},
+			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 : ''
+							});
+						} else {
+							
+						}
+						this.getHeight()
+						this.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.isFinish = res.isFinish || 0
+							this.duration = res.course && res.course.duration ? res.course.duration : 0
+							this.playDuration = res.playDuration || 0
+							this.playDurationSeek = 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
+							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
+								setTimeout(()=>{
+									this.player = uni.createVideoContext('video-content-box');
+									this.player.seek(this.playTime)
+									this.player.play();
+								},500);
+								// this.getDanmuList()
+								// if (this.socket) {
+								// 	this.socket.close({
+								// 		success:()=>{
+								// 			this.reOpenSocket = true
+								// 			clearInterval(this.pingpangTimes)
+								// 		}
+								// 	})
+								// } else {
+								// 	this.initSocket()
+								// }
+							} else {
+								// let div = document.querySelector(".vjs-progress-control");
+								// if(div) {
+								// 	if (this.isFinish == 1 || this.isEnded || this.linkType == 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.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: ''
+								}))
+						} else {
+							if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+								this.sendErrorLog('/app/course/getH5CourseVideoDetails',this.urlOption)
+							}
+						}
+						this.getHeight()
+						this.getDescHeight()
+					},
+					rej => {}
+				)
+			},
+			handleAnswer(item, option, idx) {
+				let time = this.playTime
+				if(this.isEnded) {
+					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 (item.type == 1) {
+					// 单选option
+					item.answer = option.name
+				} else if (item.type == 2) {
+					// 多选
+					let answer = item.answer ? item.answer.split(',') : []
+					if (answer.indexOf(option.name) === -1) {
+						answer.push(option.name)
+						item.answer = answer.join(',')
+					} else {
+						answer.splice(answer.indexOf(option.name), 1)
+						item.answer = answer.join(',')
+					}
+				}
+			},
+			submit() {
+				if(this.isExpire){
+					uni.showToast({
+						title: '课程已过期或链接无效',
+						icon: 'none'
+					});
+					return
+				}
+				// 登录
+				this.$isLoginCourse().then(
+					res => {
+						if(res){
+							if (this.isAddKf == 1&&this.isCheckRealUrl) {
+								// 答题
+								// 您已提交过答案,请领取红包
+								this.courseAnswer()
+							} else {
+								// 添加客服
+								if (this.videoId && this.qwUserId) {
+									this.getIsAddKf()
+								} else {
+									uni.showToast({
+										title: '请添加客服',
+										icon: 'none'
+									})
+								}
+							} 
+						} else{
+							this.goLogin()
+						}
+					},
+					rej => {}
+				);
+			},
+			// 答题
+			courseAnswer() {
+				let time = this.playTime
+				if (this.isEnded) {
+					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;
+				});
+				if(!this.isCheckRealUrl) return;
+				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")
+							}
+						} else {
+							if (res.msg == "该课题到达答错次数限制") {
+								this.errTitle = "答题次数超过限制"
+								this.errDesc = "以后的课程要认真学习哦"
+								this.$refs.answerPopup.open("center")
+							} else {
+								uni.showToast({
+									title: res.msg,
+									icon: "none"
+								})
+							}
+							if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+								this.sendErrorLog('/app/course/courseAnswer',param)
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			// 选择
+			rewardChange(e) {
+				this.currentReward = e.detail.value
+			},
+			closeAnswerPopup() {
+				this.$refs.answerPopup.close()
+				if(!this.isCheckRealUrl) return;
+				if (this.errTitle == '恭喜你,回答正确') {
+					const param = {
+						...this.urlOption,
+						rewardType: Number(this.currentReward),
+						source: 2
+					}
+					sendReward(param).then(res => {
+						uni.showToast({
+							title: res.msg,
+							icon: 'none'
+						})
+						// if(res.code == 200) {
+						// 	//重构 发红包,后台通过OPENID发零钱到 账
+						// 	//this.initWXConfig(res.package)
+						// }else {
+						// 	uni.showToast({
+						// 		title: res.msg,
+						// 		icon: 'none'
+						// 	})
+						// }
+						if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+							this.sendErrorLog('/app/course/sendReward',param)
+						}
+					})
+				}
+			},
+			// 线路
+			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.linkType == 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()
+				}
+
+			},
+			// 客服
+			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.isCheckRealUrl = true
+							this.getH5CourseVideoDetails()
+						} else if (res.code == 400) {
+							this.isAddKf = 0
+							this.isCheckRealUrl = false
+							this.qrcode = res.qrcode
+							this.qrcodeMsg = res.msg
+							this.$refs.kfPopup.open()
+						} else if (res.code == 504) {
+							// 登录
+							this.isCheckRealUrl = false
+							this.goLogin()
+						} else if (res.code == 566) {
+							this.isAddKf = 1
+							this.isCheckRealUrl = true
+							// 官方群发通用链接
+							const url = res.courseLink.realLink.split('?course=')[1]
+							this.urlOption = JSON.parse(url)
+							this.getH5CourseVideoDetails()
+						} else {
+							this.isCheckRealUrl = false
+							this.isAddKf = 0
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+								this.sendErrorLog('/app/course/isAddKf',this.urlOption)
+							}
+						}
+					},
+					err => {}
+				);
+			},
+			closeKFPop() {
+				this.$refs.kfPopup.close()
+			},
+			getFinishCourseVideo() {
+				if (!this.playTime || !this.isCheckRealUrl) return
+				// {videoId: this.videoId,duration:this.playTime}
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getFinishCourseVideo(param).then(res=>{
+					if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+						this.sendErrorLog('/app/course/updateWatchDuration',param)
+					}
+				})
+			},
+			// 每十分钟获得积分
+			getIntegralByH5Video() {
+				if(!this.isCheckRealUrl) return
+				const param = {
+					duration: this.playTime,
+					...this.urlOption
+				}
+				getIntegralByH5Video(param).then(res => {
+					if (res.code == 200) {
+						uni.showToast({
+							title: "积分+10",
+							icon: "none"
+						})
+					} else {
+						if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+							this.sendErrorLog('/app/course/getIntegralByH5Video',param)
+						}
+					}
+				})
+			},
+			progressChange(e) {
+				this.bufferRate = Math.ceil(e.detail.buffered)
+			},
+			// 缓冲
+			getInternetTraffic() {
+				if(!this.isCheckRealUrl) 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).then(res=>{
+					if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+						this.sendErrorLog('/app/course/getInternetTraffic',param)
+					}
+				})
+			},
+			getErrMsg(err,type) {
+				let msgerr = {
+					errType: type || 'error',
+					videoUrl: this.videoUrl,
+					lineIndex: this.lineIndex,
+					errTime: new Date(),
+					ip: this.ip,
+					errMsg: err || ''
+				}
+				getErrMsg({
+					msg: JSON.stringify(msgerr)
+				})
+			},
+			goLogin() {
+				this.$getProvider().then(provider=>{
+					console.log('当前的环境商',provider)
+					if (!provider) {
+					  reject()
+					}
+					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}).then(res=>{
+										 uni.hideLoading();
+										 if (res.code == 200) {
+											uni.setStorageSync('AppTokenmini_RTCourse', res.token);
+											uni.setStorageSync('userInfo', JSON.stringify(res.user));
+											this.user = res.user
+											this.isLogin = true
+											this.getIsAddKf() 
+										 } else {
+											uni.showToast({
+												title: res.msg,
+												icon: 'none'
+											});
+											if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+												this.sendErrorLog('/app/wx/courseLogin',{code: loginRes.code,encryptedData:infoRes.encryptedData,iv:infoRes.iv})
+											}
+										 }
+									 }).catch(err=>{
+										uni.hideLoading();
+										uni.showToast({
+											icon:'none',
+											title: "登录失败,请重新登录",
+										});
+									});
+							   }
+							});
+						}
+					})
+				}).catch(err => {})
+			},
+			getLink() {
+				let that = this;
+				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.isCheckRealUrl) {
+							this.getH5CourseVideoDetails()
+						}
+						if (this.videoId &&(this.isAddKf != 1 || !this.isCheckRealUrl)) {
+							this.$isLoginCourse().then(
+								isLogin => {
+									this.isLogin = isLogin
+									if(isLogin){
+										this.getIsAddKf() 
+									} else {
+										this.goLogin()
+									}
+								},
+								rej => {}
+							);
+						}
+					} else {
+						this.isExpire = true
+						uni.showToast({
+							title: '课程已过期或链接无效',
+							icon: 'none'
+						});
+						if(res&&res.code==500&&res.msg == '未知异常,请联系管理员'){
+							this.sendErrorLog('/app/course/getRealLink',{sortLink:this.sortLink})
+						}
+					}
+				}).catch(err=>{
+					this.isExpire = true
+					uni.showToast({
+						title: '发生错误,请稍后再试',
+						icon: 'none'
+					});
+				})
+			},
+			/**
+			 * 节流原理:在一定时间内,只能触发一次
+			 *
+			 * @param {Function} func 要执行的回调函数
+			 * @param {Number} wait 延时的时间
+			 * @param {Boolean} immediate 是否立即执行
+			 * @return null
+			 */
+			throttle(func, wait = 500, 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.danmuIput= ''
+				if(type == 1) {
+					this.player.exitFullScreen()
+				}
+				this.$refs.danmuPopup.open()
+			},
+			changeShowPopup(val) {
+				this.focus = val.show
+			},
+			// 发送弹幕
+			sendDanmu() {
+				if(this.danmuIput=='') {
+					uni.showToast({
+						title: '弹幕不能为空',
+						icon: 'none'
+					})
+					return;
+				}
+				this.sendMsg()
+			},
+			// 弹幕列表
+			getDanmuList(){
+				getDanmuList(this.videoId).then(res=>{
+					if(res.code == 200&&res.data&&res.data.length>0) {
+						this.danmuList = res.data.map(item=>({
+							id: item.id,
+							text: item.content,
+							time: item.timePoint ? Number(item.timePoint) : this.playTime,
+							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.user.userId ==item.userId ? item.color ? `solid 1px ${item.color}`: this.danmuItemStyle.border : 'none',
+								borderRadius: this.user.userId==item.userId ? this.danmuItemStyle.borderRadius : 0,
+								backgroundColor: this.user.userId==item.userId ? this.danmuItemStyle.backgroundColor : 'transparent'
+							},
+						}))
+					} else {
+						this.danmuList = []
+					}
+				})
+			},
+			//创建一个socket连接
+			initSocket() {
+				let userId = this.user.userId;
+				let that = this;
+				this.socket = uni.connectSocket({
+					url: getApp().globalData.wsUrl + "/ws/barrage/" + this.videoId,
+					multiple: true,
+					header: {
+						'token': uni.getStorageSync('AppTokenmini_RTCourse')
+					},
+					success: res => {
+						console.log('WebSocket连接已打开1!');
+						that.isSocketOpen = true
+						that.reOpenSocket = false
+						
+						// 保持心跳
+						if(that.pingpangTimes) {
+							clearInterval(that.pingpangTimes)
+							that.pingpangTimes= null
+						}
+						that.pingpangTimes=setInterval(()=>{
+							let data={cmd:"heartbeat",userId: userId};
+							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=="danmu"){
+						that.isSend=true;
+						that.addMsg(1,redata);
+					}
+				})
+				//监听socket打开
+				this.socket.onOpen(() => {
+					console.log('WebSocket连接已打开2!');
+					that.isSocketOpen = true
+					that.reOpenSocket = false
+					that.isSend = true;
+				})
+				//监听socket关闭
+				this.socket.onClose(() => {
+					that.isSocketOpen = false
+					that.socket = null
+					console.log('WebSocket连接已关闭!',that.reOpenSocket);
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+					if(that.reOpenSocket) {
+						//重启
+						// that.initSocket()
+					}
+				})
+				//监听socket错误
+				this.socket.onError((err) => {
+					console.log("socket err:",err)
+					that.isSocketOpen = false
+					that.reOpenSocket = false
+					that.socket = null
+					if(that.pingpangTimes) {
+						clearInterval(that.pingpangTimes)
+						that.pingpangTimes= null
+					}
+				})
+			},
+			sendMsg() {
+				if (!this.isSend) {
+					return;
+				}
+				if (this.isSocketOpen) {
+					var data = {
+						cmd: 'danmu',
+						userId: this.user.userId,
+						videoId: this.videoId,
+						content: this.danmuIput,
+						timePoint: this.playTime, // 弹幕对应视频时间节点()秒
+						platform: 'uniapp',  //发送平台,app传值“app”,小程序传值“uniapp”
+						fontSize: '16px',
+						mode: "scroll",
+						color: "#ffffff",
+					};
+					this.socket.send({
+						data: JSON.stringify(data),
+						success: () => {
+							console.log("发送成功")
+							this.$refs.danmuPopup.close()
+							this.isSend = false;
+						},
+						fail: () => {
+							uni.showToast({
+								title: '发送失败',
+								icon: 'none'
+							})
+						}
+					});
+			
+				}
+			
+			},
+			// 收到消息
+			addMsg(type, content) {
+				if (!this.player) {
+					this.player = uni.createVideoContext('video-content-box');
+				}
+				// this.player.sendDanmu({
+				// 	text: content.content,
+				// 	color: "#FF0000",
+				// 	time: this.playTime + 1
+				// })
+				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 = {
+					id: content.id || id,
+					userId: content.userId,
+					text: content.content,
+					time: this.flagTime + 1,
+					color: content.color || this.danmuItemStyle.color,
+					style: this.user.userId == content.userId ? mystyle : otherstyle,
+					top: null
+				}
+				console
+				if(this.showDanmu == 0) return
+				this.danmuList.push(obj)
+			},
+			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
+					});
+				}
+			},
+			// 获取字体高度
+			getTextWidth(content) {
+				if (!this.ctx) {
+					this.ctx = uni.createCanvasContext('myCanvas')
+				}
+				const metrics = this.ctx.measureText(content)
+				return Math.ceil(metrics.width)
+			},
+			// 分配轨道
+			getFreeTrack(item) {
+				const width = this.getTextWidth(item.content)
+				const passWidth = width + uni.getSystemInfoSync().screenWidth
+				const duration = 8
+				for (let i = 0; i < this.tracks.length; i++) {
+					if (this.tracks[i].isFree) {
+						this.tracks[i].isFree = false;
+						// 等本条通过右边界的时间
+						let passtime = Math.ceil(duration * 1000 / passWidth * width)
+						passtime = passtime + 1000
+						// console.log("passtime==", passtime)
+						setTimeout(() => {
+							this.tracks[i].isFree = true;
+						}, passtime); // 5秒后释放轨道
+						return this.tracks[i].top;
+					}
+				}
+				// 无可用轨道
+				if (item.userId == this.user.userId) {
+					let trackHeight = this.tracks[this.tracks.length - 1].top
+					return Math.random() * trackHeight + 16 // 自己发的弹幕随机高度; // 无可用轨道
+				} else {
+					// console.log("无可用轨道")
+					return 'abandon'
+				}
+			},
+			// 检测并激活弹幕
+			checkDanmu() {
+				if(this.showDanmu == 0) return
+				// 筛选当前时间应出现的弹幕
+				const newDanmus = this.danmuList.filter((item) => Math.abs(item.time - this.flagTime) < 1)
+				// 分配轨道高度
+				newDanmus.forEach((item) => {
+					// 滚动弹幕随机高度
+					if(!item.top) {
+						item.top = this.getFreeTrack(item)
+					}
+				})
+				// 过滤没有分配到空闲轨道弹幕
+				const aliveNewDanmus = newDanmus.filter((item) => item.top != 'abandon')
+				// 添加到活跃列表
+				this.activeDanmus = [...this.activeDanmus, ...aliveNewDanmus]
+			},
+			animationend(moveItem, i) {
+				// 移除动画结束的弹幕(性能优化)
+				this.activeDanmus = this.activeDanmus.filter((item) => item.id != moveItem.id)
+			},
+			switchDanmu() {
+				this.showDanmu = this.showDanmu == 1 ? 0:1
+				if(this.showDanmu == 0) {
+					this.activeDanmus = []
+					this.initTracks()
+				}
+			},
+			// 未知异常,请联系管理员
+			sendErrorLog(url,param){
+				const data = {
+					url:url || '',
+					param:param?JSON.stringify(param) : ''
+				}
+				errorLogUpload(data)
+			}
+		}
+	}
+</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) + 164rpx);
+		.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;
+			}
+		}
+
+		.descbox {
+			padding: 36rpx 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;
+		}
+
+		.ques-content {
+			background-color: #fff;
+			padding: 40rpx 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;
+			}
+		}
+
+		.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) + 14rpx);
+			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;
+	}
+	.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);
+		&-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-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%);
+		}
+	}
+	.danmu-icon{
+		height: 24px;
+		width: 24px;
+		margin-right: 12px;
+	}
+</style>

+ 159 - 0
pages_course/webview.vue

@@ -0,0 +1,159 @@
+<template>
+	<view class="container">
+		<!-- 加载提示 -->
+		<view class="loading" v-if="loading">
+			<text>加载中...</text>
+		</view>
+
+		<!-- web-view组件 -->
+		<web-view :src="webviewUrl" @message="handleMessage" @load="onLoads" @error="onError"></web-view>
+	</view>
+</template>
+
+<script>
+	import {loginByMpH5} from '@/api/course.js'
+	export default {
+		data() {
+			return {
+				loading: true,
+				webviewUrl: 'https://h5api.his.cdwjyyh.com/weixinOauth',
+				userInfo: null
+			}
+		},
+		onLoad(options) {
+			console.log("webview",options)
+			if (options.code) {
+				// uni.$emit('usercode', {  code: options.code });
+				this.loginweixin(options.code)
+
+			}
+			// 生成带参的H5授权页面URL
+			// this.webviewUrl = this.generateAuthUrl()
+		},
+		methods: {
+			loginweixin(datas) {
+				var data = {
+					code: datas,
+				}
+				loginByMpH5(data).then(res => {
+						this.res = res
+						uni.hideLoading();
+						if (res.code == 200) {
+							console.log(res)
+							uni.hideLoading();
+							uni.showToast({
+								icon: 'none',
+								title: "成功获取用户信息",
+							});
+							uni.setStorageSync('userInfos', JSON.stringify(res.user));
+							this.userInfo = res.user;
+							setTimeout(() => {
+								uni.navigateBack({
+									delta: 1
+								});
+							}, 200)
+						} else {
+							uni.hideLoading();
+							uni.showToast({
+								title: res.msg || '获取用户信息失败',
+								icon: 'none'
+							})
+						}
+					},
+					err => {}
+				).catch(err => {
+					uni.hideLoading();
+					uni.showToast({
+						icon: 'none',
+						title: "授权登录失败,请重新登录",
+					});
+				});
+			},
+			// 生成授权页面URL,附带小程序传递的参数
+			generateAuthUrl() {
+				// 获取当前小程序的场景值,用于后续业务处理
+				const scene = uni.getLaunchOptionsSync().scene
+
+				// 这里替换为你的uniapp H5项目域名
+
+				// 拼接参数,可包含小程序特有的信息
+				const params = {
+					scene,
+					appid: 'wx961fadab9bcb792b', // 公众号AppID
+					redirect_uri: encodeURIComponent('https://h5api.his.cdwjyyh.com/weixinOauth'),
+					scope: 'snsapi_userinfo',
+					state: 'wechat_redirect'
+				}
+
+				// 微信公众号授权URL
+				return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${params.appid}&redirect_uri=${params.redirect_uri}&response_type=code&scope=${params.scope}&state=${params.state}#wechat_redirect`
+			},
+
+			// 处理web-view向小程序发送的消息
+			handleMessage(e) {
+				console.log('收到web-view消息:', e.detail)
+				console.log('收到web-view消息:', e)
+				// 获取H5页面传递过来的用户信息
+				if (e.detail && e.detail.type === 'user_info') {
+					this.userInfo = e.detail.data
+					this.token = e.detail.token
+					// 存储用户信息到本地
+					uni.setStorageSync('userInfo', this.userInfo)
+					uni.setStorageSync('TOKEN_WEXIN', this.userInfo)
+
+					// 返回上一页或跳转到首页
+					uni.showToast({
+						title: '登录成功',
+						icon: 'success'
+					})
+
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 1500)
+				}
+			},
+
+			// web-view加载完成
+			onLoads() {
+				this.loading = false
+				console.log('web-view加载完成')
+			},
+
+			// web-view加载失败
+			onError(e) {
+				this.loading = false
+				console.error('web-view加载失败:', e)
+				uni.showToast({
+					title: '页面加载失败',
+					icon: 'none'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.container {
+		width: 100%;
+		height: 100%;
+		position: relative;
+	}
+
+	.loading {
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background-color: #fff;
+		z-index: 100;
+	}
+
+	web-view {
+		width: 100%;
+		height: 100%;
+	}
+</style>

+ 244 - 0
pages_doctor/doctorArticleDetails.vue

@@ -0,0 +1,244 @@
+<template>
+	<view class="content">
+		<view class="detail-cont">
+			<view class="title">{{item.title}}</view>
+			<view class="info">
+				<view class="reads">阅读数:{{item.views}}</view>
+				<view class="time">{{item.createTime}}</view>
+			</view>
+			<view class="video"  v-if="item.videoUrl!=null">
+				<video class="myVideo" id="myVideo" :src="item.videoUrl"
+				                  @error="videoErrorCallback"   controls></video>
+			</view>
+			<!-- 正文 -->
+			<view class="full-text"  >
+				<view v-html="item.content"></view>
+			</view>
+			
+		</view>
+		<!-- 咨询按钮 -->
+		<view class="inquiry"  >
+			<view class="content"  @click="navTo('/pages_doctor/doctorDetails?doctorId='+item.doctorId)">
+				<image  mode="aspectFill"  :src="item.avatar" ></image>
+				<text class="text">{{item.doctorName}}</text>
+			</view>
+			
+		</view>
+		<view class="ad">
+			<u-swiper
+					:list="advImgs"
+					indicator
+					indicatorMode="line"
+					circular
+					@click="handleAdvClick"
+			></u-swiper>
+		</view>
+	</view> 
+</template>
+
+<script>
+	import {getAdvList} from '@/api/adv.js'
+	import {getDoctorArticleById} from '@/api/doctorArticle.js'
+	export default {
+		data() {
+			return {
+				advs:[],
+				advImgs:[],
+				src: '',
+				articleId:null,
+				item:{},
+			};
+		},
+		onLoad(option) {
+			this.articleId=option.articleId;
+			 
+		},
+		onShow() {
+			this.getAdvList()
+			this.getDoctorArticleById();
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.item.title,
+				path: '/pages_doctor/doctorArticleDetails?articleId='+this.articleId,
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.item.title,
+				query:'articleId='+this.articleId,//页面参数
+			}
+			
+		},
+		methods:{
+			handleAdvClick(index){
+				var ad=this.advs[index];
+				console.log(ad.advUrl);
+				if(ad.showType==1){
+					uni.setStorageSync('url',ad.advUrl);
+					uni.navigateTo({
+						url:"h5"
+					})
+				}
+				else if(ad.showType==2){
+					uni.navigateTo({
+						url:ad.advUrl
+					})
+				}
+				else if(ad.showType==3){
+					 uni.setStorageSync('content',ad.content);
+					 uni.navigateTo({
+					 	url:"content"
+					 })
+				}
+				
+			},
+			getAdvList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					advType:10
+				};
+				getAdvList(data).then(res => {
+					if(res.code==200){
+						that.advImgs=[];
+						that.advs=[];
+						res.data.forEach(function(element) {
+							if(element.imageUrl!=null&&element.imageUrl!=""){
+								that.advs.push(element);
+								that.advImgs.push(element.imageUrl);
+							}
+						});
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			 
+			videoErrorCallback: function(e) {
+				uni.showModal({
+					content: e.target.errMsg,
+					showCancel: false
+				})
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			getDoctorArticleById(){
+				let data = {articleId:this.articleId};
+				getDoctorArticleById(data).then(
+					res => {
+						if(res.code==200){
+							this.item=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		height: 100%;
+	}
+	.content{
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+	}
+	.detail-cont{
+		width: 100%;
+		flex: 1;
+		padding: 40upx;
+		overflow-y: auto;
+		.title{
+			font-size: 40upx;
+			font-family: PingFang SC;
+			// font-weight: bold;
+			color: #222222;
+			line-height: 70upx;
+		}
+		.info{
+			display: flex;
+			align-items: center;
+			font-size: 24upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #999999;
+			line-height: 48upx;
+			margin: 23upx 0;
+			.reads{
+				margin-right: 30upx;
+			}
+		}
+		.full-text{
+			width: 100%;
+			font-size: 36upx;
+			font-family: PingFang SC;
+			// font-weight: 500;
+			color: #222222;
+			line-height: 60upx;
+		}
+		.video{
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			video{
+				width: 100%;
+			}
+		}
+	}
+	.ad{
+		margin-bottom: 50rpx;
+		width: 100%;
+		padding: 15rpx;
+		 
+	}
+	.inquiry{
+		position: fixed;
+		right: 22upx;
+		bottom: 193upx;
+		z-index: 99;
+		.content{
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-direction: column;
+			image{
+				box-sizing: border-box;
+				width: 100upx;
+				height: 100upx;
+				border-radius: 50%;
+				z-index: 9;
+				border: 2rpx solid #C39A58;
+			}
+			.text{
+				margin-top: 15upx;
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #C39A58;
+			}
+			 
+		}
+		
+	}
+	 
+</style>

+ 337 - 0
pages_doctor/doctorArticleList.vue

@@ -0,0 +1,337 @@
+<template>
+	<view>
+		<view class="top-content">
+			<!-- 搜索框 -->
+			
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_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>
+			<view class="cate-list">
+				<Menu :list="cates" @menuClick="menuClick" v-if="cates.length>0" style="width:100%;"></Menu>
+				
+				<!-- 关键字列表 -->
+				<!-- <scroll-view   scroll-x="true" > -->
+					<!-- <view class="inner">
+						<view v-for="(item,index) in cates" :key="index" :class="cateId == item.cateId?'item active':'item'" @click="choseCate(item)">
+							<image class="icon" :src="item.imgUrl"></image>
+							<view class="title" >{{item.cateName}}  </view>
+						</view>
+					</view> -->
+				<!-- </scroll-view> -->
+			</view>
+		</view>
+		<mescroll-body v-if="top!=null" :top="top"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="article-list">
+				<view class="item" v-for="(item,index) in dataList" :key="index" @click="showDetail(item)">
+					<view class="left">
+						<view class="title ellipsis2">{{ item.title }}</view>
+						<view class="info-box">
+							
+							<view class="readers">
+								<view class="head-box"  >
+									<view class="head"  >
+										<image class="eye" mode="aspectFill"  :src="item.avatar" ></image> 
+									</view>
+								</view>
+								<view class="readings">
+									<image class="eye" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/eye.png" ></image>
+									<text class="num">{{item.views}}</text>
+								</view>
+							</view>
+							<view class="time-box">{{item.createTime || ''}}</view>
+						</view>
+					</view>
+					<view class="right">
+						<image :src="item.imageUrl" mode="aspectFill"></image>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+		
+	</view>
+</template>
+
+<script>
+	import Menu from '@/components/Menu.vue'
+	import {getDoctorArticleList,getDoctorArticleCateList} from '@/api/doctorArticle.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		components: {Menu},
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				top:null,
+				cates:[],
+				cateId:0,
+				keyword: '',
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			};
+		},
+		onLoad() {
+			
+		},
+		onShow() {
+			this.getDoctorArticleCateList();
+		},
+		methods:{
+			menuClick(item){
+				this.cateId = item.cateId;
+				this.mescroll.resetUpScroll()
+			},
+			getDoctorArticleCateList(){
+				var that=this;
+				let data = {};
+				getDoctorArticleCateList(data).then(
+					res => {
+						if(res.code==200){
+							this.cates=res.data;
+							var query = uni.createSelectorQuery().in(that);
+							setTimeout(function(){
+								query.select('.top-content').boundingClientRect(data => {
+									if (data) {
+									    console.log('View height:', data.height+"px");
+										that.top=data.height+"px";
+									}
+								}).exec();
+							},500);
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			doSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			getArticleCateList(){
+				var that=this;
+				let data = {};
+				getArticleCateList(data).then(
+					res => {
+						if(res.code==200){
+							this.cates=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword:this.keyword,
+					cateId:this.cateId,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getDoctorArticleList(data).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();
+					}
+				});
+			},
+			// 关键词选择
+			choseCate(item) {
+				this.cateId = item.cateId;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: './doctorArticleDetails?articleId=' + item.articleId
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top-content{
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+	.top-title{
+		height: 88upx;
+		line-height: 88upx;
+		font-size: 42upx;
+		font-family: Source Han Sans CN;
+		font-weight: bold;
+		color: #222222;
+		padding-left: 41upx;
+		background-color: #FFFFFF;
+	}
+	.search-cont{
+		padding: 16upx 30upx;
+		background-color: #FFFFFF;
+		.inner{
+			box-sizing: border-box;
+			width: 100%;
+			height: 72upx;
+			background: #F7F7F7;
+			border-radius: 36upx;
+			display: flex;
+			align-items: center;
+			padding: 0 30upx;
+			.icon-search{
+				width: 28upx;
+				height: 28upx;
+				margin-right: 20upx;
+			}
+			input{
+				height: 60upx;
+				line-height: 60upx;
+				flex: 1;
+			}
+		}
+	}
+	.cate-list{
+		box-sizing: border-box;
+		background: #fff;
+	}
+	.article-list{
+		padding: 0 10upx;
+		.item{
+			box-sizing: border-box;
+			height: 271upx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			padding: 40upx 30upx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-bottom: 20upx;
+			.left{
+				flex: 1;
+				padding-right: 40upx;
+				height: 190upx;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				.title{
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #111111;
+					line-height: 48upx;
+				}
+				.info-box{
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.readers{
+						display: flex;
+						align-items: center;
+						.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%;
+								}
+							}
+						}
+						.readings{
+							display: flex;
+							align-items: center;
+							.eye{
+								width: 26upx;
+								height: 20upx;
+								margin-right: 9upx;
+							}
+							.num{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+								line-height: 1;
+							}
+						}
+					}
+					.time{
+						font-size: 24upx;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #999999;
+					}
+				}
+			}
+			.right{
+				width: 250upx;
+				height: 190upx;
+				border-radius: 8upx;
+				overflow: hidden;
+				image{
+					width: 100%;
+					height: 100%;
+				}
+			}
+		}
+	}
+</style>

+ 941 - 0
pages_doctor/doctorDetails.vue

@@ -0,0 +1,941 @@
+<template>
+	<view class="content">
+		<view class="bg">
+			<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/dd7da40764af4db0ac326db271c7f1d3.png" />
+		</view>
+		 <view class="top-box"   >
+		 	<view class="status_bar" :style="{height: statusBarHeight}"></view>
+		 	<view class="btn-box">
+				<view class="btns" @click="goback()">
+					<view class="btn"  >
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/back_white.png" />
+					</view>
+					<view class="line"  ></view>
+					<view class="btn" @click="gohome()" >
+						<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/5981c2cd5f23484181f5b328c820d0de.png" />
+					</view>
+				</view>
+			</view>
+			
+		 </view>
+		<view class="cont">
+			<view class="status_bar" :style="{height: statusBarHeight}"></view>
+			<view class="docs" style="margin-top:88rpx" >
+				<view class="tip" @click="navTo('/pages_doctor/doctorImgs?doctorId='+doctor.doctorId)">
+					<view class="left">
+						<view class="title">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/a58ee2a3fb674c2e8339243cb4ca1378.png"></image>
+							<view >实名认证</view>
+						</view>
+						<view class="cert">
+							<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/62aeeb0579974b67863a6ab56e9562f9.png"></image>
+							<view   >资格证编号:{{doctor.certificateCode!=null?doctor.certificateCode.substr(0,4)+"****"+doctor.certificateCode.substr(doctor.certificateCode.length-4,doctor.certificateCode.length):""}}</view>
+						</view>
+					</view>
+					<view class="right">
+						<image src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/1d519ad0467e4daea843aac745ae6b40.png"></image>
+					</view>
+				</view>
+				<view class="doc-cont">
+					<view class="doc-box">
+						<view class="left">
+							<image :src="doctor.avatar" mode="aspectFill"></image>
+						</view>
+						<view class="right">
+							<view class="doc-name-box">
+								<view class="doc-name">
+									{{doctor.doctorName}}
+								</view>
+								<view class="doc-btns"  >
+									<view class="btn" @click="followChange()">
+										<image v-if="isFollow" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_strar.png"></image>
+										<image v-if="!isFollow" src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/d509e50536804703a4b7dc066b16beee.png"></image>
+										关注
+									</view>
+									<view class="btn">
+										<image  src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/f79c3b9cbefa40be8c2beb74f616eefc.png"></image>
+										分享
+										<button class="contact-btn"   data-name="shareBtn" open-type="share">分享</button>
+									</view>
+								</view>
+							</view>
+							<view class="doc-dept-box">
+								{{doctor.position}}
+								<view class="line"></view>
+								{{department.deptName}} 
+							</view>
+							<view class="doc-his-box">
+								{{hospital.hospitalName || ''}}
+							</view>
+							
+						</view>
+						
+					</view>
+					<view class="doc-desc-box">
+						<view class="doc-desc-cont"  @click="navTo('/pages_doctor/doctorInfo?doctorId='+doctor.doctorId)">
+							<view class="desc-cont ellipsis2"><text class="title">擅长:</text>{{doctor.speciality}}</view>
+							<view class="btn">详情</view>
+						</view>
+						<view class="doc-desc-cont" @click="navTo('/pages_doctor/doctorInfo?doctorId='+doctor.doctorId)">
+							<view class="desc-cont ellipsis2"><text class="title">介绍:</text>{{doctor.introduction}}</view>
+							<view class="btn">详情</view>
+						</view>
+					</view>
+					
+				</view>
+				
+			</view>
+			
+			<view class="price-box">
+				<view class="count-box">
+					<view class="count-item">
+						<view class="count yellow">{{doctor.pingStar}}分</view>
+						<view class="name">好评</view>
+					</view>
+					<view class="count-item">
+						<view class="count">{{doctor.orderNumber}}</view>
+						<view class="name">接诊量</view>
+					</view>
+					<view class="count-item">
+						<view class="count">{{doctor.speed}}分钟</view>
+						<view class="name">平均响应</view>
+					</view>
+					<view class="count-item">
+						<view class="count">0</view>
+						<view class="name">粉丝数</view>
+					</view>
+				</view>
+				<view class="price-list" v-if="doctor!=null&&doctor.prices!=null&&doctor.prices.length>0">
+					<view class="price-item" @click="doInquiry(price)" v-for="(price,index) in doctor.prices">
+						<view class="p-left">
+							<image  v-if="price.type==1" src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/645f3f298a264882b48e529342fc4074.png"></image>
+							<image  v-if="price.type==2" src="https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/45e904a9e74f4d1da771936a4b83f015.png"></image>
+							<view class="price-name">
+								<view class="price">
+									<text class="title" v-if="price.type==1">图文问诊</text>
+									<text class="title" v-if="price.type==2">视频问诊</text>
+									<text class="money">{{price.price.toFixed(2)}}/次</text>
+								</view>
+								<view class="price-desc" v-if="price.type==1">
+									与医生图文交流
+								</view>
+								<view class="price-desc" v-if="price.type==2">
+									与医生视频交流
+								</view>
+							</view>
+							
+						</view>
+						<view class="p-right">
+							<view :class="doctor.workStatus==1?'btn':'btn gray'" >
+								去咨询
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- <view class="his-box">
+				<view class="title-box">
+					<view class="title">执业医院</view>
+				</view>
+				<view class="his"  @click="navTo('/pages/index/hospitalDetails?hospitalId='+hospital.hospitalId)">
+					<view class="left">
+						<view class="his-name">
+							{{hospital.hospitalName}}
+						</view>
+						<view class="his-desc" v-if="hospital.hospitalType!=null">
+							{{hospital.hospitalType}}
+						</view>
+					</view>
+					<view class="right">
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_arrow_r.png"></image>
+					</view>
+				</view>
+			</view> -->
+			<!-- <view class="desc-box">
+				<view class="title-box">
+					<view class="title">医生介绍</view>
+				</view>
+				<view class="desc" >
+					{{doctor.introduction}}
+				</view>
+			</view> -->
+			<view class="ping-box">
+				<view class="title-box">
+					<view class="left">
+						<view class="title">患者评价({{pingsTotal}})</view>
+					</view>
+					<view class="more" @click="navTo('./doctorPingList?doctorId='+doctorId)">
+						<view >更多</view>
+						<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_arrow_r.png"></image>
+					</view>
+				</view>
+				<view class="ping-list" v-if="pings.length>0">
+					<view class="ping-item" v-for="(item) in pings">
+					 	<view class="left">
+							<image :src="item.avatar==null?'https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/detault_head.jpg':item.avatar"></image>
+						</view>
+						<view class="right">
+							<view class="user-name-box">
+								<view class="user-name">
+									{{item.nickName}}
+								</view>
+								<view class="ping-star">
+									<u-rate activeColor="#ffc603" count="5" readonly v-model="item.pingStar"></u-rate>
+								</view>
+							</view>
+							<view class="ping-cont">
+								{{item.pingContent}}
+							</view>
+							<view class="ping-time">
+								{{item.pingTime}}
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {checkFollow,doFollow,getDoctorDetails,getDoctorPingList} from '@/api/doctor.js'
+	export default {
+		data() {
+			return {
+				pingsTotal:0,
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				isFollow:false,
+				doctorId:null,
+				doctor:null,
+				department:null,
+				hospital:null,
+				pings:[]
+			}
+		},
+		onLoad(options) {
+			if(options.doctorId!=null){
+				this.doctorId=options.doctorId;
+			}
+			else if (options.hasOwnProperty('q') && options.q) {
+				// 通过下面这步解码,可以拿到url的值
+				const url = decodeURIComponent(options.q)
+				// // 对url中携带的参数提取处理
+				const obj = this.$urlToObj(url)
+				uni.setStorageSync('doctorId',obj.doctorId);
+				this.doctorId=obj.doctorId;
+			}
+		},
+		onShow() {
+			this.getDoctorDetails();
+			this.getDoctorPingList();
+			var that=this;
+			this.$isLogin().then(
+				res => {
+					if(res){
+						that.checkFollow();
+					}
+				},
+				rej => {}
+			);
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.doctor.doctorName,
+				path: '/pages_doctor/doctorDetails?doctorId='+this.doctorId,
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.doctor.doctorName,
+				query:'doctorId='+this.doctorId,//页面参数
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		methods: {
+			goback(){
+				uni.navigateBack()
+			},
+			gohome(){
+				uni.switchTab({
+					url: '/pages/index/index'
+				})
+			},
+			doInquiry(price){
+				if(this.doctor.workStatus==0){
+					uni.showToast({
+						icon:'none',
+						title: "医生休息中",
+					});
+					return;
+				}
+				var that=this;
+				this.$isLogin().then(
+					res => {
+						if(res){
+							uni.navigateTo({
+							 	url: "/pages_order/inquiryForm1?inquiryType=1&orderType="+price.type+"&doctorId="+that.doctorId
+							})
+						}
+						else{
+							uni.navigateTo({
+								url:'/pages/auth/login'
+							})
+						}
+						
+					},
+					rej => {}
+				);
+			},
+			followChange() {
+				this.$isLogin().then(
+					res => {
+						if(res){
+							this.doFollow();
+						}
+						else{
+							uni.navigateTo({
+								url:'/pages/auth/login'
+							})
+						}
+					},
+					rej => {}
+				);
+			},
+			checkFollow(){
+				var that=this;
+				var data={doctorId:this.doctorId}
+				checkFollow(data).then(
+					res => {
+						
+						if(res.code==200){
+							if(res.isFollow==1) {
+								this.isFollow=true;
+								
+							} else {
+								this.isFollow=false;
+							}
+						}
+						else{
+							this.isFollow=false;
+						}
+					},
+					rej => {}
+				);
+			},
+			doFollow(){
+				var that=this;
+				var data={doctorId:this.doctorId}
+				doFollow(data).then(
+					res => {
+						this.isFollow=!this.isFollow;
+						if(res.code=200){
+							uni.showToast({
+								title: res.msg
+							})
+						}
+					},
+					rej => {}
+				);
+			},
+			getDoctorDetails() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					doctorId: this.doctorId
+				};
+				getDoctorDetails(data).then(res => {
+					if(res.code==200){
+						this.doctor=res.data.doctor;
+						this.doctor.prices=JSON.parse(this.doctor.priceJson)
+						this.department=res.data.department;
+						this.hospital=res.data.hospital;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getDoctorPingList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					doctorId: this.doctorId,
+					pageNum: 1,
+					pageSize: 10
+				};
+				getDoctorPingList(data).then(res => {
+					if(res.code==200){
+						this.pings=res.data.list;
+						this.pingsTotal=res.data.total
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			}
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		position: relative;
+		.bg{
+			width: 100%;
+			height:500rpx;
+			// background-color: #C39A58;
+			// background: linear-gradient(#C39A58, #E2C99E);
+			border-radius: 0rpx 0rpx 50rpx 50rpx;
+			position: fixed;
+			image{
+				width: 100%;
+				height:500rpx;
+			}
+			// z-index: 1;
+		}
+		.top-box{
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 1001;
+			.btn-box{
+				height:88rpx;
+				margin-left: 15rpx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				.btns{
+					display: flex;
+					align-items: center;
+					justify-content: flex-start;
+					background: rgba(255,255,255,0.4);
+					border-radius: 44rpx;
+					opacity: 1;
+					.btn{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						padding: 15rpx 20rpx;
+						image{
+							width:32rpx;
+							height:32rpx;
+						}
+					}
+					.line{
+						width:2rpx;
+						height:40rpx;
+						background: rgba(233,233,233,0.5);
+						border-radius: 2px;
+						opacity: 1;
+					}
+				}
+				
+			}
+			 
+		}
+		.cont{
+			top:50rpx;
+			position: relative;
+			padding: 0rpx 20rpx;
+			z-index: 999;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			
+			.docs{
+				margin-bottom: 20rpx;
+				padding-top: 30rpx;
+				position: relative;
+				.tip{
+					z-index: 110;
+					width: 100%;
+					position: absolute;
+					top:-25rpx;
+					padding: 0rpx 26rpx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					height:60rpx;
+					background-color: #2c261f;
+					border-radius: 15rpx 15rpx 0rpx 0rpx;
+					.left{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						.title{
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							color: #F0CBB1;
+							font-size: 24rpx;
+							font-weight: bold;
+							image{
+								margin-right: 5rpx;
+								width:20rpx;
+								height:20rpx;
+							}
+						}
+						.cert{
+							margin-left: 10rpx;
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							color: #F0CBB1;
+							font-size: 24rpx;
+							font-weight: bold;
+							image{
+								margin-right: 10rpx;
+								width:20rpx;
+								height:20rpx;
+							}
+						}
+					}
+					.right{
+						image{
+							width:20rpx;
+							height:20rpx;
+						}
+					}
+				}
+				.doc-cont{
+					z-index:111;
+					padding: 30rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					.doc-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						.left{
+							width: 190upx;
+							height: 190upx;
+							image{
+								box-sizing: border-box;
+								border-radius: 50%;
+								border:3rpx solid #E2C99E;
+								width: 190upx;
+								height: 190upx;
+							}
+						}
+						.right{
+							display: flex;
+							flex-direction: column;
+							justify-content: flex-start;
+							margin-left: 20rpx;
+							height:190upx;
+							width: calc(100% - 210upx);
+							.doc-name-box{
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								position: relative;
+								.doc-name{
+									font-size: 38rpx;
+									font-weight: bold;
+									color: #2A2B2E;
+								}
+								.doc-btns{
+									display: flex;
+									align-items: center;
+									justify-content: flex-end;
+									.btn{
+										flex-shrink: 0;
+										border-radius: 30rpx;
+										padding: 10rpx 20rpx;
+										border: 1rpx solid #C39A58;
+										margin-left: 10rpx;
+										display: flex;
+										align-items: center;
+										justify-content: center;
+										margin-left: 10rpx;	
+										color: #C39A58;
+										font-size: 24rpx;
+										font-weight: bold;
+										position: relative;
+										image{
+											margin-right: 5rpx;
+											width:24rpx;
+											height:24rpx;
+										}
+										.contact-btn{
+											display: inline-block;
+											position: absolute;
+											top: 0;
+											left: 0;
+											width: 100%;
+											height: 100%;
+											opacity: 0;
+											z-index: 9999;
+										}
+									}
+									
+									
+								}
+								 
+							}
+							.doc-dept-box{
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								margin-top: 15rpx;
+								font-size: 28upx;
+								font-weight: bold;
+								font-family: PingFang SC;
+								color: #2d2b36;
+								.line{
+									height:25rpx;
+									width:3rpx;
+									background-color: #ECECEC;
+									margin: 0rpx 10rpx;
+								}
+								 
+							}
+							.doc-his-box{
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								margin-top: 15rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #2d2b36;
+								 
+							}
+							
+						}
+						
+					}
+					.doc-desc-box{
+						.doc-desc-cont{
+							width: 100%;
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							position: relative;
+							margin-top: 15rpx;
+							.title{
+								font-weight: bold;
+								// position: absolute;
+								// top:0rpx;
+								// left:0rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #2A2B2E;
+							}
+							.desc-cont{
+								width: 100%;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.btn{
+								padding: 0rpx 0rpx 0rpx 15rpx;
+								background-color: white;
+								position: absolute;
+								bottom: 0rpx;
+								right:0rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #3D74F7;
+							}
+							
+						}
+					}
+				}
+				
+			}
+			
+			.price-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				background: linear-gradient(180deg, #F8EADC 0%, #FAF2E7 100%);
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				border-radius: 15rpx;
+				.count-box{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.count-item{
+						width:25%;
+						display: flex;
+						flex-direction: column;
+						align-items: center;
+						justify-content: space-between;
+						.count{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #2A2B2E;
+						}
+						.yellow{
+							font-size: 40rpx;
+							color: #C39A58;
+						}
+						.name{
+							margin-top: 10rpx;
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #626468;
+						}
+					}
+				}
+				.price-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					margin-top: 15rpx;
+					padding: 15rpx;
+					.price-item{
+						margin-bottom: 15rpx;
+						padding: 20rpx;
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						border-radius: 15rpx;
+						background-color: #ffffff;
+						.p-left{
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							image{
+								width: 96rpx;
+								height:96rpx;
+							}
+							.price-name{
+								padding: 10rpx 0rpx;
+								margin-left: 15rpx;
+								display: flex;
+								flex-direction: column;
+								align-items: flex-start;
+								justify-content: space-between;
+								.price{
+									display: flex;
+									align-items: center;
+									justify-content: flex-start;
+									
+									.title{
+										font-size: 32upx;
+										font-family: PingFang SC;
+										font-weight: bold;
+										color: #111111;
+									}
+									.money{
+										font-size: 32upx;
+										font-family: PingFang SC;
+										font-weight: bold;
+										color: #FD8005;
+									}
+									
+								}
+								.price-desc{
+									margin-top: 20rpx;
+									font-size: 28upx;
+									font-family: PingFang SC;
+									color: #9a9a9c;
+								}
+								
+							}
+							
+							
+						}
+						.p-right{
+							.btn{
+								padding: 15rpx 30rpx;
+								background-color: #C39A58;
+								color: #fff;
+								font-size: 28rpx;
+								border-radius: 30rpx;
+							}
+							.gray{
+								background-color: #9a9a9c;
+							}
+						}
+						
+					}
+				}
+			}
+			.his-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+				}
+				.his{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-top: 15rpx;
+					.left{
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: center;
+						.his-name{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							color: #111111;
+						}
+						.his-desc{
+							margin-top: 15rpx;
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #9a9a9c;
+						}
+					}
+					.right{
+						image{
+							width:30rpx;
+							height:30rpx;
+						}
+					}
+				}
+			}
+			.desc-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+				}
+				.desc{
+					margin-top: 15rpx;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					color: #9a9a9c;
+				}
+			}
+			.ping-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: space-between;
+					.left{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+					}
+					.more{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+						image{
+							margin-left: 10rpx;
+							width: 30rpx;
+							height:30rpx;
+						}
+					}
+					
+					 
+				}
+				.ping-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					margin-top: 15rpx;
+					padding: 15rpx;
+					.ping-item{
+						padding: 20rpx 0rpx;
+						border-bottom: 1rpx solid #efefef;
+						width: 100%;
+						display: flex;
+						align-items: flex-start;
+						justify-content: flex-start;
+						&:last-child{
+							padding-bottom: 0rpx;
+							border-bottom: none;
+						}
+						.left{
+							image{
+								width:80rpx;
+								height:80rpx;
+								border-radius: 50%;
+							}
+						}
+						.right{
+							width: 100%;
+							margin-left: 15rpx;
+							.user-name-box{
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #111111;
+							}
+							.ping-cont{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.ping-time{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							 
+						}
+					}
+				}
+			}
+		}
+	}
+	 
+</style>

+ 456 - 0
pages_doctor/doctorImgs.vue

@@ -0,0 +1,456 @@
+<template>
+	<view class="content">
+		<view class="imgs">
+			<view class="img" v-for="(img,index) in imgs">
+				<image @click="showImg(index)"  :src="img"></image>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {getDoctorDetails} from '@/api/doctor.js'
+	export default {
+		data() {
+			return {
+				imgs:[]
+			}
+		},
+		onLoad(options) {
+			this.doctorId=options.doctorId;
+			
+		},
+		onShow() {
+			this.getDoctorDetails();
+			 
+		},
+		methods: {
+			showImg(index){
+				uni.previewImage({
+					current:index,
+					urls: this.imgs
+				});
+			},
+			getDoctorDetails() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					doctorId: this.doctorId
+				};
+				this.imgs=[];
+				getDoctorDetails(data).then(res => {
+					if(res.code==200){
+						this.doctor=res.data.doctor;
+						if(this.doctor.certificateImages!=null){
+							this.imgs.concat(this.doctor.certificateImages)
+						}
+						if(this.doctor.practiseImages!=null){
+							this.imgs.concat(this.doctor.practiseImages)
+						}
+						console.log(this.imgs)
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		position: relative;
+		.imgs{
+			padding: 15rpx;
+			width: 100%;
+			image{
+				width: 100%;
+				margin-bottom: 15rpx;
+				
+			}
+			
+		}
+		.cont{
+			top:50rpx;
+			position: relative;
+			padding: 0rpx 20rpx;
+			z-index: 999;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			.doc-box{
+				margin-bottom: 20rpx;
+				padding: 30rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				.left{
+					width: 190upx;
+					height: 190upx;
+					border-radius: 8upx;
+					image{
+						width: 190upx;
+						height: 190upx;
+					}
+				}
+				.right{
+					display: flex;
+					flex-direction: column;
+					justify-content: flex-start;
+					margin-left: 20rpx;
+					height:190upx;
+					width: calc(100% - 210upx);
+					.doc-name-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						position: relative;
+						.doc-name{
+							font-size: 38rpx;
+							font-weight: bold;
+						}
+						.doc-ping{
+							margin-left: 10rpx;
+						}
+						.doc-star{
+							position: absolute;
+							top:5rpx;
+							right:0rpx;
+							width:32rpx;
+							height:32rpx;
+							image{
+								width:100%;
+								height:100%;
+							}
+						}
+					}
+					.doc-dept-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 15rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #2d2b36;
+						 
+					}
+					.doc-his-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 15rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+						 
+					}
+					.doc-spec-box{
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						margin-top: 15rpx;
+						.spec-left{
+							width: 80%;
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							.title{
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.spec{
+								// margin-left: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+						}
+						.spec-right{
+							.btn{
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #C39A58;
+							}
+						}
+						
+					}
+				}
+				
+			}
+			.price-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.price-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					margin-top: 15rpx;
+					padding: 15rpx;
+					.price-item{
+						margin-bottom: 15rpx;
+						padding: 15rpx;
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						border-radius: 15rpx;
+						background-color: #f1f6fc;
+						.left{
+							.price-name{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								color: #111111;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								.price{
+									margin-left: 15rpx;
+									font-size: 32upx;
+									font-family: PingFang SC;
+									color: #fe9460;
+									
+								}
+							}
+							.price-desc{
+								margin-top: 20rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							
+						}
+						.right{
+							.btn{
+								padding: 15rpx 30rpx;
+								background-color: #ff9561;
+								color: #fff;
+								font-size: 28rpx;
+								border-radius: 15rpx;
+							}
+						}
+					}
+				}
+			}
+			.his-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.his{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-top: 15rpx;
+					.left{
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: center;
+						.his-name{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							color: #111111;
+						}
+						.his-desc{
+							margin-top: 15rpx;
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #9a9a9c;
+						}
+					}
+					.right{
+						image{
+							width:30rpx;
+							height:30rpx;
+						}
+					}
+				}
+			}
+			.desc-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.desc{
+					margin-top: 15rpx;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					color: #9a9a9c;
+				}
+			}
+			.ping-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: space-between;
+					.left{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.line{
+							margin-right: 15rpx;
+							height: 30rpx;
+							width: 6rpx;
+							background-color: #C39A58;
+							
+						}
+					}
+					.more{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+						image{
+							margin-left: 10rpx;
+							width: 30rpx;
+							height:30rpx;
+						}
+					}
+					
+					 
+				}
+				.ping-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					margin-top: 15rpx;
+					padding: 15rpx;
+					.ping-item{
+						padding: 20rpx 0rpx;
+						border-bottom: 1rpx solid #efefef;
+						width: 100%;
+						display: flex;
+						align-items: flex-start;
+						justify-content: flex-start;
+						&:last-child{
+							padding-bottom: 0rpx;
+							border-bottom: none;
+						}
+						.left{
+							image{
+								width:80rpx;
+								height:80rpx;
+								border-radius: 50%;
+							}
+						}
+						.right{
+							width: 100%;
+							margin-left: 15rpx;
+							.user-name-box{
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #111111;
+							}
+							.ping-cont{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.ping-time{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							 
+						}
+					}
+				}
+			}
+		}
+	}
+	 
+</style>

+ 538 - 0
pages_doctor/doctorInfo.vue

@@ -0,0 +1,538 @@
+<template>
+	<view class="content">
+		<view class="bg"></view>
+		<view class="cont">
+			<view class="doc-box">
+				<view class="left">
+					<image  @click="showImg()" :src="doctor.avatar" mode="aspectFill"></image>
+				</view>
+				<view class="right">
+					<view class="doc-name-box">
+						<view class="doc-name">
+							{{doctor.doctorName}}
+						</view>
+						<view class="doc-ping">
+							<u-rate activeColor="#ffc603" count="5" readonly v-model="doctor.pingStar"></u-rate>
+						</view>
+					</view>
+					<view class="doc-dept-box">
+						{{department.deptName}}|{{doctor.position}}
+					</view>
+					<view class="doc-his-box">
+						{{hospital.hospitalName}}
+					</view>
+				</view>
+				
+			</view>
+			<view class="desc-box">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">擅长方向</view>
+				</view>
+				<view class="desc" >
+					{{doctor.speciality}}
+				</view>
+			</view>			 
+			<view class="desc-box">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">医生介绍</view>
+				</view>
+				<view class="desc" >
+					{{doctor.introduction}}
+				</view>
+			</view>
+			<view class="desc-box" v-if="imgs&&imgs.length>0">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">荣誉资质</view>
+				</view>
+				<view class="desc doc-imgs" >
+					<image v-for="i in imgs" :src="i" mode="aspectFill" @click="previewImage"></image>
+				</view>
+			</view>
+			<view class="desc-box" v-if="videoUrl">
+				<view class="title-box">
+					<view class="line"></view>
+					<view class="title">医生风采</view>
+				</view>
+				<view class="desc" >
+					<video :src="videoUrl" :poster="thumbnail" :autoplay='true' class="doc-video"></video>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {checkFollow,doFollow,getDoctorDetails,getDoctorPingList} from '@/api/doctor.js'
+	export default {
+		data() {
+			return {
+				isFollow:false,
+				doctorId:null,
+				doctor:null,
+				department:null,
+				hospital:null,
+				pings:[],
+				videoUrl: '',
+				imgs: [],
+				thumbnail: ''
+			}
+		},
+		onLoad(options) {
+			this.doctorId=options.doctorId;
+			
+		},
+		onShow() {
+			this.getDoctorDetails();
+			 
+		},
+		methods: {
+			showImg(){
+				var data=[];
+				data.push(this.doctor.avatar)
+				uni.previewImage({
+					current: 0,
+					urls: data
+				});
+			},
+			previewImage() {
+				uni.previewImage({
+					current: 0,
+					urls: this.imgs
+				});
+			},
+			getDoctorDetails() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					doctorId: this.doctorId
+				};
+				getDoctorDetails(data).then(res => {
+					if(res.code==200){
+						this.doctor=res.data.doctor;
+						this.department=res.data.department;
+						this.hospital=res.data.hospital;
+						this.thumbnail = this.doctor&&this.doctor.thumbnail;
+						this.videoUrl = this.doctor&&this.doctor.videoUrl;
+						this.imgs = this.doctor&&this.doctor.honorImgUrl? this.doctor.honorImgUrl.split(','):[];
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		position: relative;
+		.bg{
+			width: 100%;
+			height:280rpx;
+			background-color: #C39A58;
+			background: linear-gradient(#C39A58, #E2C99E);
+			border-radius: 0rpx 0rpx 50rpx 50rpx;
+			position: fixed;
+			// z-index: 1;
+		}
+		.cont{
+			top:50rpx;
+			position: relative;
+			padding: 0rpx 20rpx;
+			z-index: 999;
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			.doc-box{
+				margin-bottom: 20rpx;
+				padding: 30rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				.left{
+					width: 190upx;
+					height: 190upx;
+					border-radius: 8upx;
+					image{
+						width: 190upx;
+						height: 190upx;
+					}
+				}
+				.right{
+					display: flex;
+					flex-direction: column;
+					justify-content: flex-start;
+					margin-left: 20rpx;
+					height:190upx;
+					width: calc(100% - 210upx);
+					.doc-name-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						position: relative;
+						.doc-name{
+							font-size: 38rpx;
+							font-weight: bold;
+						}
+						.doc-ping{
+							margin-left: 10rpx;
+						}
+						.doc-star{
+							position: absolute;
+							top:5rpx;
+							right:0rpx;
+							width:32rpx;
+							height:32rpx;
+							image{
+								width:100%;
+								height:100%;
+							}
+						}
+					}
+					.doc-dept-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 15rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #2d2b36;
+						 
+					}
+					.doc-his-box{
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						margin-top: 15rpx;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+						 
+					}
+					.doc-spec-box{
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						margin-top: 15rpx;
+						.spec-left{
+							width: 80%;
+							display: flex;
+							align-items: center;
+							justify-content: flex-start;
+							.title{
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.spec{
+								// margin-left: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+						}
+						.spec-right{
+							.btn{
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #C39A58;
+							}
+						}
+						
+					}
+				}
+				
+			}
+			.price-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.price-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					margin-top: 15rpx;
+					padding: 15rpx;
+					.price-item{
+						margin-bottom: 15rpx;
+						padding: 15rpx;
+						width: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						border-radius: 15rpx;
+						background-color: #f1f6fc;
+						.left{
+							.price-name{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								color: #111111;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								.price{
+									margin-left: 15rpx;
+									font-size: 32upx;
+									font-family: PingFang SC;
+									color: #fe9460;
+									
+								}
+							}
+							.price-desc{
+								margin-top: 20rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							
+						}
+						.right{
+							.btn{
+								padding: 15rpx 30rpx;
+								background-color: #ff9561;
+								color: #fff;
+								font-size: 28rpx;
+								border-radius: 15rpx;
+							}
+						}
+					}
+				}
+			}
+			.his-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.his{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					margin-top: 15rpx;
+					.left{
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: center;
+						.his-name{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							color: #111111;
+						}
+						.his-desc{
+							margin-top: 15rpx;
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #9a9a9c;
+						}
+					}
+					.right{
+						image{
+							width:30rpx;
+							height:30rpx;
+						}
+					}
+				}
+			}
+			.desc-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: flex-start;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.line{
+						margin-right: 15rpx;
+						height: 30rpx;
+						width: 6rpx;
+						background-color: #C39A58;
+						
+					}
+					 
+				}
+				.desc{
+					margin-top: 15rpx;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					color: #9a9a9c;
+				}
+			}
+			.ping-box{
+				margin-bottom: 20rpx;
+				padding: 15rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: space-between;
+					.left{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.line{
+							margin-right: 15rpx;
+							height: 30rpx;
+							width: 6rpx;
+							background-color: #C39A58;
+							
+						}
+					}
+					.more{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+						image{
+							margin-left: 10rpx;
+							width: 30rpx;
+							height:30rpx;
+						}
+					}
+					
+					 
+				}
+				.ping-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					margin-top: 15rpx;
+					padding: 15rpx;
+					.ping-item{
+						padding: 20rpx 0rpx;
+						border-bottom: 1rpx solid #efefef;
+						width: 100%;
+						display: flex;
+						align-items: flex-start;
+						justify-content: flex-start;
+						&:last-child{
+							padding-bottom: 0rpx;
+							border-bottom: none;
+						}
+						.left{
+							image{
+								width:80rpx;
+								height:80rpx;
+								border-radius: 50%;
+							}
+						}
+						.right{
+							width: 100%;
+							margin-left: 15rpx;
+							.user-name-box{
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #111111;
+							}
+							.ping-cont{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.ping-time{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							 
+						}
+					}
+				}
+			}
+		}
+	}
+	.doc-video {
+		width: 680rpx;
+		height: 382.5rpx;
+	}
+	.doc-imgs {
+		display: flex;
+		flex-direction: row;
+		flex-wrap: wrap;
+		align-items: center;
+		image {
+			height: 180rpx;
+			width: 320rpx;
+			margin: 0 10rpx 20rpx;
+		}
+	}
+</style>

+ 307 - 0
pages_doctor/doctorList.vue

@@ -0,0 +1,307 @@
+<template>
+	<view class="content">
+		<view class="search-cont">
+			<view class="inner">
+				<image class="icon-search" src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/icon_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>
+		<view class="top-fixed">
+			 <u-tabs
+			  :current="tabIndex"
+			  :scrollable="true"
+			  :list="tabs"  
+			  lineColor="#C39A58"
+			 @change="deptChange">
+			 </u-tabs>
+		</view>
+		<mescroll-body top="176rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
+		<view class="doctors" v-if="dataList.length>0">
+			<view class="doctor-box">
+				<view class="doctor" @click="navTo('/pages_doctor/doctorDetails?doctorId='+item.doctorId)" v-for="(item,index) in dataList">
+					<view class="item">
+						<view class="left">
+							<view class="head-box"> 
+								<image mode="aspectFill" class="doc-img" :src="item.avatar"></image>
+								<view class="isline" v-if="item.workStatus==1">
+									<view class="img">
+										<image src="https://bjyjb-1362704775.cos.ap-chongqing.myqcloud.com/shop/image/isline.png"></image>
+										<view class="name">在线</view>
+									</view>
+								</view>
+							</view>
+						</view>
+						<view class="right"> 
+							<view class="doc-box">
+								<view class="doc-name">
+									{{item.doctorName}}
+								</view>
+								<view class="doc-position">{{item.position}}</view>
+								<view class="doc-dept">{{item.deptName}}</view>
+							</view>
+							<view class="hospital-box">
+								<!-- <view class="tag" v-if="item.hospitalLevel!=null">
+									<text>{{$getDictLabelName(hosLevelOptions,item.hospitalLevel)}}</text>
+								</view> -->
+								<view class="name">{{item.hospitalName||''}} </view>
+							</view>
+							<view class="doc-spec">
+								<view class="spec ellipsis2">{{item.speciality}}</view>
+							</view>
+							<view class="doc-count">
+								<view class="name">好评:</view>
+								<view class="count">{{item.pingStar}}分</view>
+								<view class="name">接诊量:</view>
+								<view class="count">{{item.orderNumber}}</view>
+								<view class="name">平均响应:</view>
+								<view class="count">{{item.speed||''}}分钟</view>
+							</view>
+							<view class="doc-price"  >
+								<view class="btn">
+									咨询医生¥
+									<text v-for="(price,index) in item.prices">
+										{{price.price.toFixed(2)}} <text v-if="index==0">/</text>
+									</text>
+								</view>
+							</view>
+						</view>
+						
+					</view>
+					
+				</view>
+				
+			</view>
+		</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import {getDoctorList} from '@/api/doctor.js'
+	import {getDepartmentList} from '@/api/department.js'
+	import {getDictByKey} from '@/api/common.js'
+	export default {
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				keyword: '',
+				hosLevelOptions:[],
+				tabIndex:0,
+				tabs:[
+					{name:"全部",deptId:0}
+				],
+				deptId:0,
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		onLoad(options) {
+			if(options.deptId!=null){
+				this.deptId=options.deptId;
+			}
+			if(options.keyword!=null){
+				this.keyword=options.keyword;
+			}
+			console.log(this.deptId)
+			this.getDictByKey("sys_hospital_level");
+			this.getDepartmentList()
+		},
+		onShow() {
+		},
+		methods: {
+			doSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			getDictByKey(key){
+				var data={key:key}
+				getDictByKey(data).then(
+					res => {
+						if(res.code==200){
+							if(key=="sys_hospital_level"){
+								this.hosLevelOptions=res.data;
+							}
+						}
+					},
+					err => {
+					}
+				);
+				
+			},
+			getDepartmentList(page) {
+				var that = this;
+				var data = {
+				};
+				getDepartmentList(data).then(res => {
+					if(res.code==200){
+						res.data.forEach(function(value,index,array){
+							var data={name:value.deptName,deptId:value.deptId}
+							that.tabs.push(data);
+							if(value.deptId==that.deptId){
+								that.tabIndex=index+1;
+								console.log(that.tabIndex)
+							}
+						});
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			deptChange(item){
+				this.deptId=item.deptId
+				this.mescroll.resetUpScroll()
+			},
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback() {
+				this.mescroll.resetUpScroll()
+			},
+			/*上拉加载的回调*/
+			upCallback(page) {   
+				//联网加载数据
+				var that = this;
+				var data = {
+					keyword:this.keyword,
+					deptId:this.deptId,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getDoctorList(data).then(res => {
+					if(res.code==200){
+						if (page.num == 1) {
+							res.data.list.forEach(function(value,index,array){
+								value.prices=JSON.parse(value.priceJson)
+							});
+							that.dataList = res.data.list; 
+							
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+							 
+						}
+						console.log(that.dataList[0])
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		padding: 0rpx 20rpx;
+		.search-cont{
+			position:fixed;
+			height: 88upx;
+			top: 0;
+			left: 0;
+			z-index: 10;
+			width: 100%;
+			padding: 16upx 30upx;
+			background-color: #FFFFFF;
+			.inner{
+				box-sizing: border-box;
+				width: 100%;
+				height: 72upx;
+				background: #F7F7F7;
+				border-radius: 36upx;
+				display: flex;
+				align-items: center;
+				padding: 0 30upx;
+				.icon-search{
+					width: 28upx;
+					height: 28upx;
+					margin-right: 20upx;
+				}
+				input{
+					height: 60upx;
+					line-height: 60upx;
+					flex: 1;
+				}
+			}
+		}
+		.top-fixed{
+			width: 100%;
+			position: fixed;
+			top: 88rpx;
+			left: 0;
+			z-index: 10;
+			height: 88upx;
+			background-color: #fff;
+		}
+		.doctors{
+			margin: 15rpx 0rpx;
+			padding: 15rpx;
+			box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+			background-color: #fff;
+			border-radius: 15rpx;
+			.title-box{
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: flex-start;
+				.title{
+					font-size: 32upx;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+				.line{
+					margin-right: 15rpx;
+					height: 30rpx;
+					width: 6rpx;
+					background-color: #C39A58;
+					
+				}
+				 
+			}
+		}
+	}
+	 
+</style>

+ 225 - 0
pages_doctor/doctorPingList.vue

@@ -0,0 +1,225 @@
+<template>
+	<view class="content">
+		<view class="cont">
+			<view class="ping-box">
+				<view class="title-box">
+					<view class="left">
+						<view class="title">患者评价({{total}})</view>
+					</view>
+				</view>
+				<mescroll-body top="88rpx" bottom="0" ref="mescrollRef" @init="mescrollInit"    :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
+				
+				<view class="ping-list">
+					<view class="ping-item" v-for="(item) in dataList">
+					 	<view class="left">
+							<image :src="item.avatar==null?'https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/dfdd555016854b0d9fb623937238729f.jpg':item.avatar"></image>
+						</view>
+						<view class="right">
+							<view class="user-name-box">
+								<view class="user-name">
+									{{item.nickName}}
+								</view>
+								<view class="ping-star">
+									<u-rate activeColor="#ffc603" count="5" readonly v-model="item.pingStar"></u-rate>
+								</view>
+							</view>
+							<view class="ping-cont">
+								{{item.pingContent}}
+							</view>
+							<view class="ping-time">
+								{{item.pingTime}}
+							</view>
+						</view>
+					</view>
+				</view>
+				</mescroll-body>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {getDoctorPingList} from '@/api/doctor.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				total:0,
+				doctorId:null,
+				mescroll:null,
+				downOption: {   //下拉刷新
+				 	use:true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: []
+			}
+		},
+		onLoad(options) {
+			this.doctorId=options.doctorId;
+		},
+		methods: {
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback() {
+				this.mescroll.resetUpScroll()
+			},
+			/*上拉加载的回调*/
+			upCallback(page) {   
+				//联网加载数据
+				var that = this;
+				var data = {
+					doctorId: this.doctorId,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getDoctorPingList(data).then(res => {
+					if(res.code==200){
+						this.total=res.data.total;
+						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();
+					}
+				});
+			},
+		}
+	}
+</script>
+<style scoped lang="scss">
+	.content{
+		height: 100%;
+		position: relative;
+		.cont{
+			width: 100%;
+			display: flex;
+			flex-direction: column;
+			.ping-box{
+				.title-box{
+					padding: 0rpx 20rpx;
+					position: fixed;
+					line-height: 88rpx;
+					display: flex;
+					flex-direction: row;
+					align-items: center;
+					justify-content: space-between;
+					.left{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						// .line{
+						// 	margin-right: 15rpx;
+						// 	height: 30rpx;
+						// 	width: 6rpx;
+						// 	background-color: #C39A58;
+							
+						// }
+					}
+					.more{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 28upx;
+						font-family: PingFang SC;
+						color: #9a9a9c;
+						image{
+							margin-left: 10rpx;
+							width: 30rpx;
+							height:30rpx;
+						}
+					}
+					
+					 
+				}
+				.ping-list{
+					display: flex;
+					flex-direction: column;
+					align-items: flex-start;
+					justify-content: flex-start;
+					padding: 20rpx;
+					.ping-item{
+						margin-bottom: 15rpx;
+						padding: 15rpx;
+						box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+						background-color: #fff;
+						border-radius: 15rpx;
+						width: 100%;
+						display: flex;
+						align-items: flex-start;
+						justify-content: flex-start;
+						&:last-child{
+							margin-bottom: 0rpx;
+						}
+						.left{
+							image{
+								width:80rpx;
+								height:80rpx;
+								border-radius: 50%;
+							}
+						}
+						.right{
+							width: 100%;
+							margin-left: 15rpx;
+							.user-name-box{
+								display: flex;
+								align-items: center;
+								justify-content: space-between;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #111111;
+							}
+							.ping-cont{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							.ping-time{
+								margin-top: 10rpx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								color: #9a9a9c;
+							}
+							 
+						}
+					}
+				}
+			}
+		}
+	}
+	 
+</style>

+ 18 - 0
pages_im/api/checkUpdate.js

@@ -0,0 +1,18 @@
+export const checkUpdateFormPgyer = (buildVersion) =>
+  uni.$u?.http.post(
+    "/apiv2/app/check",
+    {
+      _api_key: "",
+      appKey: "",
+      buildVersion,
+    },
+    {
+      custom: {
+        isPgyerApi: true,
+      },
+      dataType: "x-www-form-urlencoded",
+      header: {
+        "Content-Type": "application/x-www-form-urlencoded",
+      },
+    },
+  );

+ 191 - 0
pages_im/api/imApi.js

@@ -0,0 +1,191 @@
+// 在线状态
+export const getOnlineStateFromSvr = (userID) =>
+  uni.$u?.http.post(
+    "/user/get_users_status",
+    JSON.stringify({
+      userID,
+      userIDs: [userID],
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+);
+
+export const getRtcInvitaion = () =>
+  uni.$u?.http.post(
+    "/third/get_rtc_invitation_start_app",
+    JSON.stringify({
+      operationID: uuidv4(),
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    },
+  );
+
+export const subUserOnlineStatus = (userID, targetID) =>
+  uni.$u?.http.post(
+    "/user/subscribe_users_status",
+    JSON.stringify({
+      userID,
+      userIDs: [targetID],
+      genre: 1,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+);
+
+
+
+export const unSubUserOnlineStatus = (userID, targetID) =>
+  uni.$u?.http.post(
+    "/user/unsubscribe_users_status",
+    JSON.stringify({
+      userID,
+      userIDs: [targetID],
+      genre: 2,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    },
+  );
+  
+
+
+//获取超级管理员token
+ export const getImAdminToken = () =>
+   uni.$u?.http.post(
+     "/auth/get_admin_token", 
+     JSON.stringify({ secret:"openIM123",userID: "imAdmin"}),
+     {
+       custom: {
+         isIMApi: true,
+       },
+       header: {
+         //operationID: Date.now()
+       }
+     }
+ );
+ 
+ //注册IM用户
+ export const registerImUser = (data) =>
+   uni.$u?.http.post(
+     "/user/user_register", 
+     data,
+     {
+       custom: {
+         isIMApi: true,
+       },
+       header: {
+         //operationID: Date.now(),
+		 token:uni.getStorageSync("IMAdminToken"),
+       },
+     }
+ );
+ 
+ 
+ //修改IM用户
+ export const updateImUser = (data) =>
+   uni.$u?.http.post(
+     "/user/update_user_info_ex", 
+     data,
+     {
+       custom: {
+         isIMApi: true,
+       },
+       header: {
+         //operationID: Date.now(),
+ 		 token:uni.getStorageSync("IMAdminToken"),
+       },
+     }
+ );
+ 
+ 
+ 
+ 
+ //获取用户token
+ export const getImUserToken = (userID) =>
+   uni.$u?.http.post(
+     "/auth/get_user_token", 
+     JSON.stringify(
+	    {"platformID": getRuntimePlatform(),"userID": userID}
+ 	 ),
+     {
+       custom: {
+         isIMApi: true,
+       },
+       header: {
+         //operationID: Date.now(),
+ 		 token:uni.getStorageSync("IMAdminToken")
+       },
+     }
+ );
+ 
+ 
+ //查询用户是否注册
+ export const imAccountCheck = (userID) =>
+   uni.$u?.http.post(
+     "/user/account_check", 
+     JSON.stringify({
+		  checkUserIDs:[ userID ]
+	 }),
+     {
+       custom: {
+         isIMApi: true,
+       },
+       header: {
+         //operationID: Date.now(),
+ 		 token:uni.getStorageSync("IMAdminToken")
+       },
+     }
+ );
+ 
+ 
+ 
+ function getRuntimePlatform() {
+   const systemInfo = uni.getSystemInfoSync();
+   const compilePlatform = process.env.UNI_PLATFORM;
+   //1:iOS,2:Android,3:Windows,4:OSX,5:WEB,6:小程序,7:linux,8:AndroidPad,9:IPad,10:Admin
+   let platformType=6;
+   // H5 环境
+   if (compilePlatform === 'h5') platformType= 5;  
+ 
+   // 小程序环境
+   if (compilePlatform.startsWith('mp-')) {
+      const mpType = compilePlatform.split('-')[1]; // 如 weixin/alipay
+      platformType=6;
+	 // return `小程序(${mpType})- ${systemInfo.platform}`;
+   }
+ 
+   // App 环境
+   if (compilePlatform === 'app-plus') {
+	 if(systemInfo.platform.toLowerCase() === 'android'){
+		 platformType=2;
+	 }
+	 if(systemInfo.platform.toLowerCase() === 'ios'){
+	 		 platformType=1;
+	 }
+   }
+ 
+   return platformType;
+ }

+ 170 - 0
pages_im/api/imBll.js

@@ -0,0 +1,170 @@
+import { getImAdminToken,imAccountCheck,registerImUser,getImUserToken,updateImUser } from "@/pages_im/api/imApi";
+
+export const imAccountCheckReg = (userID) => {
+  return new Promise(async (resolve, reject) => {
+	   let data={};
+	   let hasReg=false;
+		try {
+			  let token = uni.getStorageSync('IMAdminToken');
+			  let tokenData={};
+			  if(!token){
+				   const respTokenObj = await getImAdminToken();
+					if(respTokenObj.errCode==0){
+						tokenData = respTokenObj.data;
+						token=tokenData.token;
+						uni.setStorageSync("IMAdminToken",token);
+					}
+			  }
+			  data = await imAccountCheck(userID);
+			  if(data.results.lenth>0){
+			  	  uni.setStorage({key: "IMUserID",data: userID});
+			  	  hasReg=true;
+			  }
+			  data={hasReg:hasReg};  
+			  resolve(data);
+		} catch (e) {
+			reject(e);
+		}
+       
+  });
+};
+
+
+
+export const getImUserTokenReq = (userID) => {
+  return new Promise(async (resolve, reject) => {
+	   let data={};
+		try {
+			  let token = uni.getStorageSync('IMAdminToken');
+			  let tokenData={};
+			  if(!token){
+				    const data = await getImAdminToken();
+					console.log("qxj getImAdminToken data:"+JSON.stringify(data));
+					token=data.token;
+					uni.setStorageSync("IMAdminToken",token);
+			  }
+			  data = await getImUserToken(userID);
+			  uni.setStorage({key: "IMToken", data: data.token});
+			  uni.setStorage({key: "IMUserID",data: userID});
+			  resolve(data);
+		} catch (err) {
+			  reject(err);
+		}
+      
+  });
+};
+
+
+export const registerImUserReq = (userID,nickname,faceURL) => {
+   return new Promise(async (resolve, reject) => {
+	   let data={};
+		try {
+			  let token = uni.getStorageSync('IMAdminToken');
+			  let tokenData={};
+			  const respTokenObj = await getImAdminToken();
+			  if(!token){
+					if(!!respTokenObj && respTokenObj.token){
+						token=respTokenObj.token;
+						uni.setStorageSync("IMAdminToken",token);
+					}
+			  }
+			  let params={
+			  	  users:[ { userID:userID,nickname:nickname,faceURL:faceURL } ]
+			  };
+			  let respObj = await registerImUser(params);
+			  console.log("----qxj registerImUserReq respObj:"+JSON.stringify(respObj));
+			  //if(respObj.errCode==0){
+				   data = await getImUserToken(userID);
+				   uni.setStorage({key: "IMToken", data: data.token});
+				   uni.setStorage({key: "IMUserID",data: userID});
+			  //}
+			  resolve(data);
+		} catch (e) {
+			reject(e);
+		}
+        
+  });
+};
+
+
+export const updateImUserReq = (userID,nickname,faceURL) => {
+   return new Promise(async (resolve, reject) => {
+	   let data={};
+		try {
+			  let token = uni.getStorageSync('IMAdminToken');
+			  let tokenData={};
+			  const respTokenObj = await getImAdminToken();
+			  if(!token){
+					if(!!respTokenObj && respTokenObj.token){
+						token=respTokenObj.token;
+						uni.setStorageSync("IMAdminToken",token);
+					}
+			  }
+			  let params={
+			  	  userInfo:{ "userID":userID,"nickname":nickname,"faceURL":faceURL }
+			  };
+			  let respObj = await updateImUser(params);
+			  //if(respObj.errCode==0){
+				   data = await getImUserToken(userID);
+				   uni.setStorage({key: "IMToken", data: data.token});
+				   uni.setStorage({key: "IMUserID",data: userID});
+			  //}
+			  resolve(data);
+		} catch (e) {
+			reject(e);
+		}
+        
+  });
+};
+
+
+export const openImLoginApi =async (data,IMToken,IMUserID,succCallBack,failCallBack) => {
+	console.log("----qxj IMUserID:"+IMUserID+" IMToken:"+IMToken);
+    let userID=data.userID;
+	let nickName=data.nickName;
+	let faceURL=data.avatar;
+	if(!!IMUserID || !!IMToken){
+		  getImUserTokenReq(IMUserID).then(res => {
+			   updateImUserReq(userID,nickName,faceURL).then(res1 => {
+			   		succCallBack(res.token);
+			   	},
+			   	rej => {
+			   		failCallBack();
+			   	}
+			   ).catch((res) => {
+			   	 failCallBack();
+			   });
+				//succCallBack();
+			},
+			rej => {
+				if(rej.errCode==1004 && rej.errMsg=="RecordNotFoundError"){  //未找到
+					registerImUserReq(userID,nickName,faceURL).then(res => {
+							succCallBack();
+						},
+						rej => {
+							failCallBack();
+						}
+					).catch((res) => {
+						 failCallBack();
+					});
+				}
+				failCallBack();
+			}
+		).catch((err) => {
+		     failCallBack();
+		});
+	}
+	else{
+		
+		registerImUserReq(userID,nickName,faceURL).then(res => {
+				succCallBack();
+			},
+			rej => {
+				failCallBack();
+			}
+		).catch(() => {
+			
+		});
+	}
+
+};

+ 82 - 0
pages_im/api/login.js

@@ -0,0 +1,82 @@
+// 登录
+export const businessLogin = (params) =>
+  uni.$u?.http.post("/account/login", JSON.stringify(params));
+export const businessSendSms = (params) =>
+  uni.$u?.http.post("/account/code/send", JSON.stringify(params));
+export const businessVerifyCode = (params) =>
+  uni.$u?.http.post("/account/code/verify", JSON.stringify(params));
+export const businessRegister = (params) =>
+  uni.$u?.http.post("/account/register", JSON.stringify(params));
+export const businessReset = (params) =>
+  uni.$u?.http.post("/account/password/reset", JSON.stringify(params));
+
+export const businessModify = (params) =>
+  uni.$u?.http.post(
+  "/account/password/change",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      header: {
+        token: uni.getStorageSync("BusinessToken"),
+      },
+    }
+  );
+
+// 用户信息
+export const businessInfoUpdate = (params) =>
+  uni.$u?.http.post(
+    "/user/update",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      header: {
+        token: uni.getStorageSync("BusinessToken"),
+      },
+    }
+  );
+export const businessGetUserInfo = (userID) =>
+  uni.$u?.http.post(
+    "/user/find/full",
+    JSON.stringify({userIDs: [userID]}),
+    {
+      header: {
+        token: uni.getStorageSync("BusinessToken")
+      },
+    }
+  );
+
+export const businessSearchUserInfo = (keyword) =>
+  uni.$u?.http.post(
+    "/user/search/full",
+    JSON.stringify({
+      keyword,
+      pagination: {
+        pageNumber: 1,
+        showNumber: 10,
+      },
+    }),
+    {
+      header: {
+        token: uni.getStorageSync("AppToken"),
+      },
+    }
+  );
+
+export const businessSearchUser = (keyword) =>
+  uni.$u?.http.post(
+    "/friend/search",
+    JSON.stringify({
+      keyword,
+      pagination: {
+        pageNumber: 1,
+        showNumber: 99,
+      },
+    }),
+    {
+      header: {
+        token: uni.getStorageSync("BusinessToken"),
+      },
+    }
+  );

+ 175 - 0
pages_im/api/meeting.js

@@ -0,0 +1,175 @@
+export const bookMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/book_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const joinMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/join_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const leaveMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/leave_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const updateMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/update_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const createImmediateMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/create_immediate_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const getMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/get_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const getMeetings = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/get_meetings",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const endMeeting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/end_meeting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const setPersonalSetting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/set_personal_setting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const getPersonalSetting = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/get_personal_setting",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );
+
+export const getMeetingToken = (params) =>
+  uni.$u?.http.post(
+    "/rtc-meeting/get_meeting_token",
+    JSON.stringify({
+      ...params,
+    }),
+    {
+      custom: {
+        isIMApi: true,
+      },
+      header: {
+        token: uni.getStorageSync("IMToken"),
+      },
+    }
+  );

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