Bladeren bron

first commit

liujiaxin 1 maand geleden
commit
1da2378dd9
100 gewijzigde bestanden met toevoegingen van 12233 en 0 verwijderingen
  1. 17 0
      .gitignore
  2. 16 0
      .hbuilderx/launch.json
  3. 510 0
      App.vue
  4. 0 0
      README.md
  5. 24 0
      api/activity.js
  6. 37 0
      api/address.js
  7. 6 0
      api/adv.js
  8. 28 0
      api/article.js
  9. 12 0
      api/class.js
  10. 35 0
      api/common.js
  11. 29 0
      api/companyOrder.js
  12. 32 0
      api/companyUser.js
  13. 29 0
      api/coupon.js
  14. 94 0
      api/courseAuto.js
  15. 76 0
      api/courseLook.js
  16. 9 0
      api/department.js
  17. 16 0
      api/disease.js
  18. 45 0
      api/doc.js
  19. 11 0
      api/doctorArticle.js
  20. 47 0
      api/doctorOrder.js
  21. 69 0
      api/index.js
  22. 233 0
      api/living.js
  23. 277 0
      api/manageCompany.js
  24. 236 0
      api/order.js
  25. 22 0
      api/patient.js
  26. 149 0
      api/pay.js
  27. 24 0
      api/pay_new.js
  28. 7 0
      api/payment.js
  29. 21 0
      api/prescribe.js
  30. 65 0
      api/product.js
  31. 29 0
      api/storeAfterSales.js
  32. 81 0
      api/storeOrder.js
  33. 15 0
      api/storeProductPackage.js
  34. 24 0
      api/test.js
  35. 72 0
      api/user.js
  36. 17 0
      api/userSign.js
  37. 262 0
      assets/css/common.less
  38. 163 0
      assets/css/common.scss
  39. 31 0
      assets/css/theme.scss
  40. 2 0
      assets/iconfont/iconfont.css
  41. BIN
      assets/iconfont/iconfont.ttf
  42. 163 0
      common/request.js
  43. 21 0
      components/Loading.vue
  44. 147 0
      components/Menu.vue
  45. 166 0
      components/chengpeng-audio/free-audio.vue
  46. 42 0
      components/chengpeng-audio/redme.md
  47. BIN
      components/chengpeng-audio/static/play.png
  48. BIN
      components/chengpeng-audio/static/stop.png
  49. 143 0
      components/evan-switch/evan-switch.vue
  50. 68 0
      components/im/base/common.js
  51. 146 0
      components/im/base/emojiMap.js
  52. 113 0
      components/im/base/message-facade.js
  53. 29 0
      components/im/tui-chat/message-elements/audio-message/index.css
  54. 67 0
      components/im/tui-chat/message-elements/audio-message/index.vue
  55. 103 0
      components/im/tui-chat/message-elements/custom-message/index.css
  56. 236 0
      components/im/tui-chat/message-elements/custom-message/index.vue
  57. 20 0
      components/im/tui-chat/message-elements/emoji/index.css
  58. 48 0
      components/im/tui-chat/message-elements/emoji/index.vue
  59. 13 0
      components/im/tui-chat/message-elements/face-message/index.css
  60. 57 0
      components/im/tui-chat/message-elements/face-message/index.vue
  61. 65 0
      components/im/tui-chat/message-elements/file-message/index.css
  62. 83 0
      components/im/tui-chat/message-elements/file-message/index.vue
  63. 13 0
      components/im/tui-chat/message-elements/image-message/index.css
  64. 54 0
      components/im/tui-chat/message-elements/image-message/index.vue
  65. 29 0
      components/im/tui-chat/message-elements/system-message/index.css
  66. 86 0
      components/im/tui-chat/message-elements/system-message/index.vue
  67. 47 0
      components/im/tui-chat/message-elements/text-message/index.css
  68. 55 0
      components/im/tui-chat/message-elements/text-message/index.vue
  69. 9 0
      components/im/tui-chat/message-elements/tip-message/index.css
  70. 46 0
      components/im/tui-chat/message-elements/tip-message/index.vue
  71. 27 0
      components/im/tui-chat/message-elements/video-message/index.css
  72. 53 0
      components/im/tui-chat/message-elements/video-message/index.vue
  73. 156 0
      components/im/tui-chat/message-input/index.css
  74. 566 0
      components/im/tui-chat/message-input/index.vue
  75. 70 0
      components/im/tui-chat/message-list/index.css
  76. 195 0
      components/im/tui-chat/message-list/index.vue
  77. 86 0
      components/im/tui-chat/message-private/common-words/index.css
  78. 85 0
      components/im/tui-chat/message-private/common-words/index.vue
  79. 178 0
      components/im/tui-chat/message-private/order-list/index.css
  80. 137 0
      components/im/tui-chat/message-private/order-list/index.vue
  81. 93 0
      components/im/tui-chat/message-private/service-evaluation/index.css
  82. 116 0
      components/im/tui-chat/message-private/service-evaluation/index.vue
  83. 214 0
      components/likeProduct.vue
  84. 315 0
      components/px-popup-bottom/px-popup-bottom.vue
  85. 148 0
      components/tabbar/tabbar.vue
  86. 214 0
      components/tuiProduct.vue
  87. 325 0
      components/z-modal/z-modal.vue
  88. 20 0
      index.html
  89. 34 0
      main.js
  90. 79 0
      manifest.json
  91. 344 0
      package-lock.json
  92. 18 0
      package.json
  93. 1532 0
      pages.json
  94. 424 0
      pages/auth/login.vue
  95. 761 0
      pages/auth/numberlogin.vue
  96. 107 0
      pages/auth/wxLogin.vue
  97. 111 0
      pages/common/launch.vue
  98. 294 0
      pages/healthy/detail.vue
  99. 239 0
      pages/healthy/idea.vue
  100. 351 0
      pages/healthy/index.vue

+ 17 - 0
.gitignore

@@ -0,0 +1,17 @@
+# Windows
+[Dd]esktop.ini
+Thumbs.db
+$RECYCLE.BIN/
+
+# macOS
+.DS_Store
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+
+# Node.js
+node_modules/
+
+.project
+unpackage/

+ 16 - 0
.hbuilderx/launch.json

@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 510 - 0
App.vue

@@ -0,0 +1,510 @@
+<script>
+	import Vue from 'vue'
+	// import TIM from 'tim-wx-sdk';
+	// import COS from 'cos-wx-sdk-v5';
+	export default {
+		globalData: {
+			// wsUrl: 'wss://websocket.cdwjyyh.com',
+			wsUrl: '',
+			appId: 'wxedde588767b358b1',
+		},
+		onLoad: function (){
+			
+		},
+		onLaunch: function() {
+			this.checkUpdate()
+			// uni.hideTabBar({ animation: true })
+			// uni.$TUIKit = TIM.create({
+			// 	SDKAppID: 1400693126
+			// });
+			// uni.$TUIKit.registerPlugin({
+			// 	'cos-wx-sdk': COS
+			// });
+			// uni.$TUIKitTIM = TIM;
+			// uni.$TUIKitEvent = TIM.EVENT;
+			// uni.$TUIKitVersion = TIM.VERSION;
+			// uni.$TUIKitTypes = TIM.TYPES; // 监听系统级事件
+			// uni.$resetLoginData = this.resetLoginData();
+			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_READY, this.onSDKReady);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_NOT_READY, this.onSdkNotReady);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.KICKED_OUT, this.onKickedOut);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.ERROR, this.onTIMError);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.NET_STATE_CHANGE, this.onNetStateChange);
+			// uni.$TUIKit.on(uni.$TUIKitEvent.SDK_RELOAD, this.onSDKReload);
+			// console.log('IM')
+			// 看课题目字体跟随系统变化
+			const systemInfo = uni.getSystemInfoSync();
+			const baseFontSize = 14; // 标准字体大小(你可以自定义)
+			const userFontSize = systemInfo.fontSizeSetting || baseFontSize;
+			// 计算比例
+			const scale = userFontSize / baseFontSize;
+			// 存储到全局变量或 Vuex
+			uni.setStorageSync('fontScale', scale);
+		},
+		onShow: function () {
+		    console.log('App Show')
+		    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: function() {
+			console.log('App Hide')
+		},
+		 
+		methods: {
+			checkUpdate() {
+				const updateManager = uni.getUpdateManager();
+				updateManager.onCheckForUpdate(function(res) {
+					// 请求完新版本信息的回调
+					console.log('是否有新版本:', res.hasUpdate);
+				});
+			
+				updateManager.onUpdateReady(function() {
+					uni.showModal({
+						title: '更新提示',
+						content: '新版本已经准备好,是否重启小程序?',
+						confirmText: '立即重启',
+						confirmColor: '#2179f5',
+						showCancel: false,
+						success(res) {
+							if (res.confirm) {
+								// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+								updateManager.applyUpdate();
+							}
+						}
+					});
+				});
+			
+				updateManager.onUpdateFailed(function() {
+					// 新的版本下载失败
+					uni.showModal({
+						title: '更新提示',
+						content: '新版本下载失败,请检查网络后重试。',
+						showCancel: false
+					});
+				});
+			},
+			// TODO:
+			resetLoginData() {
+				// this.globalData.expiresIn = '';
+				// this.globalData.sessionID = '';
+				// this.globalData.userInfo = {
+				// 	userID: '',
+				// 	userSig: '',
+				// 	token: '',
+				// 	phone: ''
+				// };
+				// this.globalData.userProfile = null;
+				// logger.log(`| app |  resetLoginData | globalData: ${this.globalData}`);
+			},
+			onTIMError() {},
+			onSDKReady({name}) {
+				 console.log("im注册:"+name)
+				  const isSDKReady = name === uni.$TUIKitEvent.SDK_READY ? true : false
+				  console.log("im注册:"+isSDKReady)
+					uni.$emit('isSDKReady', {
+						isSDKReady: true
+					});
+			},
+			onNetStateChange() {},
+			onSDKReload() {},
+			onSdkNotReady() {},
+			onKickedOut() {
+				uni.showToast({
+					title: '您被踢下线',
+					icon: 'error'
+				});
+				
+			}
+		}
+	}
+</script>
+ 
+ <style lang="less">
+	 @import './assets/css/common.less';
+ </style>
+ 
+<style lang="scss">
+	
+    /*每个页面公共css */
+	@import "uview-ui/index.scss";
+	@import './assets/iconfont/iconfont.css';
+	@import '@/assets/css/common.scss';
+	@import './assets/css/theme.scss';
+	page{
+		background-color: #f6f6f6;
+	}
+	::-webkit-scrollbar{
+	    width: 0 !important;
+	    height: 0 !important;
+	    
+	}
+	view{
+		box-sizing: border-box;
+	}
+	.ellipsis{
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+	.single-line-ellipsis {
+		width: 480rpx; /* 设置固定宽度 */
+		white-space: nowrap; /* 文本不换行 */
+		overflow: hidden; /* 隐藏超出部分 */
+		text-overflow: ellipsis; /* 超出部分用省略号表示 */
+	}
+	.single-ellipsis {
+		width: 260rpx; /* 设置固定宽度 */
+		white-space: nowrap; /* 文本不换行 */
+		overflow: hidden; /* 隐藏超出部分 */
+		text-overflow: ellipsis; /* 超出部分用省略号表示 */
+	}
+	.ellipsis2{
+		overflow:hidden; 
+		text-overflow:ellipsis;
+		display:-webkit-box; 
+		-webkit-box-orient:vertical;
+		-webkit-line-clamp:2; 
+	}
+	 
+	
+	.no-data-box{
+		height:100%;
+		width: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		flex-direction: column;
+		image{
+			width: 264upx;
+			height: 212upx;
+		}
+		.empty-title{
+			margin-top: 20rpx;
+			font-size: 28rpx;
+			color: gray;
+			 
+		}
+	}
+		
+	
+	
+		.w-calc-30 {
+			padding: 0 30rpx;
+			width: calc(100% - 60rpx);
+		}
+	
+		.hb {
+			height: 100%;
+			box-sizing: border-box;
+		}
+	
+		.hidden {
+			overflow: hidden;
+		}
+	
+		.base-color {
+			color: $--base-color;
+		}
+	
+		.base-color-2 {
+			color: $--base-color2;
+		}
+	
+		.base-color-3 {
+			color: $--base-color3;
+		}
+		.base-color-9 {
+			color: $--base-color-9;
+		}
+		.base-color-8 {
+			color: $--base-color-f8;
+		}
+		.base-color-6 {
+			color: $--base-color-6;
+		}
+		.base-color-gray {
+			color: $--base-color-gray;
+		}
+		.base-color-red{
+				color:#ee0a25;
+		}
+		.base-color-dark {
+			color: $--base-color-dark;
+		}
+	
+		.base-color-dark2 {
+			color: $--base-color-dark2;
+		}
+	
+		.base-price {
+			color: $--base-color-price;
+		}
+	
+		.base-success {
+			color: $--base-color-success;
+		}
+	
+		.base-bg {
+			background: $--base-bg;
+		}
+	
+		.base-bg-2 {
+			background: $--base-bg2;
+		}
+		.base-bg-red{
+			background: #ee0a25;
+		}
+		.base-bg-f{
+			background-color:#fff;
+		}
+		.base-bg-f8{
+			background-color: $--base-color-f8;
+		}
+		.base-bg-f5{
+			background-color: $--base-color-f5;
+		}
+		.base-bg-9{
+			background-color: $--base-color-9;
+		}
+		.base-bg-blue{
+			background:$--base-bg-blue;
+		}
+		.base-bg-sure{
+			background:$--base-sure-bg;
+		}
+		.base-bg-orange{
+			background:$--base-bg-orange;
+		}
+		.base-bg-false{
+			background:$--base-false-bg;
+		}
+		.bor-blue{
+			border: 2rpx solid $--base-bor-blue;
+		}
+		.bor-red{
+			border: 2rpx solid $--base-bor-red;
+		}
+		.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;
+		}
+</style>
+<style>
+	/*每个页面公共css */
+	/* 解决小程序和app滚动条的问题 */
+	/* #ifdef MP-WEIXIN || APP-PLUS */
+		:deep(::-webkit-scrollbar ){
+		    display: none !important;
+		    width: 0 !important;
+		    height: 0 !important;
+		    -webkit-appearance: none;
+		    background: transparent;
+		    color: transparent;
+		}
+	/* #endif */
+	
+	/* 解决H5 的问题 */
+	/* #ifdef H5 */
+	    uni-scroll-view .uni-scroll-view::-webkit-scrollbar {
+	    	/* 隐藏滚动条,但依旧具备可以滚动的功能 */
+			display: none;
+		    width: 0 !important;
+		    height: 0 !important;
+		    -webkit-appearance: none;
+		    background: transparent;
+		    color: transparent;
+	    }
+	/* #endif */
+</style>
+ 

+ 0 - 0
README.md


+ 24 - 0
api/activity.js

@@ -0,0 +1,24 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ 
+ 
+ export function getStoreActivity(data) {
+ 	 return request('/app/activity/getStoreActivity',data,'GET');
+ }
+ export function getStoreActivityDetails(data) {
+ 	 return request('/app/activity/getStoreActivityDetails',data,'GET');
+ }
+ export function share(activityId) {
+ 	 return request('/app/activity/share?activityId='+activityId,null,'POST');
+ }
+  
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 

+ 37 - 0
api/address.js

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

+ 6 - 0
api/adv.js

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

+ 28 - 0
api/article.js

@@ -0,0 +1,28 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getArticleCate() {
+ 	 return request('/app/article/getArticleCate',null,'GET');
+ }
+ 
+ export function getArticleList(data) {
+ 	 return request('/app/article/getArticleList',data,'GET');
+ }
+
+ export function getArticleByArticleId(data) {
+ 	 return request('/app/article/getArticleByArticleId',data,'GET');
+ } 
+ 
+ export function updateView(articleId) {
+ 	 return request('/app/article/updateView?articleId='+articleId,null,'POST');
+ } 
+ 
+ export function getArticleViewList(data) {
+ 	 return request('/app/article/getArticleViewList',data,'GET');
+ } 
+ 
+
+ 
+ 
+  

+ 12 - 0
api/class.js

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

+ 35 - 0
api/common.js

@@ -0,0 +1,35 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+
+ export function uploadOSS(data) {
+ 	 return request('/app/common/uploadOSS',data,'POST');
+ }
+ export function getTlsSig(data) {
+ 	 return request('/app/common/getTlsSig',data,'GET');
+ }
+ 
+ export function getStoreConfig() {
+  	 return request('/app/common/getStoreConfig',null,'GET');
+ } 
+ 
+ export function getProductConfig() {
+  	 return request('/app/common/getProductConfig',null,'GET');
+ } 
+ 
+ export function getWeixinTemps() {
+ 	 return request('/app/common/getWeixinTemps',null,'GET');
+ }
+ export function getWeixinOrderTemps() {
+ 	 return request('/app/common/getWeixinOrderTemps',null,'GET');
+ }
+ export function getWeixinPrescribeTemps() {
+ 	 return request('/app/common/getWeixinPrescribeTemps',null,'GET');
+ }
+ 
+ 
+ export function getDictByKey(data) {
+  	 return request('/app/common/getDictByKey',data,'GET');
+ } 
+ 
+ 

+ 29 - 0
api/companyOrder.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getSalesProducts(data) {
+ 	 return request('/app/companyOrder/getSalesProducts',data,'GET');
+ }
+ 
+ export function createSalesOrder(data) {
+ 	 return request('/app/companyOrder/createSalesOrder',data,'GET' );
+ }
+ export function updateSalseOrderMoney(data) {
+ 	 return request('/app/companyOrder/updateSalseOrderMoney',data,'GET' );
+ }
+ 
+ 
+ export function getSalesOrder(data) {
+ 	 return request('/app/companyOrder/getSalesOrder',data,'GET' );
+ }
+ export function addUserCart(data) {
+ 	 return request('/app/companyOrder/addUserCart',data,'GET' );
+ }
+ 
+ export function editOrderMoney(data) {
+ 	 return request('/app/companyOrder/editOrderMoney',data,'GET' );
+ }
+ 
+  
+ 
+ 

+ 32 - 0
api/companyUser.js

@@ -0,0 +1,32 @@
+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 getcomapycode(data) {
+ 	 return request('/app/companyUser/getCompanyWxaCodeByPayment',data,'GET','application/json;charset=UTF-8');
+ }
+ //生成公司微信收款码
+ export function generateComapycode(data) {
+ 	 return request('/app/payment/getWxaCodeByPayment',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+  
+ 
+ 

+ 29 - 0
api/coupon.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getCouponIssueList(data) {
+ 	 return request('/app/coupon/getCouponIssueList',data,'GET');
+ }
+ export function getCompanyCouponIssueList(data) {
+ 	 return request('/app/coupon/getCompanyCouponIssueList',data,'GET');
+ }
+ export function getCouponIssueById(data) {
+ 	 return request('/app/coupon/getCouponIssueById',data,'GET');
+ }
+ 
+ 
+ 
+ export function receive(data) {
+ 	return request('/app/coupon/receive',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyCouponList(data) {
+ 	 return request('/app/coupon/getMyCouponList',data,'GET');
+ }
+ export function getMyEnableCouponList(data) {
+ 	 return request('/app/coupon/getMyEnableCouponList',data,'GET');
+ }
+ 
+ 
+
+ 

+ 94 - 0
api/courseAuto.js

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

+ 76 - 0
api/courseLook.js

@@ -0,0 +1,76 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ //微信小程序登录
+ export function loginByMiniApp(data) {
+ 	 return request('/course_uniapp/app/wx/miniapp/loginByMa',data,'POST','application/json;charset=UTF-8');
+ }
+// 播放错误上报
+export function getErrMsg(data) {
+	return request('/course_uniapp/app/course/wx/h5/getErrMsg', data, 'POST', 'application/x-www-form-urlencoded','https://h5api.his.cdwjyyh.com');
+}
+// h5课程简介
+export function getH5CourseByVideoId(data) {
+	return request('/course_uniapp/app/course/wx/h5/getH5CourseByVideoId', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+// h5课程详情加问答
+export function getH5CourseVideoDetails(data) {
+	return request('/course_uniapp/app/course/wx/h5/videoDetails', data, 'GET','','https://h5api.his.cdwjyyh.com');
+}
+// 答题发红包
+export function courseAnswer(data) {
+	return request('/course_uniapp/app/course/wx/h5/courseAnswer', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+// 记录看课时间(新)
+export function getFinishCourseVideo(data) {
+	return request('/course_uniapp/app/course/wx/h5/updateWatchDuration', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+// 关注客服 是否添加客服
+export function getIsAddKf(data) {
+	return request('/course_uniapp/app/course/wx/h5/isAddKf', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+// 流量(缓冲百分比)
+export function getInternetTraffic(data) {
+	return request('/course_uniapp/app/course/wx/h5/getInternetTraffic', data, 'POST', 'application/json;charset=UTF-8','https://h5api.his.cdwjyyh.com');
+}
+// 每十分钟获得积分
+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('/course_uniapp/app/course/wx/h5/sendReward', 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');
+}
+ //检查是否有头像以及昵称
+ export function checkUserInfo(data) {
+ 	 return request('/course_uniapp/app/user/checkUserInfo',data,'GET','application/json;charset=UTF-8');
+ }
+ //更改用户头像以及昵称
+ export function editUser(data) {
+ 	 return request('/course_uniapp/app/user/editUser',data,'POST','application/json;charset=UTF-8');
+ }
+ // 成为会员
+ export function registerCourses(data) {
+ 	 return request('/course_uniapp/companyapp/app/fs/user/beMember',data,'POST','application/json;charset=UTF-8');
+ }
+ //获取头像以及昵称信息
+ export function getusername(data) {
+ 	 return request('/companyapp/app/wx/h5/mp/userInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ //h5授权登录
+ export function handleFsUserWx(data) {
+ 	 return request('/course_uniapp/app/wx/h5/mp/handleFsUserWx',data,'POST','application/json;charset=UTF-8');
+ }
+ //h5授权登录
+ export function H5logoinApp(data,type) {
+	 if(type&&type==1) {
+		return request('/app/wx/h5/mp/courseLoginByMp',data,'POST','application/json;charset=UTF-8'); 
+	 } else {
+		return request('/app/wx/h5/mp/loginByMp',data,'POST','application/json;charset=UTF-8'); 
+	 }
+ }

+ 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');
+ }
+ 
+ 
+ 
+ 
+  
+  
+  

+ 45 - 0
api/doc.js

@@ -0,0 +1,45 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getMyDocList(data) {
+ 	 return request('/app/doc/getMyDocList',data,'GET');
+ }
+ 
+ export function getDocDetails(data) {
+ 	 return request('/app/doc/getDocDetails',data,'GET');
+ }
+ 
+ export function addDoc(data) {
+ 	return request('/app/doc/addDoc',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function editDoc(data) {
+ 	return request('/app/doc/editDoc',data,'POST','application/json;charset=UTF-8');
+ }
+ export function delDoc(data) {
+ 	return request('/app/doc/delDoc',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyDocRecordList(data) {
+ 	 return request('/app/doc/getMyDocRecordList',data,'GET');
+ }
+ 
+ export function getDocRecordReplyList(data) {
+ 	 return request('/app/doc/getDocRecordReplyList',data,'GET');
+ }
+ 
+ 
+ export function addDocRecord(data) {
+ 	return request('/app/doc/addDocRecord',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyDocOrderList() {
+ 	 return request('/app/doc/getMyDocOrderList',null,'GET');
+ }
+ 
+ export function addDocOrder(data) {
+ 	return request('/app/doc/addDocOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 

+ 11 - 0
api/doctorArticle.js

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

+ 47 - 0
api/doctorOrder.js

@@ -0,0 +1,47 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ 
+ 
+ export function getDepartmentList(data) {
+ 	 return request('/app/doctorOrder/getDepartmentList',data,'GET');
+ } 
+ 
+ export function getDoctorList(data) {
+ 	 return request('/app/doctorOrder/getDoctorList',data,'GET');
+ } 
+ 
+ export function getDoctorCase(data) {
+ 	 return request('/app/doctorOrder/getDoctorCase',data,'GET');
+ } 
+ 
+ 
+ export function getMyDoctorOrderList(data) {
+ 	 return request('/app/doctorOrder/getMyDoctorOrderList',data,'GET');
+ } 
+ 
+ export function getDoctorDetail(data) {
+ 	 return request('/app/doctorOrder/getDoctorDetail',data,'GET');
+ } 
+ 
+ export function getDoctorOrderDetail(data) {
+ 	 return request('/app/doctorOrder/getDoctorOrderDetail',data,'GET');
+ } 
+ export function create(data) {
+ 	 return request('/app/doctorOrder/create',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pay(data) {
+ 	 return request('/app/doctorOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ export function cancelOrder(data) {
+ 	 return request('/app/doctorOrder/cancelOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pingOrder(data) {
+ 	 return request('/app/doctorOrder/pingOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getImOrderDetail(data) {
+ 	 return request('/app/doctorOrder/getImOrderDetail',data,'GET');
+ } 
+ 
+ 

+ 69 - 0
api/index.js

@@ -0,0 +1,69 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+export function getDicts(data) {
+ 	 return request('/app/common/getDicts',data,'GET');
+} 
+export function getCanvas() {
+ 	 return request('/app/index/getCanvas',null,'GET');
+} 
+export function getMenu() {
+ 	 return request('/app/index/getMenu',null,'GET');
+} 
+export function getIndexData(data) {
+ 	 return request('/app/index/getIndexData',data,'GET');
+} 
+export function getTuiArticle(data) {
+ 	 return request('/app/index/getTuiArticle',data,'GET');
+} 
+export function getTuiDoctor(data) {
+ 	 return request('/app/index/getTuiDoctor',data,'GET');
+} 
+
+export function getTuiDoctorOrder(data) {
+ 	 return request('/app/index/getTuiDoctorOrder',data,'GET');
+} 
+
+export function getCartCount() {
+ 	 return request('/app/index/getCartCount',null,'GET');
+} 
+
+
+ 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');
+ }
+ export function getConfigByKey(data) {
+ 	 return request('/app/common/getConfigByKey',data,'GET');
+ } 
+ 
+ 
+
+ 
+ 

+ 233 - 0
api/living.js

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

+ 277 - 0
api/manageCompany.js

@@ -0,0 +1,277 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+//看课管理销售登录
+export function login(data) {
+	return request('/companyapp/app/user/login', data, 'POST', 'application/json;charset=UTF-8');
+}
+// 统计经销商会员总数和群管总数
+export function getCompanyUserAndUserCount(data) {
+	return request('/companyapp/app/fs/user/firstPage/summaryCount', data, 'GET', 'application/json;charset=UTF-8');
+}
+// 课程统计
+export function getCourseCount(data) {
+	return request('/companyapp/app/fs/user/firstPage/statistics', data, 'GET', 'application/json;charset=UTF-8');
+}
+//查询看课转化率(漏斗图)
+export function getcourseRate(data) {
+	const url = '/companyapp/app/fs/user/firstPage/graphic'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//根据经销商 获取群管排名
+export function getGroupRanklist(data) {
+	const url = '/companyapp/app/fs/user/firstPage/userRanking'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//根据经销商 获取课程排名
+export function getCourseRanklist(data) {
+	const url = '/companyapp/app/fs/user/firstPage/courseRanking'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+// 获取课程列表
+export function getFsCourseList(data) {
+	return request('/companyapp/app/fs/course/courseList', data, 'GET', 'application/json;charset=UTF-8');
+}
+// 根据训练营查询节目
+export function getCourseVdieoList(data) {
+	const url = '/companyapp/app/fs/course/pageList?periodId=' + data.periodId + '&pageNum=' + data.pageNum +
+		'&pageSize=' + data.pageSize + '&keyword=' + data.keyword
+	return request(url, null, 'GET', 'application/json;charset=UTF-8');
+}
+//获取今日课程
+export function getTodayCourse(data) {
+	return request('/companyapp/app/fs/course/todayCourseList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//根据经销商或群管查询会员列表
+export function getfsuserList(data) {
+	const url = '/companyapp/app/fs/user/pageList'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//查询会员标签列表
+export function getcompanyTaglist(data) {
+	return request('/companyapp/app/fs/user/tagList', data, 'GET');
+}
+//添加黑名单
+export function Addblacklist(data) {
+	const url = '/companyapp/app/fs/user/disabled'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//修改公司会员打标签
+export function changeLable(data) {
+	const url = '/companyapp/app/fs/user/changeUserTags'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//根据经销商或群管查询会员总数
+export function getvipNum(data) {
+	const url = '/companyapp/app/fs/user/totalNumber'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//根据经销商 查询所属群管列表
+export function getgroupList(data) {
+	const url = '/companyapp/app/companyUser/companyUserListByCompanyId'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//生成分享海报,新建会员
+export function becomeVipuserImg(data) {
+	return request('/companyapp/app/fs/user/userImage', data, 'POST', 'application/json;charset=UTF-8');
+}
+//获取公司所有销售
+export function getusersales(data) {
+	return request('/companyapp/app/fs/user/allCompanyUser', data, 'GET', 'application/json;charset=UTF-8');
+}
+export function removebalcklist(data) {
+	const url = '/companyapp/app/fs/user/enabled'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//获取公司所有标签
+export function getallTags(data) {
+	return request('/companyapp/app/companyTag/list', data, 'GET', 'application/json;charset=UTF-8');
+}
+//更改用户姓名,备注
+export function getchangesUserInfo(data) {
+	return request('/companyapp/app/fs/user/changeUserInfo', data, 'POST', 'application/json;charset=UTF-8');
+}
+//催课 获取会员注册
+export function getWorkTask(data) {
+	return request('/companyapp/app/qwWorkTask/getUserList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//获取销售信息
+export function getCompanyUser(data) {
+	return request('/companyapp/app/user/getCompanyUser', data, 'GET');
+}
+//获取课程小节下拉列表
+export function getvideolist(data) {
+	return request('/companyapp/app/fs/course/videoList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//根据经销商 运营:查询课程数,群管数,参与会员
+export function getshopCoursenum(data) {
+	const url = '/companyapp/app/fs/user/statistics/details'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//查询详情看课转化率(漏斗图)
+export function getcourseRates(data) {
+	const url = '/companyapp/app/fs/user/graphic/details'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//获取课程视频详情
+export function getcourseDetail(data) {
+	return request('/companyapp/app/fs/course/videoDetails', data, 'GET', 'application/json;charset=UTF-8');
+}
+// 根据观看记录查询用户(课程分析)
+export function getUserLogListByCourseId(data) {
+	const url = '/companyapp/app/fs/course/participationRecord'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8');
+}
+// 修改用户
+export function updateFsUser(data) {
+	const url = '/fsUser/updateFsUser'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8');
+}
+
+//修改用户名称
+export function changeUserName(data) {
+	const url = '/fsUser/updateFsUser'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//查询答题数据(会员详情)
+export function getanswerlist(data) {
+	const url = '/companyapp/app/fs/user/details'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//通过销售审核
+export function subsalesaudit(data) {
+	return request('/companyapp/app/user/audit?userIds=' + data, data, 'POST', 'application/json;charset=UTF-8');
+}
+//获取审核销售
+export function getAllUsers(data) {
+	return request('/companyapp/app/user/getAllUsers', data, 'GET');
+}
+//查询销售部门列表
+export function querydepartment(data) {
+	return request('/companyapp/app/companyUser/deptList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//查询销售岗位列表
+export function querypost(data) {
+	return request('/companyapp/app/companyUser/postList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//修改销售部门和岗位
+export function modifysaleNews(data) {
+	return request('/companyapp/app/companyUser/changeUserDeptAndPost', data, 'POST', 'application/json;charset=UTF-8');
+}
+//查询销售角色列表
+export function queryrole(data) {
+	return request('/companyapp/app/companyUser/roleList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//根据经销商 新增公司标签
+export function addCompanyLabel(data) {
+	const url = '/companyapp/app/companyTag/add'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//根据经销商 删除公司标签
+export function deleteCompanyLabel(data) {
+	const url = '/companyapp/app/companyTag/delete?tagIds=' + data
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//更改销售信息
+export function setUserInfo(data) {
+	return request('/companyapp/app/user/setUserInfo', data, 'POST', 'application/json;charset=UTF-8');
+}
+//根据经销商 查询所属群管
+export function getusergroup(data) {
+	const url = '/companyapp/app/companyUser/getCompanyUserList'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//根据经销商 获取账户可用余额
+export function getuserbalance(data) {
+	const url = '/companyUser/getCompanyBalance'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//根据经销商 修改群管信息
+export function updategroupinfo(data) {
+	const url = '/companyapp/app/companyUser/updateUserInfo'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//获取更换会员归属审核列表
+export function getchangeslist(data) {
+	return request('/companyapp/app/companyUser/applyList', data, 'GET', 'application/json;charset=UTF-8');
+}
+//解除销售黑名单
+export function changesalesState(data) {
+	return request('/companyapp/app/user/changeUserState?userIds=' + data, data, 'POST',
+		'application/json;charset=UTF-8');
+}
+//销售详情
+export function getUserInfoByUserId(data) {
+	return request('/companyapp/app/user/getUserInfoByUserId', data, 'GET');
+}
+export function getUserInfo(data) {
+	return request('/companyapp/app/user/getUserInfo', data, 'GET');
+}
+//根据经销商  修改全部会员群管
+export function changevipUserAll(data) {
+	const url = '/companyapp/app/companyUser/changeUserParentApply'
+	return request(url, data, 'POST', 'application/json;charset=UTF-8')
+}
+//根据经销商  查询标签下会员
+export function gettagsUser(data) {
+	return request('/companyapp/app/companyTag/tagSubUsers', data, 'POST', 'application/json;charset=UTF-8');
+}
+//管理 获取会员人数等
+export function getmanagepopnum(data) {
+	return request('/companyapp/app/fs/user/companyUser/summaryCount', data, 'GET', 'application/json;charset=UTF-8');
+}
+//管理 获取管理课程统计
+export function getmanagecourse(data) {
+	return request('/companyapp/app/fs/user/companyUser/details', data, 'GET', 'application/json;charset=UTF-8');
+}
+//根据经销商 查询群管的课程
+export function getcourseList(data) {
+	const url = '/companyapp/app/fs/user/courseAnalysis'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//根据经销商 获取群管详情
+export function getGroupDetail(data) {
+	const url = '/companyapp/app/companyUser/getCompanyUserInfo?companyUserId'
+	return request(url, data, 'GET', 'application/json;charset=UTF-8')
+}
+//注册销售账户
+export function loginsales(data) {
+	return request('/companyapp/app/companyUser/resisterCompanyUser', data, 'POST', 'application/json;charset=UTF-8');
+}
+//会员页面获取项目列表
+export function getprojectlist(data) {
+	return request('/companyapp/app/common/getDictByKey', data, 'GET', 'application/json;charset=UTF-8');
+}
+//通过id获取项目
+export function getprojectChange(data) {
+	return request('/companyapp/app/companyUser/getDictByKeyByProject', data, 'POST', 'application/json;charset=UTF-8');
+}
+//生成小程序链接
+export function copyuniLink(data) {
+	return request('/companyapp/app/fs/course/getGotoWxAppLink', data, 'GET', 'application/json;charset=UTF-8');
+}
+
+ //语音接口
+ export function addVoicePrintUrl(data) {
+ 	 return request('/companyapp/app/companyUser/addVoicePrintUrl',data,'POST','application/json;charset=UTF-8');
+ }
+ //  模板语音上传接口
+ export function companyUserVoiceNew(data) {
+ 	 return request('/companyapp/app/companyUser/companyUserVoiceNew',data,'GET','application/json;charset=UTF-8');
+ }
+ // 模板语音上传接口
+ export function companyUserVoice(data) {
+ 	 return request('/companyapp/app/companyUser/companyUserVoice',data,'GET','application/json;charset=UTF-8');
+ }
+ // 获取语音列表
+ export function querySopVoiceList(data) {
+ 	 return request('/companyapp/app/companyUser/querySopVoiceList',data,'GET','application/json;charset=UTF-8');
+ }
+ // 获取语音详情
+ export function queryDetail(id) {
+ 	 return request('/companyapp/app/companyUser/query/'+id,null,'GET','application/json;charset=UTF-8');
+ }
+  
+ export function createUserAllVoice(id) {
+ 	 return request('/companyapp/app/companyUser/createUserAllVoice',null,'GET','application/json;charset=UTF-8');
+ }

+ 236 - 0
api/order.js

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

+ 22 - 0
api/patient.js

@@ -0,0 +1,22 @@
+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 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');
+ }
+ export function delPatient(data) {
+ 	return request('/app/patient/delPatient',data,'POST','application/json;charset=UTF-8');
+ }

+ 149 - 0
api/pay.js

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

+ 24 - 0
api/pay_new.js

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

+ 7 - 0
api/payment.js

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

+ 21 - 0
api/prescribe.js

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

+ 65 - 0
api/product.js

@@ -0,0 +1,65 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+
+ export function getProductCate(data) {
+ 	 return request('/app/product/getProductCate',data,'GET');
+ }
+ 
+ export function getProductCateByPid(data) {
+ 	 return request('/app/product/getProductCateByPid',data,'GET');
+ }
+ 
+ export function getProducts(data) {
+ 	 return request('/app/product/getProducts',data,'GET');
+ }
+ export function getProductDetails(data) {
+ 	 return request('/app/product/getProductDetails',data,'GET');
+ }
+ export function getCarts(data) {
+ 	 return request('/app/product/getCarts',data,'GET');
+ }
+ export function addCart(data) {
+ 	 return request('/app/product/addCart',data,'POST','application/json;charset=UTF-8');
+ }
+ export function delCart(data) {
+ 	 return request('/app/product/delCart',data,'POST','application/json;charset=UTF-8');
+ }
+ export function cartNum(data) {
+ 	 return request('/app/product/cartNum',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getCartCount(data) {
+ 	 return request('/app/product/getCartCount',data,'GET');
+ }
+ export function getGoodsProduct() {
+ 	 return request('/app/product/getGoodsProduct',null,'GET');
+ }
+ export function getGoodsProducts(data) {
+ 	 return request('/app/product/getGoodsProducts',data,'GET');
+ }
+ export function getTuiProducts(data) {
+ 	 return request('/app/product/getTuiProducts',data,'GET');
+ }
+ export function getStoreProductAttrValueList(data) {
+ 	 return request('/app/product/getStoreProductAttrValueList',data,'GET');
+ }
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+ 
+ 
+ 
+ 
+ 
+ 

+ 29 - 0
api/storeAfterSales.js

@@ -0,0 +1,29 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function getMyStoreOrderItemByOrderId(data) {
+ 	 return request('/app/storeAfterSales/getMyStoreOrderItemByOrderId',data,'GET');
+ } 
+ export function applyAfterSales(data) {
+ 	 return request('/app/storeAfterSales/applyAfterSales',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getAfterSalesList(data) {
+ 	 return request('/app/storeAfterSales/getAfterSalesList',data,'GET');
+ } 
+ 
+ export function getAfterSalesDetails(data) {
+ 	 return request('/app/storeAfterSales/getAfterSalesDetails',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');
+ }
+ 
+ 
+ 
+ 
+ 
+ 

+ 81 - 0
api/storeOrder.js

@@ -0,0 +1,81 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getMyStoreOrderList(data) {
+ 	 return request('/app/storeOrder/getMyStoreOrderList',data,'GET');
+ } 
+ export function getCompanyStoreOrderList(data) {
+ 	 return request('/app/storeOrder/getCompanyStoreOrderList',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 confirm(data) {
+ 	 return request('/app/storeOrder/confirm',data,'POST','application/json;charset=UTF-8');
+ }
+ export function computed(data) {
+ 	 return request('/app/storeOrder/computed',data,'POST','application/json;charset=UTF-8');
+ }
+ export function create(data) {
+ 	 return request('/app/storeOrder/create',data,'POST','application/json;charset=UTF-8');
+ }
+ export function pay(data) {
+ 	 return request('/app/storeOrder/pay',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function editPayType(data) {
+ 	 return request('/app/storeOrder/editPayType',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function payRemain(data) {
+ 	 return request('/app/storeOrder/payRemain',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function otherPayment(data) {
+ 	 return request('/app/storeOrder/otherPayment',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function otherPaymentRemain(data) {
+ 	 return request('/app/storeOrder/otherPaymentRemain',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 confirmPackageOrder(data) {
+ 	 return request('/app/storeOrder/confirmPackageOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ export function computedPackageOrder(data) {
+ 	 return request('/app/storeOrder/computedPackageOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function createPackageOrder(data) {
+ 	 return request('/app/storeOrder/createPackageOrder',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getOrderCount() {
+ 	 return request('/app/storeOrder/getOrderCount',null,'GET');
+ } 
+ 
+ export function orderBindUser(data) {
+ 	 return request('/app/storeOrder/orderBindUser',data,'POST','application/json;charset=UTF-8');
+ }  
+ 
+ 

+ 15 - 0
api/storeProductPackage.js

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

+ 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');
+ }
+  
+  

+ 72 - 0
api/user.js

@@ -0,0 +1,72 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function loginByMiniApp(data) {
+ 	 return request('/app/wx/loginByMiniApp',data,'POST','application/json;charset=UTF-8');
+ }
+ export function loginByMp(data) {
+ 	 return request('/app/wx/loginByMp',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getUserInfo() {
+ 	 return request('/app/user/getUserInfo',null,'GET');
+ }
+ 
+ export function editUser(data) {
+ 	return request('/app/user/editUser',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getWeixinInfo(data) {
+ 	return request('/app/wx/getWeixinInfo',data,'POST','application/json;charset=UTF-8');
+ }
+ export function checkLogin() {
+ 	 return request('/app/user/checkLogin',null,'GET');
+ }
+ export function getTuiImg() {
+ 	 return request('/app/user/getTuiImg',null,'GET');
+ }
+ export function getMyTuiOrderList(data) {
+ 	 return request('/app/user/getMyTuiOrderList',data,'GET');
+ }
+ export function getTuiMoney() {
+ 	 return request('/app/user/getTuiMoney',null,'GET');
+ }
+ export function getMyTuiList(data) {
+ 	 return request('/app/user/getMyTuiList',data,'GET');
+ }
+ export function getTuiMoneyLogs(data) {
+ 	 return request('/app/user/getTuiMoneyLogs',data,'GET');
+ }
+ 
+ export function getProductFoots(data) {
+ 	 return request('/app/user/getProductFoots',data,'GET');
+ }
+ export function delProductFoots(data) {
+ 	 return request('/app/user/delProductFoots',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function doExtract(data) {
+ 	 return request('/app/user/doExtract',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getExtractList(data) {
+ 	 return request('/app/user/getExtractList',data,'GET');
+ }
+ export function applyPromoter(data) {
+ 	 return request('/app/user/applyPromoter',data,'POST','application/json;charset=UTF-8');
+ }
+ export function bindPromoter(data) {
+ 	 return request('/app/user/bindPromoter',data,'POST','application/json;charset=UTF-8');
+ }
+ //获取跳转配置
+ export function getConfigByKey(data) {
+ 	 return request('/app/common/getConfigByKey',data,'GET');
+ }
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 

+ 17 - 0
api/userSign.js

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

+ 262 - 0
assets/css/common.less

@@ -0,0 +1,262 @@
+ 
+page {
+  background: #f5f5f5;
+  height: 100%;
+}
+.container{
+  height: 100%;
+}
+rich-text {
+  width: 100%;
+  display: block;
+  img,
+  image {
+    display: block;
+    width: 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;
+}
+
+/*每个页面公共css */
+.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; 
+}
+radio .wx-radio-input{
+  width: 36rpx;
+  height: 36rpx;
+  border: 1px solid #CCCCCC;
+}
+/* 选中后的 背景样式  */
+radio .wx-radio-input.wx-radio-input-checked{
+	background: linear-gradient(135deg, #66b2ef  0%, #2BC7B9 100%);
+	border: 1px solid #2BC7B9;
+}
+/* 选中后的 对勾样式 (白色对勾) */
+radio .wx-radio-input.wx-radio-input-checked::before{
+	color: #ffffff;
+}
+checkbox .wx-checkbox-input{
+	width: 36rpx;
+	height: 36rpx;
+	border: 1px solid #CCCCCC;
+	border-radius: 50%;
+}
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+	background: linear-gradient(135deg, #66b2ef 0%, #2BC7B9 100%);
+	border: 1px solid #2BC7B9;
+	border-radius: 50%;
+}
+checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
+	color: #ffffff;
+}
+::-webkit-scrollbar {
+   width: 0;
+   height: 0;
+   color: transparent;
+ }
+ /* 暂无数据 */
+.no-data-box{
+	padding: 100upx 50upx;
+	text-align: center;
+	image{
+		width: 372rpx;
+		height: 240rpx;
+	}
+	.empty-title{
+		margin-top: 20rpx;
+		font-size: 32rpx;
+		color: #bbbbbb;
+		 
+	}
+}
+.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;
+}
+
+ .back-box{
+	position: relative;
+	.title{
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%,-50%);
+	}
+}

+ 163 - 0
assets/css/common.scss

@@ -0,0 +1,163 @@
+// 字体
+@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;
+}
+.base-textcol{
+	color: var(--base-color-text);
+}
+.color9{
+	color: #999;
+}
+.color6{
+	color: #666;
+}
+.bgf{
+	background-color: #fff;
+}
+.base-color{
+	color: #018C39;
+}

+ 31 - 0
assets/css/theme.scss

@@ -0,0 +1,31 @@
+/*自定义主题色 */
+$--base-color:#1773ff;
+$--base-color2:#e7f1fe;
+$--base-color3:#425034;
+$--base-color-price:#FF1212;
+$--base-color-gray:#DEDFE4;
+$--base-color-dark:#313131;
+$--base-color-red:#ef4c50;
+$--base-color-dark2:#3E3E3E;
+$--base-color-success:#a3db42;
+$--base-color-false:#f93e3e;
+$--base-color-0:#000;
+$--base-color-1:#111;
+$--base-color-3:#333;
+$--base-color-6:#666;
+$--base-color-9:#999;
+$--base-color-f8:#f8f8f8;
+$--base-color-f5:#f5f5f5;
+$--base-bg: #1773ff;
+$--base-bg2:#e7f1fe;
+$--base-bor-red:#f7a1a1;
+$--base-bor-blue:#c9e1fb;
+$--base-cont-bg:#F3F5F9;
+$--base-false-bg:#fae7e7;
+$--base-sure-bg:#e7f2fe;
+$--base-bg-f:#fff;
+$--base-bg-red:#ee0a25;
+$--base-bg-blue:#1677ff;
+$--base-bg-orange:#FF7F00;
+
+

File diff suppressed because it is too large
+ 2 - 0
assets/iconfont/iconfont.css


BIN
assets/iconfont/iconfont.ttf


+ 163 - 0
common/request.js

@@ -0,0 +1,163 @@
+// uni-app请求封装
+import {
+	TOKEN_KEYAuto
+} from '@/utils/courseTool.js'
+import store from '@/store/index.js'
+export default class Request {
+	http(router, data = {}, method, contentType) {
+		let that = this;
+		//let path = 'http://localhost:7014';
+		// let path = 'https://test.userapp.store.cdwjyyh.com';
+		// let path = 'https://user.test.ylrztop.com/api';
+
+		let path = 'https://userapp.klbycp.com/store'; //百域承品
+		let path2 = 'https://userapp.klbycp.com'; //百域承品
+
+
+
+		// let path = 'http://j9d5863c.natappfree.cc/store';//百域承品
+		// let path2 = 'http://j9d5863c.natappfree.cc';//百域承品
+
+		let type = 0
+		uni.setStorageSync('requestPath', path2)
+		// uni.showLoading({
+		// 	title: '加载中'
+		// });
+
+		if (router.indexOf("/live/liveData/like") != -1) {
+			path = 'https://im.fhhx.runtzh.com';
+		}
+
+		if (router.indexOf("/live") !== -1||router.indexOf("/liveAPP") !== -1) {
+			path = 'https://userapp.klbycp.com';
+			console.log("在live里面>>>>.",`${path}${router}`)
+			router = router.replace('/liveAPP', '')
+			type=4
+			token = uni.getStorageSync('AppToken');
+		}
+		
+		if (router.indexOf("/patient/getPatientList") !== -1) {
+			path = 'https://userapp.klbycp.com';
+			// path = 'http://j9d5863c.natappfree.cc';
+		}
+		if (router.indexOf("/getGotoWxAppLiveLink") !== -1) {
+			path = 'https://userapp.klbycp.com/companyapp';
+		}
+
+		let token = uni.getStorageSync('AppToken');
+		if (router.indexOf("/companyapp") != -1) {
+			// router =router.replace('/companyapp','')
+			path = 'https://userapp.klbycp.com' //百域承品
+			type = 1
+			token = uni.getStorageSync('ManageToken');
+		}
+
+
+		// 企微看课
+		if (router.indexOf("/course_auto") != -1) {
+			type = 2
+			router = router.replace('/course_auto', '')
+			// path = 'http://w43fa358.natappfree.cc'
+			path = 'https://userapp.klbycp.com' //百域承品
+			token = uni.getStorageSync(TOKEN_KEYAuto)
+			console.log("TOKEN_KEYAuto===", TOKEN_KEYAuto, token)
+		}
+		if (router.indexOf("/course_uniapp") != -1) {
+			type = 3
+			router = router.replace('/course_uniapp', '')
+			//张玉朋
+			// let path = 'http://192.168.10.158:8113'//
+			path = 'https://userapp.klbycp.com' //百域承品
+			token = uni.getStorageSync('TOKEN_WEXIN')
+		}
+
+		return new Promise((resolve, reject) => {
+			// token = uni.getStorageSync('AppToken');
+			var httpContentType = 'application/x-www-form-urlencoded';
+			if (contentType != undefined) {
+				//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
+				},
+				url: `${path}${router}`,
+				data: data,
+				method: method,
+				success: (res) => {
+					if (type !== 0 && (res.data.code == 401 || res.data.code == 4001 || res.data
+							.code == 4004)) {
+						store.commit('setCoureLogin', 2);
+						uni.removeStorageSync("userinfos")
+						// uni.removeStorageSync('userInfo');
+						uni.removeStorageSync('TOKEN_WEXIN');
+						if (type == 2) {
+							uni.removeStorageSync(TOKEN_KEYAuto)
+						}
+						if (type == 1) {
+							uni.removeStorageSync('ManageToken');
+							uni.navigateTo({
+								url: '/pages_manage/login'
+							})
+						}
+						resolve({
+							code: 401,
+							data: null
+						});
+						return
+					}
+					//收到开发者服务器成功返回的回调函数
+					if (res.data.code == 401) { //没有权限直接退出到登录界面
+						let pages = getCurrentPages();
+						pages.forEach(function(element) {
+							if (element != undefined && element.route ==
+								"pages/auth/login") {
+								resolve(res.data)
+								return;
+							}
+						});
+						// let url = pages[ pages.length - 1]; //当前页页面实例
+						// //如果登录界面已打开,自动关闭
+						// if(url!=undefined&&url.route=="pages/auth/numberlogin"){
+						//  	resolve(res.data)
+						// 	return;
+						// }
+						uni.navigateTo({
+							url: '/pages/auth/login',
+							success: () => {
+								uni.hideLoading();
+
+							},
+							fail: () => {
+								uni.hideLoading();
+							}
+						})
+						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();
+				}
+
+			})
+		})
+
+	}
+
+}

+ 21 - 0
components/Loading.vue

@@ -0,0 +1,21 @@
+<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>

+ 147 - 0
components/Menu.vue

@@ -0,0 +1,147 @@
+<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.menuId" @tap="routerTo(item)">
+						<image class="tab-img Shop-selector-circular" :style="{ width: imgW + 'rpx', height: imgW + 'rpx' }" :src="item.icon"></image>
+						<text class="Shop-selector-rect">{{ item.menuName }}</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 {
+			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.$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;
+			}
+		}
+	}
+	.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>

+ 166 - 0
components/chengpeng-audio/free-audio.vue

@@ -0,0 +1,166 @@
+<template>
+	<!-- 音频播放器组件 -->
+	<view v-if='url' class='flex justify-between align-center audio' >
+		<view class='mr-3'  @click='start(audioId)'>
+			<image :src='startPic' class='icon' v-show='!status'></image>
+			<image :src='endPic' class='icon' v-show='status'></image>
+		</view>
+		<view class='flex-1'>
+			<slider 
+				@change='changeAudio' 
+				:activeColor='activeColor' 
+				:min='0' 
+				:max='duration.toFixed(0)' 
+				:value='currentTime.toFixed(0)' 
+				:step='0.1'
+				backgroundColor="#E9F0F0"
+				:block-size='14'
+				block-color='#2BC7B9'>
+			</slider>
+		</view>
+		<view class='ml-3'>{{getTime(Math.round(currentTime))}}</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				context: null,
+				currentTime: 0,
+				duration: 100,
+				status: false
+			}
+		},
+		props: {
+			url: String,
+			activeColor: {
+				type: String,
+				default: '#0E7EFC'
+			},
+			startPic: String,
+			endPic: String,
+			audioId: [String,Number]
+		},
+		created() {
+			this.context = uni.createInnerAudioContext();
+			this.context.src = this.url;
+			this.onTimeUpdate();
+			this.onCanplay();
+			this.onEnded();
+			uni.$on('stop',(id)=> {
+				if(id && id != this.audioId) {
+					this.context.stop();
+					this.status = false;
+				} else if(!id){
+					this.context.stop();
+					this.status = false;
+				}
+			})
+		},
+		methods: {
+			start(id) { //点击播放
+				let audioId = id;
+				if(this.status) {
+					this.context.pause();
+					this.status = !this.status;
+				}else {
+					uni.$emit('stop',id)
+					this.context.play()
+					this.status = !this.status;
+				}
+			},
+			onCanplay() { //进入可播放状态
+				this.context.onCanplay(() => {
+					this.context.duration;
+					setTimeout(()=>{
+						this.duration = this.context.duration;
+					},1000)
+				})
+			},
+			onTimeUpdate() { //音频播放进度
+				 this.context.onTimeUpdate(() => {
+					 if (!Number.isFinite( this.context.duration)) {
+						this.context.currentTime = Number.MAX_SAFE_INTEGER;
+						this.context.currentTime = 0;
+					 } else {
+						 this.duration = this.context.duration;
+						 this.currentTime = this.context.currentTime;
+					 }
+				 })
+			},
+			onEnded() { //播放结束
+				this.context.onEnded(()=> {
+					this.status = false;
+					this.currentTime = 0;
+				})
+			},
+			changeAudio(e) {
+				let paused = this.context.paused;
+				this.context.pause();
+				this.context.seek(e.detail.value)
+				if(!paused) {
+					this.context.play();
+				} 
+			},
+			getTime(time) {
+				let m = parseInt(time / 60);
+				let s = time % 60;
+				return this.towNum(m) + ':' + this.towNum(s);
+			},
+			towNum(num) {
+				if(num >= 10) {
+					return num;
+				}else {
+					return '0' + num;
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+	.audio {
+		background: #F5F7F7;
+		padding: 30upx 20upx;
+	}
+	
+	.icon {
+		width: 54upx;
+		height: 54upx;
+	}
+	slider{
+		margin: 0;
+	}
+	.flex {
+		display: flex;
+		flex-direction: row;
+	}
+	
+	.justify-between {
+		justify-content: between;
+	}
+	
+	.align-center {
+		align-items: center;
+	}
+	
+	.flex-1 {
+		flex: 1;
+	}
+	
+	.ml-3 {
+		margin-left: 20upx;
+		font-size: 24upx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: #666666;
+	}
+	
+	.mr-3 {
+		margin-right: 30upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+</style>

+ 42 - 0
components/chengpeng-audio/redme.md

@@ -0,0 +1,42 @@
+## 参数
+
+| url      | activeColor | startPic       | endPic         | 组件id                                                |
+| -------- | ----------- | -------------- | -------------- | ----------------------------------------------------- |
+| 音频链接 | 进度条颜色  | 开始播放的图片 | 暂停播放的图片 | audioId(必填,且id不可为数字0,建议格式 ‘audio’+数字) |
+
+## 使用方法
+
+```javascript
+//html
+<template>
+  <free-audio startPic='https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon/play.png' endPic='https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/icon/stop.png' :audioId='audio1' :url='path'></free-audio>
+</template>
+
+//js
+
+import freeAudio from '@/components/free-audio.vue'
+export default {
+    components: {freeAudio},
+    data() {
+        return{
+            path: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3'
+        }
+    },
+    methods: {
+
+    },
+} 
+
+//暂停所有音频(一般用于页面切换时停止正在播放的音频)
+onUnload() { //普通页面在 onUnload 生命周期中执行
+  uni.$emit('stop')
+},
+onHide() { //tabBar页面在onHide生命周期中执行
+  uni.$emit('stop')
+}
+
+
+
+
+```
+

BIN
components/chengpeng-audio/static/play.png


BIN
components/chengpeng-audio/static/stop.png


+ 143 - 0
components/evan-switch/evan-switch.vue

@@ -0,0 +1,143 @@
+<template>
+	<!-- <view @click="toggle" class="evan-switch" :class="{'evan-switch--disabled':disabled}" :style="{width:2*size+'px',height:switchHeight,borderRadius:size+'px',backgroundColor:currentValue===activeValue?activeColor:inactiveColor}">
+		<view class="evan-switch__circle" :style="{width:size+'px',height:size+'px',transform:currentValue===activeValue?`translateX(${size}px)`:`translateX(0)`}"></view>
+	</view> -->
+	<view @click="toggle" class="evan-switch" :class="{'evan-switch--disabled':disabled}" :style="{backgroundColor:currentValue===activeValue?activeColor:inactiveColor}">
+		<view class="evan-switch__circle" :style="{transform:currentValue===activeValue?`translateX(${29}px)`:`translateX(0)`}"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'EvanSwitch',
+		props: {
+			value: {
+				type: [String, Number, Boolean],
+				default: false
+			},
+			activeColor: {
+				type: String,
+				default: '#108ee9'
+			},
+			inactiveColor: {
+				type: String,
+				default: '#fff'
+			},
+			size: {
+				type: Number,
+				default: 30
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			activeValue: {
+				type: [String, Number, Boolean],
+				default: true
+			},
+			inactiveValue: {
+				type: [String, Number, Boolean],
+				default: false
+			},
+			beforeChange: {
+				type: Function,
+				default: null
+			},
+			extraData: null,
+			contextLevel: {
+				type: Number,
+				default: 1
+			}
+		},
+		computed: {
+			switchHeight() {
+				// #ifdef APP-NVUE
+				return this.size + 2 + 'px'
+				// #endif
+				// #ifndef APP-NVUE
+				return this.size + 'px'
+				// #endif
+			}
+		},
+		watch: {
+			value: {
+				immediate: true,
+				handler(value) {
+					this.currentValue = value
+				}
+			}
+		},
+		data() {
+			return {
+				currentValue: false
+			}
+		},
+		methods: {
+			toggle() {
+				if (!this.disabled) {
+					if (this.beforeChange && typeof this.beforeChange === 'function') {
+						let context = this
+						for (let i = 0; i < this.contextLevel; i++) {
+							context = context.$options.parent
+						}
+						const result = this.beforeChange(this.currentValue === this.activeValue ? this.inactiveValue : this.activeValue,
+							this.extraData, context)
+						if (typeof result === 'object') {
+							result.then(() => {
+								this.toggleValue()
+							}).catch(() => {})
+						} else if (typeof result === 'boolean' && result) {
+							this.toggleValue()
+						}
+					} else {
+						this.toggleValue()
+					}
+				}
+			},
+			toggleValue() {
+				this.currentValue = this.currentValue === this.activeValue ? this.inactiveValue : this.activeValue
+				this.$emit('input', this.currentValue)
+				this.$emit('change', this.currentValue)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.evan-switch {
+		position: relative;
+		border-width: 1px;
+		border-color: rgba(0, 0, 0, 0.1);
+		border-style: solid;
+		transition: background-color 0.3s;
+		width: 100upx;
+		height: 36upx;
+		background: #2BC7B9;
+		border-radius: 18upx;
+		/* #ifndef APP-NVUE */
+		box-sizing: content-box;
+		/* #endif */
+	}
+
+	.evan-switch--disabled {
+		opacity: 0.3;
+	}
+
+	.evan-switch__circle {
+		position: absolute;
+		left: -4upx;
+		top: -8upx;
+		width: 50upx;
+		height: 50upx;
+		background: #FFFFFF;
+		box-shadow: 0px 2px 10px 0px rgba(166, 217, 212, 0.49);
+		border-radius: 50%;
+		/* #ifndef APP-NVUE */
+		box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		box-shadow: 1px 0 0px 0 rgba(0, 0, 0, 0.05);
+		/* #endif */
+		transition: transform 0.3s;
+	}
+</style>

+ 68 - 0
components/im/base/common.js

@@ -0,0 +1,68 @@
+export function caculateTimeago(dateTimeStamp) {
+  const minute = 1000 * 60; // 把分,时,天,周,半个月,一个月用毫秒表示
+
+  const hour = minute * 60;
+  const day = hour * 24;
+  const week = day * 7;
+  const now = new Date().getTime(); // 获取当前时间毫秒
+
+  const diffValue = now - dateTimeStamp; // 时间差
+
+  let result = '';
+
+  if (diffValue < 0) {
+    return;
+  }
+
+  const minC = diffValue / minute; // 计算时间差的分,时,天,周,月
+
+  const hourC = diffValue / hour;
+  const dayC = diffValue / day;
+  const weekC = diffValue / week;
+
+  if (weekC >= 1 && weekC <= 4) {
+    result = ` ${parseInt(weekC, 10)}周前`;
+  } else if (dayC >= 1 && dayC <= 6) {
+    result = ` ${parseInt(dayC, 10)}天前`;
+  } else if (hourC >= 1 && hourC <= 23) {
+    result = ` ${parseInt(hourC, 10)}小时前`;
+  } else if (minC >= 1 && minC <= 59) {
+    result = ` ${parseInt(minC, 10)}分钟前`;
+  } else if (diffValue >= 0 && diffValue <= minute) {
+    result = '刚刚';
+  } else {
+    const datetime = new Date();
+    datetime.setTime(dateTimeStamp);
+    const Nyear = datetime.getFullYear();
+    const Nmonth = datetime.getMonth() + 1 < 10 ? `0${datetime.getMonth() + 1}` : datetime.getMonth() + 1;
+    const Ndate = datetime.getDate() < 10 ? `0${datetime.getDate()}` : datetime.getDate();
+    result = `${Nyear}-${Nmonth}-${Ndate}`;
+  }
+
+  return result;
+}
+export function formateTime(secondTime) {
+  const time = secondTime;
+  let newTime;
+  let hour;
+  let minite;
+  let seconds;
+  if (time >= 3600) {
+    hour = parseInt(time / 3600) < 10 ? `0${parseInt(time / 3600)}` : parseInt(time / 3600);
+    minite = parseInt(time % 60 / 60) < 10 ? `0${parseInt(time % 60 / 60)}` : parseInt(time % 60 / 60);
+    seconds = time % 3600 < 10 ? `0${time % 3600}` : time % 3600;
+    if (seconds > 60) {
+      minite = parseInt(seconds / 60) < 10 ? `0${parseInt(seconds / 60)}` : parseInt(seconds / 60);
+      seconds = seconds % 60 < 10 ? `0${seconds % 60}` : seconds % 60;
+    }
+    newTime = `${hour}:${minite}:${seconds}`;
+  } else if (time >= 60 && time < 3600) {
+    minite = parseInt(time / 60) < 10 ? `0${parseInt(time / 60)}` : parseInt(time / 60);
+    seconds = time % 60 < 10 ? `0${time % 60}` : time % 60;
+    newTime = `00:${minite}:${seconds}`;
+  } else if (time < 60) {
+    seconds = time < 10 ? `0${time}` : time;
+    newTime = `00:00:${seconds}`;
+  }
+  return newTime;
+}

+ 146 - 0
components/im/base/emojiMap.js

@@ -0,0 +1,146 @@
+export const emojiUrl = 'https://web.sdk.qcloud.com/im/assets/emoji/';
+export const emojiMap = {
+  '[NO]': 'emoji_0@2x.png',
+  '[OK]': 'emoji_1@2x.png',
+  '[下雨]': 'emoji_2@2x.png',
+  '[么么哒]': 'emoji_3@2x.png',
+  '[乒乓]': 'emoji_4@2x.png',
+  '[便便]': 'emoji_5@2x.png',
+  '[信封]': 'emoji_6@2x.png',
+  '[偷笑]': 'emoji_7@2x.png',
+  '[傲慢]': 'emoji_8@2x.png',
+  '[再见]': 'emoji_9@2x.png',
+  '[冷汗]': 'emoji_10@2x.png',
+  '[凋谢]': 'emoji_11@2x.png',
+  '[刀]': 'emoji_12@2x.png',
+  '[删除]': 'emoji_13@2x.png',
+  '[勾引]': 'emoji_14@2x.png',
+  '[发呆]': 'emoji_15@2x.png',
+  '[发抖]': 'emoji_16@2x.png',
+  '[可怜]': 'emoji_17@2x.png',
+  '[可爱]': 'emoji_18@2x.png',
+  '[右哼哼]': 'emoji_19@2x.png',
+  '[右太极]': 'emoji_20@2x.png',
+  '[右车头]': 'emoji_21@2x.png',
+  '[吐]': 'emoji_22@2x.png',
+  '[吓]': 'emoji_23@2x.png',
+  '[咒骂]': 'emoji_24@2x.png',
+  '[咖啡]': 'emoji_25@2x.png',
+  '[啤酒]': 'emoji_26@2x.png',
+  '[嘘]': 'emoji_27@2x.png',
+  '[回头]': 'emoji_28@2x.png',
+  '[困]': 'emoji_29@2x.png',
+  '[坏笑]': 'emoji_30@2x.png',
+  '[多云]': 'emoji_31@2x.png',
+  '[大兵]': 'emoji_32@2x.png',
+  '[大哭]': 'emoji_33@2x.png',
+  '[太阳]': 'emoji_34@2x.png',
+  '[奋斗]': 'emoji_35@2x.png',
+  '[奶瓶]': 'emoji_36@2x.png',
+  '[委屈]': 'emoji_37@2x.png',
+  '[害羞]': 'emoji_38@2x.png',
+  '[尴尬]': 'emoji_39@2x.png',
+  '[左哼哼]': 'emoji_40@2x.png',
+  '[左太极]': 'emoji_41@2x.png',
+  '[左车头]': 'emoji_42@2x.png',
+  '[差劲]': 'emoji_43@2x.png',
+  '[弱]': 'emoji_44@2x.png',
+  '[强]': 'emoji_45@2x.png',
+  '[彩带]': 'emoji_46@2x.png',
+  '[彩球]': 'emoji_47@2x.png',
+  '[得意]': 'emoji_48@2x.png',
+  '[微笑]': 'emoji_49@2x.png',
+  '[心碎了]': 'emoji_50@2x.png',
+  '[快哭了]': 'emoji_51@2x.png',
+  '[怄火]': 'emoji_52@2x.png',
+  '[怒]': 'emoji_53@2x.png',
+  '[惊恐]': 'emoji_54@2x.png',
+  '[惊讶]': 'emoji_55@2x.png',
+  '[憨笑]': 'emoji_56@2x.png',
+  '[手枪]': 'emoji_57@2x.png',
+  '[打哈欠]': 'emoji_58@2x.png',
+  '[抓狂]': 'emoji_59@2x.png',
+  '[折磨]': 'emoji_60@2x.png',
+  '[抠鼻]': 'emoji_61@2x.png',
+  '[抱抱]': 'emoji_62@2x.png',
+  '[抱拳]': 'emoji_63@2x.png',
+  '[拳头]': 'emoji_64@2x.png',
+  '[挥手]': 'emoji_65@2x.png',
+  '[握手]': 'emoji_66@2x.png',
+  '[撇嘴]': 'emoji_67@2x.png',
+  '[擦汗]': 'emoji_68@2x.png',
+  '[敲打]': 'emoji_69@2x.png',
+  '[晕]': 'emoji_70@2x.png',
+  '[月亮]': 'emoji_71@2x.png',
+  '[棒棒糖]': 'emoji_72@2x.png',
+  '[汽车]': 'emoji_73@2x.png',
+  '[沙发]': 'emoji_74@2x.png',
+  '[流汗]': 'emoji_75@2x.png',
+  '[流泪]': 'emoji_76@2x.png',
+  '[激动]': 'emoji_77@2x.png',
+  '[灯泡]': 'emoji_78@2x.png',
+  '[炸弹]': 'emoji_79@2x.png',
+  '[熊猫]': 'emoji_80@2x.png',
+  '[爆筋]': 'emoji_81@2x.png',
+  '[爱你]': 'emoji_82@2x.png',
+  '[爱心]': 'emoji_83@2x.png',
+  '[爱情]': 'emoji_84@2x.png',
+  '[猪头]': 'emoji_85@2x.png',
+  '[猫咪]': 'emoji_86@2x.png',
+  '[献吻]': 'emoji_87@2x.png',
+  '[玫瑰]': 'emoji_88@2x.png',
+  '[瓢虫]': 'emoji_89@2x.png',
+  '[疑问]': 'emoji_90@2x.png',
+  '[白眼]': 'emoji_91@2x.png',
+  '[皮球]': 'emoji_92@2x.png',
+  '[睡觉]': 'emoji_93@2x.png',
+  '[磕头]': 'emoji_94@2x.png',
+  '[示爱]': 'emoji_95@2x.png',
+  '[礼品袋]': 'emoji_96@2x.png',
+  '[礼物]': 'emoji_97@2x.png',
+  '[篮球]': 'emoji_98@2x.png',
+  '[米饭]': 'emoji_99@2x.png',
+  '[糗大了]': 'emoji_100@2x.png',
+  '[红双喜]': 'emoji_101@2x.png',
+  '[红灯笼]': 'emoji_102@2x.png',
+  '[纸巾]': 'emoji_103@2x.png',
+  '[胜利]': 'emoji_104@2x.png',
+  '[色]': 'emoji_105@2x.png',
+  '[药]': 'emoji_106@2x.png',
+  '[菜刀]': 'emoji_107@2x.png',
+  '[蛋糕]': 'emoji_108@2x.png',
+  '[蜡烛]': 'emoji_109@2x.png',
+  '[街舞]': 'emoji_110@2x.png',
+  '[衰]': 'emoji_111@2x.png',
+  '[西瓜]': 'emoji_112@2x.png',
+  '[调皮]': 'emoji_113@2x.png',
+  '[象棋]': 'emoji_114@2x.png',
+  '[跳绳]': 'emoji_115@2x.png',
+  '[跳跳]': 'emoji_116@2x.png',
+  '[车厢]': 'emoji_117@2x.png',
+  '[转圈]': 'emoji_118@2x.png',
+  '[鄙视]': 'emoji_119@2x.png',
+  '[酷]': 'emoji_120@2x.png',
+  '[钞票]': 'emoji_121@2x.png',
+  '[钻戒]': 'emoji_122@2x.png',
+  '[闪电]': 'emoji_123@2x.png',
+  '[闭嘴]': 'emoji_124@2x.png',
+  '[闹钟]': 'emoji_125@2x.png',
+  '[阴险]': 'emoji_126@2x.png',
+  '[难过]': 'emoji_127@2x.png',
+  '[雨伞]': 'emoji_128@2x.png',
+  '[青蛙]': 'emoji_129@2x.png',
+  '[面条]': 'emoji_130@2x.png',
+  '[鞭炮]': 'emoji_131@2x.png',
+  '[风车]': 'emoji_132@2x.png',
+  '[飞吻]': 'emoji_133@2x.png',
+  '[飞机]': 'emoji_134@2x.png',
+  '[饥饿]': 'emoji_135@2x.png',
+  '[香蕉]': 'emoji_136@2x.png',
+  '[骷髅]': 'emoji_137@2x.png',
+  '[麦克风]': 'emoji_138@2x.png',
+  '[麻将]': 'emoji_139@2x.png',
+  '[鼓掌]': 'emoji_140@2x.png',
+  '[龇牙]': 'emoji_141@2x.png'
+};
+export const emojiName = ['[龇牙]', '[调皮]', '[流汗]', '[偷笑]', '[再见]', '[敲打]', '[擦汗]', '[猪头]', '[玫瑰]', '[流泪]', '[大哭]', '[嘘]', '[酷]', '[抓狂]', '[委屈]', '[便便]', '[炸弹]', '[菜刀]', '[可爱]', '[色]', '[害羞]', '[得意]', '[吐]', '[微笑]', '[怒]', '[尴尬]', '[惊恐]', '[冷汗]', '[爱心]', '[示爱]', '[白眼]', '[傲慢]', '[难过]', '[惊讶]', '[疑问]', '[困]', '[么么哒]', '[憨笑]', '[爱情]', '[衰]', '[撇嘴]', '[阴险]', '[奋斗]', '[发呆]', '[右哼哼]', '[抱抱]', '[坏笑]', '[飞吻]', '[鄙视]', '[晕]', '[大兵]', '[可怜]', '[强]', '[弱]', '[握手]', '[胜利]', '[抱拳]', '[凋谢]', '[米饭]', '[蛋糕]', '[西瓜]', '[啤酒]', '[瓢虫]', '[勾引]', '[OK]', '[爱你]', '[咖啡]', '[月亮]', '[刀]', '[发抖]', '[差劲]', '[拳头]', '[心碎了]', '[太阳]', '[礼物]', '[皮球]', '[骷髅]', '[挥手]', '[闪电]', '[饥饿]', '[困]', '[咒骂]', '[折磨]', '[抠鼻]', '[鼓掌]', '[糗大了]', '[左哼哼]', '[打哈欠]', '[快哭了]', '[吓]', '[篮球]', '[乒乓]', '[NO]', '[跳跳]', '[怄火]', '[转圈]', '[磕头]', '[回头]', '[跳绳]', '[激动]', '[街舞]', '[献吻]', '[左太极]', '[右太极]', '[闭嘴]', '[猫咪]', '[红双喜]', '[鞭炮]', '[红灯笼]', '[麻将]', '[麦克风]', '[礼品袋]', '[信封]', '[象棋]', '[彩带]', '[蜡烛]', '[爆筋]', '[棒棒糖]', '[奶瓶]', '[面条]', '[香蕉]', '[飞机]', '[左车头]', '[车厢]', '[右车头]', '[多云]', '[下雨]', '[钞票]', '[熊猫]', '[灯泡]', '[风车]', '[闹钟]', '[雨伞]', '[彩球]', '[钻戒]', '[沙发]', '[纸巾]', '[手枪]', '[青蛙]'];

+ 113 - 0
components/im/base/message-facade.js

@@ -0,0 +1,113 @@
+import {
+  emojiMap,
+  emojiUrl
+} from './emojiMap';
+/** 传入message.element(群系统消息SystemMessage,群提示消息GroupTip除外)
+ * content = {
+ *  type: 'TIMTextElem',
+ *  content: {
+ *    text: 'AAA[龇牙]AAA[龇牙]AAA[龇牙AAA]'
+ *  }
+ *}
+ **/
+// 群提示消息的含义 (opType)
+
+const GROUP_TIP_TYPE = {
+  MEMBER_JOIN: 1,
+  MEMBER_QUIT: 2,
+  MEMBER_KICKED_OUT: 3,
+  MEMBER_SET_ADMIN: 4,
+  // 被设置为管理员
+  MEMBER_CANCELED_ADMIN: 5,
+  // 被取消管理员
+  GROUP_INFO_MODIFIED: 6,
+  // 修改群资料,转让群组为该类型,msgBody.msgGroupNewInfo.ownerAccount表示新群主的ID
+  MEMBER_INFO_MODIFIED: 7 // 修改群成员信息
+
+}; // 解析小程序text, 表情信息也是[嘻嘻]文本
+
+export function parseText(message) {
+  const renderDom = [];
+  let temp = message.payload.text;
+  let left = -1;
+  let right = -1;
+
+  while (temp !== '') {
+    left = temp.indexOf('[');
+    right = temp.indexOf(']');
+
+    switch (left) {
+      case 0:
+        if (right === -1) {
+          renderDom.push({
+            name: 'span',
+            text: temp
+          });
+          temp = '';
+        } else {
+          const _emoji = temp.slice(0, right + 1);
+
+          if (emojiMap[_emoji]) {
+            renderDom.push({
+              name: 'img',
+              src: emojiUrl + emojiMap[_emoji]
+            });
+            temp = temp.substring(right + 1);
+          } else {
+            renderDom.push({
+              name: 'span',
+              text: '['
+            });
+            temp = temp.slice(1);
+          }
+        }
+
+        break;
+
+      case -1:
+        renderDom.push({
+          name: 'span',
+          text: temp
+        });
+        temp = '';
+        break;
+
+      default:
+        renderDom.push({
+          name: 'span',
+          text: temp.slice(0, left)
+        });
+        temp = temp.substring(left);
+        break;
+    }
+  }
+
+  return renderDom;
+} 
+// 解析图片消息
+
+export function parseImage(message) {
+  const renderDom = [{
+    name: 'image',
+    // 这里默认渲染的是 1080P 的图片
+    src: message.payload.imageInfoArray[0].url
+  }];
+  return renderDom;
+} // 解析视频消息
+
+export function parseVideo(message) {
+  const renderDom = {
+    name: 'video',
+    src: message.payload.videoUrl
+  };
+  return renderDom;
+} // 解析语音消息
+
+export function parseAudio(message) {
+  const renderDom = {
+    name: 'audio',
+    src: message.payload.url,
+    second: message.payload.second === 0 ? 1 : message.payload.second
+  };
+  return renderDom;
+}

+ 29 - 0
components/im/tui-chat/message-elements/audio-message/index.css

@@ -0,0 +1,29 @@
+.audio-message {
+	padding: 10rpx 18rpx;
+	border-radius: 2px 10px 10px 10px;
+	border: 1px solid #D9D9D9;
+	display: flex;
+}
+
+.audio-icon {
+	width: 28px;
+	height: 28px;
+}
+
+.my-audio {
+	border-radius: 10px 2px 10px 10px;
+	background: rgba(0, 110, 255, 0.10);
+	border: 1px solid rgba(0, 110, 255, 0.30);
+}
+
+.audio {
+	/*border-radius: 2px 10px 10px 10px;*/
+	height: 60rpx;
+	font-family: PingFangSC-Medium;
+	font-size: 28rpx;
+	color: #000000;
+	line-height: 28rpx;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+}

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

@@ -0,0 +1,67 @@
+<template>
+	<view :class="'audio-message ' + (isMine ? 'my-audio' : '')">
+		<image class="audio-icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/audio.png"></image>
+		<view class="audio " @click="handlePlayAudioMessage" :style="'width: ' + 120 + 'rpx'">{{ '" ' + message.payload.second }}</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			audio: {}
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object,
+			default: () => {}
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					message: newVal
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+
+	beforeMount() {
+		this.audio = uni.createInnerAudioContext();
+		this.audio.onPlay(() => {
+			console.log('开始播放');
+		});
+		this.audio.onEnded(() => {
+			console.log('停止播放');
+		});
+		this.audio.onError(e => {
+			console.error(e, 'onError');
+			// ios 音频播放无声,可能是因为系统开启了静音模式
+			uni.showToast({
+				icon: 'none',
+				title: '该音频暂不支持播放'
+			});
+		});
+	},
+
+	methods: {
+		handlePlayAudioMessage() {
+			this.audio.src = this.message.payload.url;
+			this.audio.play();
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 103 - 0
components/im/tui-chat/message-elements/custom-message/index.css

@@ -0,0 +1,103 @@
+.custom-message {
+	display: flex;
+	padding: 10rpx 24rpx;
+	background-color: #fff;
+	border-radius: 2px 10px 10px 10px;
+	border: 1px solid #D9D9D9;
+}
+
+.my-custom {
+	border-radius: 10px 2px 10px 10px;
+	border: 1px solid rgba(0, 110, 255, 0.30);
+}
+
+.custom-content-title {
+	font-family: PingFangSC-Medium;
+	width: 278rpx;
+	line-height: 34rpx;
+	font-size: 24rpx;
+	color: #000000;
+	letter-spacing: 0;
+	margin-bottom: 12rpx;
+}
+
+.custom-content-description {
+	font-family: PingFangSC-Regular;
+	width: 278rpx;
+	line-height: 34rpx;
+	font-size: 28rpx;
+	color: #006EFF;
+	letter-spacing: 0;
+	margin-bottom: 12rpx;
+}
+
+.custom-content-price {
+	font-family: PingFangSC-Medium;
+	line-height: 50rpx;
+	color: #FF7201;
+	letter-spacing: 0;
+}
+
+.custom-image {
+	width: 135rpx;
+	height: 135rpx;
+	border-radius: 6rpx;
+	margin-right: 10rpx;
+	margin-top: 4rpx;
+}
+
+.custom-content-score {
+	display: flex;
+	align-items: center;
+	padding-bottom: 12rpx;
+}
+
+.custom-content-score .score-star {
+	width: 36rpx;
+	height: 36rpx;
+	margin-right: 10rpx;
+}
+
+.text-message {
+	display: inline-flex;
+	max-width: 60vw;
+	line-height: 52rpx;
+	padding: 12rpx 24rpx;
+	background: #F8F8F8;
+	border: 1px solid #D9D9D9;
+	border-radius: 2px 10px 10px 10px;
+}
+
+.my-text {
+	border-radius: 10px 2px 10px 10px;
+	border: 1px solid rgba(0, 110, 255, 0.30);
+	background: rgba(0, 110, 255, 0.10);
+}
+
+.message-body-span {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	/*justify-content: flex-start;*/
+	flex-wrap: wrap;
+	outline: none;
+	font-size: 28rpx;
+	color: #333333;
+	position: relative;
+	max-width: 60vw;
+}
+
+.message-body-span-text {
+	width: 100%;
+	display: inline;
+	word-wrap: break-word;
+	word-break: break-all;
+}
+
+.custom-content-text {
+	font-family: PingFangSC-Regular;
+	height: 25px;
+	line-height: 25px;
+	font-size: 28rpx;
+	letter-spacing: 0;
+}

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

@@ -0,0 +1,236 @@
+<template>
+	<view>
+		<view v-if="renderDom[0].type === 'order'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
+			<image class="custom-image" :src="renderDom[0].imageUrl"></image>
+			<view class="custom-content">
+				<view class="custom-content-title">{{ renderDom[0].title }}</view>
+				<view class="custom-content-description">{{ renderDom[0].description }}</view>
+				<view class="custom-content-price">{{ renderDom[0].price }}</view>
+			</view>
+		</view>
+		<view v-if="renderDom[0].type === 'consultion'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
+			<view class="custom-content">
+				<view class="custom-content-title">{{ renderDom[0].title }}</view>
+				<view v-for="(item, index) in renderDom[0].item" :key="index" class="custom-content-description" :id="item.key">{{ item.key }}</view>
+				<view class="custom-content-description">{{ renderDom[0].description }}</view>
+			</view>
+		</view>
+		<view v-if="renderDom[0].type === 'evaluation'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
+			<view class="custom-content">
+				<view class="custom-content-title">{{ renderDom[0].title }}</view>
+				<view class="custom-content-score">
+					<image v-for="(item, index) in renderDom[0].score" :key="index" class="score-star" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/star.png"></image>
+				</view>
+				<view class="custom-content-description">{{ renderDom[0].description }}</view>
+			</view>
+		</view>
+		<view v-if="renderDom[0].type === 'group_create'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
+			<view class="custom-content-text">{{ renderDom[0].text }}</view>
+		</view>
+		<view v-if="renderDom[0].type === 'c2cCalling' || renderDom[0].type === 'groupCalling'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
+			<view class="custom-content-text">{{ renderDom[0].text }}</view>
+		</view>
+		<view v-if="renderDom[0].type === 'notSupport'" class="message-body-span text-message">
+			<view class="message-body-span-text">{{ renderDom[0].text }}</view>
+		</view>
+		<view v-if="renderDom[0].type === 'finish'" :class="'custom-message ' + (isMine ? 'my-custom' : '')">
+			<view class="custom-content-text">{{ renderDom[0].text }}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { formateTime } from '../../../base/common.js';
+export default {
+	data() {
+		return {};
+	},
+	components: {},
+	props: {
+		message: {
+			type: Object,
+			default: () => {}
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					message: newVal,
+					renderDom: this.parseCustom(newVal)
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+	methods: {
+		// 解析音视频通话消息
+		extractCallingInfoFromMessage(message) {
+			const callingmessage = JSON.parse(message.payload.data);
+			if (callingmessage.businessID !== 1) {
+				return '';
+			}
+			const objectData = JSON.parse(callingmessage.data);
+			switch (callingmessage.actionType) {
+				case 1: {
+					if (objectData.call_end >= 0 && !callingmessage.groupID) {
+						return `通话时长:${formateTime(objectData.call_end)}`;
+					}
+					if (callingmessage.groupID) {
+						return '结束群聊';
+					}
+					if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+						return '切换语音通话';
+					}
+					if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+						return '切换视频通话';
+					}
+					return '发起通话';
+				}
+				case 2:
+					return '取消通话';
+				case 3:
+					if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+						return '切换语音通话';
+					}
+					if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+						return '切换视频通话';
+					}
+					return '已接听';
+				case 4:
+					return '拒绝通话';
+				case 5:
+					if (objectData.data && objectData.data.cmd === 'switchToAudio') {
+						return '切换语音通话';
+					}
+					if (objectData.data && objectData.data.cmd === 'switchToVideo') {
+						return '切换视频通话';
+					}
+					return '无应答';
+				default:
+					return '';
+			}
+		},
+		parseCustom(message) {
+			
+			// 约定自定义消息的 data 字段作为区分,不解析的不进行展示
+			if (message.payload.data === 'order') {
+				const extension = JSON.parse(message.payload.extension);
+				const renderDom = [
+					{
+						type: 'order',
+						name: 'custom',
+						title: extension.title || '',
+						imageUrl: extension.imageUrl || '',
+						price: extension.price || 0,
+						description: message.payload.description
+					}
+				];
+				return renderDom;
+			} // 客服咨询
+
+			if (message.payload.data === 'consultion') {
+				const extension = JSON.parse(message.payload.extension);
+				const renderDom = [
+					{
+						type: 'consultion',
+						title: extension.title || '',
+						item: extension.item || 0,
+						description: extension.description
+					}
+				];
+				return renderDom;
+			} // 服务评价
+
+			if (message.payload.data === 'evaluation') {
+				const extension = JSON.parse(message.payload.extension);
+				const renderDom = [
+					{
+						type: 'evaluation',
+						title: message.payload.description,
+						score: extension.score,
+						description: extension.comment
+					}
+				];
+				return renderDom;
+			} // 群消息解析
+			// 群消息解析
+			if (message.payload.data === 'group_create') {
+				const renderDom = [
+					{
+						type: 'group_create',
+						text: message.payload.extension
+					}
+				];
+				return renderDom;
+			}
+			if (message.payload.data === 'finish') {
+				console.log(111)
+				const renderDom = [
+					{
+						type: 'finish',
+						text: message.payload.extension
+					}
+				];
+				return renderDom;
+			}
+			// 音视频通话消息解析
+			const callingmessage = JSON.parse(message.payload.data);
+
+			if (callingmessage.businessID === 1) {
+				if (message.conversationType === 'GROUP') {
+					if (message.payload.data.actionType === 5) {
+						message.nick = message.payload.data.inviteeList ? message.payload.data.inviteeList.join(',') : message.from;
+					}
+					const _text = this.extractCallingInfoFromMessage(message);
+					const groupText = `${_text}`;
+					const renderDom = [
+						{
+							type: 'groupCalling',
+							text: groupText,
+							userIDList: []
+						}
+					];
+					return renderDom;
+				}
+				if (message.conversationType === 'C2C') {
+					const c2cText = this.extractCallingInfoFromMessage(message);
+					const renderDom = [
+						{
+							type: 'c2cCalling',
+							text: c2cText
+						}
+					];
+					return renderDom;
+				}
+			}
+
+			if (message.payload.data === 'group_create') {
+				const renderDom = [
+					{
+						type: 'group_create',
+						text: message.payload.extension
+					}
+				];
+				return renderDom;
+			}
+			
+
+			return [
+				{
+					type: 'notSupport',
+					text: '[自定义消息]'
+				}
+			];
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 20 - 0
components/im/tui-chat/message-elements/emoji/index.css

@@ -0,0 +1,20 @@
+.TUI-Emoji {
+	display: flex;
+	justify-content: flex-start;
+	flex-wrap: wrap;
+	width: 100%;
+	height: 480rpx;
+	margin-left: 4vw;
+	overflow-y: scroll;
+}
+
+.TUI-emoji-image {
+	width: 9vw;
+	height: 9vw;
+	margin: 2vw;
+}
+
+.emoji-image {
+	width: 100%;
+	height: 100%;
+}

+ 48 - 0
components/im/tui-chat/message-elements/emoji/index.vue

@@ -0,0 +1,48 @@
+<template>
+	<view class="TUI-Emoji">
+		<view v-for="(item, index) in emojiList" :key="index" class="TUI-emoji-image">
+			<image :data-name="item.emojiName" class="emoji-image" :src="item.url" @tap="handleEnterEmoji"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+import { emojiName, emojiUrl, emojiMap } from '../../../base/emojiMap';
+
+export default {
+	data() {
+		return {
+			emojiList: []
+		};
+	},
+
+	components: {},
+	props: {},
+
+	beforeMount() {
+		for (let i = 0; i < emojiName.length; i++) {
+			this.emojiList.push({
+				emojiName: emojiName[i],
+				url: emojiUrl + emojiMap[emojiName[i]]
+			});
+		}
+
+		this.setData({
+			emojiList: this.emojiList
+		});
+	},
+
+	methods: {
+		handleEnterEmoji(event) {
+			this.$emit('enterEmoji', {
+				detail: {
+					message: event.currentTarget.dataset.name
+				}
+			});
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 13 - 0
components/im/tui-chat/message-elements/face-message/index.css

@@ -0,0 +1,13 @@
+.TUI-faceMessage {
+  width: 150px;
+  height: 110px;
+  max-width: 60vw;
+}
+.face-message {
+  width: 100%;
+  height: 100%;
+  border-radius: 10px 10px 10px 10px;
+}
+.my-image {
+  border-radius: 10px 2px 10px 10px;
+}

+ 57 - 0
components/im/tui-chat/message-elements/face-message/index.vue

@@ -0,0 +1,57 @@
+<template>
+	<view class="TUI-faceMessage" @tap="previewImage"><image class="face-message" :src="renderDom.src"></image></view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			renderDom: [],
+			percent: 0,
+			faceUrl: 'https://web.sdk.qcloud.com/im/assets/face-elem/'
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					renderDom: this.parseFace(newVal)
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+	methods: {
+		// 解析face 消息
+		parseFace(message) {
+			const renderDom = {
+				src: `${this.faceUrl + message.payload.data}@2x.png`
+			};
+			return renderDom;
+		},
+
+		previewImage() {
+			uni.previewImage({
+				current: this.renderDom[0].src,
+				// 当前显示图片的http链接
+				urls: [this.renderDom[0].src]
+			});
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 65 - 0
components/im/tui-chat/message-elements/file-message/index.css

@@ -0,0 +1,65 @@
+.TUI-fileMessage {
+	display: flex;
+	padding: 10rpx 24rpx;
+	background-color: #fff;
+	border-radius: 2px 10px 10px 10px;
+	border: 1px solid #D9D9D9;
+}
+
+.fileMessage {
+	display: flex;
+}
+
+.fileMessage-box {
+	display: flex;
+	background: white;
+	align-items: center;
+	height: 150rpx;
+}
+
+.file-icon {
+	width: 80rpx;
+	height: 80rpx;
+}
+
+.pop {
+	position: fixed;
+	width: 50%;
+	bottom: 400rpx;
+	margin-left: 90rpx;
+	background: rgba(0, 0, 0, 0.3);
+	z-index: 99999;
+}
+
+.text-box {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	height: 112rpx;
+}
+
+.download-confirm {
+	font-family: PingFangSC-Regular;
+	font-size: 16px;
+	color: #E85454;
+	letter-spacing: 0;
+	text-align: center;
+	line-height: 22px;
+}
+
+.abandon {
+	opacity: 0.8;
+	font-family: PingFangSC-Regular;
+	font-size: 16px;
+	color: #FFFFFF;
+	letter-spacing: 0;
+	text-align: center;
+	line-height: 22px;
+}
+
+.file-title {
+	max-width: 53vw;
+	display: inline;
+	word-wrap: break-word;
+	word-break: break-all;
+}

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

@@ -0,0 +1,83 @@
+<template>
+	<view>
+		<view class="TUI-fileMessage">
+			<view class="fileMessage">
+				<view class="fileMessage-box">
+					<image class="file-icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/file.png"></image>
+					<label @tap="download" class="file-title">{{ filePayload.fileName }}</label>
+				</view>
+			</view>
+		</view>
+		<view class="pop" v-if="Show">
+			<view class="text-box"><text class="download-confirm" @tap.stop="downloadConfirm">下载</text></view>
+			<view class="text-box"><text class="abandon" @tap="cancel">取消</text></view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			Show: false,
+			filePayload: {}
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object,
+			default: () => {}
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					filePayload: newVal.payload
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+	methods: {
+		download() {
+			this.setData({
+				Show: true
+			});
+		},
+
+		downloadConfirm() {
+			uni.downloadFile({
+				url: this.filePayload.fileUrl,
+
+				success(res) {
+					const filePath = res.tempFilePath;
+					uni.openDocument({
+						filePath,
+
+						success() {
+							console.log('打开文档成功');
+						}
+					});
+				}
+			});
+		},
+
+		cancel() {
+			this.setData({
+				Show: false
+			});
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 13 - 0
components/im/tui-chat/message-elements/image-message/index.css

@@ -0,0 +1,13 @@
+.TUI-ImageMessage {
+	width: 150px;
+}
+
+.image-message {
+	width: 100%;
+	height: 100%;
+	border-radius: 10px 10px 10px 10px;
+}
+
+.my-image {
+	border-radius: 10px 2px 10px 10px;
+}

+ 54 - 0
components/im/tui-chat/message-elements/image-message/index.vue

@@ -0,0 +1,54 @@
+<template>
+	<view class="TUI-ImageMessage" @tap="previewImage">
+		<image :class="'image-message ' + (isMine ? 'my-image' : '')" mode="widthFix" :src="renderDom[0].src"></image>
+	</view>
+</template>
+
+<script>
+import { parseImage } from '../../../base/message-facade';
+
+export default {
+	data() {
+		return {
+			renderDom: [],
+			percent: 0
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object,
+			default: ''
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					renderDom: parseImage(newVal),
+					percent: newVal.percent
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+	methods: {
+		previewImage() {
+			uni.previewImage({
+				current: this.renderDom[0].src,
+				// 当前显示图片的http链接
+				urls: [this.renderDom[0].src]
+			});
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 29 - 0
components/im/tui-chat/message-elements/system-message/index.css

@@ -0,0 +1,29 @@
+.container {
+	width: 100%;
+	height: 200rpx;
+}
+
+.handle {
+	display: flex;
+	justify-content: space-between;
+}
+
+.card {
+	font-size: 14px;
+	margin: 20px;
+	padding: 20px;
+	box-sizing: border-box;
+	border: 1px solid #abdcff;
+	background-color: #f0faff;
+	border-radius: 12px;
+}
+
+.time {}
+
+.button {
+	color: blue;
+	border-radius: 8px;
+	line-height: 30px;
+	font-size: 16px;
+	width: 70px;
+}

+ 86 - 0
components/im/tui-chat/message-elements/system-message/index.vue

@@ -0,0 +1,86 @@
+<template>
+	<view>
+		<view v-if="message.payload.operationType === 1" class="card handle">
+			<view>
+				<view class="time">{{ messageTime }}</view>
+				{{ renderDom }}
+			</view>
+			<view class="choose"><view class="button" @tap="handleClick">处理</view></view>
+		</view>
+		<view class="card" v-else>
+			<view class="time">{{ messageTime }}</view>
+			{{ renderDom }}
+		</view>
+	</view>
+</template>
+
+<script>
+import { parseGroupSystemNotice } from '../../../base/message-facade';
+import { caculateTimeago } from '../../../base/common';
+
+export default {
+	data() {
+		return {
+			// message: {},
+			messageTime: '',
+			renderDom: ''
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					messageTime: caculateTimeago(newVal.time * 1000),
+					renderDom: parseGroupSystemNotice(newVal)
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+
+	methods: {
+		handleClick() {
+			uni.showActionSheet({
+				itemList: ['同意', '拒绝'],
+				success: res => {
+					const option = {
+						handleAction: 'Agree',
+						handleMessage: '欢迎进群',
+						message: this.message
+					};
+
+					if (res.tapIndex === 1) {
+						option.handleAction = 'Reject';
+						option.handleMessage = '拒绝申请';
+					}
+
+					uni.$TUIKit
+						.handleGroupApplication(option)
+						.then(() => {
+							uni.showToast({
+								title: option.handleAction === 'Agree' ? '已同意申请' : '已拒绝申请'
+							});
+						})
+						.catch(error => {
+							uni.showToast({
+								title: error.message || '处理失败',
+								icon: 'none'
+							});
+						});
+				}
+			});
+		}
+	}
+};
+</script>
+<style scoped>
+@import './index.css';
+</style>

+ 47 - 0
components/im/tui-chat/message-elements/text-message/index.css

@@ -0,0 +1,47 @@
+.text-message {
+	display: inline-flex;
+	max-width: 60vw;
+	line-height: 52rpx;
+	padding: 12rpx 24rpx;
+	background: #F8F8F8;
+	border: 1px solid #D9D9D9;
+	border-radius: 2px 10px 10px 10px;
+}
+
+.my-text {
+	border-radius: 10px 2px 10px 10px;
+	border: 1px solid rgba(0, 110, 255, 0.30);
+	background: rgba(0, 110, 255, 0.10);
+}
+
+.message-body-span {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	/*justify-content: flex-start;*/
+	flex-wrap: wrap;
+	outline: none;
+	font-size: 28rpx;
+	color: #333333;
+	position: relative;
+	max-width: 60vw;
+}
+
+.message-body-span-text {
+	width: 100%;
+	display: inline;
+	word-wrap: break-word;
+	word-break: break-all;
+}
+
+.message-body-span-image {
+	display: inline-block;
+	width: 32rpx;
+	height: 32rpx;
+	margin: 0 4rpx;
+}
+
+.emoji-icon {
+	width: 20px;
+	height: 20px;
+}

+ 55 - 0
components/im/tui-chat/message-elements/text-message/index.vue

@@ -0,0 +1,55 @@
+<template>
+	<view :class="'text-message ' + (isMine ? 'my-text' : '')">
+		<view v-for="(item, index) in renderDom" :key="index" class="message-body-span">
+			<span class="message-body-span-text" v-if="item.name === 'span'">{{ item.text }}</span>
+			<image v-if="item.name === 'img'" class="emoji-icon" :src="item.src"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+import { parseText } from '../../../base/message-facade';
+
+export default {
+	data() {
+		return {
+			renderDom: []
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					renderDom: parseText(newVal)
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+
+	beforeMount() {
+		// 在组件实例进入页面节点树时执行
+	},
+
+	destroyed() {
+		// 在组件实例被从页面节点树移除时执行
+	},
+
+	methods: {}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 9 - 0
components/im/tui-chat/message-elements/tip-message/index.css

@@ -0,0 +1,9 @@
+.tip-message {
+	width: 100%;
+}
+
+.text-message {
+	text-align: center;
+	font-size: 12px;
+	color: #999999;
+}

+ 46 - 0
components/im/tui-chat/message-elements/tip-message/index.vue

@@ -0,0 +1,46 @@
+<template>
+	<view class="tip-message">
+		<view class="text-message">{{ renderDom[0].text }}</view>
+	</view>
+</template>
+
+<script>
+import { parseGroupTip } from '../../../base/message-facade';
+
+export default {
+	data() {
+		return {};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.setData({
+					renderDom: parseGroupTip(newVal)
+				});
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+
+	beforeMount() {
+		// 在组件实例进入页面节点树时执行
+	},
+
+	destroyed() {
+		// 在组件实例被从页面节点树移除时执行
+	},
+
+	methods: {}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 27 - 0
components/im/tui-chat/message-elements/video-message/index.css

@@ -0,0 +1,27 @@
+.video-message {}
+
+.video-box {
+	width: 160px;
+	height: 120px;
+	background-color: rgba(0, 0, 0, 0.2);
+	border-radius: 10px 2px 10px 10px;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+.my-video {
+	border-radius: 10px 2px 10px 10px;
+}
+
+.icon {
+	position: absolute;
+	bottom: 30px;
+	right: 30px;
+}
+
+.video-icon {
+	display: block;
+	width: 32px;
+	height: 32px;
+}

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

@@ -0,0 +1,53 @@
+<template>
+	<view :class="'video-box ' + (isMine ? 'my-video' : '')" @click="playerHander">
+		<image class="video-icon" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/video-play.png"></image>
+	</view>
+</template>
+
+<script>
+import videoIcon from 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/video-play.png';
+export default {
+	data() {
+		return {
+			isPlay: false,
+			videoIcon: videoIcon
+		};
+	},
+
+	components: {},
+	props: {
+		message: {
+			type: Object,
+			default: () => {}
+		},
+		isMine: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		message: {
+			handler: function(newVal) {
+				this.message=newVal
+				 
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+	methods: {
+		playerHander() {
+			uni.$emit('videoPlayerHandler', {
+				isPlay: true,
+				message: this.message
+			});
+		},
+		stopHander() {
+			this.isPlay = false;
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 156 - 0
components/im/tui-chat/message-input/index.css

@@ -0,0 +1,156 @@
+.TUI-message-input-container {
+	background-color: #F1F1F1;
+	padding-bottom: 20rpx;
+}
+
+.TUI-message-input {
+	display: flex;
+	padding-bottom: 16rpx;
+	background-color: #F1F1F1;
+	width: 100vw;
+}
+
+.TUI-commom-function {
+	display: flex;
+	flex-wrap: nowrap;
+	width: 750rpx;
+	height: 106rpx;
+	background-color: #F1F1F1;
+	align-items: center;
+}
+
+.TUI-commom-function-item {
+	display: flex;
+	width: 136rpx;
+	justify-content: center;
+	align-items: center;
+	font-size: 24rpx;
+	color: #FFFFFF;
+	height: 48rpx;
+	margin-left: 16rpx;
+	border-radius: 24rpx;
+	background-color: #2BC7B9;
+}
+
+.TUI-commom-function-item:first-child {
+	margin-left: 48rpx;
+}
+
+.TUI-message-input-functions {
+	display: flex;
+	align-items: center;
+}
+
+.TUI-message-input-main {
+	background-color: #fff;
+	flex: 1;
+	height: 66rpx;
+	margin: 0 10rpx;
+	padding: 0 5rpx;
+	border-radius: 5rpx;
+	display: flex;
+	align-items: center;
+}
+
+.TUI-message-input-area {
+	width: 100%;
+	height: 100%;
+}
+
+.TUI-icon {
+	width: 56rpx;
+	height: 56rpx;
+	margin: 0 16rpx;
+}
+
+.TUI-Extensions {
+	display: flex;
+	flex-wrap: wrap;
+	width: 100vw;
+	height: 450rpx;
+	margin-left: 14rpx;
+	margin-right: 14rpx;
+}
+
+.TUI-Extension-slot {
+	width: 128rpx;
+	height: 170rpx;
+	margin-left: 26rpx;
+	margin-right: 26rpx;
+	margin-top: 24rpx;
+}
+
+.TUI-Extension-icon {
+	width: 128rpx;
+	height: 128rpx;
+}
+
+.TUI-sendMessage-btn {
+	display: flex;
+	align-items: center;
+	margin: 0 10rpx;
+}
+
+.TUI-Emoji-area {
+	width: 100vw;
+	height: 450rpx;
+}
+
+.TUI-Extension-slot-name {
+	line-height: 34rpx;
+	font-size: 24rpx;
+	color: #333333;
+	letter-spacing: 0;
+	text-align: center;
+}
+
+.record-modal {
+	height: 300rpx;
+	width: 60vw;
+	background-color: #000;
+	opacity: 0.8;
+	position: fixed;
+	top: 670rpx;
+	z-index: 9999;
+	left: 20vw;
+	border-radius: 24rpx;
+	display: flex;
+	flex-direction: column;
+}
+
+.record-modal .wrapper {
+	display: flex;
+	height: 200rpx;
+	box-sizing: border-box;
+	padding: 10vw;
+}
+
+.record-modal .wrapper .modal-loading {
+	opacity: 1;
+	width: 40rpx;
+	height: 16rpx;
+	border-radius: 4rpx;
+	background-color: #006fff;
+	animation: loading 2s cubic-bezier(0.17, 0.37, 0.43, 0.67) infinite;
+}
+
+.modal-title {
+	text-align: center;
+	color: #fff;
+}
+
+@keyframes loading {
+	0% {
+		transform: translate(0, 0)
+	}
+
+	50% {
+		transform: translate(30vw, 0);
+		background-color: #f5634a;
+		width: 40px;
+	}
+
+	100% {
+		transform: translate(0, 0);
+	}
+}

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

@@ -0,0 +1,566 @@
+<template>
+	<view>
+		<view class="TUI-message-input-container">
+			<view class="TUI-commom-function">
+				<view v-for="(item, index) in commonFunction" :key="index" class="TUI-commom-function-item" :data-function="item" @tap="handleCommonFunctions">
+					{{ item.name }}
+				</view>
+			</view>
+			<view class="TUI-message-input">
+				<image class="TUI-icon" @tap="switchAudio" :src="isAudio ? '/static/assets/keyboard.svg' : '/static/assets/audio.svg'"></image>
+				<view v-if="!isAudio" class="TUI-message-input-main">
+					<input
+						class="TUI-message-input-area"
+						:adjust-position="true"
+						cursor-spacing="20"
+						v-model="inputText"
+						@input="onInputValueChange"
+						maxlength="140"
+						type="text"
+						placeholder-class="input-placeholder"
+						placeholder="请输入内容"
+						@focus="inputBindFocus"
+						@blur="inputBindBlur"
+					/>
+				</view>
+				<view
+					v-else
+					class="TUI-message-input-main"
+					@longpress="handleLongPress"
+					@touchmove="handleTouchMove"
+					@touchend="handleTouchEnd"
+					style="display: flex; justify-content: center; font-size: 32rpx; font-family: PingFangSC-Regular;"
+				>
+					<text>{{ text }}</text>
+				</view>
+				<view class="TUI-message-input-functions" hover-class="none">
+					<image class="TUI-icon" @tap="handleEmoji" src="/static/assets/face-emoji.svg"></image>
+					<view v-if="!sendMessageBtn" @tap="handleExtensions"><image class="TUI-icon" src="/static/assets/more.svg"></image></view>
+					<view v-else class="TUI-sendMessage-btn" @tap="sendTextMessage">发送</view>
+				</view>
+			</view>
+			<view v-if="displayFlag === 'emoji'" class="TUI-Emoji-area"><TUI-Emoji @enterEmoji="appendMessage"></TUI-Emoji></view>
+			<view v-if="displayFlag === 'extension'" class="TUI-Extensions">
+				<!-- TODO: 这里功能还没实现 -->
+				<!--        <camera device-position="back" flash="off" binderror="error" style="width: 100%; height: 300px;"></camera>-->
+				<view class="TUI-Extension-slot" @tap="handleSendPicture">
+					<image class="TUI-Extension-icon" src="/static/assets/take-photo.svg"></image>
+					<view class="TUI-Extension-slot-name">拍摄照片</view>
+				</view>
+				<view class="TUI-Extension-slot" @tap="handleSendImage">
+					<image class="TUI-Extension-icon" src="/static/assets/send-img.svg"></image>
+					<view class="TUI-Extension-slot-name">发送图片</view>
+				</view>
+				<view class="TUI-Extension-slot" @tap="handleShootVideo">
+					<image class="TUI-Extension-icon" src="/static/assets/take-video.svg"></image>
+					<view class="TUI-Extension-slot-name">拍摄视频</view>
+				</view>
+				<view class="TUI-Extension-slot" @tap="handleSendVideo">
+					<image class="TUI-Extension-icon" src="/static/assets/send-video.svg"></image>
+					<view class="TUI-Extension-slot-name">发送视频</view>
+				</view>
+				<view class="TUI-Extension-slot" @tap="handleServiceEvaluation">
+					<image class="TUI-Extension-icon" src="/static/assets/service-assess.svg"></image>
+					<view class="TUI-Extension-slot-name">服务评价</view>
+				</view>
+				<!-- <view class="TUI-Extension-slot" @tap="handleSendOrder">
+					<image class="TUI-Extension-icon" src="/static/assets/send-order.svg"></image>
+					<view class="TUI-Extension-slot-name">发送订单</view>
+				</view> -->
+			</view>
+			<TUI-Common-Words class="tui-cards" :display="displayCommonWords" @sendMessage="$handleSendTextMessage" @close="$handleCloseCards"></TUI-Common-Words>
+			<TUI-Order-List class="tui-cards" :display="displayOrderList" @sendCustomMessage="$handleSendCustomMessage" @close="$handleCloseCards"></TUI-Order-List>
+			<TUI-Service-Evaluation
+				class="tui-cards"
+				:display="displayServiceEvaluation"
+				@sendCustomMessage="$handleSendCustomMessage"
+				@close="$handleCloseCards"
+			></TUI-Service-Evaluation>
+		</view>
+		<view class="record-modal" v-if="popupToggle" @longpress="handleLongPress" @touchmove="handleTouchMove" @touchend="handleTouchEnd">
+			<view class="wrapper"><view class="modal-loading"></view></view>
+			<view class="modal-title">{{ title }}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import TUIEmoji from '../message-elements/emoji/index';
+import TUICommonWords from '../message-private/common-words/index';
+import TUIOrderList from '../message-private/order-list/index';
+import TUIServiceEvaluation from '../message-private/service-evaluation/index';
+
+export default {
+	data() {
+		return {
+			 
+			firstSendMessage: true,
+			inputText: '',
+			extensionArea: false,
+			sendMessageBtn: false,
+			displayFlag: '',
+			isAudio: false,
+			bottomVal: 0,
+			startPoint: 0,
+			popupToggle: false,
+			isRecording: false,
+			canSend: true,
+			text: '按住说话',
+			title: ' ',
+			notShow: false,
+			isShow: true,
+			recordTime: 0,
+			recordTimer: null,
+			commonFunction: [
+				{
+					name: '常用语',
+					key: '0'
+				},
+				// {
+				// 	name: '发送订单',
+				// 	key: '1'
+				// },
+				{
+					name: '服务评价',
+					key: '2'
+				}
+			],
+			displayServiceEvaluation: false,
+			displayCommonWords: false,
+			displayOrderList: false
+		};
+	},
+	components: {
+		TUIEmoji,
+		TUICommonWords,
+		TUIOrderList,
+		TUIServiceEvaluation
+	},
+	props: {
+		conversation: {
+			type: Object,
+			default: () => {}
+		},
+		toUser: {
+			type: String,
+			default: () => {}
+		}
+	},
+	watch: {
+		conversation: {
+			handler: function(newVal) {
+				// todo 值会被改变
+				// this.setData({
+				//   conversation: newVal
+				// });
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+
+	beforeMount() {
+		var that=this;
+		// 加载声音录制管理器
+		this.recorderManager = uni.getRecorderManager();
+		this.recorderManager.onStop(res => {
+			clearInterval(this.recordTimer);
+			// 兼容 uniapp 打包app,duration 和 fileSize 需要用户自己补充
+			// 文件大小 = (音频码率) x 时间长度(单位:秒) / 8
+			let msg = {
+				duration: res.duration ? res.duration : this.recordTime * 1000,
+				tempFilePath: res.tempFilePath,
+				fileSize: res.fileSize ? res.fileSize : ((48 * this.recordTime) / 8) * 1024
+			};
+			uni.hideLoading();
+			// 兼容 uniapp 语音消息没有duration
+			if (this.canSend) {
+				if (msg.duration < 1000) {
+					uni.showToast({
+						title: '录音时间太短',
+						icon: 'none'
+					});
+				} else {
+					var orderId=uni.getStorageSync('orderId');
+					// res.tempFilePath 存储录音文件的临时路径
+					const message = uni.$TUIKit.createAudioMessage({
+						to: this.getToAccount(),
+						conversationType: this.conversation.type,
+						payload: {
+							file: msg
+						},
+						cloudCustomData: 'orderId='+orderId
+					});
+					this.$sendTIMMessage(message);
+				}
+			}
+
+			that.setData({
+				startPoint: 0,
+				popupToggle: false,
+				isRecording: false,
+				canSend: true,
+				title: ' ',
+				text: '按住说话'
+			});
+		});
+	},
+
+	methods: {
+		switchAudio() {
+			this.isAudio= !this.isAudio;
+			this.text='按住说话';
+			
+		},
+		handleLongPress(e) {
+			this.recorderManager.start({
+				duration: 60000,
+				// 录音的时长,单位 ms,最大值 600000(10 分钟)
+				sampleRate: 44100,
+				// 采样率
+				numberOfChannels: 1,
+				// 录音通道数
+				encodeBitRate: 192000,
+				// 编码码率
+				format: 'aac' // 音频格式,选择此格式创建的音频消息,可以在即时通信 IM 全平台(Android、iOS、微信小程序和Web)互通
+			});
+			this.setData({
+				startPoint: e.touches[0],
+				title: '正在录音',
+				// isRecording : true,
+				// canSend: true,
+				notShow: true,
+				isShow: false,
+				isRecording: true,
+				popupToggle: true,
+				recordTime: 0
+			});
+			this.recordTimer = setInterval(() => {
+				this.recordTime++;
+			}, 1000);
+		},
+
+		// 录音时的手势上划移动距离对应文案变化
+		handleTouchMove(e) {
+			if (this.isRecording) {
+				if (this.startPoint.clientY - e.touches[e.touches.length - 1].clientY > 100) {
+					this.setData({
+						text: '抬起停止',
+						title: '松开手指,取消发送',
+						canSend: false
+					});
+				} else if (this.startPoint.clientY - e.touches[e.touches.length - 1].clientY > 20) {
+					this.setData({
+						text: '抬起停止',
+						title: '上划可取消',
+						canSend: true
+					});
+				} else {
+					this.setData({
+						text: '抬起停止',
+						title: '正在录音',
+						canSend: true
+					});
+				}
+			}
+		},
+
+		// 手指离开页面滑动
+		handleTouchEnd() {
+			this.setData({
+				isRecording: false,
+				popupToggle: false
+			});
+			uni.hideLoading();
+			this.recorderManager.stop();
+		},
+		handleEmoji() {
+			let targetFlag = 'emoji';
+
+			if (this.displayFlag === 'emoji') {
+				targetFlag = '';
+			}
+			this.displayFlag=targetFlag;
+			 
+		},
+
+		handleExtensions() {
+			let targetFlag = 'extension';
+
+			if (this.displayFlag === 'extension') {
+				targetFlag = '';
+			}
+			this.displayFlag=targetFlag;
+		},
+
+		error(e) {
+			console.log(e.detail);
+		},
+
+		handleSendPicture() {
+			this.sendImageMessage('camera');
+		},
+
+		handleSendImage() {
+			this.sendImageMessage('album');
+		},
+
+		sendImageMessage(type) {
+		
+			uni.chooseImage({
+				sourceType: [type],
+				count: 1,
+				success: res => {
+					if (res) {
+						var orderId=uni.getStorageSync('orderId');
+						const message = uni.$TUIKit.createImageMessage({
+							to: this.getToAccount(),
+							conversationType: this.conversation.type,
+							payload: {
+								file: res
+							},
+							cloudCustomData: 'orderId='+orderId,
+							onProgress: percent => {
+								message.percent = percent;
+							}
+						});
+						this.$sendTIMMessage(message);
+					}
+				}
+			});
+		},
+
+		handleShootVideo() {
+			this.sendVideoMessage('camera');
+		},
+
+		handleSendVideo() {
+			this.sendVideoMessage('album');
+		},
+
+		sendVideoMessage(type) {
+			uni.chooseVideo({
+				sourceType: [type],
+				// 来源相册或者拍摄
+				maxDuration: 60,
+				// 设置最长时间60s
+				camera: 'back',
+				// 后置摄像头
+				success: res => {
+					if (res) {
+						var orderId=uni.getStorageSync('orderId');
+						const message = uni.$TUIKit.createVideoMessage({
+							to: this.getToAccount(),
+							conversationType: this.conversation.type,
+							payload: {
+								file: res
+							},
+							cloudCustomData: 'orderId='+orderId,
+							onProgress: percent => {
+								message.percent = percent;
+							}
+						});
+						this.$sendTIMMessage(message);
+					}
+				}
+			});
+		},
+
+		handleCommonFunctions(e) {
+			switch (e.target.dataset.function.key) {
+				case '0':
+					this.setData({
+						displayCommonWords: true
+					});
+					break;
+
+				// case '1':
+				// 	this.setData({
+				// 		displayOrderList: true
+				// 	});
+				// 	break;
+
+				case '2':
+					this.setData({
+						displayServiceEvaluation: true
+					});
+					break;
+
+				default:
+					break;
+			}
+		},
+
+		handleSendOrder() {
+			this.setData({
+				displayOrderList: true
+			});
+		},
+
+		appendMessage(e) {
+			this.setData({
+				inputText: this.inputText + e.detail.message,
+				sendMessageBtn: true
+			});
+		},
+
+		getToAccount() {
+			return this.toUser;
+		},
+		handleCalling(value) {
+			// todo 目前支持单聊
+			if (this.conversation.type === 'GROUP') {
+				uni.showToast({
+					title: '群聊暂不支持',
+					icon: 'none'
+				});
+				return;
+			}
+			const { userID } = this.conversation.userProfile;
+
+			// #ifdef APP-PLUS
+			if(typeof(uni.$TUICalling) === 'undefined') {
+					logger.error('请使用真机运行并且自定义基座调试,可能影响音视频功能~ 插件地址:https://ext.dcloud.net.cn/plugin?id=7097 , 调试地址:https://nativesupport.dcloud.net.cn/NativePlugin/use/use');
+					uni.showToast({
+						title: '请使用真机运行并且自定义基座调试,可能影响音视频功能~ ',
+						icon: 'none',
+						duration: 3000
+					});
+			} else {
+				uni.$TUICalling.call(
+					{
+						userID: userID,
+						type: value
+					},
+					res => {
+						console.log(JSON.stringify(res));
+					}
+				);
+			}
+			// #endif
+			// #ifdef MP-WEIXIN
+			uni.showToast({
+				title: '微信小程序暂不支持',
+				icon: 'none'
+			});
+			// uni.$wxTUICalling.call({userID, type: value})
+			// #endif
+		},
+		sendTextMessage(msg, flag) {
+			var orderId=uni.getStorageSync('orderId');
+			 console.log(this.conversation.type)
+			const to = this.getToAccount();
+			const text = flag ? msg : this.inputText;
+			const message = uni.$TUIKit.createTextMessage({
+				to,
+				conversationType: this.conversation.type,
+				payload: {
+					text:text
+				},
+				cloudCustomData: 'orderId='+orderId
+			});
+			this.setData({
+				inputText: '',
+				sendMessageBtn: false
+			});
+			this.$sendTIMMessage(message);
+		},
+
+		onInputValueChange(event) {
+			if (event.detail.value) {
+				this.setData({
+					sendMessageBtn: true
+				});
+			} else {
+				this.setData({
+					sendMessageBtn: false
+				});
+			}
+		},
+
+		$handleSendTextMessage(event) {
+			this.sendTextMessage(event.detail.message, true);
+			this.setData({
+				displayCommonWords: false
+			});
+		},
+
+		$handleSendCustomMessage(e) {
+			var orderId=uni.getStorageSync('orderId');
+			const message = uni.$TUIKit.createCustomMessage({
+				to: this.getToAccount(),
+				conversationType: this.conversation.type,
+				payload: e.detail.payload,
+				cloudCustomData: 'orderId='+orderId
+			});
+			this.$sendTIMMessage(message);
+			this.setData({
+				displayOrderList: false
+			});
+		},
+
+		$handleCloseCards(e) {
+			switch (e.detail.key) {
+				case '0':
+					this.setData({
+						displayCommonWords: false
+					});
+					break;
+
+				case '1':
+					this.setData({
+						displayOrderList: false
+					});
+					break;
+
+				case '2':
+					this.setData({
+						displayServiceEvaluation: false
+					});
+					break;
+
+				default:
+					break;
+			}
+		},
+		$sendTIMMessage(message) {
+			this.$emit('sendMessage', {
+				detail: {
+					message
+				}
+			});
+			uni.$TUIKit.sendMessage(message).then((res) => {
+				this.firstSendMessage = false
+			}).catch((error) => {
+				 
+			})
+			this.setData({
+				displayFlag: ''
+			});
+		},
+
+		handleClose() {
+			this.setData({
+				displayFlag: ''
+			});
+		},
+
+		handleServiceEvaluation() {
+			this.setData({
+				displayServiceEvaluation: true
+			});
+		},
+
+		inputBindFocus() {
+			console.log('占位:函数 inputBindFocus 未声明');
+		},
+
+		inputBindBlur() {
+			console.log('占位:函数 inputBindBlur 未声明');
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 70 - 0
components/im/tui-chat/message-list/index.css

@@ -0,0 +1,70 @@
+.message-list-container {
+	width: 100%;
+	height: 100%;
+}
+
+.t-message-item {
+	/*max-width: 60vw;*/
+	padding: 16rpx 0;
+}
+
+.t-recieve-message {
+	display: flex;
+	flex-direction: row;
+	justify-items: flex-start;
+	align-items: center;
+	width: 100vw;
+}
+
+.t-message-avatar {
+	margin-left: 20rpx;
+	margin-right: 12rpx;
+	border-radius: 10rpx;
+	width: 80rpx;
+	height: 80rpx;
+}
+
+.t-self-message {
+	display: flex;
+	flex-direction: row;
+	justify-content: flex-end;
+	/*align-items: center;*/
+	width: 100vw;
+}
+
+.t-self-message-body {
+	display: flex;
+	justify-content: flex-start;
+	flex-wrap: wrap;
+	outline: none;
+}
+
+.t-recieve-message-body {
+	display: flex;
+	justify-content: flex-start;
+	flex-wrap: wrap;
+	outline: none;
+	/*background: #F8F8F8;*/
+	border-radius: 2px 10px 10px 10px;
+	margin-left: 8rpx;
+
+}
+
+.read-receipts {
+	line-height: 42px;
+	height: 42px;
+	font-size: 12px;
+	color: #6e7981;
+	margin-right: 10px
+}
+
+.no-message {
+	text-align: center;
+	position: fixed;
+	width: 100%;
+	font-size: 12px;
+	color: #a5b5c1;
+	height: 40px;
+	top: -40px;
+	right: 0;
+}

+ 195 - 0
components/im/tui-chat/message-list/index.vue

@@ -0,0 +1,195 @@
+<template>
+	<scroll-view
+		class="message-list-container"
+		scroll-y="true"
+		:scroll-into-view="scrollView"
+		:refresher-enabled="true"
+		@refresherrefresh="refresh"
+		:scroll-top="scrollTop"
+		:refresher-triggered="triggered"
+	>
+		<view id="message-scroll" style="width:100%">
+			<view class="no-message" v-if="isCompleted">没有更多啦</view>
+			<view v-for="item in messageList" :key="item.ID" class="t-message">
+				<view v-if="conversation.type !== '@TIM#SYSTEM'" :id="item.ID">
+					<view class="t-message-item">
+						<TUI-TipMessage v-if="item.type === 'TIMGroupTipElem'" :message="item"></TUI-TipMessage>
+						<view v-if="item.type !== 'TIMGroupTipElem'" :class="item.flow === 'out' ? 't-self-message' : 't-recieve-message'">
+							<image
+								class="t-message-avatar"
+								v-if="item.flow === 'in'"
+								:src="item.avatar || 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/avatar_21.png'"
+							></image>
+							<view class="read-receipts" v-if="conversation.type === 'C2C' && item.flow === 'out'">
+								<view v-if="item.isPeerRead">已读</view>
+								<view v-else>未读</view>
+							</view>
+							<view>
+								<TUI-TextMessage v-if="item.type === 'TIMTextElem'" :message="item" :isMine="item.flow === 'out'"></TUI-TextMessage>
+								<TUI-ImageMessage v-if="item.type === 'TIMImageElem'" :message="item" :isMine="item.flow === 'out'"></TUI-ImageMessage>
+								<TUI-VideoMessage v-if="item.type === 'TIMVideoFileElem'" :message="item" :isMine="item.flow === 'out'"></TUI-VideoMessage>
+								<TUI-AudioMessage v-if="item.type === 'TIMSoundElem'" :message="item" :isMine="item.flow === 'out'"></TUI-AudioMessage>
+								<TUI-CustomMessage v-if="item.type === 'TIMCustomElem'" :message="item" :isMine="item.flow === 'out'"></TUI-CustomMessage>
+								<TUI-FaceMessage v-if="item.type === 'TIMFaceElem'" :message="item" :isMine="item.flow === 'out'"></TUI-FaceMessage>
+								<TUI-FileMessage v-if="item.type === 'TIMFileElem'" :message="item" :isMine="item.flow === 'out'"></TUI-FileMessage>
+							</view>
+							<image
+								class="t-message-avatar"
+								v-if="item.flow === 'out'"
+								:src="item.avatar || 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/avatar_21.png'"
+							></image>
+						</view>
+					</view>
+				</view>
+				<view v-else :id="item.ID" :data-value="item.ID"><TUI-SystemMessage :message="item"></TUI-SystemMessage></view>
+			</view>
+		</view>
+	</scroll-view>
+</template>
+
+<script>
+import TUITextMessage from '../message-elements/text-message/index';
+import TUIImageMessage from '../message-elements/image-message/index';
+import TUIVideoMessage from '../message-elements/video-message/index';
+import TUIAudioMessage from '../message-elements/audio-message/index';
+import TUICustomMessage from '../message-elements/custom-message/index';
+import TUITipMessage from '../message-elements/tip-message/index';
+import TUISystemMessage from '../message-elements/system-message/index';
+import TUIFaceMessage from '../message-elements/face-message/index';
+import TUIFileMessage from '../message-elements/file-message/index';
+
+export default {
+	data() {
+		return {
+			conversation:null,
+			// 当前会话
+			messageList: [],
+			// 自己的 ID 用于区分历史消息中,哪部分是自己发出的
+			scrollView: '',
+			scrollTop: 0,
+			triggered: true,
+			nextReqMessageID: '',
+			// 下一条消息标志
+			isCompleted: false // 当前会话消息是否已经请求完毕
+		};
+	},
+
+	components: {
+		TUITextMessage,
+		TUIImageMessage,
+		TUIVideoMessage,
+		TUIAudioMessage,
+		TUICustomMessage,
+		TUITipMessage,
+		TUISystemMessage,
+		TUIFaceMessage,
+		TUIFileMessage
+	},
+	mounted() {
+		uni.$TUIKit.on(uni.$TUIKitEvent.MESSAGE_RECEIVED, this.$onMessageReceived, this);
+		uni.$TUIKit.on(uni.$TUIKitEvent.MESSAGE_READ_BY_PEER, this.$onMessageReadByPeer, this);
+		
+	},
+	destroyed() {
+		// 一定要解除相关的事件绑定
+		uni.$TUIKit.off(uni.$TUIKitEvent.MESSAGE_RECEIVED, this.$onMessageReceived);
+	},
+	methods: {
+		refresh() {
+			if (this.isCompleted) {
+				this.setData({
+					isCompleted: true,
+					triggered: false
+				});
+				return;
+			}
+			this.getMessageList(this.conversation);
+			setTimeout(() => {
+				this.setData({
+					triggered: false
+				});
+			}, 2000);
+		},
+		getMessageList(conversation) {
+			this.conversation=conversation
+			var that=this;
+			if (!this.isCompleted) {
+				uni.$TUIKit
+					.getMessageList({
+						conversationID: that.conversation.conversationID,
+						nextReqMessageID: that.nextReqMessageID,
+						count: 15
+					})
+					.then(res => {
+						const { messageList } = res.data; // 消息列表。
+						this.nextReqMessageID = res.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。
+						this.isCompleted = res.data.isCompleted; // 表示是否已经拉完所有消息。
+						this.messageList = [...messageList, ...this.messageList];
+						this.$handleMessageRender(this.messageList, messageList);
+					});
+			}
+		},
+
+		// 自己的消息上屏
+		updateMessageList(msg) {
+			this.messageList = [...this.messageList, msg];
+			this.scrollToButtom();
+		},
+
+		// 消息已读更新
+		$onMessageReadByPeer() {
+			this.setData({
+				messageList: this.messageList
+			});
+		},
+		scrollToButtom() {
+			const query = uni.createSelectorQuery().in(this);
+			let nodesRef = query.select('#message-scroll');
+			nodesRef
+				.boundingClientRect(res => {
+					this.$nextTick(() => {
+						//进入页面滚动到底部
+						this.scrollTop = res.height;
+					});
+				})
+				.exec();
+		},
+		// 收到的消息
+		$onMessageReceived(value) {
+			console.log(value)
+			// 若需修改消息,需将内存的消息复制一份,不能直接更改消息,防止修复内存消息,导致其他消息监听处发生消息错误
+			const event = value;
+			const list = [];
+			event.data.forEach(item => {
+				if (item.conversationID === this.conversation.conversationID) {
+					list.push(Object.assign(item));
+					if(item.type=="TIMCustomElem"&&item.payload.data=='finish'){
+						this.$emit("finish");
+					}
+				}
+			});
+			this.messageList = this.messageList.concat(list);
+			this.scrollToButtom();
+		},
+
+		// 历史消息渲染
+		$handleMessageRender(messageList) {
+			if (messageList.length > 0) {
+				this.setData(
+					{
+						messageList
+					},
+					() => {}
+				);
+				this.$nextTick(() => {
+					//进入页面滚动到底部
+					this.scrollTop = 9999;
+				});
+			}
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 86 - 0
components/im/tui-chat/message-private/common-words/index.css

@@ -0,0 +1,86 @@
+.tui-common-words-container {
+	position: fixed;
+	width: 100vw;
+	height: 100vh;
+	z-index: 100;
+	top: 0;
+	/*  #ifdef  H5  */
+	top: calc(88rpx + constant(safe-area-inset-top));
+	top: calc(88rpx + env(safe-area-inset-top));
+	/*  #endif  */
+	background: rgba(0, 0, 0, 0.5);
+}
+
+.tui-common-words-box {
+	position: absolute;
+	width: 100%;
+	height: 60%;
+	bottom: 0;
+	background: rgba(255, 255, 255, 1);
+	padding-bottom: 68rpx;
+	z-index: 200;
+}
+
+.tui-common-words-title {
+	display: flex;
+	flex-wrap: nowrap;
+	justify-content: space-between;
+	padding-left: 40rpx;
+	padding-right: 40rpx;
+	padding-top: 48rpx;
+	font-family: PingFangSC-Medium;
+	font-size: 36rpx;
+	color: #000000;
+	letter-spacing: 0;
+	line-height: 50rpx;
+}
+
+.tui-search-bar {
+	display: flex;
+	flex-wrap: nowrap;
+	align-items: center;
+	margin: 32rpx 40rpx;
+	width: 670rpx;
+	height: 80rpx;
+	background: #FFFFFF;
+	border-radius: 40rpx;
+	border-radius: 40rpx;
+	background-color: #F8F8F8;
+}
+
+.tui-searchcion {
+	display: inline-block;
+	margin-left: 24rpx;
+	width: 48rpx;
+	height: 48rpx;
+}
+
+.tui-search-bar-input {
+	margin-left: 16rpx;
+	line-height: 40rpx;
+	font-size: 28rpx;
+	width: 100%;
+	display: inline-block;
+}
+
+.tui-common-words-list {
+	position: absolute;
+	top: 242rpx;
+	bottom: 68rpx;
+	width: 750rpx;
+}
+
+.tui-common-words-item {
+	width: 750rpx;
+	height: 112rpx;
+	border-bottom: 2rpx solid #EEF0F3;
+	background-color: #FFFFFF;
+	font-family: PingFangSC-Regular;
+	font-size: 32rpx;
+	color: #333333;
+	letter-spacing: 0;
+	line-height: 44rpx;
+	padding: 0 40rpx;
+	display: flex;
+	align-items: center;
+}

+ 85 - 0
components/im/tui-chat/message-private/common-words/index.vue

@@ -0,0 +1,85 @@
+<template>
+	<view v-show="display" class="tui-common-words-container">
+		<view class="tui-common-words-box">
+			<view class="tui-common-words-title">
+				<view>请选择常用语</view>
+				<view style="color: #006EFF; font-family: PingFangSC-Regular;" class="tui-common-words-close" @tap="handleClose">关闭</view>
+			</view>
+			<view class="tui-search-bar">
+				<image class="tui-searchcion" src="/static/assets/serach-icon.svg"></image>
+				<input class="tui-search-bar-input" :value="words" placeholder="请输入关键字搜索" @input="wordsInput" />
+			</view>
+			<scroll-view class="tui-common-words-list" scroll-y="true" enable-flex="true">
+				<view v-for="(item, index) in commonWordsMatch" :key="index" class="tui-common-words-item" @tap="sendMessage" :data-words="item">{{ item }}</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+const commonWordsList = [
+	'你好在吗',
+	'问题A',
+	'问题B'
+];
+
+export default {
+	data() {
+		return {
+			words: '',
+			commonWordsMatch: commonWordsList
+		};
+	},
+
+	components: {},
+	props: {
+		display: {
+			type: Boolean,
+			default: false
+		}
+	},
+	watch: {
+		display: {
+			handler: function(newVal) {
+				// this.setData({
+				//   display: newVal
+				// });
+			},
+			immediate: true
+		}
+	},
+	methods: {
+		handleClose() {
+			this.$emit('close', {
+				detail: {
+					key: '0'
+				}
+			});
+		},
+
+		wordsInput(e) {
+			(this.commonWordsMatch = []),
+				commonWordsList.forEach(item => {
+					if (item.indexOf(e.detail.value) > -1) {
+						this.commonWordsMatch.push(item);
+					}
+				});
+			this.setData({
+				words: e.detail.value,
+				commonWordsMatch: this.commonWordsMatch
+			});
+		},
+
+		sendMessage(e) {
+			this.$emit('sendMessage', {
+				detail: {
+					message: e.currentTarget.dataset.words
+				}
+			});
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 178 - 0
components/im/tui-chat/message-private/order-list/index.css

@@ -0,0 +1,178 @@
+.tui-cards-container {
+	position: fixed;
+	width: 100vw;
+	height: 100vh;
+	z-index: 100;
+	top: 0;
+	/*  #ifdef  H5  */
+	top: calc(88rpx + constant(safe-area-inset-top));
+	top: calc(88rpx + env(safe-area-inset-top));
+	/*  #endif  */
+	background: rgba(0, 0, 0, 0.5);
+}
+
+.tui-cards-box {
+	position: absolute;
+	width: 100%;
+	height: 60%;
+	bottom: 0;
+	background: #F4F5F9;
+	padding-bottom: 68rpx;
+	z-index: 200;
+}
+
+.tui-cards-title {
+	display: flex;
+	flex-wrap: nowrap;
+	justify-content: space-between;
+	padding-left: 40rpx;
+	padding-right: 40rpx;
+	padding-top: 48rpx;
+	font-family: PingFangSC-Medium;
+	font-size: 36rpx;
+	color: #000000;
+	letter-spacing: 0;
+	line-height: 50rpx;
+}
+
+.tui-search-bar {
+	display: flex;
+	flex-wrap: nowrap;
+	align-items: center;
+	margin: 32rpx 40rpx;
+	width: 670rpx;
+	height: 80rpx;
+	background: #FFFFFF;
+	border-radius: 40rpx;
+	border-radius: 40rpx;
+	background-color: #F8F8F8;
+}
+
+.tui-searchcion {
+	display: inline-block;
+	margin-left: 24rpx;
+	width: 48rpx;
+	height: 48rpx;
+}
+
+.tui-search-bar-input {
+	margin-left: 16rpx;
+	line-height: 40rpx;
+	font-size: 28rpx;
+	width: 100%;
+	display: inline-block;
+}
+
+.tui-order-list {
+	position: absolute;
+	top: 242rpx;
+	bottom: 68rpx;
+	width: 750rpx;
+}
+
+.tui-order-item {
+	width: 670rpx;
+	margin: 32rpx 40rpx;
+	height: 388rpx;
+	background-color: #FFFFFF;
+	border-radius: 4px;
+	display: flex;
+	flex-wrap: wrap;
+	align-items: center;
+}
+
+.order-title {
+	width: 670rpx;
+	height: 102rpx;
+	padding: 32rpx 40rpx;
+	padding-bottom: 0;
+	border-bottom: 2rpx solid #EEF0F3;
+}
+
+.order-title>.order-number {
+	font-family: PingFangSC-Medium;
+	font-size: 32rpx;
+	line-height: 44rpx;
+	color: #000000;
+	letter-spacing: 0;
+	margin-bottom: 8rpx;
+}
+
+.order-title>.order-time {
+	font-family: PingFangSC-Regular;
+	font-size: 24rpx;
+	line-height: 34rpx;
+	color: #999999;
+	letter-spacing: 0;
+}
+
+.order-info {
+	display: flex;
+	flex-wrap: nowrap;
+	width: 670rpx;
+	height: 236rpx;
+	padding: 32rpx 40rpx;
+}
+
+.order-content {
+	width: 450rpx;
+	margin-left: 32rpx;
+}
+
+.order-content-title {
+	font-family: PingFangSC-Medium;
+	width: 378rpx;
+	line-height: 34rpx;
+	font-size: 24rpx;
+	color: #000000;
+	letter-spacing: 0;
+	margin-bottom: 12rpx;
+}
+
+.order-content-description {
+	display: flex;
+	flex-wrap: nowrap;
+	font-family: PingFangSC-Regular;
+	max-width: 410rpx;
+	line-height: 34rpx;
+	font-size: 24rpx;
+	color: #999999;
+	letter-spacing: 0;
+	margin-bottom: 12rpx;
+}
+
+.order-content-price {
+	font-family: PingFangSC-Medium;
+	font-size: 36rpx;
+	line-height: 50rpx;
+	color: #FF7201;
+	letter-spacing: 0;
+}
+
+.order-image {
+	width: 156rpx;
+	height: 156rpx;
+}
+
+.btn-send-order {
+	width: 176rpx;
+	height: 58rpx;
+	background-color: #006EFF;
+	border-radius: 14.5px;
+	font-family: PingFangSC-Regular;
+	font-size: 24rpx;
+	color: #FFFFFF;
+	line-height: 28px;
+	text-align: center;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin-right: 40rpx;
+}
+
+.btn-send-text {
+	font-family: PingFangSC-Regular;
+	font-size: 12px;
+	color: #FFFFFF;
+	line-height: 14px;
+}

+ 137 - 0
components/im/tui-chat/message-private/order-list/index.vue

@@ -0,0 +1,137 @@
+<template>
+	<view v-if="display" class="tui-cards-container">
+		<view class="tui-cards-box">
+			<view class="tui-cards-title">
+				<view>请选择你要发送的订单</view>
+				<view style="color: #006EFF; font-family: PingFangSC-Regular;" class="tui-cards-close" @tap="handleClose">关闭</view>
+			</view>
+			<view class="tui-search-bar">
+				<image class="tui-searchcion" src="/static/assets/serach-icon.svg"></image>
+				<input class="tui-search-bar-input" :value="words" placeholder="搜索" @input="wordsInput" />
+			</view>
+			<scroll-view class="tui-order-list" scroll-y="true" enable-flex="true">
+				<view v-for="(item, index) in orderMatch" :key="index" class="tui-order-item">
+					<view class="order-title">
+						<view class="order-number">订单编号: {{ item.orderNum }}</view>
+						<view class="order-time">{{ item.time }}</view>
+					</view>
+					<view class="order-info">
+						<image class="order-image" :src="item.imageUrl"></image>
+						<view class="order-content">
+							<view class="order-content-title">{{ item.title }}</view>
+							<view class="order-content-description">{{ item.description }}</view>
+							<view style="display: flex; flex-wrap: no-wrap; justify-content: space-between;">
+								<view class="order-content-price">{{ item.price }}</view>
+								<view class="btn-send-order" :data-order="item" @tap.stop="sendMessage"><text class="btn-send-text">发送此订单</text></view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+const orderList = [
+	{
+		orderNum: 1,
+		time: '2021-7-20 20:45',
+		title: '[天博检验]新冠核酸检测/预约',
+		description: '专业医学检测,电子报告',
+		imageUrl: 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/miles.jpeg',
+		price: '80元'
+	},
+	{
+		orderNum: 2,
+		time: '2021-7-20 22:45',
+		title: '[路边]新冠核酸检测/预约',
+		description: '专业医学检测,电子报告',
+		imageUrl: 'https://sdk-web-1252463788.cos.ap-hongkong.myqcloud.com/component/TUIKit/assets/miles.jpeg',
+		price: '7000元'
+	}
+];
+
+export default {
+	data() {
+		return {
+			words: '',
+			orderMatch: orderList
+		};
+	},
+
+	components: {},
+	props: {
+		display: {
+			type: Boolean,
+			default: false
+		},
+		conversation: {
+			type: Object,
+			default: () => {}
+		}
+	},
+	watch: {
+		display: {
+			handler: function(newVal) {
+				// this.setData({
+				//   display: newVal
+				// });
+			},
+			immediate: true
+		},
+		conversation: {
+			
+			handler: function(newVal) {
+				this.conversation=newVal
+			},
+			immediate: true,
+			deep: true
+		}
+	},
+	methods: {
+		handleClose() {
+			this.$emit('close', {
+				detail: {
+					key: '1'
+				}
+			});
+		},
+		wordsInput(e) {
+			var that=this;
+			(this.orderMatch = []),
+				orderList.forEach(item => {
+					if (item.title.indexOf(e.detail.value) > -1 || item.orderNum === ~~e.detail.value) {
+						this.orderMatch.push(item);
+					}
+				});
+			that.setData({
+				words: e.detail.value,
+				orderMatch: this.orderMatch
+			});
+		},
+
+		sendMessage(e) {
+			const { order } = e.currentTarget.dataset;
+			this.$emit('sendCustomMessage', {
+				detail: {
+					payload: {
+						// data 字段作为表示,可以自定义
+						data: 'order',
+						description: order.description,
+						// 获取骰子点数
+						extension: JSON.stringify({
+							title: order.title,
+							imageUrl: order.imageUrl,
+							price: order.price
+						})
+					}
+				}
+			});
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 93 - 0
components/im/tui-chat/message-private/service-evaluation/index.css

@@ -0,0 +1,93 @@
+.tui-cards-container {
+	position: fixed;
+	width: 100vw;
+	height: 100vh;
+	z-index: 100;
+	top: 0;
+	/*  #ifdef  H5  */
+	top: calc(88rpx + constant(safe-area-inset-top));
+	top: calc(88rpx + env(safe-area-inset-top));
+	/*  #endif  */
+	background: rgba(0, 0, 0, 0.5);
+}
+
+.service-evaluation {
+	position: absolute;
+	bottom: 0;
+	right: 0;
+	left: 0;
+	background: #FFFFFF;
+	padding: 48rpx 40rpx;
+}
+
+.header {
+	display: flex;
+	justify-content: space-between;
+	font-family: PingFangSC-Regular;
+}
+
+.btn {
+	width: 100%;
+	padding: 0;
+	margin: 0 auto;
+	text-align: center;
+	background: none;
+}
+
+.btn-close {
+	color: #006EFF;
+}
+
+.header-label {
+	font-size: 18px;
+	color: #000000;
+	letter-spacing: 0;
+	line-height: 25px;
+}
+
+.header .btn {
+	font-size: 16px;
+	color: #006EFF;
+	letter-spacing: 0;
+	line-height: 24px;
+}
+
+.main {
+	display: flex;
+	flex-direction: column;
+	padding: 48rpx 0;
+}
+
+.main-evaluation-score {
+	padding: 0 60rpx 48rpx;
+	display: flex;
+	justify-content: space-between;
+	align-items: flex-end;
+}
+
+.main-evaluation-score .score-star {
+	width: 72rpx;
+	height: 72rpx;
+}
+
+.main-textarea {
+	background: #F8F8F8;
+	border: 0 solid #D9D9D9;
+	border-radius: 4px;
+	font-size: 14px;
+	padding: 16rpx 32rpx;
+}
+
+.textarea-placeholder {
+	color: #B0B0B0;
+}
+
+.footer .btn {
+	width: 100%;
+	padding: 26rpx 0;
+	background: #006EFF;
+	border-radius: 24px;
+	border-radius: 24px;
+	font-size: 16px;
+	color: #FFFFFF;
+}

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

@@ -0,0 +1,116 @@
+<template>
+	<view class="tui-cards-container" v-if="display">
+		<view class="service-evaluation">
+			<view class="header">
+				<label class="header-label">请对本次服务进行评价</label>
+				<view class="btn-close" @tap="handleClose">关闭</view>
+			</view>
+			<view class="main">
+				<view class="main-evaluation-score">
+					<image
+						v-for="(item, index) in scoreList"
+						:key="index"
+						class="score-star"
+						:data-score="item"
+						:src="'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/star' + (item > score ? '-grey' : '') + '.png'"
+						@tap="handleScore"
+					></image>
+				</view>
+				<textarea
+					class="main-textarea"
+					cols="30"
+					rows="10"
+					@input="bindTextAreaInput"
+					placeholder="请输入评语"
+					placeholder-style="textarea-placeholder"
+				></textarea>
+			</view>
+			<view class="footer"><view class="btn" @tap="sendMessage" :disabled="score === 0 && !comment">提交评价</view></view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			scoreList: [1, 2, 3, 4, 5],
+			score: 5,
+			comment: ''
+		};
+	},
+
+	components: {},
+	props: {
+		display: {
+			type: Boolean,
+			default: ''
+		}
+	},
+	watch: {
+		display: {
+			handler: function(newVal) {},
+			immediate: true
+		}
+	},
+
+	onPageShow() {
+		this.score= 0;
+		this.comment='';
+		 
+	},
+
+	methods: {
+		handleClose() {
+			this.$emit('close', {
+				detail: {
+					key: '2'
+				}
+			});
+		},
+
+		handleScore(e) {
+			let { score } = e.currentTarget.dataset;
+
+			if (score === this.score) {
+				score = 0;
+			}
+
+			this.setData({
+				score
+			});
+		},
+
+		bindTextAreaInput(e) {
+			this.setData({
+				comment: e.detail.value
+			});
+		},
+
+		sendMessage() {
+			this.$emit('sendCustomMessage', {
+				detail: {
+					payload: {
+						// data 字段作为表示,可以自定义
+						data: 'evaluation',
+						description: '对本次服务的评价',
+						// 获取骰子点数
+						extension: JSON.stringify({
+							score: this.score,
+							comment: this.comment
+						})
+					}
+				}
+			});
+			this.setData({
+				score: 0,
+				comment: ''
+			});
+			this.handleClose();
+		}
+	}
+};
+</script>
+<style>
+@import './index.css';
+</style>

+ 214 - 0
components/likeProduct.vue

@@ -0,0 +1,214 @@
+<template>
+   <view>
+		<view class="like-title" v-show="list &&list.length > 0">
+			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/like.png" mode=""></image>
+			<text class="text">猜你喜欢</text>
+		</view>
+		<view class="like-list">
+			<view class="item" v-for="(item,index) in list" :key="index" @click="showProduct(item)">
+				<view class="img-box">
+					<image :src="item.image" mode=""></image>
+				</view>
+				<view class="info-box">
+					<view class="title ellipsis2">{{ item.productName }}</view>
+					<view class="price-box">
+						<view class="now">
+							<text class="unit">¥</text>
+							<text class="num"  v-if="userinfoa.isShow==1&&isuser==false">{{item.price.toFixed(2)}}</text>
+							<text class="num" v-else>{{item.otPrice.toFixed(2)}}</text>
+						</view>
+						<view class="old" v-if="userinfoa.isShow==1&&isuser==false">¥{{item.otPrice.toFixed(2)}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<Loading :loaded="loaded" :loading="loading"></Loading>
+   </view>
+</template>
+
+<script>
+  import {getGoodsProducts} from '@/api/product'
+  import {getUserInfo} from '@/api/user'
+  import Loading from "@/components/Loading";
+  export default {
+	components: {Loading },
+    name: "likeProduct",
+	data() {
+		return {
+			page:{
+				page: 1,
+				pageSize: 10
+			},
+			total:0,
+			list:[],
+			loaded: false,
+			loading: false,
+			userinfoa:[],
+			isuser:false,
+		};
+	},
+	created() {
+	},
+	mounted() {
+		this.getGoodsProducts();
+		if(uni.getStorageSync('AppToken')){
+			this.getUserInfos()
+		}else{
+			this.isuser=true
+		}
+	},
+	watch: {
+		UserInfo() {
+		    return uni.getStorageSync('AppToken')
+		}
+	},
+	methods: {
+		getUserInfos(){
+			getUserInfo().then(res => {
+					if(res.code==200){
+						if(res.user!=null){
+							// if(res.user.isPromoter==null||res.user.isPromoter==0){
+							// 	this.tuiModalControl=true
+							// }
+							this.userinfoa=res.user
+							console.log(this.userinfoa.isShow,78787)
+						}
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				},
+				rej => {}
+			);
+		},
+		getGoodsProducts(){
+			console.log(1)
+			var that=this;
+			if (that.loaded == true || that.loading == true) return;
+			that.loading = true;
+			uni.showLoading({
+				title:"加载中..."
+			})
+			getGoodsProducts(that.page).then(
+				res => {
+					if(res.code==200){
+						that.total=res.data.total;
+						that.list.push.apply(that.list, res.data.list);
+						that.loading = false;
+						that.loaded = that.list.length<that.total?false:true;
+						that.page.page = that.page.page + 1;
+						uni.hideLoading()
+					}
+				},
+				err => {
+					uni.hideLoading()
+					uni.showToast({
+						title: err.msg ,
+						icon: 'none',
+						duration: 2000
+					});
+				}
+			);
+		},
+		showProduct(item){
+			uni.navigateTo({
+				url: '/pages/shopping/productDetails?productId='+item.productId
+			})
+		},
+	}
+ 
+  };
+</script>
+<style lang="scss">
+	.like-title{
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 30upx 0;
+		image{
+			width: 37upx;
+			height: 37upx;
+			margin-right: 20upx;
+		}
+		.text{
+			font-size: 36upx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #111111;
+			line-height: 1;
+		}
+	}
+	.like-list{
+		display: flex;
+		flex-wrap: wrap;
+		.item{
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			width: 345rpx;
+			background: #FFFFFF;
+			box-shadow: 0px 0px 10rpx 4rpx rgba(199, 199, 199, 0.22);
+			border-radius: 20rpx;
+			overflow: hidden;
+			&:nth-child(2n) {
+				margin-right: 0;
+			}
+			.img-box{
+				width: 100%;
+				height: 334upx;
+				image{
+					width: 100%;
+					height: 100%;
+				}
+			}
+			.info-box{
+				box-sizing: border-box;
+				height: 182upx;
+				padding: 20upx 20upx 30upx;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				.title{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #111111;
+					line-height: 40upx;
+				}
+				.price-box{
+					display: flex;
+					align-items: flex-end;
+					.now{
+						display: flex;
+						align-items: flex-end;
+						margin-right: 20upx;
+						.unit{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #FF6633;
+							line-height: 1.2;
+							margin-right: 4upx;
+						}
+						.num{
+							font-size: 36upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FF6633;
+							line-height: 1;
+						}
+					}
+					.old{
+						font-size: 26upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						text-decoration: line-through;
+						color: #BBBBBB;
+						line-height: 1.1;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 315 - 0
components/px-popup-bottom/px-popup-bottom.vue

@@ -0,0 +1,315 @@
+<template>
+	<view :class="['popup',{'popup-show':show}]" @mousewheel.prevent.stop @touchmove.stop.prevent
+		:style="{'z-index':zindex}">
+		<view class="mask" :style="{'z-index':maskZindex,bottom:bottom+'rpx'}" v-show="show" @click.stop="onClose"
+			@touchmove.prevent.stop></view>
+		<view :class="['content',{show}]" @click.stop @touchmove.prevent.stop :style="{'background-color':bgColor,height:`${height}px`,maxHeight:show ? cotMaxHeight:0,'border-top-right-radius':cotRadius,
+			'border-top-left-radius':cotRadius,transition: `all ${animaTime}s ease-in`,bottom:bottom+'rpx','z-index':zindex}">
+			<view id="title-bar" class="title-bar" v-show="title">
+				<view class="title" :style="{fontWeight:fontweight}">{{title}}</view>
+				<view class="close-wrap" @click.stop="onClose">
+					<image class="close-icon" :src="closeIcon" mode="widthFix"></image>
+				</view>
+			</view>
+			<view class="scroll-wrap">
+				<scroll-view :class="{'scroll-view':isAnimaStart}" scroll-y="true" style="height:100%;"
+					@scrolltolower="onScrollToLower">
+					<view id="popup_content" class="popup_content">
+						<slot></slot>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	// import iconClose from 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close40.png'
+	export default {
+		props: {
+			title: { //标题
+				type: String,
+				default: ''
+			},
+			fontweight: {
+				type: [String, Number],
+				default: 'normal'
+			},
+			visible: { //隐藏显示标识
+				type: Boolean,
+				default: false
+			},
+			maxHeight: { //内容区域最大高度
+				type: [String, Number],
+				default: '75%'
+			},
+			radius: { //顶部圆角
+				type: [String, Number],
+				default: '0'
+			},
+			animaTime: { //弹窗动画时间
+				type: Number,
+				default: 0.2
+			},
+			bottom: { //离底部距离
+				type: [String, Number],
+				default: 0
+			},
+			bgColor: {
+				type: [String],
+				default: '#ffffff'
+			},
+			zindex: {
+				type: [String, Number],
+				default: 1000
+			},
+			maskZindex: {
+				type: [String, Number],
+				default: 999
+			},
+			always: { //是否每次打开都重新计算内容高度
+				type: Boolean,
+				default: false
+			},
+
+		},
+		data() {
+			return {
+				show: false,
+				height: 0,
+				PopHeight: 0,
+				cotMaxHeight: '',
+				isAnimaStart: false,
+				rpxRate: "",
+				cotRadius: 0,
+				closeIcon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/close40.png'
+			}
+		},
+		watch: {
+			visible(newval) {
+				this.isAnimaStart = true;
+				setTimeout(() => {
+					this.isAnimaStart = false;
+				}, this.animaTime * 1000)
+
+				if (newval && this.height === 0) {
+					if (this.PopHeight === 0 || this.always) {
+						this.setContViewHeight();
+
+					} else {
+						this.height = this.PopHeight
+					}
+
+					// #ifdef H5 
+					this.setBodyOverFlow('hidden') //阻止滚动穿透
+					//#endif
+					this.$emit('open')
+
+				} else {
+					this.height = 0;
+					// #ifdef H5 
+					this.setBodyOverFlow('visible')
+					//#endif
+
+				}
+
+				this.show = newval
+
+			},
+			maxHeight: {
+				handler(newval) {
+					this.cotMaxHeight = this.unitCheck(newval);
+
+				},
+				immediate: true
+			},
+			radius: {
+				handler(newval) {
+					this.cotRadius = this.unitCheck(newval);
+
+				},
+				immediate: true
+			}
+		},
+		created() {
+			this.rpxRate = this.getRpxRate()
+		},
+		mounted() {
+			this.$nextTick(() => {
+				// #ifdef H5
+				this.preventTouch(document.querySelector(
+					'.scroll-wrap .uni-scroll-view .uni-scroll-view')); //防止浏览器报错
+				//#endif
+			})
+		},
+		methods: {
+			onClose() {
+				this.$emit("update:visible", false);
+				this.$emit('close')
+			},
+			//触底
+			onScrollToLower(e) {
+				this.$emit("reachBottom");
+			},
+			getRpxRate() {
+				let res = uni.getSystemInfoSync();
+				let width = res.windowWidth;
+				let rate = 750.00 / width;
+				return rate
+			},
+			unitCheck(value) {
+				const val = String(value);
+				if (!val.includes('px') && !val.includes('%')) {
+					return `${val}rpx`;
+				}
+				return val;
+
+			},
+			preventTouch(el) {
+				el.addEventListener('touchmove', function(e) {
+					e.stopPropagation();
+
+				}, {
+					passive: false
+				});
+			},
+			setBodyOverFlow(val) {
+				document.body.style.overflow = val
+			},
+
+			//设置内容区域高度
+			async setContViewHeight() {
+				let data = await this.computeHeight();
+				this.height = data.height + (this.title ? 100 / parseFloat(this.rpxRate) : 0);
+				this.PopHeight = this.height;
+			},
+			//计算内容区域高度
+			computeHeight() {
+				return new Promise(resolve => {
+					this.$nextTick(() => {
+						const query = uni.createSelectorQuery().in(this);
+						query.select('#popup_content').boundingClientRect(data => {
+							resolve(data)
+						}).exec();
+					})
+				})
+			}
+
+		}
+
+
+	}
+</script>
+
+<style lang="scss" scoped>
+	.popup {
+
+		&.popup-show {
+			position: fixed;
+			top: 0;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			overflow: hidden;
+			z-index: 999;
+		}
+
+		.mask {
+			position: fixed;
+			top: 0;
+			right: 0;
+			bottom: 0;
+			left: 0;
+			background-color: rgba($color: #000000, $alpha: 0.5);
+			z-index: 999;
+		}
+
+		.content {
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			right: 0;
+			height: 0;
+			height: auto;
+			background-color: #ffffff;
+			transition: all 0.2s ease-in;
+			z-index: 1000;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			overflow: hidden;
+
+			.title-bar {
+				width: 100%;
+				flex-shrink: 0;
+				text-align: center;
+				position: relative;
+				padding: 10rpx 70rpx 0;
+				box-sizing: border-box;
+				height: 80rpx;
+
+				.title {
+					font-size: 34upx;
+					font-family: PingFang SC;
+					font-weight: bold !important;
+					color: #111111;
+					width: 100%;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+				}
+
+				.close-wrap {
+					position: absolute;
+					top: 20rpx;
+					right: 10rpx;
+					padding: 10rpx 20rpx;
+					box-sizing: border-box;
+				}
+
+				.close-icon {
+					width: 40rpx;
+					height: 40rpx;
+				}
+			}
+
+			.scroll-wrap {
+				flex: 1;
+				height: 0;
+				width: 100%;
+			}
+
+			&.visible {
+				max-height: 75%;
+				overflow-y: hidden;
+				height: auto;
+
+			}
+		}
+	}
+
+	.scroll-view ::-webkit-scrollbar {
+		display: none !important;
+		width: 0 !important;
+		height: 0 !important;
+		-webkit-appearance: none;
+		background: transparent;
+
+	}
+
+	.popup_content {
+		width: 100%;
+		padding: 0rpx 30rpx;
+		box-sizing: border-box;
+
+		&::after {
+			display: block;
+			width: 100%;
+			content: "\00A0";
+			overflow: hidden;
+			opacity: 0;
+			height: 1rpx;
+		}
+
+	}
+</style>

+ 148 - 0
components/tabbar/tabbar.vue

@@ -0,0 +1,148 @@
+<template>
+	<view class="tabbar align-center" >
+		<view v-for="(item, index) in tabbarList" :key="index" @click="switchTabs(item)" 
+		class="tablist" v-if="item.isshowed">
+			<view class=" tabbar-list"  >
+				<image :src="actindex==index?item.selectedIconPath:item.iconPath"></image>
+				<text class="fs24 base-textcol"
+				 :class="actindex==index?'actcolor':'morecolor'">{{item.Text}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getUserInfo} from '@/api/user'
+	export default {
+		name: "tabbar",
+		props: {
+			actindex: {
+				type: Number,
+				default: 0,
+			}
+		},
+		data() {
+			return {
+				tabbarList: [],
+				userinfoa:[],
+				isuser:false
+			};
+		},
+		mounted() {
+			this.themeicon()
+			this.$nextTick(()=>{
+				if(uni.getStorageSync('AppToken')){
+					this.getUserInfos()
+				}else{
+					this.isuser=true
+					this.tabbarList[2].isshowed=true
+				}
+			})
+		},
+		methods: {
+			getUserInfos(){
+				getUserInfo().then(
+					res => {
+						if(res.code==200){
+							if(res.user!=null){
+								this.userinfoa=res.user
+								if(this.userinfoa.isShow==0&&this.isuser==false){
+									this.tabbarList[3].isshowed=false
+									this.tabbarList[2].isshowed=true
+								}else if(this.userinfoa.isShow==1){
+									this.tabbarList[3].isshowed=true
+									this.tabbarList[2].isshowed=false
+								}
+							}
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			switchTabs(item) {
+				uni.switchTab({
+					url: item.url
+				})
+			},
+			themeicon() {
+				this.tabbarList = [{
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/home.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/home_sel.png",
+						Text: '首页',
+						url: '/pages/home/index',
+						isshowed:true
+					},
+					{
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/health.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/health_sel.png",
+						Text: '百域百科',
+						url: '/pages/healthy/index',
+						isshowed:true
+					},
+					{
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/archive.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/archive_sel.png",
+						Text: '百域档案',
+						url: '/pages/healthy/idea',
+						isshowed:false
+					},
+					{
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/shop_mall.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/shop_mall_sel.png",
+						Text: '百域产品',
+						url: '/pages/shopping/index',
+						isshowed:false
+					},
+					{
+						iconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/my.png",
+						selectedIconPath: "https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/my_sel.png",
+						Text: '我的',
+						url: '/pages/user/index',
+						isshowed:true
+					},
+				]
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.tabbar {
+		display: flex;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: #fff;
+		z-index: 1000;
+		height: 100rpx;
+		padding: 20rpx 0rpx;
+		image{
+			margin-bottom: 4rpx;
+			width: 48rpx;
+			height: 48rpx;
+		}
+	}
+
+	.tablist {
+		width: 25%;
+	}
+	.morecolor{
+		color: #626468;
+	}
+	.actcolor{
+		color: #2BC7B9;
+	}
+	.tabbar-list{
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		font-size: 24rpx
+	}
+</style>

+ 214 - 0
components/tuiProduct.vue

@@ -0,0 +1,214 @@
+<template>
+   <view>
+		<view class="like-title">
+			<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/tui.png" mode=""></image>
+			<text class="text">精选商品</text>
+		</view>
+		<view class="like-list">
+			<view class="item" v-for="(item,index) in list" :key="index" @click="showProduct(item)">
+				<view class="img-box">
+					<image :src="item.image" mode=""></image>
+				</view>
+				<view class="info-box">
+					<view class="title ellipsis2">{{ item.productName }}</view>
+					<view class="price-box">
+						<view class="now">
+							<text class="unit">¥</text>
+							<text class="num"  v-if="userinfoa.isShow==1&&isuser==false">{{item.price.toFixed(2)}}</text>
+							<text class="num" v-else>{{item.otPrice.toFixed(2)}}</text>
+						</view>
+						<view class="old" v-if="userinfoa.isShow==1&&isuser==false">¥{{item.otPrice.toFixed(2)}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<Loading :loaded="loaded" :loading="loading"></Loading>
+   </view>
+</template>
+
+<script>
+  import {getTuiProducts} from '@/api/product'
+  import {getUserInfo} from '@/api/user'
+  import Loading from "@/components/Loading";
+  export default {
+	components: {Loading },
+    name: "likeProduct",
+	data() {
+		return {
+			page:{
+				page: 1,
+				pageSize: 10
+			},
+			total:0,
+			list:[],
+			loaded: false,
+			loading: false,
+			userinfoa:[],
+			isuser:false,
+		};
+	},
+	created() {
+	},
+	mounted() {
+		this.getTuiProducts();
+		if(uni.getStorageSync('AppToken')){
+			this.getUserInfos()
+		}else{
+			this.isuser=true
+		}
+	},
+	watch: {
+		UserInfo() {
+		    return uni.getStorageSync('AppToken')
+		}
+	},
+	methods: {
+		getUserInfos(){
+			getUserInfo().then(res => {
+					if(res.code==200){
+						if(res.user!=null){
+							// if(res.user.isPromoter==null||res.user.isPromoter==0){
+							// 	this.tuiModalControl=true
+							// }
+							this.userinfoa=res.user
+							console.log(this.userinfoa.isShow,78787)
+						}
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				},
+				rej => {}
+			);
+		},
+		getTuiProducts(){
+			console.log(1)
+			var that=this;
+			if (that.loaded == true || that.loading == true) return;
+			that.loading = true;
+			uni.showLoading({
+				title:"加载中..."
+			})
+			getTuiProducts(that.page).then(
+				res => {
+					if(res.code==200){
+						that.total=res.data.total;
+						that.list.push.apply(that.list, res.data.list);
+						that.loading = false;
+						that.loaded = that.list.length<that.total?false:true;
+						that.page.page = that.page.page + 1;
+						uni.hideLoading()
+					}
+				},
+				err => {
+					uni.hideLoading()
+					uni.showToast({
+						title: err.msg ,
+						icon: 'none',
+						duration: 2000
+					});
+				}
+			);
+		},
+		showProduct(item){
+			uni.navigateTo({
+				url: '/pages/shopping/productDetails?productId='+item.productId
+			})
+		},
+	}
+ 
+  };
+</script>
+<style lang="scss">
+	.like-title{
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 15upx 0rpx 30upx 0rpx;
+		image{
+			width: 37upx;
+			height: 37upx;
+			margin-right: 20upx;
+		}
+		.text{
+			font-size: 36upx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #111111;
+			line-height: 1;
+		}
+	}
+	.like-list{
+		display: flex;
+		flex-wrap: wrap;
+		.item{
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			width: 345rpx;
+			background: #FFFFFF;
+			box-shadow: 0px 0px 10rpx 4rpx rgba(199, 199, 199, 0.22);
+			border-radius: 20rpx;
+			overflow: hidden;
+			&:nth-child(2n) {
+				margin-right: 0;
+			}
+			.img-box{
+				width: 100%;
+				height: 334upx;
+				image{
+					width: 100%;
+					height: 100%;
+				}
+			}
+			.info-box{
+				box-sizing: border-box;
+				height: 182upx;
+				padding: 20upx 20upx 30upx;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+				.title{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #111111;
+					line-height: 40upx;
+				}
+				.price-box{
+					display: flex;
+					align-items: flex-end;
+					.now{
+						display: flex;
+						align-items: flex-end;
+						margin-right: 20upx;
+						.unit{
+							font-size: 24upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #FF6633;
+							line-height: 1.2;
+							margin-right: 4upx;
+						}
+						.num{
+							font-size: 36upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #FF6633;
+							line-height: 1;
+						}
+					}
+					.old{
+						font-size: 26upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						text-decoration: line-through;
+						color: #BBBBBB;
+						line-height: 1.1;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 325 - 0
components/z-modal/z-modal.vue

@@ -0,0 +1,325 @@
+<template>
+	<view>
+		<view class="mask" :style="{'opacity':show?'1':'0','visibility':show?'visible':'hidden'}"></view>
+		<view class="modal-box" :style="{'display':show?'block':'none','width':modalWidth}">
+			<view class="modal-title" :style="{'padding':titlePadding,'fontSize':titleSize,'color':titleColor}">
+				{{titleText}}
+			</view>
+			<view class="modal-content" v-if="contentType==1" :style="{'fontSize':contentSize,'padding':contentPadding,'color':contentColor}">
+				{{contentText}}
+			</view>
+			<view class="modal-content" v-if="contentType==2" :style="{'padding':contentPadding}">
+				<input :placeholder="placeholderText" v-model="inputText" :maxlength="maxLength" :placeholder-style="placeholderStyleString" :style="{'borderColor':inputBorderColor,'fontSize':contentSize,'color':contentColor}" class="input-area"/>
+			</view>
+			<view class="modal-content" v-if="contentType==3" :style="{'padding':contentPadding}">
+				<textarea :placeholder="placeholderText" v-model="textareaText" :maxlength="maxLength" :placeholder-style="placeholderStyleString" :style="{'borderColor':inputBorderColor,'fontSize':contentSize,'color':contentColor}"/>
+			</view>
+			<view class="model-bottom" :style="{'padding':bottomPadding,'justify-content':btnLength>1?'space-between':'center'}">
+				<block v-for="(item,index) in btnGroup" :key='index'>
+					<view class="modal-btn" :style="{'width':item.width,'height':item.height,'color':item.color,'background-color':item.bgColor,'font-size':bottomFontSize,'border-radius':shapeObj[item.shape]}" @tap="btnClick(index)">
+						{{item.text}}
+					</view>
+				</block>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "z-modal",
+		props: {
+			// **************** 使用配置项 ****************
+			// 文本校验?
+			check:{
+				type:Boolean,
+				default:false
+			},
+			checkItem:{
+				// isRequired-是否必填/ isNumber-是否为纯数字 isChinese-是否为纯中文 isEnglish-是否为纯英文 isEmail-是否为邮箱格式 isIdNum-是否为身份证格式
+				type:Array,
+				default:()=>{
+					return []
+				}
+			},
+			/*
+			支持自定义校验,格式为{
+				key:正则
+			}
+			例如{
+				'isNumber':/^\+?[0-9][0-9]*$/
+			}
+			*/
+			selfCheckItem:{
+				type:Object,
+				default:()=>{
+					return {}
+				}
+			},
+			// 控制modal的显示隐藏
+			show:{
+				type:Boolean,
+				default:false
+			},
+			// 底部按钮组
+			btnGroup: {
+				type: Array,
+				default: () => {
+					return [{
+						text: '取消',
+						color: '#FFFFFF',
+						bgColor: '#999999',
+						width: '220rpx',
+						height: '80rpx',
+						shape: 'circle',
+						eventName: 'cancle'
+					}, {
+						text: '确定',
+						color: '#FFFFFF',
+						bgColor: '#007AFF',
+						width: '220rpx',
+						height: '80rpx',
+						shape: 'circle',
+						eventName: 'sure'
+					}]
+				}
+			},
+			// 文本类型 1-展示文字 2-input 3-textarea
+			contentType:{
+				type:[Number,String],
+				default:1
+			},
+			// contentType为2或3时的字数限制
+			maxLength:{
+				type:Number,
+				default:20
+			},
+			// **************** 尺寸&大小 ****************
+			// modal整体宽度 rpx
+			modalWidth:{
+				type:String,
+				default:'580rpx'
+			},
+			// title区域文字大小
+			titleSize:{
+				type:String,
+				default:'32rpx'
+			},
+			// content区域文字大小
+			contentSize:{
+				type:String,
+				default:'28rpx'
+			},
+			// 底部(按钮)区域的字号
+			bottomFontSize:{
+				type:String,
+				default:'28rpx'
+			},
+			// title(标题) 区域的padding
+			titlePadding:{
+				type:String,
+				default:'20rpx 0'
+			},
+			// content(内容) 区域的padding
+			contentPadding:{
+				type:String,
+				default:'10rpx 40rpx'
+			},
+			// 底部(按钮)区域的padding
+			bottomPadding:{
+				type:String,
+				default:'30rpx 40rpx'
+			},
+			// **************** 颜色 ****************
+			// 标题文字颜色
+			titleColor:{
+				type:String,
+				default:'#333333'
+			},
+			// 内容文字颜色
+			contentColor:{
+				type:String,
+				default:'#333333'
+			},
+			// placeholderColor-提示文字的颜色
+			placeholderColor:{
+				type:String,
+				default:'#999'
+			},
+			inputBorderColor:{
+				type:String,
+				default:'#999'
+			},
+			// **************** 内容 ****************
+			// 标题内容
+			titleText:{
+				type:String,
+				default:'titleText'
+			},
+			// 文本内容
+			contentText:{
+				type:String,
+				default:'Please type in your text'
+			},
+			// input或textarea的placeholder
+			placeholderText:{
+				type:String,
+				default:'请输入你的内容'
+			}
+		},
+		computed:{
+			btnLength(){
+				return this.btnGroup.length
+			},
+			placeholderStyleString(){
+				return `color:${this.placeholderColor};font-size:${this.contentSize}`
+			}
+		},
+		data() {
+			return {
+				// 底部按钮shape对应值
+				shapeObj:{
+					'circle':'1000rpx',
+					'straight':'0',
+					'fillet':'12rpx'
+				},
+				inputText:'',
+				textareaText:'',
+				// ***校验项,是否通过,true-通过,false不通过
+				checkCollection: {
+					isRequired :function(val){
+						return !(val === null || val === '' || val === undefined)
+					},
+					isNumber :function(val){
+						let reg = /^\+?[0-9][0-9]*$/
+						return reg.test(val)
+					},
+					isChinese :function(val){
+						let reg = /^[\u4e00-\u9fa5]+$/
+						return reg.test(val)
+					},
+					isEnglish :function(val){
+						let reg = /^[a-zA-Z]+$/
+						return reg.test(val)
+					},
+					isEmail :function(val){
+						let reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
+						return reg.test(val)
+					},
+					isIdNum :function(val){
+						let reg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
+						return reg.test(val)
+					}
+				}
+			};
+		},
+		methods:{
+			btnClick(index){
+				let val = this.contentType==2?this.inputText:this.textareaText
+				if(this.check && this.checkItem.length && this.contentType!=1){
+					let err = false
+					// 进入校验,如果不通过直接返回,通过则吐出按钮事件
+					for(let item of this.checkItem){
+						if(!this.checkCollection[item](val)){
+							this.$emit('error',item)
+							err = true
+							break
+						}
+					}
+					if(err) return
+				}
+				let selfCheckArr = Object.entries(this.selfCheckItem)
+				if(this.check && selfCheckArr.length && this.contentType!=1){
+					let err = false
+					for(let item of selfCheckArr){
+						let reg = new RegExp(item[1])
+						if(!reg.test(val)){
+							this.$emit('error',item[0])
+							err = true
+							break
+						}
+					}
+					if(err) return
+				}
+				this.$emit(this.btnGroup[index]['eventName'],{
+					inputText:this.inputText || '',
+					textareaText:this.textareaText || ''
+				})
+				this.inputText = ''
+				this.textareaText = ''
+			}
+		}
+	}
+</script>
+
+<style>
+	.mask {
+		position: fixed;
+		z-index: 98;
+		background-color: rgba(0, 0, 0, .7);
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		visibility: hidden;
+		opacity: 0;
+		transition: all .3s;
+	}
+
+	.modal-box {
+		background-color: #FFFFFF;
+		position: fixed;
+		z-index: 99;
+		border-radius: 12rpx;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%, -50%);
+	}
+
+	.modal-title {
+		box-sizing: border-box;
+		color: #333333;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.modal-content {
+		box-sizing: border-box;
+		color: #333333;
+		word-break: break-all;
+		display: flex;
+		justify-content: center;
+	}
+
+	.model-bottom {
+		display: flex;
+		align-items: center;
+	}
+
+	.modal-btn {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	
+	.input-area{
+		border: 1rpx solid #999;
+		width: 100%;
+		padding:0 16rpx;
+		box-sizing: border-box;
+		height: 60rpx;
+		border-radius: 6rpx;
+		outline: none;
+	}
+	
+	textarea{
+		border: 1rpx solid #999;
+		width: 92%;
+		padding:16rpx;
+		box-sizing: border-box;
+		border-radius: 6rpx;
+		height: 200rpx;
+	}
+
+</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>

+ 34 - 0
main.js

@@ -0,0 +1,34 @@
+import Vue from 'vue'
+import App from './App'
+
+Vue.config.productionTip = false
+import store from './store/index.js' // 确保路径正确
+Vue.prototype.$store = store;
+import uView from 'uview-ui'
+import {formatSeconds}from './utils/tools.js'
+Vue.prototype.$formatSeconds = formatSeconds;
+import {isLoginCourse,isLoginCourseqw} from './utils/common.js'
+import {isLoginCourseAuto} from '@/utils/courseTool.js'
+Vue.prototype.$isLoginCourse = isLoginCourse
+Vue.prototype.$isLoginCourseqw = isLoginCourseqw
+Vue.prototype.$isLoginCourseAuto = isLoginCourseAuto
+
+Vue.use(uView)
+// uni.$u.config.unit = 'rpx'
+  
+import utils from './utils/common.js'
+Vue.prototype.utils = utils;
+ 
+import {setData} from './utils/common.js'
+Vue.prototype.setData = setData;
+ 
+ 
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+
+
+ 
+ 

+ 79 - 0
manifest.json

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

+ 344 - 0
package-lock.json

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

+ 18 - 0
package.json

@@ -0,0 +1,18 @@
+{
+  "name": "zhongkmall_user_app",
+  "version": "1.0.0",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "description": "",
+  "dependencies": {
+    "crypto-js": "^4.2.0",
+    "dayjs": "^1.11.13",
+    "uview-ui": "^2.0.38",
+    "vuex": "^4.1.0"
+  }
+}

+ 1532 - 0
pages.json

@@ -0,0 +1,1532 @@
+{
+	"easycom": {
+		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/common/launch"
+		},
+		{
+			"path": "pages/auth/login",
+			"style": {
+				"navigationBarTitleText": "授权登录",
+				"navigationStyle": "custom"
+			}
+		},{
+			"path": "pages/auth/numberlogin",
+			"style": {
+				"navigationBarTitleText": "电话号码登录",
+				"navigationStyle": "custom"
+			}
+
+		},
+		{
+			"path": "pages/auth/wxLogin",
+			"style": {
+				"navigationBarTitleText": "公众号授权",
+				"navigationStyle": "custom"
+			}
+
+		},
+		{
+			"path": "pages/home/index",
+			"style": {
+				"navigationBarTitleText": "百域承品",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		// {
+		//           "path" : "pages/home/doctorCase",
+		//           "style" :                                                                                    
+		//           {
+		//               "navigationBarTitleText": "问诊案例",
+		// 		"app-plus": {
+		// 			"titleNView": false
+		// 		}
+		//           }
+
+		//       },
+		// {
+		//     "path" : "pages/doctor/doctorQr",
+		//     "style" :                                                                                    
+		//     {
+		//         "navigationBarTitleText": "用药咨询",
+		// 		"app-plus": {
+		// 			"titleNView": false
+		// 		}
+		//     }
+
+		// },
+		{
+			"path": "pages/home/productSearch",
+			"style": {
+				"navigationBarTitleText": "产品搜索",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+
+		},
+		{
+			"path": "pages/healthy/idea",
+			"style": {
+				"navigationBarTitleText": "百域档案",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/home/productList",
+			"style": {
+				"navigationBarTitleText": "产品列表",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/healthy/index",
+			"style": {
+				"navigationBarTitleText": "百域知识",
+				"enablePullDownRefresh": false,
+				"navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+
+		},
+		{
+			"path": "pages/healthy/detail",
+			"style": {
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path": "pages/healthy/readUsers",
+			"style": {
+				"navigationBarTitleText": "阅读用户",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		// {
+		//           "path" : "pages/doctor/index",
+		//           "style" :                                                                                    
+		//           {
+		//               "navigationBarTitleText": "问诊",
+		//               "navigationStyle": "custom",
+		//               "enablePullDownRefresh": false
+		//           }
+		//       },
+		// {
+		//           "path" : "pages/doctor/doctorList",
+		//           "style" :                                                                                    
+		//           {
+		//               "navigationBarTitleText": "医生列表",
+		//               "enablePullDownRefresh": false
+		//           }
+
+		//       },
+		// {
+		//           "path" : "pages/doctor/doctorDetail",
+		//           "style" :                                                                                    
+		//           {
+		//               "navigationBarTitleText": "医生详情",
+		//               "navigationStyle": "custom",
+		//               "enablePullDownRefresh": false
+		//           }
+
+		//       },
+		// {
+		//           "path" : "pages/doctor/submitOrder",
+		//           "style" :                                                                                    
+		//           {
+		//               "navigationBarTitleText": "发布问诊",
+		//               "enablePullDownRefresh": false
+		//           }
+
+		//       },
+		{
+			"path": "pages/shopping/index",
+			"style": {
+				"navigationBarTitleText": "商城",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false
+			}
+
+		},
+		{
+			"path": "pages/user/index",
+			"style": {
+				"navigationBarTitleText": "我的",
+				"navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		}, {
+			"path": "pages/shopping/productDetails",
+			"style": {
+				"navigationBarTitleText": "产品详情",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/shopping/cart",
+			"style": {
+				"navigationBarTitleText": "购物车",
+				"enablePullDownRefresh": false
+			}
+
+		}
+		// ,{
+		//     "path" : "pages/shopping/productList",
+		//     "style" :                                                                                    
+		//     {
+		//         "navigationBarTitleText": "产品列表",
+		//         "enablePullDownRefresh": false
+		//     }
+
+		// }
+		, {
+			"path": "pages/shopping/confirmOrder",
+			"style": {
+				"navigationBarTitleText": "确认订单",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/shopping/paymentOrder",
+			"style": {
+				"navigationBarTitleText": "去支付",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/shopping/payOrder",
+			"style": {
+				"navigationBarTitleText": "推荐服务支付",
+				"enablePullDownRefresh": false
+			}
+		},
+		//     {
+		//         "path" : "pages/shopping/prescribe",
+		//         "style" :                                                                                    
+		//         {
+		//             "navigationBarTitleText": "填写处方信息",
+		// "navigationStyle": "custom",
+		//             "enablePullDownRefresh": false
+		//         }
+
+		//     },
+		// {
+		//           "path" : "pages/doctor/doctorIm",
+		//           "style" :                                                                                    
+		//           {
+		//               "navigationBarTitleText": "问诊会话",
+		//               "enablePullDownRefresh": false
+		//           }
+
+		//       },
+		{
+			"path": "pages/shopping/success",
+			"style": {
+				"navigationBarTitleText": "支付成功",
+				"enablePullDownRefresh": false
+			}
+
+		},
+		// {
+		//     "path" : "pages/doctor/paymentOrder",
+		//     "style" :                                                                                    
+		//     {
+		//         "navigationBarTitleText": "去支付",
+		//         "enablePullDownRefresh": false
+		//     }
+
+		// }
+		// ,{
+		//     "path" : "pages/doctor/doctorOrderIM",
+		//     "style" :                                                                                    
+		//     {
+		//         "navigationBarTitleText": "问诊会话",
+		//         "enablePullDownRefresh": false
+		//     }
+
+		// }
+		{
+			"path": "pages/home/content",
+			"style": {
+				"navigationBarTitleText": "详情",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/home/h5",
+			"style": {
+				"navigationBarTitleText": "详情",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/home/cert",
+			"style": {
+				"navigationBarTitleText": "资质证明",
+				"enablePullDownRefresh": false
+			}
+
+		}
+		// ,{
+		//     "path" : "pages/shopping/confirmPackageOrder",
+		//     "style" :                                                                                    
+		//     {
+		//         "navigationBarTitleText": "确认支付",
+		//         "enablePullDownRefresh": false
+		//     }
+
+		// }
+
+	],
+	"subPackages": [
+		// {
+		// 	"root": "pages_doctor",
+		// 	"pages": [
+		// 		{
+		// 		    "path" : "doctorDetail",
+		// 		    "style" :                                                                                    
+		// 		    {
+		// 		        "navigationBarTitleText": "医生详情",
+		// 		        "navigationStyle": "custom",
+		// 		        "enablePullDownRefresh": false
+		// 		    }
+		// 		},{
+		// 			  "path" : "doctorIm",
+		// 			  "style" :                                                                                    
+		// 			  {
+		// 				  "navigationBarTitleText": "问诊会话",
+		// 				  "enablePullDownRefresh": false
+		// 			  }
+		// 		},{
+		// 			"path" : "doctorList",
+		// 			"style" :                                                                                    
+		// 			{
+		// 			    "navigationBarTitleText": "医生列表",
+		// 			    "enablePullDownRefresh": false
+		// 			}
+		// 		},{
+		// 			"path" : "doctorOrderIM",
+		// 			"style" :                                                                                    
+		// 			{
+		// 				"navigationBarTitleText": "问诊会话",
+		// 				"enablePullDownRefresh": false
+		// 			}
+		// 		},{
+		// 			"path" : "doctorQr",
+		// 			"style" :                                                                                    
+		// 			{
+		// 				"navigationBarTitleText": "用药咨询",
+		// 				"app-plus": {
+		// 					"titleNView": false
+		// 				}
+		// 			}
+		// 		},{
+		// 			"path" : "index",
+		// 			"style" :                                                                                    
+		// 			{
+		// 				"navigationBarTitleText": "问诊",
+		// 				"navigationStyle": "custom",
+		// 				"enablePullDownRefresh": false
+		// 			}
+		// 		},{
+		// 			"path" : "paymentOrder",
+		// 			"style" :                                                                                    
+		// 			{
+		// 			    "navigationBarTitleText": "去支付",
+		// 			    "enablePullDownRefresh": false
+		// 			}
+		// 		},{
+		// 			  "path" : "submitOrder",
+		// 			  "style" :                                                                                    
+		// 			  {
+		// 				  "navigationBarTitleText": "发布问诊",
+		// 				  "enablePullDownRefresh": false
+		// 			  }
+		// 		}
+		// 	]
+		// },
+		{
+			"root": "pages_index",
+			"pages": [{
+					"path": "index/medicatedFoodList",
+					"style": {
+						"navigationBarTitleText": "药膳食疗",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/medicatedFoodDetails",
+					"style": {
+						"navigationBarTitleText": "药膳食疗",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+
+				{
+					"path": "index/vesselList",
+					"style": {
+						"navigationBarTitleText": "经络穴位",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/vesselDetails",
+					"style": {
+						"navigationBarTitleText": "经络穴位",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/questionsList",
+					"style": {
+						"navigationBarTitleText": "问答专区",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/questionsDetails",
+					"style": {
+						"navigationBarTitleText": "问答专区",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/diseaseList",
+					"style": {
+						"navigationBarTitleText": "疾病列表",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/diseaseDetails",
+					"style": {
+						"navigationBarTitleText": "疾病",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+
+				{
+					"path": "index/chineseMedicineList",
+					"style": {
+						"navigationBarTitleText": "中药图解",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/chineseMedicineDetails",
+					"style": {
+						"navigationBarTitleText": "中药图解",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+
+				{
+					"path": "index/famousPrescribeList",
+					"style": {
+						"navigationBarTitleText": "名方今用",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/famousPrescribeDetails",
+					"style": {
+						"navigationBarTitleText": "名方今用",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+
+
+				{
+					"path": "index/test",
+					"style": {
+						"navigationBarTitleText": "测一测",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/testList",
+					"style": {
+						"navigationBarTitleText": "测一测",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/testDetails",
+					"style": {
+						"navigationBarTitleText": "测一测",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/testResult",
+					"style": {
+						"navigationBarTitleText": "测试结果",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/articleList",
+					"style": {
+						"navigationBarTitleText": "百域知识",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/articleDetails",
+					"style": {
+						"navigationBarTitleText": "文章详情",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+
+				{
+					"path": "index/doctorArticleList",
+					"style": {
+						"navigationBarTitleText": "康复医案",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index/doctorArticleDetails",
+					"style": {
+						"navigationBarTitleText": "康复医案",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}
+			]
+		},
+
+
+		{
+			"root": "pages_user",
+			"pages": [{
+					"path": "user/addPatient",
+					"style": {
+						"navigationBarTitleText": "创建百域档案",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}, {
+					"path": "user/message",
+					"style": {
+						"navigationBarTitleText": "消息",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/msgDetail",
+					"style": {
+						"navigationBarTitleText": "系统消息",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/storeOrder",
+					"style": {
+						// "navigationBarTitleText": "我的服务",
+						"navigationBarTitleText": "我的订单",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/storeOrderDetail",
+					"style": {
+						"navigationBarTitleText": "服务详情",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/doctorOrder",
+					"style": {
+						"navigationBarTitleText": "问诊列表",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/patient",
+					"style": {
+						"navigationBarTitleText": "百域档案",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/addAddress",
+					"style": {
+						"navigationBarTitleText": "新建收货地址",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/address",
+					"style": {
+						"navigationBarTitleText": "收货地址",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/integral",
+					"style": {
+						"navigationBarTitleText": "我的积分",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/refundOrderList",
+					"style": {
+						"navigationBarTitleText": "售后服务",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/refundOrderDetail",
+					"style": {
+						"navigationBarTitleText": "处理进度",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/refundOrderLogs",
+					"style": {
+						"navigationBarTitleText": "退款详情",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/storeOrderDelivery",
+					"style": {
+						"navigationBarTitleText": "物流信息",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/refundOrder",
+					"style": {
+						"navigationBarTitleText": "申请售后",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/prescribeOrder",
+					"style": {
+						"navigationBarTitleText": "处方单",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/pay",
+					"style": {
+						"navigationBarTitleText": "收款",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/success",
+					"style": {
+						"navigationBarTitleText": "支付结果",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/refundOrderProduct",
+					"style": {
+						"navigationBarTitleText": "订单售后",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/refundOrderDelivery",
+					"style": {
+						"navigationBarTitleText": "物流信息",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTui",
+					"style": {
+						"navigationBarTitleText": "我的推广",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiProduct",
+					"style": {
+						"navigationBarTitleText": "推广产品",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiImg",
+					"style": {
+						"navigationBarTitleText": "推广海报",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiList",
+					"style": {
+						"navigationBarTitleText": "我的推荐人",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiMoneyList",
+					"style": {
+						"navigationBarTitleText": "佣金记录",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiOrderList",
+					"style": {
+						"navigationBarTitleText": "服务记录",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/storeProductRelation",
+					"style": {
+						"navigationBarTitleText": "我的足迹",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/personInfo",
+					"style": {
+						"navigationBarTitleText": "个人信息",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiMoney",
+					"style": {
+						"navigationBarTitleText": "提现管理",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiExtractLog",
+					"style": {
+						"navigationBarTitleText": "提现记录",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/doc",
+					"style": {
+						"navigationBarTitleText": "百域档案",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/addDoc",
+					"style": {
+						"navigationBarTitleText": "创建百域档案",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/docDetail",
+					"style": {
+						"navigationBarTitleText": "百域档案",
+						"navigationBarBackgroundColor": "#dff9f5",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/docRecord",
+					"style": {
+						"navigationBarTitleText": "百域记录",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/addDocRecord",
+					"style": {
+						"navigationBarTitleText": "添加百域记录",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/userTuiAdd",
+					"style": {
+						"navigationBarTitleText": "申请推广员",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/paymentOrderRemain",
+					"style": {
+						"navigationBarTitleText": "支付尾款",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/otherPaymentOrder",
+					"style": {
+						"navigationBarTitleText": "亲友代付",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/otherPaySuccess",
+					"style": {
+						"navigationBarTitleText": "支付成功",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "user/otherPaymentOrderRemain",
+					"style": {
+						"navigationBarTitleText": "亲友代付尾款",
+						"enablePullDownRefresh": false
+					}
+
+				}
+
+			]
+		},
+		{
+			"root": "pages_company",
+			"pages": [{
+					"path": "auth/login",
+					"style": {
+						"navigationBarTitleText": "销售员登录",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "index",
+					"style": {
+						"navigationBarTitleText": "销售管理首页",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},{
+					"path": "shareLive",
+					"style": {
+						"navigationBarTitleText": "分享直播间",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "storeOrder",
+					"style": {
+						"navigationBarTitleText": "服务管理",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}, {
+					"path": "storeOrderDetail",
+					"style": {
+						"navigationBarTitleText": "服务详情",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "storeProductPackage",
+					"style": {
+						"navigationBarTitleText": "产品套餐",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "storeProductPackageDetails",
+					"style": {
+						"navigationBarTitleText": "套餐详情",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "coupon",
+					"style": {
+						"navigationBarTitleText": "优惠券",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "couponDetails",
+					"style": {
+						"navigationBarTitleText": "优惠券详情",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "order/productList",
+					"style": {
+						"navigationBarTitleText": "产品列表",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "order/productDetails",
+					"style": {
+						"navigationBarTitleText": "产品详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/cart",
+					"style": {
+						"navigationBarTitleText": "购物车",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "order/confirmOrder",
+					"style": {
+						"navigationBarTitleText": "推荐服务信息",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "order/confirmCompanyOrder",
+					"style": {
+						"navigationBarTitleText": "推荐服务",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "order/coupon",
+					"style": {
+						"navigationBarTitleText": "制单优惠券",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "order/productShowDetails",
+					"style": {
+						"navigationBarTitleText": "产品详情",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "alipayImg",
+					"style": {
+						"navigationBarTitleText": "支付宝收款",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "wechatcode",
+					"style": {
+						"navigationBarTitleText": "微信收款码",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "card",
+					"style": {
+						"navigationBarTitleText": "我的名片",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				}
+			]
+		},
+		{
+			"root": "pages_shopping",
+			"pages": [{
+					"path": "shopping/confirmPackageOrder",
+					"style": {
+						"navigationBarTitleText": "确认支付",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "shopping/confirmCreateOrder",
+					"style": {
+						"navigationBarTitleText": "确认订单",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "shopping/productList",
+					"style": {
+						"navigationBarTitleText": "产品列表",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "shopping/coupon",
+					"style": {
+						"navigationBarTitleText": "优惠券",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "shopping/myCoupon",
+					"style": {
+						"navigationBarTitleText": "我的优惠券",
+						"enablePullDownRefresh": false
+					}
+
+				}, {
+					"path": "shopping/activityDetails",
+					"style": {
+						"navigationBarTitleText": "活动",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "live/storeOrderDetail",
+					"style": {
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+						
+					}
+
+				},{
+					"path": "live/complaint",
+					"style": {
+						"navigationBarTitleText": "我的反馈",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+{
+					"path": "live/complaintList",
+					"style": {
+						"navigationBarTitleText": "反馈与投诉",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/goods",
+					"style": {
+						"navigationBarTitleText": "商品详情",
+						"enablePullDownRefresh": false
+					}
+
+				},{
+					"path": "live/integral",
+					"style": {
+						"navigationBarTitleText": "积分",
+						"enablePullDownRefresh": false
+					}
+
+				},
+
+				{
+					"path": "live/order",
+					"style": {
+						"navigationBarTitleText": "我的订单",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/confirmCreateOrder",
+					"style": {
+						"navigationBarTitleText": "确认订单",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/paymentOrder",
+					"style": {
+						"navigationBarTitleText": "支付订单",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/refundOrder",
+					"style": {
+						"navigationBarTitleText": "申请售后",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "live/refundOrderProduct",
+					"style": {
+						"navigationBarTitleText": "订单售后",
+						"enablePullDownRefresh": false
+					}
+
+				},{
+					"path": "live/storeOrderDelivery",
+					"style": {
+						"navigationBarTitleText": "物流信息",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+
+				},
+				{
+					"path": "live/storeOrderRefundList",
+					"style": {
+						"navigationBarTitleText": "我的售后",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black"
+					}
+				},
+				
+				{
+					"path": "live/storeOrderRefundSubmit",
+					"style": {
+						"navigationBarTitleText": "提交售后",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+					}
+				},
+				{
+					"path": "live/success",
+					"style": {
+						"navigationBarTitleText": "支付成功",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/refundOrderDetail",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationStyle": "custom",
+						"scrollIndicator": "none",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				},
+				{
+					"path": "live/refundOrderDelivery",
+					"style": {
+						"navigationBarTitleText": "物流信息",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}
+
+			]
+		},
+		{
+			"root": "pages_manage",
+			"pages": [
+				{
+					"path": "login",
+					"style": {
+						"navigationBarTitleText": "登录",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "index",
+					"style": {
+						"navigationBarTitleText": "数据",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "dataDetails",
+					"style": {
+						"navigationBarTitleText": "课程数据详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "statistic",
+					"style": {
+						"navigationBarTitleText": "课程统计",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "manageDataDetail",
+					"style": {
+						"navigationBarTitleText": "销售详情",
+						"enablePullDownRefresh": false
+					}
+				}
+				
+				
+			]
+		},
+		{
+			"root": "pages_managedata",
+			"pages": [{
+					"path": "coursedetail",
+					"style": {
+						"navigationBarTitleText": "课程详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "vipdetail",
+					"style": {
+						"navigationBarTitleText": "会员详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "userInfo",
+					"style": {
+						"navigationBarTitleText": "用户信息",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "editUser",
+					"style": {
+						"navigationBarTitleText": "设置",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "lableSetup",
+					"style": {
+						"navigationBarTitleText": "标签设置",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "about",
+					"style": {
+						"navigationBarTitleText": "关于我们",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "users",
+					"style": {
+						"navigationBarTitleText": "审核销售",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "managedetail",
+					"style": {
+						"navigationBarTitleText": "审核销售",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "exprotList",
+					"style": {
+						"navigationBarTitleText": "审核列表",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "saleInfo",
+					"style": {
+						"navigationBarTitleText": "员工详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "changeVip",
+					"style": {
+						"navigationBarTitleText": "更换会员归属",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "voice",
+					"style": {
+						"navigationBarTitleText": "声音采集",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor": "#ffffff",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none" // 页面回弹
+						}
+					}
+				},{
+					"path" : "voiceItem",
+					"style" : 
+					{
+						"navigationBarTitleText" : "声音录制",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black",
+						"app-plus": {
+							"bounce": "none" // 页面回弹
+						}
+					}
+				},{
+					"path" : "voiceList",
+					"style" : 
+					{
+						"navigationBarTitleText" : "声音录制",
+						"enablePullDownRefresh": false,
+						"navigationBarBackgroundColor":"#ffffff",
+						"navigationBarTextStyle":"black",
+						"app-plus": {
+							"bounce": "none" // 页面回弹
+						}
+					}
+				}
+			]
+		},
+		{
+			"root": "pages_course",
+			"pages": [{
+					"path": "reward",
+					"style": {
+						"navigationBarTitleText": "领取奖励",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "becomeVIP",
+					"style": {
+						"navigationBarTitleText": "注册会员",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "becomeSale",
+					"style": {
+						"navigationBarTitleText": "注册销售",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "webview",
+					"style": {
+						"navigationBarTitleText": "授权登录",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "videovip",
+					"style": {
+						"navigationBarTitleText": "看课详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path" : "learn",
+					"style" : 
+					{
+						"navigationBarTitleText" : "百域生活方式指导",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "teacherClassroom",
+					"style": {
+						"navigationBarTitleText": "名师课堂",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "video",
+					"style": {
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false,
+						"navigationStyle": "custom"
+					}
+				}, {
+					"path": "livingList",
+					"style": {
+						"navigationBarTitleText": "课程列表",
+						"navigationBarTextStyle": "black",
+						"app-plus": {
+							"bounce": "none"
+						}
+					}
+				}, {
+					"path": "living",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationBarTextStyle": "black",
+						"enablePullDownRefresh": true,
+						"navigationStyle": "custom",
+						"softinputMode": "adjustResize", // 必须配置这个才能正常获取高度
+						"app-plus": {
+							"bounce": "none",
+							"videoFullscreen": true,
+							"videoAutoFullscreen": false,
+							"videoObjectFit": "contain"
+						},
+						"h5": {
+							"videoFullscreen": true
+						}
+					}
+				}
+			]
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "百域承品",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#FFFFFF"
+	},
+	"tabBar": {
+		"color": "#666666",
+		"selectedColor": "#2BC7B9",
+		// "custom": true, 
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"height": "64px",
+		"fontSize": "12px",
+		"iconWidth": "18px",
+		"spacing": "4px",
+		"list": [{
+				"pagePath": "pages/home/index",
+				"iconPath": "/static/tabbar/home.png",
+				"selectedIconPath": "/static/tabbar/home_sel.png",
+				"text": "首页"
+			},
+
+			// {
+			// 	"pagePath": "pages/healthy/index",
+			// 	"iconPath": "/static/tabbar/health.png",
+			// 	"selectedIconPath": "/static/tabbar/health_sel.png",
+			// 	"text": "百域百科"
+			// }
+			{
+				"pagePath": "pages/shopping/cart",
+				"iconPath": "/static/tabbar/cart.png",
+				"selectedIconPath": "/static/tabbar/cart_sel.png",
+				"text": "购物车"
+			},
+			// {
+			// 	"pagePath": "pages/shopping/index",
+			// 	"iconPath": "/static/tabbar/shop_mall.png",
+			// 	"selectedIconPath": "/static/tabbar/shop_mall_sel.png",
+			// 	"text": "百域商城"
+			// },
+			
+			// {
+			// 	"pagePath": "pages/healthy/idea",
+			// 	"iconPath": "/static/tabbar/archive.png",
+			// 	"selectedIconPath": "/static/tabbar/archive_sel.png",
+			// 	"text": "百域档案"
+			// },
+			{
+				"pagePath": "pages/user/index",
+				"iconPath": "/static/tabbar/my.png",
+				"selectedIconPath": "/static/tabbar/my_sel.png",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 424 - 0
pages/auth/login.vue

@@ -0,0 +1,424 @@
+<template>
+  <view class="container">
+    <!-- #ifdef MP-WEIXIN -->
+    <view  class="force-login-wrap">
+      <view class="force-login__content y-f">
+		  <view class="logo">
+		  	<view class="logo-img">
+		  		<!-- <image  :src="imgPath+'/app/images/logo.png'"></image> -->
+				<image  src="/static/logo.png"></image>
+		  	</view>
+		  	<view class="title">百域承品</view>
+		  </view>
+        <!-- <open-data class="user-avatar" type="userAvatarUrl"></open-data>
+        <open-data class="user-name" type="userNickName"></open-data> -->
+        <view class="login-notice">为了提供更优质的服务,请先登录</view>
+		
+		<button
+			class="author-btn"
+			open-type="getPhoneNumber"
+			@getphonenumber="phoneLogin"  >手机号一键登录</button>
+       <button class="close-btn" @tap="back">暂不登录</button>
+		 <view class="tips">
+			 <checkbox  :checked="isAgreement" @click="handleAgreement()" />
+			 <view  @click="handleAgreement()">您同意并接受</view>
+		 	<view class="btn"  @click="openH5('/h5/userAgreement')">《用户协议》</view>
+		 	<view class="btn" @click="openH5('/h5/privacyPolicy')">《隐私保护》</view>
+		 </view>
+      </view>
+    </view>
+    <!-- #endif -->
+	 
+    
+  </view>
+</template>
+
+<script>
+import { loginByMiniApp,getUserInfo,loginByMp } from '@/api/user'
+export default {
+	data() {
+		return {
+			code:null,
+			isAgreement:false,
+		}
+	},
+	computed: {
+		imgPath() {
+		  return this.$store.state.imgpath
+		},
+	},
+	onLoad(option) 
+	{
+		// #ifdef MP-WEIXIN
+		uni.$on('refreshLogin', () => {
+			uni.navigateBack({
+				delta:1
+			})
+		})
+		//选获取CODE,防止后请求的时候腾讯服务端未同步报错
+		this.getCode();
+		// #endif
+		
+		// #ifdef H5
+		if (this.checkWeixin()) {
+			this.getWxCode()
+		} else {
+			uni.showToast({
+				icon:'none',
+				title: "请在微信中打开",
+			});
+			//跳转到手机号密码登录
+		}
+		// #endif
+	 
+	},
+	onUnload() {
+	},
+	mounted() {
+    
+	},
+	methods: {
+		checkWeixin(){
+			var ua = window.navigator.userAgent.toLowerCase();
+			if (ua.match(/micromessenger/i) == 'micromessenger') {
+				return true;
+			} else {
+				return false;
+			}
+		},
+		//URL地址是否存在CODE
+		getUrlCode(name) {
+			return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1]
+				.replace(/\+/g, '%20')) || null
+		},
+		//获取微信CODE
+		getWxCode() {
+			//在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 
+			//http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
+			var appId="wxedde588767b358b1";
+			var url="http://h5.yjf.runtzh.com";
+			window.location.href ='https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent(url+"/#/pages/auth/wxLogin") +'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
+			//console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
+			// redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
+		},
+		handleAgreement(){
+			this.isAgreement=!this.isAgreement;
+		},
+		openH5(url){
+			var requestPath = uni.getStorageSync('requestPath');
+			uni.setStorageSync('url',requestPath+url);
+			uni.navigateTo({
+				url: '../home/h5'
+			})
+		},
+		getCode(){
+			var that=this;
+			this.utils.getProvider()
+			.then(provider => {
+				console.log('当前的环境商',provider)
+				if (!provider) {
+				  reject()
+				}
+				// uni登录
+				uni.login({
+					provider: provider,
+					success: async loginRes => {
+						that.code = loginRes.code
+					}
+				})
+			})
+			.catch(err => {
+				
+			})
+		},
+		// 微信用户手机号登录
+		phoneLogin(e) {
+			var that=this;
+			if(!this.isAgreement){
+				uni.showToast({
+					icon:'none',
+					title: "请先同意协议后再登录",
+				});
+				return false;
+			}
+			uni.showLoading({
+				title:"处理中..."
+			})
+			if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
+				this.utils.getProvider()
+				.then(provider => {
+					console.log('当前的环境商',provider)
+					if (!provider) {
+					  reject()
+					}
+					// uni登录
+					uni.login({
+						provider: provider,
+						success: async loginRes => {
+							console.log(loginRes)
+							let code = loginRes.code // 获取开发code
+							var userCode=uni.getStorageSync('userCode');
+							loginByMiniApp({
+							   encryptedData: e.mp.detail.encryptedData,
+							   iv: e.mp.detail.iv,
+							   code: code,
+							   userCode:userCode,
+							   appId:wx.getAccountInfoSync().miniProgram.appId,
+							})
+							.then( res => {
+								if(res.code==200){
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "登录成功",
+									});
+									uni.setStorageSync('AppToken',res.token);
+									uni.setStorageSync('userInfo',JSON.stringify(res.user));
+									uni.hideLoading()
+									//that.getUserInfo()
+									uni.$emit('refreshLogin');
+									uni.navigateBack({
+										delta:1
+									})
+								}
+								else{
+									uni.hideLoading();
+									uni.showToast({
+										icon:'none',
+										title: "授权登录失败,请重新登录",
+									});
+								}
+							   
+							 })
+							 .catch(error => {
+								console.log(error)
+								uni.hideLoading();
+								uni.showToast({
+									icon:'none',
+									title: "登录接口调用失败",
+								});
+							 })
+							 
+						}
+					})
+				})
+				.catch(err => {
+					uni.showToast({
+						icon:'none',
+						title: err,
+					});
+				})
+				 
+			} else {
+				uni.showToast({
+					title: '已拒绝授权',
+					icon: 'none',
+					duration: 2000,
+				})
+			}
+		},
+		back() {
+			// uni.switchTab({
+			// 	url: '/pages/home/index'
+			// });
+			uni.navigateBack()
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+	.logo{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.logo-img{
+			border: 4upx solid #FFFFFF;
+			box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
+			border-radius: 50%;
+			width: 80px;
+			height: 80px;
+			image{
+				border-radius: 50%;
+				width: 100%;
+				height: 100%;
+				overflow: hidden;
+			}
+		}
+		
+		.title{
+			margin-top: 20rpx;
+			font-size: 35rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #000;
+			margin-bottom: 30rpx;
+		}
+	}
+.container {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-start;
+  // position: relative;
+}
+
+.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%);
+
+    .user-avatar {
+		border: 4upx solid #FFFFFF;
+		box-shadow: 0px 5px 15px 2px rgba(0,0,0,0.1);
+		width: 160rpx;
+		height: 160rpx;
+		border-radius: 50%;
+		overflow: hidden;
+		margin-bottom: 40rpx;
+    }
+
+    .user-name {
+      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;
+    }
+
+    .author-btn {
+      width: 630rpx;
+      height: 80rpx;
+      background: linear-gradient(to right, #66b2ef  0%, #2BC7B9 100%);
+      background: -moz-linear-gradient(to right, #66b2ef 0%, #2BC7B9 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 #2BC7B9;
+      background: none;
+      font-size: 30rpx;
+      font-family: PingFang SC;
+      font-weight: 500;
+      color: #2BC7B9;
+    }
+  }
+}
+.tips{
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	checkbox{
+	}
+	.btn{
+		color: #2BC7B9;
+	}
+}
+
+
+.wx-login{
+	background: rgba(0,0,0,0.7);
+	z-index: 99999;
+	position: fixed;
+	top: 0;
+	left: 0;
+	height: 100%;
+	width: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	.form{
+		border-radius: 20rpx;
+		padding: 60rpx 30rpx;
+		width: 500upx;
+		height: 300upx;
+		background-color: #fff;
+		.title{
+			font-size: 32upx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			
+		}
+		.desc{
+			font-size: 28upx;
+			margin: 60upx 0upx 60upx 0upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+		}
+		.btn-box{
+			margin-top: 30rpx;
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			
+			.btn{
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				margin-left: 10upx;
+				width: 50%;
+				height: 80rpx;
+				border-radius: 5rpx;
+				background-color: #2BC7B9;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #fff;
+				position: relative;
+			}
+			.btn-close{
+				margin-right: 10upx;
+				width: 50%;
+				height: 80rpx;
+				border-radius: 5rpx;
+				border: 2rpx solid #2BC7B9;
+				background: none;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #2BC7B9;
+			}
+		}
+	}
+}
+.auth_btn{
+	width: 100%;
+	height: 100%;
+	top:0upx;
+	position: absolute;
+	opacity:0.0;
+}
+</style>

+ 761 - 0
pages/auth/numberlogin.vue

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

+ 107 - 0
pages/auth/wxLogin.vue

@@ -0,0 +1,107 @@
+<template>
+  <view class="container">
+    
+  </view>
+</template>
+
+<script>
+import { loginByMp } from '@/api/user'
+export default {
+	data() {
+		return {
+			code:null,
+		}
+	},
+	computed: {
+	},
+	onLoad(option) 
+	{
+		// #ifdef H5
+		if (this.checkWeixin()) {
+			let code = this.getUrlCode('code')
+			if (code==null||code==undefined) {
+				uni.showToast({
+					icon:'none',
+					title: "code不存在",
+				});
+			} else {
+				this.code = code
+				this.loginByMp();
+			}
+		} else {
+			uni.showToast({
+				icon:'none',
+				title: "请在微信中打开",
+			});
+			//跳转到手机号密码登录
+		}
+		// #endif
+	},
+	onUnload() {
+	},
+	mounted() {
+    
+	},
+	methods: {
+		loginByMp(){
+			let code = this.code // 获取开发code
+			var tuiUserId=uni.getStorageSync('tuiUserId');
+			uni.showLoading({
+				title:"处理中..."
+			})
+			loginByMp({
+			   code: code,
+			   tuiUserId:tuiUserId
+			})
+			.then( res => {
+				if(res.code==200||res.code==40163){
+					uni.hideLoading();
+					uni.showToast({
+						icon:'none',
+						title: "登录成功",
+					});
+					uni.setStorageSync('AppToken',res.token);
+					uni.setStorageSync('userInfo',JSON.stringify(res.user));
+					//that.getUserInfo()
+					uni.$emit('refreshLogin');
+					uni.reLaunch({
+						url:"/pages/home/index"
+					})
+				}
+				else{
+					uni.hideLoading();
+					uni.showToast({
+						icon:'none',
+						title: res.msg,
+					});
+				}
+			   
+			 })
+			 .catch(error => {
+				console.log(error)
+				uni.hideLoading();
+				uni.showToast({
+					icon:'none',
+					title: "登录接口调用失败",
+				});
+			 })
+		},
+		checkWeixin(){
+			var ua = window.navigator.userAgent.toLowerCase();
+			if (ua.match(/micromessenger/i) == 'micromessenger') {
+				return true;
+			} else {
+				return false;
+			}
+		},
+		//URL地址是否存在CODE
+		getUrlCode(name) {
+			return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1]
+				.replace(/\+/g, '%20')) || null
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+</style>

+ 111 - 0
pages/common/launch.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="content">
+		<view class="loadding" v-if="loadding==true">
+			<view class="circlebox">
+				<view class="circle"></view>
+				<image src="/static/logo.png"></image>
+			</view>
+			<text class="text">百域承品</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getDicts} from '@/api/index'
+	export default {
+		data() {
+			return {
+				loadding:true,
+			};
+		},
+		methods: {
+			
+			getDicts:function(){
+				getDicts().then(
+					res => {
+						if(res.code==200){
+							uni.setStorageSync('dicts',JSON.stringify(res));
+							
+						}else{
+							 
+						}
+						this.loadding=false;
+						this.navigatHandler();
+					},
+					rej => {}
+				);
+			},
+			navigatHandler: function() {
+				uni.reLaunch({
+					url: '../home/index',
+					animationType: 'pop-in',
+					animationDuration: 100
+				})
+			},
+			
+		},
+		onLoad() {
+			this.getDicts()
+		}
+	};
+ 
+</script>
+
+<style lang="scss">
+	content {
+		height: 100%;
+		width: 100%;
+		position: relative;
+		padding-top: 0;
+		
+	}
+	.circlebox {
+		position: relative;
+		width: 132rpx;
+		height:132rpx;
+	}
+	.circle {
+		width: 120rpx;
+		height:120rpx;
+		border: 6rpx solid #00c250;
+		border-radius: 50%;
+		border-right-color: transparent;
+		animation: progress linear 1s infinite;
+	}
+
+	@keyframes progress {
+		0% {
+			transform: rotate(0);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+	.loadding{
+		background-color: #fff;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 9999;
+		image{
+			border-radius: 50%;
+			// animation: load linear 1s infinite;
+			width: 120rpx;
+			height:120rpx;
+			position: absolute;
+			top: 6rpx;
+			left: 6rpx;
+		}
+		.text{
+			font-size: 28rpx;
+			margin-top: 20rpx;
+		}
+	}
+</style>

+ 294 - 0
pages/healthy/detail.vue

@@ -0,0 +1,294 @@
+<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.publishTime}}</view>
+			</view>
+			<!-- 正文 -->
+			<view class="full-text">
+				<view v-html="item.contents"></view>
+			</view>
+		</view>
+		<!-- 最近阅读 -->
+		<view class="recent-reads">
+			<view class="left">
+				<text class="label">最近阅读</text>
+				<view class="peop-box" @click="showUsers">
+					<view class="head-box">
+						<view class="head" v-for="(subitem,j) in views" :key="j">
+							<image :src="subitem.avatar==null?'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
+						</view>
+					</view>
+					<image class="arrow" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/arrow_gray.png" mode=""></image>
+				</view>
+			</view>
+			<!-- <view class="share-btn">
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/share.png" mode=""></image>
+				<text>分享</text>
+				<button  class="share" data-name="shareBtn" open-type="share">分享</button>
+			</view> -->
+		</view>
+		<!-- 咨询按钮 -->
+		<view class="inquiry">
+			<view class="content">
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/consult.png" mode=""></image>
+				<text class="text">咨询</text>
+				<button class="contact-btn" open-type="contact"></button>
+			</view>
+			
+		</view>
+	</view> 
+</template>
+
+<script>
+	import {getArticleByArticleId,updateView} from '@/api/article'
+	export default {
+		data() {
+			return {
+				articleId:null,
+				item:{},
+				views:[],
+			};
+		},
+		onLoad(option) {
+			this.articleId=option.articleId;
+			// this.utils.isLogin().then(res => {
+			// 	if(res){
+			// 		this.updateView();
+			// 	}
+			// })
+			uni.showShareMenu({
+				withShareTicket:true,
+				//小程序的原生菜单中显示分享按钮,才能够让发送给朋友与分享到朋友圈两个按钮可以点击
+				menus:["shareAppMessage","shareTimeline"] //不设置默认发送给朋友
+			})
+		},
+		onShow() {
+			this.getArticleByArticleId();
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: this.item.title,
+				path: '/pages/healthy/detail?articleId='+this.item.productId,
+				imageUrl: this.item.imageUrl //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: this.item.title,
+				query:'articleId='+this.item.articleId,
+				imageUrl: this.item.imageUrl //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+			
+		},
+		methods:{
+			updateView(){
+				updateView(this.articleId).then(
+					res => {
+					},
+					rej => {}
+				);
+			},
+			getArticleByArticleId(){
+				let data = {articleId:this.articleId};
+				getArticleByArticleId(data).then(
+					res => {
+						if(res.code==200){
+							this.item=res.data;
+							this.views=res.views;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 查看阅读用户
+			showUsers() {
+				uni.navigateTo({
+					url: './readUsers?articleId='+this.articleId
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		height: 100%;
+	}
+	.content{
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+	}
+	.detail-cont{
+		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{
+			font-size: 36upx;
+			font-family: PingFang SC;
+			// font-weight: 500;
+			color: #222222;
+			line-height: 60upx;
+			::v-deep {
+				section {
+					max-width: 100% !important;
+					box-sizing: border-box;
+					word-break: break-all; 
+				}
+				image {
+					max-width: 100% !important;
+				}
+			}
+		}
+	}
+	.recent-reads{
+		flex-shrink: 0;
+		box-sizing: border-box;
+		height: 121upx;
+		background: #FFFFFF;
+		border-top: 1px solid #F0F0F0;
+		padding: 0 40upx 0 37upx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		.left{
+			display: flex;
+			align-items: center;
+			.label{
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #666666;
+				line-height: 1;
+				margin-right: 20upx;
+			}
+			.peop-box{
+				display: flex;
+				align-items: center;
+				.head-box{
+					margin-right: 28upx;
+					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%;
+						}
+					}
+				}
+				.arrow{
+					width: 13upx;
+					height: 23upx;
+				}
+			}
+		}
+		.share-btn{
+			position: relative;
+			width: 240upx;
+			height: 80upx;
+			line-height: 80upx;
+			font-size: 30upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #FFFFFF;
+			background: #2BC7B9;
+			border-radius: 40upx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			image{
+				width: 32upx;
+				height: 32upx;
+				margin-right: 15upx;
+			}
+			.share{
+				position: absolute;
+				width: 100%;
+				height: 100%;
+				opacity: 0;
+			}
+		}
+	}
+	.inquiry{
+		width: 131upx;
+		height: 131upx;
+		position: fixed;
+		right: 22upx;
+		bottom: 193upx;
+		z-index: 99;
+		
+		.content{
+			position: relative;
+			image{
+				width: 100%;
+				height: 100%;
+				position: absolute;
+				top: 0;
+				left: 0;
+				z-index: 9;
+			}
+			.text{
+				position: absolute;
+				top: 70upx;
+				left: 50%;
+				transform: translateX(-50%);
+				z-index: 10;
+				font-size: 22upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #2BC7B9;
+				line-height: 1;
+			}
+			 
+		}
+		
+		
+	}
+	.contact-btn{
+		display: inline-block;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+		z-index: 9999;
+	}
+</style>

+ 239 - 0
pages/healthy/idea.vue

@@ -0,0 +1,239 @@
+<template>
+	<view class="content">
+		<view style="padding-top:100rpx;font-size: 40rpx;font-weight: bold;			margin-bottom: 20rpx;margin-left: 40rpx;">健康档案</view>
+		<view class="inner">
+			<view v-for="(item,index) in docs" :key="index" class="item" @click="showDetail(item)">
+				<view class="user-info">
+					<view class="name">{{item.userName}}</view>
+					<text class="gray-tag" v-if="item.sex==1">男</text>
+					<text class="gray-tag" v-if="item.sex==2">女</text>
+					<view class="gray-tag">{{utils.getAge(item.birthday)}}岁</view>
+					<view class="blue-tag">标签</view>
+				</view>
+			<!-- 	<view class="stage-box">
+					<text class="stage">阶段1:</text>
+					<text class="stage-text">药物治疗胰岛素降糖,洛氟沙星抗感染治疗中治疗中治疗中治疗中</text>
+				</view>
+				<view class="progress-box">
+					<progress :percent="80" activeColor="#4BC9B1" border-radius="5" stroke-width="5" />
+				</view> -->
+				<view class="period">建档时间 {{item.createTime}}</view>
+				<view class="period">备注 {{item.remark!=null?item.remark:''}}</view>
+			</view>
+			<view v-if="docs.length == 0" class="no-data-box" @click="getMyDocList()">
+				<image src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png" mode="aspectFit"></image>
+				<view class="empty-title">暂无数据</view>
+			</view>
+		</view>
+		<view class="btn-box">
+			<view class="sub-btn" @click="addDoc">创建档案</view>
+		</view>
+		<!-- <tabbar actindex="2"></tabbar> -->
+	</view>
+</template>
+
+<script>
+	import {getMyDocList,delDoc} from '@/api/doc.js'
+	export default {
+		data() {
+			return {
+				docs:[],
+			}
+		},
+		onLoad() {
+			this.getMyDocList()
+			uni.$on('refreshDoc', () => {
+				this.getMyDocList()
+			})
+		},
+		methods: {
+			showDetail(item){
+				uni.navigateTo({
+					url: './docDetail?docId='+item.docId
+				})
+			},
+			editDoc(item){
+				uni.navigateTo({
+					url: './addDoc?type=edit&docId='+item.docId
+				})
+			},
+			delDoc(item){
+				uni.showModal({
+					title:"提示",
+					content:"确认删除吗?",
+					showCancel:true,
+					cancelText:'取消',
+					confirmText:'确定',
+					success:res=>{
+						if(res.confirm){
+							// 用户点击确定
+							var data={docId:item.docId}
+							delDoc(data).then(
+								res => {
+									if(res.code==200){
+										 uni.showToast({
+										 	icon:'success',
+										 	title: "操作成功",
+										 });
+										 this.getMyDocList()
+									}else{
+										uni.showToast({
+											icon:'none',
+											title: "请求失败",
+										});
+									}
+								},
+								rej => {}
+							);
+														
+						}else{
+							// 否则点击了取消  
+						}
+					}
+				})
+			},
+			getMyDocList(){
+				uni.showLoading({
+					title:"正在加载中"
+				})
+				getMyDocList().then(
+					res => {
+						uni.hideLoading()
+						if(res.code==200){
+							this.docs=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			addDoc() {
+				uni.navigateTo({
+					url: './addDoc?type=add'
+				})
+			}
+			 
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		height: 100%;
+	}
+	.content{
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		.inner{
+			flex: 1;
+			padding: 20upx 20upx 160upx;
+			.item{
+				background: #FFFFFF;
+				border-radius: 20upx;
+				margin-bottom: 20upx;
+				padding: 40upx 30upx;
+				&:last-child{
+					margin-bottom: 0;
+				}
+				.user-info{
+					display: flex;
+					align-items: center;
+					.name{
+						font-size: 36upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+						line-height: 1;
+						margin-right: 20upx;
+					}
+					.gray-tag{
+						height: 46upx;
+						line-height: 46upx;
+						padding: 0 16upx;
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #333333;
+						background: #F7F7F7;
+						border-radius: 8upx;
+						margin-right: 10upx;
+					}
+					.blue-tag{
+						height: 46upx;
+						line-height: 46upx;
+						padding: 0 16upx;
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #4BC9B1;
+						background: #E2F6F2;
+						border-radius: 8upx;
+					}
+				}
+				.stage-box{
+					white-space: nowrap;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					margin-top: 34upx;
+					.stage{
+						font-size: 26upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						line-height: 1;
+					}
+					.stage-text{
+						font-size: 26upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						line-height: 1;
+					}
+				}
+				.progress-box{
+					margin-top: 18upx;
+				}
+				.period{
+					font-size: 28upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					line-height: 1;
+					margin-top: 40upx;
+				}
+			}
+			 
+		}
+		.btn-box{
+			z-index: 9999;
+			width: 100%;
+			padding: 30upx;
+			position: fixed;
+			bottom: 120rpx;
+			left: 0;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			
+	 
+			.sub-btn{
+				width: 100%;
+				height: 88upx;
+				line-height: 88upx;
+				text-align: center;
+				font-size: 30upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #FFFFFF;
+				background: #2BC7B9;
+				border-radius: 44upx;
+			}
+		}
+		 
+	}
+</style>

+ 351 - 0
pages/healthy/index.vue

@@ -0,0 +1,351 @@
+<template>
+	<view>
+		<view class="top-content">
+			<!-- 这里是状态栏 -->
+			<view class="status_bar" :style="{height: statusBarHeight}"></view>
+			<view class="top-title">百域百科</view>
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
+					<input type="text" v-model="searchValue" placeholder="输入关键字搜索" confirm-type="search" @confirm="doSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				</view>
+			</view>
+			<view class="keyword-list">
+			<!-- 关键字列表 -->
+			<scroll-view   scroll-x="true" >
+				<view class="inner">
+					<view v-for="(item,index) in cates" :key="index" :class="choseCateId == item.cateId?'item active':'item'" @click="choseCate(item)">
+						{{ item.cateName }}
+					</view>
+				</view>
+			</scroll-view>
+			</view>
+		</view>
+		<!-- 知识列表 -->
+		<mescroll-body  :top="top"  ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="know-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" v-if="item.viewsList!=null&&item.viewsList.length>0">
+									<view class="head" v-for="(subitem,j) in item.viewsList" :key="j" v-if="subitem!=null">
+										<image  :src="subitem.avatar==null?'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/detault_head.jpg':subitem.avatar" mode=""></image>
+									</view>
+								</view>
+								<view class="readings">
+									<image class="eye" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/eye.png" ></image>
+									<text class="num">{{item.views}}</text>
+								</view>
+							</view>
+							<view class="time">{{item.publishTime}}</view>
+						</view>
+					</view>
+					<view class="right">
+						<image :src="item.imageUrl" mode="aspectFill"></image>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+		<!-- <tabbar :actindex="1"></tabbar> -->
+	</view>
+</template>
+
+<script>
+	import {getArticleCate,getArticleList} from '@/api/article'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				top:'0px',
+				cates:[],
+				choseCateId:0,
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				searchValue: '',
+				mescroll:null,
+				// 上拉加载的配置
+				downOption:{
+					
+				},
+				upOption: {
+					onScroll:true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon:'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
+						tip: '暂无数据'
+					},
+					textNoMore:'已经到底了'
+				},
+				// 列表数据
+				dataList: [],
+			};
+		},
+		onShow() {
+			this.getArticleCate();
+			var that=this;
+			setTimeout(function(){
+				let query = uni.createSelectorQuery().select(".top-content");
+		      query.boundingClientRect(function(data) { //data - 各种参数
+		       	console.log(data.height)  // 获取元素宽度
+					that.top=data.height+"px";
+		      }).exec()
+			},500);
+			
+	// 		let info1 = uni.createSelectorQuery().select(".keyword-list");
+	//      info1.boundingClientRect(function(data) { //data - 各种参数
+	//        	console.log(data.height)  // 获取元素宽度
+				 
+	//       }).exec()
+			
+		},
+		methods:{
+			doSearch(){
+				console.log(this.searchValue)
+				this.mescroll.resetUpScroll()
+			},
+			getArticleCate(){
+				var that=this;
+				let data = {};
+				getArticleCate(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.searchValue,
+					cateId:this.choseCateId,
+					page: page.num,
+					pageSize: page.size
+				};
+				getArticleList(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.choseCateId = item.cateId;
+				this.mescroll.resetUpScroll()
+			},
+			// 查看详情
+			showDetail(item) {
+				uni.navigateTo({
+					url: './detail?articleId=' + item.articleId
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.status_bar {
+		width: 100%;
+		background-color: #FFFFFF;
+	}
+	.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;
+			}
+		}
+	}
+	.keyword-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: #2BC7B9;
+			background: #F5FFFE;
+			border: 1px solid #2BC7B9;
+			border-radius: 32upx;
+			margin: 0 20upx 20upx 0;
+			&.active{
+				color: #FFFFFF;
+				background: #2BC7B9;
+				border: 1px solid #2BC7B9;
+			}
+		}
+	}
+	.know-list{
+		margin-top: 20upx;
+		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>

Some files were not shown because too many files changed in this diff