puyao 5 months ago
parent
commit
7f658d17a1
100 changed files with 13138 additions and 0 deletions
  1. 17 0
      .gitignore
  2. 27 0
      .hbuilderx/launch.json
  3. 157 0
      App.vue
  4. 36 0
      README.en.md
  5. 37 0
      README.md
  6. 24 0
      api/activity.js
  7. 37 0
      api/address.js
  8. 6 0
      api/adv.js
  9. 28 0
      api/article.js
  10. 35 0
      api/common.js
  11. 29 0
      api/companyOrder.js
  12. 23 0
      api/companyUser.js
  13. 29 0
      api/coupon.js
  14. 9 0
      api/department.js
  15. 16 0
      api/disease.js
  16. 45 0
      api/doc.js
  17. 11 0
      api/doctorArticle.js
  18. 47 0
      api/doctorOrder.js
  19. 72 0
      api/index.js
  20. 22 0
      api/patient.js
  21. 11 0
      api/payment.js
  22. 21 0
      api/prescribe.js
  23. 65 0
      api/product.js
  24. 29 0
      api/storeAfterSales.js
  25. 79 0
      api/storeOrder.js
  26. 15 0
      api/storeProductPackage.js
  27. 24 0
      api/test.js
  28. 90 0
      api/user.js
  29. 17 0
      api/userSign.js
  30. 262 0
      assets/css/common.less
  31. 2 0
      assets/iconfont/iconfont.css
  32. BIN
      assets/iconfont/iconfont.ttf
  33. 83 0
      common/request.js
  34. 21 0
      components/Loading.vue
  35. 147 0
      components/Menu.vue
  36. 166 0
      components/chengpeng-audio/free-audio.vue
  37. 42 0
      components/chengpeng-audio/redme.md
  38. BIN
      components/chengpeng-audio/static/play.png
  39. BIN
      components/chengpeng-audio/static/stop.png
  40. 143 0
      components/evan-switch/evan-switch.vue
  41. 68 0
      components/im/base/common.js
  42. 146 0
      components/im/base/emojiMap.js
  43. 113 0
      components/im/base/message-facade.js
  44. 29 0
      components/im/tui-chat/message-elements/audio-message/index.css
  45. 67 0
      components/im/tui-chat/message-elements/audio-message/index.vue
  46. 103 0
      components/im/tui-chat/message-elements/custom-message/index.css
  47. 236 0
      components/im/tui-chat/message-elements/custom-message/index.vue
  48. 20 0
      components/im/tui-chat/message-elements/emoji/index.css
  49. 48 0
      components/im/tui-chat/message-elements/emoji/index.vue
  50. 13 0
      components/im/tui-chat/message-elements/face-message/index.css
  51. 57 0
      components/im/tui-chat/message-elements/face-message/index.vue
  52. 65 0
      components/im/tui-chat/message-elements/file-message/index.css
  53. 83 0
      components/im/tui-chat/message-elements/file-message/index.vue
  54. 13 0
      components/im/tui-chat/message-elements/image-message/index.css
  55. 54 0
      components/im/tui-chat/message-elements/image-message/index.vue
  56. 29 0
      components/im/tui-chat/message-elements/system-message/index.css
  57. 86 0
      components/im/tui-chat/message-elements/system-message/index.vue
  58. 47 0
      components/im/tui-chat/message-elements/text-message/index.css
  59. 55 0
      components/im/tui-chat/message-elements/text-message/index.vue
  60. 9 0
      components/im/tui-chat/message-elements/tip-message/index.css
  61. 46 0
      components/im/tui-chat/message-elements/tip-message/index.vue
  62. 27 0
      components/im/tui-chat/message-elements/video-message/index.css
  63. 53 0
      components/im/tui-chat/message-elements/video-message/index.vue
  64. 156 0
      components/im/tui-chat/message-input/index.css
  65. 574 0
      components/im/tui-chat/message-input/index.vue
  66. 70 0
      components/im/tui-chat/message-list/index.css
  67. 195 0
      components/im/tui-chat/message-list/index.vue
  68. 86 0
      components/im/tui-chat/message-private/common-words/index.css
  69. 85 0
      components/im/tui-chat/message-private/common-words/index.vue
  70. 178 0
      components/im/tui-chat/message-private/order-list/index.css
  71. 137 0
      components/im/tui-chat/message-private/order-list/index.vue
  72. 93 0
      components/im/tui-chat/message-private/service-evaluation/index.css
  73. 116 0
      components/im/tui-chat/message-private/service-evaluation/index.vue
  74. 181 0
      components/likeProduct.vue
  75. 315 0
      components/px-popup-bottom/px-popup-bottom.vue
  76. 136 0
      components/tabbar/tabbar.vue
  77. 325 0
      components/z-modal/z-modal.vue
  78. 26 0
      main.js
  79. 113 0
      manifest.json
  80. 35 0
      package-lock.json
  81. 11 0
      package.json
  82. 1231 0
      pages.json
  83. 109 0
      pages/auth/appLogin.vue
  84. 160 0
      pages/auth/forgetPassword.vue
  85. 387 0
      pages/auth/login.vue
  86. 205 0
      pages/auth/passwordLogin.vue
  87. 168 0
      pages/auth/register.vue
  88. 107 0
      pages/auth/wxLogin.vue
  89. 111 0
      pages/common/launch.vue
  90. 294 0
      pages/healthy/detail.vue
  91. 242 0
      pages/healthy/idea.vue
  92. 358 0
      pages/healthy/index.vue
  93. 121 0
      pages/healthy/readUsers.vue
  94. 72 0
      pages/home/cert.vue
  95. 279 0
      pages/home/components/HotProduct.vue
  96. 270 0
      pages/home/components/NewProduct.vue
  97. 80 0
      pages/home/content.vue
  98. 377 0
      pages/home/doctorCase.vue
  99. 40 0
      pages/home/h5.vue
  100. 2304 0
      pages/home/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/

+ 27 - 0
.hbuilderx/launch.json

@@ -0,0 +1,27 @@
+{
+    // 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" : [
+        {
+            "app-plus" : {
+                "launchtype" : "local"
+            },
+            "default" : {
+                "launchtype" : "local"
+            },
+            "h5" : {
+                "launchtype" : "local"
+            },
+            "mp-weixin" : {
+                "launchtype" : "local"
+            },
+            "provider" : "aliyun",
+            "type" : "uniCloud"
+        },
+        {
+            "playground" : "standard",
+            "type" : "uni-app:app-android"
+        }
+    ]
+}

+ 157 - 0
App.vue

@@ -0,0 +1,157 @@
+<script>
+	import Vue from 'vue'
+	// import TIM from 'tim-wx-sdk';
+	// import COS from 'cos-wx-sdk-v5';
+	export default {
+		onError(err) {
+		    console.error('全局错误捕获:', err);
+		  },
+		onLaunch: function() {
+			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')
+		},
+		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: {
+			// 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="scss">
+    /*每个页面公共css */
+	// @import 'animate.css';
+	@import "uview-ui/index.scss";
+	@import './assets/iconfont/iconfont.css';
+	@import './assets/css/common.less';
+	page{
+		background-color: #f6f6f6;
+	}
+	::-webkit-scrollbar{
+	    width: 0 !important;
+	    height: 0 !important;
+	    
+	}
+</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>
+ 

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# WBCrm_User_Uniapp
+
+#### Description
+wbcrm_user_app
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 37 - 0
README.md

@@ -0,0 +1,37 @@
+# WBCrm_User_Uniapp
+
+#### 介绍
+wbcrm_user_app
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 使用说明
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 参与贡献
+
+1.  Fork 本仓库
+2.  新建 Feat_xxx 分支
+3.  提交代码
+4.  新建 Pull Request
+
+
+#### 特技
+
+1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

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

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

+ 23 - 0
api/companyUser.js

@@ -0,0 +1,23 @@
+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');
+ }
+ 
+ 
+ 
+  
+ 
+ 

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

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

+ 72 - 0
api/index.js

@@ -0,0 +1,72 @@
+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 getpro(data) {
+ 	 return request('/app/common/getConfigByKey',data,'GET');
+ } 
+ export function getMenuB(data) {
+ 	 return request('/app/index/getMenuTwo',data,'GET');
+ }
+ 
+ 
+
+ 
+ 

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

+ 11 - 0
api/payment.js

@@ -0,0 +1,11 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+  
+ export function payment(data) {
+ 	 return request('/app/payment/payment',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');
+ }
+ 
+ 
+ 
+ 
+ 
+ 

+ 79 - 0
api/storeOrder.js

@@ -0,0 +1,79 @@
+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');
+ } 
+ 
+ 
+ 
+ 

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

+ 90 - 0
api/user.js

@@ -0,0 +1,90 @@
+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');
+ }
+ //app登录
+ export function login(data) {
+ 	 return request('/app/app/login',data,'POST','application/json;charset=UTF-8');
+ }
+ //app注册
+ export function register(data) {
+ 	 return request('/app/app/register',data,'POST','application/json;charset=UTF-8');
+ }
+ //微信
+ export function loginByWeChat(data) {
+ 	 return request('/app/app/loginByWeChat',data,'POST','application/json;charset=UTF-8');
+ }
+ //set手机号
+ export function setPhone(data) {
+ 	 return request('/app/app/setPhone',data,'POST','application/json;charset=UTF-8');
+ }
+ //获取图标
+ export function geticon(data) {
+ 	 return request('/app/index/getMenuUser',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 

+ 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, #38e663   0%, #018C39 100%);
+	border: 1px solid #018C39;
+}
+/* 选中后的 对勾样式 (白色对勾) */
+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, #38e663  0%, #018C39 100%);
+	border: 1px solid #018C39;
+	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%);
+	}
+}

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


BIN
assets/iconfont/iconfont.ttf


+ 83 - 0
common/request.js

@@ -0,0 +1,83 @@
+// uni-app请求封装
+export default class Request {
+	http(router, data = {}, method,contentType) {
+		let that = this;
+		//let path = 'http://localhost:7014';
+		// let path = 'https://work.natappvip.cc'
+		let path = 'http://1.95.39.2:7005';
+		//云联融智
+		// let path = 'https://userapp.his.cdwjyyh.com';
+		// let path = 'https://userapp.zhengzefeng.com';
+		uni.setStorageSync('requestPath',path)
+		// uni.showLoading({
+		// 	title: '加载中'
+		// });
+		return new Promise((resolve, reject) => {
+			let 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) => {
+					console.log(res)
+					//收到开发者服务器成功返回的回调函数
+					if(res.data.code==401){//没有权限直接退出到登录界面
+						let pages = getCurrentPages();
+						pages.forEach(function(element) {
+						  if(element!=undefined&&element.route=="/pages/auth/appLogin"){
+						  	resolve(res.data)
+						  	return;
+						  }
+						});
+						// let url = pages[ pages.length - 1]; //当前页页面实例
+						// //如果登录界面已打开,自动关闭
+						// if(url!=undefined&&url.route=="pages/auth/login"){
+						//  	resolve(res.data)
+						// 	return;
+						// }
+						uni.navigateTo({
+							url:'/pages/auth/appLogin',
+							success: () => {
+								uni.hideLoading();
+								
+							},
+							fail: () => {
+								uni.hideLoading();
+							}
+						})
+						return;
+					}
+					if (res.data.token) {
+						uni.setStorageSync('AppToken',res.data.token)
+					}
+					resolve(res.data)
+				},
+				fail:(res) =>{
+					//接口调用失败的回调函数
+				},
+				complete:(res) =>{
+					//接口调用结束的回调函数(调用成功、失败都会执行)
+					if (res.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.menuName" @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: #018C39;
+			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='#018C39'>
+			</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='/static/images/icon/play.png' endPic='/static/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: #018C39;
+		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="../../../../../static/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="/static/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="../../../../../static/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="../../../../../static/images/video-play.png"></image>
+	</view>
+</template>
+
+<script>
+import videoIcon from '../../../../../static/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: #018C39;
+}
+
+.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);
+	}
+}

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

@@ -0,0 +1,574 @@
+<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="handleCalling(1)">
+					<image class="TUI-Extension-icon" src="/static/assets/audio-calling.svg"></image>
+					<view class="TUI-Extension-slot-name">语音通话</view>
+				</view>
+				<view class="TUI-Extension-slot" @tap="handleCalling(2)">
+					<image class="TUI-Extension-icon" src="/static/assets/video-calling.svg"></image>
+					<view class="TUI-Extension-slot-name">视频通话</view>
+				</view> -->
+				<view class="TUI-Extension-slot" @tap="handleServiceEvaluation">
+					<image class="TUI-Extension-icon" src="/static/assets/service-assess.svg"></image>
+					<view class="TUI-Extension-slot-name">服务评价</view>
+				</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="'/static/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>

+ 181 - 0
components/likeProduct.vue

@@ -0,0 +1,181 @@
+<template>
+   <view>
+		<view class="like-title">
+			<image src="/static/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">{{item.price.toFixed(2)}}</text>
+						</view>
+						<view class="old">¥{{item.otPrice.toFixed(2)}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<Loading :loaded="loaded" :loading="loading"></Loading>
+   </view>
+</template>
+
+<script>
+  import {getGoodsProducts} from '@/api/product'
+  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
+		};
+	},
+	created() {
+	},
+	mounted() {
+		this.getGoodsProducts();
+	},
+	
+	methods: {
+		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 '@/static/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: iconClose
+			}
+		},
+		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>

+ 136 - 0
components/tabbar/tabbar.vue

@@ -0,0 +1,136 @@
+<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
+							}
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			switchTabs(item) {
+				console.log(12223)
+				uni.switchTab({
+					url: item.url
+				})
+			},
+			themeicon() {
+				this.tabbarList = [{
+						iconPath: "/static/images/home.png",
+						selectedIconPath: "/static/images/home_on.png",
+						Text: '首页',
+						url: '/pages/home/index',
+						isshowed:true
+					},
+					{
+						iconPath: "/static/images/ENCYCLOPEDIA.png",
+						selectedIconPath: "/static/images/ENCYCLOPEDIA_on.png",
+						Text: '健康百科',
+						url: '/pages/healthy/index',
+						isshowed:true
+					},
+					{
+						iconPath: "/static/images/mall.png",
+						selectedIconPath: "/static/images/mall_on.png",
+						Text: '健康产品',
+						url: '/pages/shopping/index',
+						isshowed:true
+					},
+					{
+						iconPath: "/static/images/mine.png",
+						selectedIconPath: "/static/images/mine_on.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: #018C39;
+	}
+	.tabbar-list{
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		font-size: 24rpx
+	}
+</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>

+ 26 - 0
main.js

@@ -0,0 +1,26 @@
+import Vue from 'vue'
+import App from './App'
+
+import { showLoginPage } from './utils/login.js'
+Vue.config.productionTip = false
+
+import uView from 'uview-ui'
+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;
+ Vue.prototype.$showLoginPage = showLoginPage;
+ 
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+
+
+ 
+ 

+ 113 - 0
manifest.json

@@ -0,0 +1,113 @@
+{
+    "name" : "云联商城",
+    "appid" : "__UNI__7FBC684",
+    "description" : "",
+    "versionName" : "1.0.1",
+    "versionCode" : 101,
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {
+            "OAuth" : {}
+        },
+        /* 应用发布信息 */
+        "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\"/>"
+                ]
+            },
+            // "plugins": {
+            // 	"oauth": {
+            // 	  "weixin": {
+            // 		"appid": "你的微信AppID",
+            // 		"UniversalLinks": "https://your-domain.com/ulink/" // iOS 必需
+            // 	  }
+            // 	}
+            // },
+            /* ios打包配置 */
+            "ios" : {
+                "dSYMs" : false
+            },
+            /* SDK配置 */
+            "sdkConfigs" : {
+                "oauth" : {
+                    "univerify" : {},
+                    "weixin" : {
+                        "appid" : "wx9e6519e1fbf2ee6b",
+                        "UniversalLinks" : ""
+                    }
+                }
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx703c4bd07bbd1695",
+        "lazyCodeLoading" : "requiredComponents",
+        "setting" : {
+            "urlCheck" : false,
+            "minified" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "获取位置用于给您推送相关信息"
+            }
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "title" : "果雨医选坊",
+        "devServer" : {
+            "https" : false
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : true
+            }
+        }
+    }
+}

+ 35 - 0
package-lock.json

@@ -0,0 +1,35 @@
+{
+    "name": "shop",
+    "version": "1.0.0",
+    "lockfileVersion": 3,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "shop",
+            "version": "1.0.0",
+            "dependencies": {
+                "animate.css": "^3.7.2",
+                "dayjs": "^1.11.13",
+                "uview-ui": "^2.0.37"
+            }
+        },
+        "node_modules/animate.css": {
+            "version": "3.7.2",
+            "resolved": "https://registry.npmmirror.com/animate.css/-/animate.css-3.7.2.tgz",
+            "integrity": "sha512-0bE8zYo7C0KvgOYrSVfrzkbYk6IOTVPNqkiHg2cbyF4Pq/PXzilz4BRWA3hwEUBoMp5VBgrC29lQIZyhRWdBTw=="
+        },
+        "node_modules/dayjs": {
+            "version": "1.11.13",
+            "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+            "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+        },
+        "node_modules/uview-ui": {
+            "version": "2.0.37",
+            "resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-2.0.37.tgz",
+            "integrity": "sha512-iBcWNmQa01Wr+z004G6XIVPDctOrJIAx7LObQceUAPxZh6kJYjIOAMp5JE1K4VpoMV5bKYDpCd0gmX+M4nTEQQ==",
+            "engines": {
+                "HBuilderX": "^3.1.0"
+            }
+        }
+    }
+}

+ 11 - 0
package.json

@@ -0,0 +1,11 @@
+{
+    "name": "shop",
+    "version": "1.0.0",
+    "description": "",
+    "keywords": [],
+    "dependencies": {
+        "animate.css": "^3.7.2",
+        "dayjs": "^1.11.13",
+        "uview-ui": "^2.0.37"
+    }
+}

+ 1231 - 0
pages.json

@@ -0,0 +1,1231 @@
+{
+	"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/wxLogin",
+			"style": {
+				"navigationBarTitleText": "公众号授权",
+				"navigationStyle": "custom"
+			}
+			
+		},
+		{
+			"path": "pages/home/index",
+			"style": {
+				"navigationBarTitleText": "云联商城",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": true
+				},
+				"tabBar": {
+				  "show": false  // 隐藏当前页面的TabBar
+				}
+			}
+		},
+		// {
+  //           "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": "商品搜索",
+				"enablePullDownRefresh": false
+            }
+            
+        },
+		{
+			"path" : "pages/healthy/idea",
+			"style": {
+				"navigationBarTitleText": "企业理念",
+			    "enablePullDownRefresh": false,
+			    "navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+            "path" : "pages/home/productList",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "商品列表",
+				"enablePullDownRefresh": false
+            }
+        },
+		{
+            "path" : "pages/healthy/index",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "健康知识",
+                "enablePullDownRefresh": false,
+                "navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+            }
+            
+        },
+		{
+            "path" : "pages/healthy/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "知识详情",
+                "enablePullDownRefresh": false
+            }
+        },
+		{
+            "path" : "pages/healthy/readUsers",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "阅读用户",
+                "enablePullDownRefresh": 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/productList",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "商品列表",
+		        "navigationStyle": "custom",
+		        "app-plus": {
+		        	"titleNView": 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
+		//     }
+		    
+		// }
+		,{
+		    "path" : "pages/shopping/confirmCreateOrder",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "确认订单",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+		    "path" : "pages/user/test",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "测一测",
+				"app-plus": {
+					"titleNView": false
+				}
+		    }
+		},
+		{
+			"path" : "pages/auth/appLogin",
+			"style" : 
+			{
+				"navigationBarTitleText" : "app登录",
+				"navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path" : "pages/auth/passwordLogin",
+			"style" : 
+			{
+				"navigationBarTitleText" : "密码登录",
+				"navigationStyle": "custom",
+				"app-plus": {
+					"titleNView": false
+				}
+			}
+		},
+		{
+			"path" : "pages/auth/register",
+			"style" : 
+			{
+				"navigationBarTitleText" : "用户注册"
+			}
+		},
+		{
+			"path" : "pages/auth/forgetPassword",
+			"style" : 
+			{
+				"navigationBarTitleText" : "忘记密码"
+			}
+		}
+		
+    ],
+	"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": "药膳食疗",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/medicatedFoodDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "药膳食疗",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				
+				{
+				    "path" : "index/vesselList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "经络穴位",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/vesselDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "经络穴位",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "index/questionsList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问答专区",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/questionsDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "问答专区",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				{
+				    "path" : "index/diseaseList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "疾病列表",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/diseaseDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "疾病",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				
+				{
+				    "path" : "index/chineseMedicineList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "中药图解",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/chineseMedicineDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "中药图解",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				
+				{
+				    "path" : "index/famousPrescribeList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "名方今用",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/famousPrescribeDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "名方今用",
+						"app-plus": {
+							"titleNView": false
+						}
+				    }
+				},
+				
+					
+				{
+				    "path" : "index/test",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测一测",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/testList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测一测",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/testDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测一测",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/testResult",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "测试结果",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/articleList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "健康知识",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/articleDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "知识详情",
+						"enablePullDownRefresh": false
+				    }
+				},
+				
+				{
+				    "path" : "index/doctorArticleList",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "康复医案",
+						"enablePullDownRefresh": false
+				    }
+				},
+				{
+				    "path" : "index/doctorArticleDetails",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "康复医案",
+						"enablePullDownRefresh": false
+				    }
+				}
+			]
+		},
+		
+		
+		{
+			"root": "pages_user",
+			"pages": [
+				{
+					"path": "user/addPatient",
+					"style": {
+						"navigationBarTitleText": "创建健康档案",
+						"enablePullDownRefresh": 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": "销售员登录",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "index",
+					"style": {
+						"navigationBarTitleText": "销售管理首页",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "storeOrder",
+					"style": {
+						"navigationBarTitleText": "服务管理",
+						"enablePullDownRefresh": false
+					}
+				}
+				,{
+					"path" : "storeOrderDetail",
+					"style" :                                                                                    
+					{
+						"navigationBarTitleText": "服务详情",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false
+					}
+					
+				},
+				{
+					"path": "storeProductPackage",
+					"style": {
+						"navigationBarTitleText": "商品套餐",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "storeProductPackageDetails",
+					"style": {
+						"navigationBarTitleText": "套餐详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "coupon",
+					"style": {
+						"navigationBarTitleText": "优惠券",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "couponDetails",
+					"style": {
+						"navigationBarTitleText": "优惠券详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/productList",
+					"style": {
+						"navigationBarTitleText": "商品列表",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/productDetails",
+					"style" :{
+					    "navigationBarTitleText": "商品详情",
+					    "enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/cart",
+					"style": {
+						"navigationBarTitleText": "购物车",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/confirmOrder",
+					"style": {
+						"navigationBarTitleText": "推荐服务信息",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/confirmCompanyOrder",
+					"style": {
+						"navigationBarTitleText": "推荐服务",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/coupon",
+					"style": {
+						"navigationBarTitleText": "制单优惠券",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "order/productShowDetails",
+					"style": {
+						"navigationBarTitleText": "商品详情",
+						"enablePullDownRefresh": false
+					}
+				},
+				{
+					"path": "alipayImg",
+					"style": {
+						"navigationBarTitleText": "支付宝收款",
+						"app-plus": {
+							"titleNView": false
+						}
+					}
+				},
+				{
+					"path": "card",
+					"style": {
+						"navigationBarTitleText": "我的名片",
+						"enablePullDownRefresh": false
+					}
+				}
+			]
+		},
+		{
+			"root": "pages_shopping",
+			"pages": [
+				{
+				    "path" : "shopping/confirmPackageOrder",
+				    "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
+				 	}
+				 	
+				 }
+				 
+			]
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "云联商城",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#FFFFFF"
+	},
+	"tabBar": {
+		"color": "#666666",
+		"selectedColor": "#018C39",
+		"custom": true,
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"height": "64px",
+		"fontSize":"12px",
+		"iconWidth":"18px",
+		"spacing": "4px",
+		"list": [{
+				"pagePath": "pages/home/index",
+				"iconPath": "/static/images/home.png",
+				"selectedIconPath": "/static/images/home_on.png",
+				"text": "首页"
+			},
+			{
+				"pagePath": "pages/healthy/index",
+				"iconPath": "/static/images/ENCYCLOPEDIA.png",
+				"selectedIconPath": "/static/images/ENCYCLOPEDIA_on.png",
+				"text": "健康百科"
+			},
+			// {
+			// 	"pagePath": "pages/healthy/idea",
+			// 	"iconPath": "/static/images/archive.png",
+			// 	"selectedIconPath": "/static/images/archive_sel.png",
+			// 	"text": "健康档案"
+			// },
+			{
+				"pagePath": "pages/shopping/index",
+				"iconPath": "/static/images/mall.png",
+				"selectedIconPath": "/static/images/mall_on.png",
+				"text": "健康产品"
+			},
+			{
+				"pagePath": "pages/user/index",
+				"iconPath": "/static/images/mine.png",
+				"selectedIconPath": "/static/images/mine_on.png",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 109 - 0
pages/auth/appLogin.vue

@@ -0,0 +1,109 @@
+<template>
+	<view>
+		<view class="top_text">
+			<view>您好,</view>
+			<view>欢迎来到云联商城!</view>
+		</view>
+		<view class="numberbtn">
+			<button @click="phoneLogin()" class="log-bnt log-a" :disabled="loading">
+			{{ loading ? '登录中...' : '本机号码一键登录' }}</button>
+			<view @click="otherLogin()" class="log-bnt log-b">其他方式登录</view>
+		</view>
+		<view class="tips">
+			 <checkbox  :checked="isAgreement" @click="handleAgreement()" color='#fff' 
+			 activeBackgroundColor='#018C39 ' borderColor='#EDEEEF' activeBorderColor='#EDEEEF'/>
+			 <view  @click="handleAgreement()">您同意并接受</view>
+			<view class="btn"  @click="openH5('/h5/userAgreement')">《用户协议》</view>
+			<view class="btn" @click="openH5('/h5/privacyPolicy')">《隐私保护》</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				isAgreement:false,
+				loading: false,      // 防止重复点击
+				loginType:3,//1账号密码  2:微信登录 3:手机号一键登录
+				providerList: [],    // 支持的登录服务列表
+				univerifyStyle: {    // 一键登录弹窗样式配置(可选)
+					fullScreen: true,
+					backgroundColor: '#ffffff'
+				}
+			}
+		},
+		methods: {
+			handleAgreement(){
+				this.isAgreement=!this.isAgreement;
+			},
+			openH5(url){
+				var requestPath = uni.getStorageSync('requestPath');
+				uni.setStorageSync('url',requestPath+url);
+				uni.navigateTo({
+					url: '../home/h5'
+				})
+			},
+			phoneLogin(){
+				if(!this.isAgreement){
+					uni.showToast({
+						icon:'none',
+						title: "请先同意协议后再登录",
+					});
+					return false;
+				}
+				this.$showLoginPage()
+			},
+			otherLogin(){
+				uni.navigateTo({
+					url:'/pages/auth/passwordLogin'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.top_text{
+		padding-top: 240rpx;
+		font-size: 52rpx;
+		font-weight: bold;
+		margin-left: 60rpx;
+	}
+	.numberbtn{
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding-top: 200rpx !important;
+		padding: 0 80rpx;
+	}
+	.log-bnt{
+		padding: 20rpx 0;
+		width: 100%;
+		text-align: center;
+	}
+	.log-a{
+		background: linear-gradient(135deg, #38e663 0%, #018C39 100%);
+		border-radius: 80rpx;
+		color: #fff;
+	}
+	.log-b{
+		border-radius: 80rpx;
+		border: 2rpx solid #999999;
+		margin-top: 40rpx;
+	}
+.tips{
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	.btn{
+		color: #018C39;
+	}
+}
+/deep/ .uni-checkbox-input {
+	border-radius: 50% !important;
+}
+</style>

+ 160 - 0
pages/auth/forgetPassword.vue

@@ -0,0 +1,160 @@
+<template>
+	<view style="padding-top: 40rpx;">
+		<veiw class="log">
+			<view class="form-items">
+				<u-icon name="account" color="#666" size="24" ></u-icon>
+				<input
+				      type="number" 
+				      v-model="phone" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      placeholder="手机号"
+				      maxlength="11"/>
+			</view>
+			<view class="form-items">
+				<u-icon name="lock" color="#666" size="24" ></u-icon>
+				<input
+				      type="password" 
+				      v-model="password" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      placeholder="密码(6-15个字符)"
+				      maxlength="15"/>
+			</view>
+			<view class="form-items codeitem">
+				<view style="display: flex;justify-content: flex-start; align-items: center;">
+					<u-icon name="lock" color="#666" size="24"></u-icon>
+					<input
+					      type="number" 
+					      v-model="code" 
+						  style="flex: 1;margin-left: 16rpx;"
+					      placeholder="验证码"
+					      maxlength="11"/>
+				</view>
+				<view
+					class="captcha-btn"
+					:disabled="countdown > 0 || !isPhoneValid"
+					@click="sendSMcode"
+				  >
+					{{ countdown > 0 ? `${countdown}s后重试` : '获取验证码' }}
+				  </view>
+			</view>
+			<view class="submitlog" @click="submitlogs">设置新密码</view>
+		</veiw>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				phone:'',
+				password:'',
+				code: '', // 验证码
+				countdown: 0,  // 倒计时
+				timer: null  // 定时器
+			}
+		},
+		 computed: {
+		    // 手机号格式验证
+		    isPhoneValid() {
+		      return /^1[3-9]\d{9}$/.test(this.phone)
+		    }
+		  },
+		methods: {
+			// 校验密码
+			validatePassword() {
+			  return /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/.test(this.password);
+			},
+			sendSMcode(){
+				if (!this.isPhoneValid) {
+					return uni.showToast({ title: '手机号格式错误', icon: 'none' })
+				}
+				  
+				// 显示加载状态
+				uni.showLoading({ title: '发送中...', mask: true })
+				this.startCountdown()
+			},
+			// 开始倒计时
+			startCountdown() {
+			  this.countdown = 60
+			  this.timer = setInterval(() => {
+				if (this.countdown <= 0) {
+				  clearInterval(this.timer)
+				  return
+				}
+				this.countdown--
+				uni.hideLoading();
+			  }, 1000)
+			},
+			// 组件销毁时清除定时器
+			  beforeDestroy() {
+			    if (this.timer) clearInterval(this.timer)
+			  },
+			  submitlogs(){
+				  if(!this.phone){
+					  return uni.showToast({ title: '请输入手机号', icon: 'none' })
+				  }
+				  if (!this.isPhoneValid) {
+				  		return uni.showToast({ title: '手机号格式错误', icon: 'none' })
+				   }
+				   if(!this.password){
+				   		 return uni.showToast({ title: '请输入密码', icon: 'none' })
+				   }
+				  if (!this.validatePassword()) {
+				  		return uni.showToast({ title: '密码格式不正确', icon: 'none' })
+				   }
+				   
+			  }
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.log{
+	background: #fff ;
+	width: calc(100% - 20rpx);
+	margin: 10rpx ;
+	padding: 20rpx 0;
+	border-radius: 20rpx;
+	display: flex;
+	flex-direction: column;
+	.form-items{
+		background: #fff ;
+		display: flex;
+		align-items: center;
+		padding: 28rpx 0;
+		margin: 0 20rpx;
+		border-bottom: #eee solid 2rpx;
+	}
+}
+.submitlog{
+	background: linear-gradient(135deg, #38e663  0%, #018C39 100%);
+	border-radius: 80rpx;
+	color: #fff;
+	margin: 0 auto;
+	width: 80%;
+	padding: 20rpx 0;
+	text-align: center;
+	margin-top: 40rpx;
+}
+.captcha-btn {
+    width: 160rpx;
+    height: 60rpx;
+    line-height: 60rpx;
+    border-radius: 8rpx;
+    background: linear-gradient(135deg, #38e663  0%, #018C39 100%);
+    color: #fff;
+	text-align: center;
+    font-size: 28rpx;
+
+    &[disabled] {
+      background-color: #a2d7ff ;
+      color: #fff;
+    }
+  }
+  .codeitem{
+	  display: flex;
+	  justify-content: space-between;
+	  align-items: center;
+	  flex: 1;
+  }
+</style>

+ 387 - 0
pages/auth/login.vue

@@ -0,0 +1,387 @@
+<template>
+  <view class="container">
+    <!-- #ifdef MP-WEIXIN -->
+    <view  class="force-login-wrap">
+      <view class="force-login__content y-f">
+        <open-data class="user-avatar" type="userAvatarUrl"></open-data>
+        <open-data class="user-name" type="userNickName"></open-data>
+        <view class="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: {
+	},
+	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="wx40593595e62f61ad";
+			// var url="http://h5.yjf.runtzh.com";
+			var appId="wx703c4bd07bbd1695";
+			var url="https://userapp.zhengzefeng.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
+							})
+							.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">
+.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, #38e663   0%, #018C39 100%);
+      background: -moz-linear-gradient(to right, #38e663  0%, #018C39 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 #018C39;
+      background: none;
+      font-size: 30rpx;
+      font-family: PingFang SC;
+      font-weight: 500;
+      color: #018C39;
+    }
+  }
+}
+.tips{
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	checkbox{
+	}
+	.btn{
+		color: #018C39;
+	}
+}
+
+
+.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: #018C39;
+				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 #018C39;
+				background: none;
+				font-size: 30rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #018C39;
+			}
+		}
+	}
+}
+.auth_btn{
+	width: 100%;
+	height: 100%;
+	top:0upx;
+	position: absolute;
+	opacity:0.0;
+}
+</style>

+ 205 - 0
pages/auth/passwordLogin.vue

@@ -0,0 +1,205 @@
+<template>
+	<view>
+		<view style="height: 90rpx;"></view>
+		<view style="padding-left: 30rpx;">
+			<u-icon name="close" color="#666" size="24" @click="backto()"
+			style="width: 40rpx;height: 40rpx;"></u-icon>
+		</view>
+		<view style="height: 260rpx;"></view>
+		<view class="detext">登录即可体验完整功能</view>
+		<veiw class="log">
+			<view class="form-items">
+				<u-icon name="account" color="#666" size="24" ></u-icon>
+				<input
+				      type="number" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      v-model="phone" 
+				      placeholder="请输入手机"
+				      maxlength="11"/>
+			</view>
+			<view class="form-items">
+				<u-icon name="lock" color="#666" size="24" ></u-icon>
+				<input
+				      type="password" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      v-model="password" 
+				      placeholder="请输入密码"
+				      maxlength="11"/>
+			</view>
+			<view class="submitlog" @click="submit()">登录</view>
+			<view class="forget">
+				<view @click="navTo('/pages/auth/register')">注册账号</view>
+				<view @click="navTo('/pages/auth/forgetPassword')">忘记密码</view>
+			</view>
+		</veiw>
+		<view class="tips">
+			 <checkbox  :checked="isAgreement" @click="handleAgreement()" color='#fff' 
+			 activeBackgroundColor='#018C39 ' borderColor='#EDEEEF' activeBorderColor='#EDEEEF'/>
+			 <view  @click="handleAgreement()">您同意并接受</view>
+			<view class="btn"  @click="openH5('/h5/userAgreement')">《用户协议》</view>
+			<view class="btn" @click="openH5('/h5/privacyPolicy')">《隐私保护》</view>
+		</view>
+		<!-- 第三方登录 -->
+		<view @click="handleWechatLogin()"  class="wechat-btn">
+			<image src="/static/images/wechat.png" style="width: 80rpx; height: 80rpx;"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {login} from '@/api/user.js'
+	export default {
+		data() {
+			return {
+				phone:'',
+				password:'',
+				isAgreement:false,
+				loginType:1
+			}
+		},
+		methods: {
+			// 校验手机号
+			validatePhone() {
+			  return /^1[3-9]\d{9}$/.test(this.phone);
+			},
+			// 跳转页面
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			}, 
+			backto(){
+				uni.navigateBack({
+					url:-1
+				})
+			},
+			handleAgreement(){
+				this.isAgreement=!this.isAgreement;
+			},
+			openH5(url){
+				var requestPath = uni.getStorageSync('requestPath');
+				uni.setStorageSync('url',requestPath+url);
+				uni.navigateTo({
+					url: '../home/h5'
+				})
+			},
+			handleWechatLogin(){
+				//微信登录
+				this.$showLoginPage("weixin");
+			},
+			submit(){
+				if (!this.phone) {
+					uni.showToast({ title: '请输入手机号', icon: 'none' });
+					return;
+				  }
+				if (!this.validatePhone()) {
+					uni.showToast({ title: '手机号格式错误', icon: 'none' });
+					return;
+				  }
+				  if (!this.password) {
+				  	uni.showToast({ title: '请输入密码', icon: 'none' });
+				  	return;
+				    }
+				if(!this.isAgreement){
+					uni.showToast({
+						icon:'none',
+						title: "请先同意协议后再登录",
+					});
+					return false;
+				}
+				const data={
+					phone:this.phone,
+					password:this.password,
+					loginType:this.loginType
+				}
+				login(data).then(res=>{
+					if(res.code==200){
+						uni.switchTab({
+							url:'/pages/home/index'
+						})
+						uni.showToast({
+							icon:'none',
+							title: '登录成功',
+						});
+						uni.setStorageSync('userInfo',res.user)
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: res.msg,
+						});
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.detext{
+	font-size: 40rpx;
+	font-weight: bold;
+	text-align: center;
+	margin-bottom: 40rpx;
+}
+.log{
+	background: #fff ;
+	width: calc(100% - 20rpx);
+	margin: 10rpx ;
+	padding: 20rpx 0;
+	border-radius: 20rpx;
+	display: flex;
+	flex-direction: column;
+	.form-items{
+		background: #fff ;
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+		padding: 28rpx 0;
+		margin: 0 20rpx;
+		border-bottom: #eee solid 2rpx;
+	}
+}
+.submitlog{
+	background: linear-gradient(135deg, #38e663  0%, #018C39 100%);
+	border-radius: 80rpx;
+	color: #fff;
+	margin: 0 auto;
+	width: 80%;
+	padding: 20rpx 0;
+	text-align: center;
+	margin-top: 40rpx;
+}
+.forget{
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 0 20rpx;
+	font-size: 24rpx;
+	color: #38e663  ;
+	margin: 20rpx 0;
+}
+.tips{
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	.btn{
+		color: #018C39;
+	}
+}
+/deep/ .uni-checkbox-input {
+	border-radius: 50% !important;
+}
+.wechat-btn {
+	margin-top: 100rpx !important;
+	margin: 0 auto;
+	width: fit-content;
+	padding: 16rpx;
+	display: flex;
+	align-items: center;
+	border-radius: 50%;
+	border: 2rpx solid #28c445;
+    }
+</style>

+ 168 - 0
pages/auth/register.vue

@@ -0,0 +1,168 @@
+<template>
+	<view style="padding-top: 40rpx;">
+		<veiw class="log">
+			<view class="form-items">
+				<u-icon name="account" color="#666" size="24" ></u-icon>
+				<input
+				      type="number" 
+				      v-model="phone" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      placeholder="请输入手机"
+				      maxlength="11"/>
+			</view>
+			<view class="form-items">
+				<u-icon name="lock" color="#666" size="24" ></u-icon>
+				<input
+				      type="password" 
+				      v-model="password" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      placeholder="密码(6-15个字符)"
+				      maxlength="15"/>
+			</view>
+			<view class="form-items">
+				<u-icon name="lock" color="#666" size="24" ></u-icon>
+				<input
+				      type="password" 
+				      v-model="subpassword" 
+					  style="flex: 1;margin-left: 16rpx;"
+				      placeholder="确认密码"
+				      maxlength="15"/>
+			</view>
+			<view class="submitlog" @click="submit()">注册</view>
+		</veiw>
+		<view class="tips">
+			 <checkbox  :checked="isAgreement" @click="handleAgreement()" color='#fff' 
+			 activeBackgroundColor='#018C39 ' borderColor='#EDEEEF' activeBorderColor='#EDEEEF'/>
+			 <view  @click="handleAgreement()">您同意并接受</view>
+			<view class="btn"  @click="openH5('/h5/userAgreement')">《用户协议》</view>
+			<view class="btn" @click="openH5('/h5/privacyPolicy')">《隐私保护》</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {register} from '@/api/user.js'
+	export default {
+		data() {
+			return {
+				phone:'',
+				password:'',
+				subpassword:'',
+				isAgreement:''
+			}
+		},
+		methods: {
+			handleAgreement(){
+				this.isAgreement=!this.isAgreement;
+			},
+			openH5(url){
+				var requestPath = uni.getStorageSync('requestPath');
+				uni.setStorageSync('url',requestPath+url);
+				uni.navigateTo({
+					url: '../home/h5'
+				})
+			},
+			 // 校验手机号
+			validatePhone() {
+			  return /^1[3-9]\d{9}$/.test(this.phone);
+			},
+			// 校验密码
+			validatePassword() {
+			  return /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/.test(this.password);
+			},
+			submit(){
+				if (!this.phone) {
+					uni.showToast({ title: '请输入手机号', icon: 'none' });
+					return;
+				  }
+				if (!this.validatePhone()) {
+					uni.showToast({ title: '手机号格式错误', icon: 'none' });
+					return;
+				  }
+				  if (!this.password) {
+				  	uni.showToast({ title: '请输入密码', icon: 'none' });
+				  return;
+				  }
+				if (!this.validatePassword()) {
+					uni.showToast({ title: '密码格式错误', icon: 'none' });
+				return;
+				}
+				if (!this.subpassword) {
+					uni.showToast({ title: '请输入确认密码', icon: 'none' });
+					return;
+					}
+				if (this.password!==this.subpassword) {
+					uni.showToast({ title: '两次输入密码不一致', icon: 'none' });
+					return;
+					}
+				if(!this.isAgreement){
+					uni.showToast({
+						icon:'none',
+						title: "请先同意协议后再登录",
+					});
+					return false;
+				}
+				const data={
+					phone:this.phone,
+					password:this.password
+				}
+				register(data).then(res=>{
+					console.log(res)
+					if(res.code==200){
+						uni.showToast({ title: '登录成功', icon: 'none' });
+						uni.navigateBack({
+							delta:1
+						})
+						console.log(res)
+					}else{
+						uni.showToast({ title: res.msg, icon: 'none' });
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.log{
+	background: #fff ;
+	width: calc(100% - 20rpx);
+	margin: 10rpx ;
+	padding: 20rpx 0;
+	border-radius: 20rpx;
+	display: flex;
+	flex-direction: column;
+	.form-items{
+		background: #fff ;
+		display: flex;
+		align-items: center;
+		padding: 28rpx 0;
+		margin: 0 20rpx;
+		border-bottom: #eee solid 2rpx;
+	}
+}
+.submitlog{
+	background: linear-gradient(135deg, #38e663  0%, #018C39 100%);
+	border-radius: 80rpx;
+	color: #fff;
+	margin: 0 auto;
+	width: 80%;
+	padding: 20rpx 0;
+	text-align: center;
+	margin-top: 40rpx;
+}
+.tips{
+	margin-top: 30rpx;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	font-size: 28rpx;
+	color: #000;
+	.btn{
+		color: #018C39;
+	}
+}
+/deep/ .uni-checkbox-input {
+	border-radius: 50% !important;
+}
+</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?'../../static/images/detault_head.jpg':subitem.avatar" mode=""></image>
+						</view>
+					</view>
+					<image class="arrow" src="../../static/images/arrow_gray.png" mode=""></image>
+				</view>
+			</view>
+			<view class="share-btn">
+				<image src="../../static/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="../../static/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: #018C39;
+			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: #018C39;
+				line-height: 1;
+			}
+			 
+		}
+		
+		
+	}
+	.contact-btn{
+		display: inline-block;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+		z-index: 9999;
+	}
+</style>

+ 242 - 0
pages/healthy/idea.vue

@@ -0,0 +1,242 @@
+<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="../../static/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()
+			})
+		},
+		onShow() {
+			uni.hideTabBar();
+		},
+		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: #018C39;
+				border-radius: 44upx;
+			}
+		}
+		 
+	}
+</style>

+ 358 - 0
pages/healthy/index.vue

@@ -0,0 +1,358 @@
+<template>
+	<view>
+		<view class="top-content">
+			<!-- 这里是状态栏 -->
+			<view class="status_bar" :style="{height: statusBarHeight}"></view>
+			<!-- #ifdef APP -->
+			<view class="top-title" style="padding-top: 70rpx;">健康百科</view>
+			<!-- #endif -->
+			<!-- 除了app外其它都生效 -->
+			<!-- #ifndef APP -->
+				<view class="top-title">健康百科</view>
+			<!-- #endif -->
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="../../static/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?'../../static/images/detault_head.jpg':subitem.avatar" mode=""></image>
+									</view>
+								</view>
+								<view class="readings">
+									<image class="eye" src="../../static/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:'/static/images/no_data.png',
+						tip: '暂无数据'
+					},
+					textNoMore:'已经到底了'
+				},
+				// 列表数据
+				dataList: [],
+			};
+		},
+		onShow() {
+			uni.hideTabBar();
+			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: #018C39;
+			background: #F5FFFE;
+			border: 1px solid #018C39;
+			border-radius: 32upx;
+			margin: 0 20upx 20upx 0;
+			&.active{
+				color: #FFFFFF;
+				background: #018C39;
+				border: 1px solid #018C39;
+			}
+		}
+	}
+	.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>

+ 121 - 0
pages/healthy/readUsers.vue

@@ -0,0 +1,121 @@
+<template>
+	<view>
+		<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+		<view class="user-list">
+			<view class="item" v-for="(item,index) in dataList" :key="index">
+				<view class="img-box">
+					<image :src="item.avatar==null?'../../static/images/detault_head.jpg':item.avatar" mode=""></image>
+				</view>
+				<text class="name">{{item.nickname}}</text>
+			</view>
+		</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {getArticleViewList} from '@/api/article';
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				articleId:null,
+				mescroll:null,
+				// 上拉加载的配置
+				upOption: {
+					onScroll:true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon:'/static/images/no_data.png',
+						tip: '暂无数据'
+					}
+				},
+				// 列表数据
+				dataList: [],
+				
+			};
+		},
+		onLoad(option) {
+			this.articleId=option.articleId;
+		},
+		methods:{
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					articleId:this.articleId,
+					page: page.num,
+					pageSize: page.size
+				};
+				getArticleViewList(data).then(res => {
+					if(res.code==200){
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list; 
+							
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+							 
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+			 
+		}
+	}
+</script>
+
+<style lang="scss">
+	.user-list{
+		background: #FFFFFF;
+		padding: 40upx 30upx;
+		margin-top: 20upx;
+		.item{
+			margin-bottom: 40upx;
+			display: flex;
+			align-items: center;
+			&:last-child{
+				margin-bottom: 0;
+			}
+			.img-box{
+				width: 80upx;
+				height: 80upx;
+				border-radius: 50%;
+				overflow: hidden;
+				margin-right: 30upx;
+				image{
+					width: 100%;
+					height: 100%;
+				}
+			}
+			.name{
+				font-size: 34upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #333333;
+			}
+		}
+	}
+</style>

+ 72 - 0
pages/home/cert.vue

@@ -0,0 +1,72 @@
+<template>
+	<view class="my-content">
+		<view class="item" v-for="item in certs">
+			<image @click="showImg(item)" :src="item"></image>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+ 
+ export default {
+ 	data() {
+ 		return {
+			 certs:[
+			 ]
+ 		}
+ 	},
+	onLoad(val) {
+		 var config=JSON.parse(uni.getStorageSync('config'));
+		 this.certs=config.certs && config.certs.split(",");
+		 console.log(this.certs)
+	},
+	methods: {
+		showImg(item) {
+			 //预览图片
+			 var urls=[];
+			 urls.push(item)
+			 console.log(urls)
+			 console.log(item)
+			 uni.previewImage({
+			 	urls: urls,
+			 	current: 0
+			 });
+		},
+	}
+	
+	
+ 	 
+ }
+ 
+ 
+</script>
+
+
+<style scoped lang="scss">
+page{
+	height: 100%;
+}
+.my-content{
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	.item{
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		margin: 30rpx;
+		width: 100%;
+		image{
+			
+			
+		}
+	}
+	
+}
+ 
+
+</style>

+ 279 - 0
pages/home/components/HotProduct.vue

@@ -0,0 +1,279 @@
+<template>
+    <view class="group-goods" v-if="detail.length>0">
+        <view class="title-box x-bc"  >
+            <text class="title">热门榜单</text>
+            <view class="group-people x-f" @tap="navTo('/pages/home/productList')">
+                <text class="tip">更多</text>
+                <text class="cuIcon-right"></text>
+            </view>
+        </view>
+        <view class="goods-box swiper-box x-f">
+            <swiper class="carousel" circular @change="swiperChange" :autoplay="true" interval="10000" duration="2000">
+                <swiper-item v-for="(goods, index) in goodsList" :key="index" class="carousel-item">
+                    <view class="goods-list-box x-f">
+                        <block v-for="mgoods in goods" :key="mgoods.productId" >
+                            <view class="min-goods"  @tap="showProduct(mgoods)"  >
+                                <view class="img-box">
+                                    <view class="tag">hot</view>
+                                    <image class="img" :src="mgoods.image" mode="widthFix"></image>
+                                </view>
+                                <view class="price-box">
+                                    <view class="y-f">
+                                        <text class="seckill-current">¥{{  mgoods.price  }}</text>
+                                        <text class="original">销量{{ mgoods.sales }}{{mgoods.unitName}}</text>
+                                    </view>
+                                </view>
+                                <view class="title">
+                                    <slot name="titleText"></slot>
+                                </view>
+                            </view>
+                        </block>
+                    </view>
+                </swiper-item>
+            </swiper>
+            <view class="swiper-dots" v-if="goodsList.length > 1">
+                <text :class="swiperCurrent === index ? 'dot-active' : 'dot'" v-for="(dot, index) in goodsList.length"
+                    :key="index"></text>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "HotProduct",
+         
+        data() {
+            return {
+                goodsList: [],
+                swiperCurrent: 0
+            };
+        },
+        props: {
+            detail: Array
+        },
+        computed: {},
+        created() {},
+        watch: {
+            detail(next) {
+                this.goodsList = this.sortData(next, 4);
+            }
+        },
+        methods: {
+            swiperChange(e) {
+                this.swiperCurrent = e.detail.current;
+            },
+            // 数据分层
+            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;
+            },
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			showProduct(item){
+				uni.navigateTo({
+					url: '/pages/shopping/productDetails?productId='+item.productId
+				})
+			},
+            
+        }
+    }
+</script>
+
+
+<style lang="scss" scoped>
+    .group-goods {
+        position: relative;
+        z-index: 1;
+		background: #FFFFFF;
+		border-radius: 16upx;
+		margin-bottom: 20upx;
+		margin-top: 20upx;
+		padding: 20upx;
+    }
+
+    .swiper-box,
+    .carousel {
+        width: 700rpx;
+        height: 240upx;
+        position: relative;
+        border-radius: 20rpx;
+
+        .carousel-item {
+            width: 100%;
+            height: 100%;
+            // padding: 0 28upx;
+            overflow: hidden;
+        }
+
+        .swiper-image {
+            width: 100%;
+            height: 100%;
+            // border-radius: 10upx;
+            background: #ccc;
+        }
+    }
+
+    .swiper-dots {
+        display: flex;
+        position: absolute;
+        left: 50%;
+        transform: translateX(-50%);
+        bottom: 0rpx;
+        z-index: 66;
+
+        .dot {
+            width: 45rpx;
+            height: 3rpx;
+            background: #eee;
+            border-radius: 50%;
+            margin-right: 10rpx;
+        }
+
+        .dot-active {
+            width: 45rpx;
+            height: 3rpx;
+            background: #a8700d;
+            border-radius: 50%;
+            margin-right: 10rpx;
+        }
+    }
+
+    // 今日必拼+限时抢购
+    .group-goods {
+        background: #fff;
+        border-radius: 20rpx;
+        overflow: hidden;
+
+        .title-box {
+            padding-bottom: 20rpx;
+
+            .title {
+                font-size: 32rpx;
+                font-weight: bold;
+            }
+
+            .group-people {
+                .time-box {
+                    font-size: 26rpx;
+                    color: #edbf62;
+
+                    .count-text-box {
+                        width: 30rpx;
+                        height: 34rpx;
+                        background: #edbf62;
+                        text-align: center;
+                        line-height: 34rpx;
+                        font-size: 24rpx;
+                        border-radius: 6rpx;
+                        color: rgba(#fff, 0.9);
+                        margin: 0 8rpx;
+                    }
+                }
+
+                .head-box {
+                    .head-img {
+                        width: 40rpx;
+                        height: 40rpx;
+                        border-radius: 50%;
+                        background: #ccc;
+                    }
+                }
+
+                .tip {
+                    font-size: 24rpx;
+                    padding-left: 30rpx;
+                    color: #999999;
+                }
+
+                .cuIcon-right {
+                    font-size: 30rpx;
+                    line-height: 28rpx;
+                    color: #666;
+                }
+            }
+        }
+
+        .goods-box {
+            .goods-item {
+                margin-right: 22rpx;
+
+                &:nth-child(4n) {
+                    margin-right: 0;
+                }
+            }
+        }
+        .min-goods{
+            margin-right: 22rpx;
+
+        }
+    }
+	.min-goods {
+	  width: 152rpx;
+	  background: #fff;
+	  .img-box {
+	    width: 152rpx;
+	    height: 152rpx;
+	    overflow: hidden;
+	    position: relative;
+	
+	    .tag {
+	      position: absolute;
+	      left: 0;
+	      bottom: 0rpx;
+	      z-index: 2;
+	      line-height: 35rpx;
+	      background: linear-gradient(132deg, rgba(243, 223, 177, 1), rgba(243, 223, 177, 1), rgba(236, 190, 96, 1));
+	      border-radius: 0px 18rpx 18rpx 0px;
+	      padding: 0 10rpx;
+	      font-size: 24rpx;
+	      font-family: PingFang SC;
+	      font-weight: bold;
+	      color: rgba(120, 79, 6, 1);
+	    }
+	
+	    .img {
+	      width: 100%;
+	      background-color: #ccc;
+	    }
+	  }
+	
+	  .price-box {
+	    width: 100%;
+	    margin-top: 10rpx;
+	
+	    .seckill-current {
+	      font-size: 30rpx;
+	      font-weight: 500;
+	      color: rgba(225, 33, 43, 1);
+	    }
+	
+	    .original {
+	      font-size: 20rpx;
+	      font-weight: 400;
+	      // text-decoration: line-through;
+	      color: rgba(153, 153, 153, 1);
+	      margin-left: 14rpx;
+	    }
+	  }
+	
+	  .title {
+	    font-size: 26rpx;
+	  }
+	}
+	
+</style>

+ 270 - 0
pages/home/components/NewProduct.vue

@@ -0,0 +1,270 @@
+<template>
+    <view class="group-goods" v-if="detail.length>0">
+        <view class="title-box x-bc"  >
+            <text class="title">新品首发</text>
+            <view class="group-people x-f" @tap="navTo('/pages/home/productList')">
+                <text class="tip">更多</text>
+                <text class="cuIcon-right"></text>
+            </view>
+        </view>
+        <view class="goods-box swiper-box x-f">
+            <swiper class="carousel" circular @change="swiperChange" :autoplay="true" interval="10000" duration="2000">
+                <swiper-item v-for="(goods, index) in goodsList" :key="index" class="carousel-item">
+                    <view class="goods-list-box x-f">
+                        <block v-for="mgoods in goods" :key="mgoods.productId"  >
+                            <view class="min-goods" @tap="showProduct(mgoods)"  >
+                                <view class="img-box">
+                                    <view class="tag">new</view>
+                                    <image class="img" :src="mgoods.image" mode="widthFix"></image>
+                                </view>
+                                <view class="price-box">
+                                    <view class="y-f">
+                                        <text class="seckill-current">¥{{  mgoods.price  }}</text>
+                                        <text class="original">销量{{ mgoods.sales }}{{mgoods.unitName}}</text>
+                                    </view>
+                                </view>
+                                <view class="title">
+                                    <slot name="titleText"></slot>
+                                </view>
+                            </view>
+                        </block>
+                    </view>
+                </swiper-item>
+            </swiper>
+            <view class="swiper-dots" v-if="goodsList.length > 1">
+                <text :class="swiperCurrent === index ? 'dot-active' : 'dot'" v-for="(dot, index) in goodsList.length"
+                    :key="index"></text>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        name: "NewProduct",
+         
+        data() {
+            return {
+                goodsList: [],
+                swiperCurrent: 0
+            };
+        },
+        props: {
+            detail: Array
+        },
+        computed: {},
+        created() {},
+        watch: {
+            detail(next) {
+                this.goodsList = this.sortData(next, 4);
+            }
+        },
+        methods: {
+            swiperChange(e) {
+                this.swiperCurrent = e.detail.current;
+            },
+            // 数据分层
+            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;
+            },
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			showProduct(item){
+				uni.navigateTo({
+					url: '/pages/shopping/productDetails?productId='+item.productId
+				})
+			}
+        }
+    }
+</script>
+
+
+<style lang="scss" scoped>
+    .group-goods {
+        position: relative;
+        z-index: 1;
+		background: #FFFFFF;
+		border-radius: 16upx;
+		margin-bottom: 20upx;
+		margin-top: 20upx;
+		padding: 20upx;
+    }
+    .swiper-box,.carousel {
+        width: 700rpx;
+        height: 240rpx;
+        position: relative;
+        border-radius: 20rpx;
+        .carousel-item {
+            width: 100%;
+            height: 100%;
+            // padding: 0 28upx;
+            overflow: hidden;
+        }
+        .swiper-image {
+            width: 100%;
+            height: 100%;
+            // border-radius: 10upx;
+            background: #ccc;
+        }
+    }
+    .swiper-dots {
+        display: flex;
+        position: absolute;
+        left: 50%;
+        transform: translateX(-50%);
+        bottom: 0rpx;
+        z-index: 66;
+        .dot {
+            width: 45rpx;
+            height: 3rpx;
+            background: #eee;
+            border-radius: 50%;
+            margin-right: 10rpx;
+        }
+        .dot-active {
+            width: 45rpx;
+            height: 3rpx;
+            background: #a8700d;
+            border-radius: 50%;
+            margin-right: 10rpx;
+        }
+    }
+
+    // 今日必拼+限时抢购
+    .group-goods {
+        background: #fff;
+        border-radius: 20rpx;
+        overflow: hidden;
+
+        .title-box {
+            padding-bottom: 20rpx;
+
+            .title {
+                font-size: 32rpx;
+                font-weight: bold;
+            }
+
+            .group-people {
+                .time-box {
+                    font-size: 26rpx;
+                    color: #edbf62;
+
+                    .count-text-box {
+                        width: 30rpx;
+                        height: 34rpx;
+                        background: #edbf62;
+                        text-align: center;
+                        line-height: 34rpx;
+                        font-size: 24rpx;
+                        border-radius: 6rpx;
+                        color: rgba(#fff, 0.9);
+                        margin: 0 8rpx;
+                    }
+                }
+
+                .head-box {
+                    .head-img {
+                        width: 40rpx;
+                        height: 40rpx;
+                        border-radius: 50%;
+                        background: #ccc;
+                    }
+                }
+
+                .tip {
+                    font-size: 24rpx;
+                    padding-left: 30rpx;
+                    color: #999999;
+                }
+
+                .cuIcon-right {
+                    font-size: 30rpx;
+                    line-height: 28rpx;
+                    color: #666;
+                }
+            }
+        }
+
+        .goods-box {
+            .goods-item {
+                margin-right: 22rpx;
+                &:nth-child(4n) {
+                    margin-right: 0;
+                }
+            }
+        }
+        .min-goods{
+            margin-right: 22rpx;
+
+        }
+    }
+	.min-goods {
+	  width: 152rpx;
+	  background: #fff;
+	  .img-box {
+	    width: 152rpx;
+	    height: 152rpx;
+	    overflow: hidden;
+	    position: relative;
+	
+	    .tag {
+	      position: absolute;
+	      left: 0;
+	      bottom: 0rpx;
+	      z-index: 2;
+	      line-height: 35rpx;
+	      background: linear-gradient(132deg, rgba(243, 223, 177, 1), rgba(243, 223, 177, 1), rgba(236, 190, 96, 1));
+	      border-radius: 0px 18rpx 18rpx 0px;
+	      padding: 0 10rpx;
+	      font-size: 24rpx;
+	      font-family: PingFang SC;
+	      font-weight: bold;
+	      color: rgba(120, 79, 6, 1);
+	    }
+	
+	    .img {
+	      width: 100%;
+	      background-color: #ccc;
+	    }
+	  }
+	
+	  .price-box {
+	    width: 100%;
+	    margin-top: 10rpx;
+	
+	    .seckill-current {
+	      font-size: 30rpx;
+	      font-weight: 500;
+	      color: rgba(225, 33, 43, 1);
+	    }
+	
+	    .original {
+	      font-size: 20rpx;
+	      font-weight: 400;
+	      // text-decoration: line-through;
+	      color: rgba(153, 153, 153, 1);
+	      margin-left: 14rpx;
+	    }
+	  }
+	
+	  .title {
+	    font-size: 26rpx;
+	  }
+	}
+	
+</style>

+ 80 - 0
pages/home/content.vue

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

+ 377 - 0
pages/home/doctorCase.vue

@@ -0,0 +1,377 @@
+<template>
+	<view>
+		<view class="top-fixed">
+			<!-- 搜索框 -->
+			<view class="search-cont">
+				<view class="inner">
+					<image class="icon-search" src="../../static/images/search.png" mode=""></image>
+					<input type="text"  v-model="searchVal" placeholder="输入关键字搜索"  confirm-type="搜索" @confirm="goSearch" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
+				</view>
+			</view>
+			<!-- tab切换 -->
+			<view class="pub-tab-box">
+				<view class="tab-inner">
+					<view 
+						v-for="(item,index) in depts" 
+						:key="index"
+						:class="deptId == item.departmentId?'item active':'item'"
+						@click="changeDept(item)"
+					>
+						<view class="text">
+							{{ item.departmentName }}
+							<image v-show="deptId == item.departmentId" class="tab-bg" src="../../static/images/tab_bg.png" mode=""></image>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- 数据列表 -->
+		<mescroll-body ref="mescroll"  top="190rpx" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+			<view class="cases-list">
+				<view class="item" v-for="(item,index) in dataList" :key="index">
+					<!-- 文字 -->
+					<view class="dec-text ellipsis2">{{item.title}}</view>
+					<!-- 有图 -->
+					<view class="images-box"  v-if="item.imgs!=null"  >
+						<view class="img-item" v-for="(subitem,j) in utils.photosToArr(item.imgs)" @click="showImg(item.imgs)" :key="j">
+							<image :src="subitem" mode="aspectFill" ></image>
+						</view>
+					</view>
+					<!-- 医生信息 -->
+					<view class="doc-info">
+						<view class="head">
+							<image :src="item.doctorHeadImg" mode="aspectFill"></image>
+						</view>
+						<view class="name">{{item.doctorName}}</view>
+						<view class="line"></view>
+						<view class="posit">
+							{{utils.getDictLabelName("doctorPosition",item.doctorPosition)}}
+						</view>
+						<view class="line"></view>
+						<view class="address">{{item.hospitalName}}</view>
+					</view>
+					<view class="answer-box">
+						<!-- 文字回答 -->
+						<text class="text-inner" v-if="item.orderType == '1' ">{{item.replyContent}}</text>
+						<!-- 语音回答 -->
+						<view class="voice-inner" v-if="item.orderType == '2'">
+							<free-audio 
+								startPic='/static/images/play.png' 
+								endPic='/static/images/pause.png'
+								activeColor="#018C39"
+								:audioId="'audio'+index"
+								:url='item.replyAudioUrl'
+							></free-audio>
+						</view>
+					</view>
+					<view class="read-box">
+						<image src="../../static/images/eye.png" mode=""></image>
+						<text class="text">{{item.views}}人看过</text>
+					</view>
+				</view>
+			</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {getDepartmentList,getDoctorCase} from '@/api/doctorOrder.js'
+	import freeAudio from '@/components/chengpeng-audio/free-audio.vue'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	
+	export default {
+		components: { freeAudio},
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				depts:[],
+				deptId:0,
+				searchVal:"",
+				// tab切换
+				casesCateChose: 1,
+				// 上拉加载的配置
+				mescroll:null,
+				// 上拉加载的配置
+				upOption: {
+					onScroll:true,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					empty: {
+						icon:'/static/images/no_data.png',
+						tip: '暂无数据'
+					}
+				},
+				// 列表数据
+				dataList: []
+			};
+		},
+		onLoad() {
+			this.getDepartmentList()
+		},
+		methods: {
+			changeDept(item) {
+				this.deptId = item.departmentId;
+				this.mescroll.resetUpScroll()
+				
+			},
+			getDepartmentList(){
+				getDepartmentList().then(res => {
+					if(res.code==200){
+						var allDept={departmentId:0,departmentName:"全部"}
+						this.depts.push(allDept);
+						this.depts=this.depts.concat(res.data);
+						console.log(this.depts)
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			goSearch(){
+				this.mescroll.resetUpScroll()
+			},
+			showImg(urls) {
+				 var imgArr =urls.split(',');
+				 //预览图片
+				 uni.previewImage({
+				 	urls: imgArr,
+				 	current: imgArr[0]
+				 });
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					departmentId:this.deptId,
+					title:this.searchVal,
+					page: page.num,
+					pageSize: page.size
+				};
+				getDoctorCase(data).then(res => {
+					if(res.code==200){
+						//设置列表数据
+						if (page.num == 1) {
+							that.dataList = res.data.list; 
+							
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+							 
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.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;
+			}
+		}
+	}
+	.pub-tab-box{
+		padding: 0 33upx;
+		background-color: #FFFFFF;
+		.tab-inner{
+			height: 88upx;
+			line-height: 88upx;
+			display: flex;
+			overflow-x: auto;
+		}
+		.item{
+			font-size: 28upx;
+			white-space: nowrap;
+			line-height: 1;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
+			margin-right: 60upx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			&:last-child{
+				margin-right: 0;
+			}
+			&.active{
+				font-weight: bold;
+				color: #333333;
+			}
+			.text{
+				position: relative;
+				z-index: 1;
+			}
+			.tab-bg{
+				width: 72upx;
+				height: 28upx;
+				position: absolute;
+				top: 17upx;
+				left: 50%;
+				transform: translateX(-36upx);
+				z-index: -1;
+			}
+		}
+	}
+	.top-fixed{
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10;
+	}
+	.top-seat{
+		width: 100%;
+		height: 212upx;
+	}
+	// 问诊案例
+	.cases-list{
+		padding: 20upx;
+		.item{
+			padding: 30upx;
+			background: #FFFFFF;
+			border-radius: 16upx;
+			margin-bottom: 20upx;
+			.dec-text{
+				font-size: 32upx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #111111;
+				line-height: 48upx;
+			}
+			.images-box{
+				margin-top: 10upx;
+				display: flex;
+				flex-wrap: wrap;
+				.img-item{
+					width: 155upx;
+					height: 155upx;
+					background: #F5F5F5;
+					border-radius: 8upx;
+					margin: 0 10upx 10upx 0;
+					overflow: hidden;
+					image{
+						width: 100%;
+						height: 100%;
+					}
+					&:nth-child(4n){
+						margin-right: 0;
+					}
+				}
+			}
+			.doc-info{
+				display: flex;
+				align-items: center;
+				margin: 30upx 0 20upx;
+				.head{
+					width: 60upx;
+					height: 60upx;
+					background: #F2F5F9;
+					border-radius: 50%;
+					margin-right: 20upx;
+					overflow: hidden;
+					image{
+						width: 100%;
+						height: 100%;
+					}
+				}
+				.name{
+					font-size: 28upx;
+					line-height: 1;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #111111;
+				}
+				.line{
+					width: 1px;
+					height: 22upx;
+					background: #DDDDDD;
+					margin: 0 16upx;
+				}
+				.posit,
+				.address{
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+				}
+			}
+			.answer-box{
+				width: 100%;
+				// height: 117upx;
+				background: #F5F7F7;
+				border-radius: 10upx;
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				.text-inner{
+					// height: 84upx;
+					font-size: 28upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #666666;
+					line-height: 42upx;
+					padding: 15upx;
+				}
+			}
+			.read-box{
+				margin-top: 30upx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-end;
+				image{
+					width: 24upx;
+					height: 19upx;
+					margin-right: 10upx;
+				}
+				.text{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+				}
+			}
+		}
+	}
+</style>

+ 40 - 0
pages/home/h5.vue

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

+ 2304 - 0
pages/home/index.vue

@@ -0,0 +1,2304 @@
+<template>
+	<view class="content">
+		<!-- 背景图片 -->
+		<!-- <image class="bg" src="../../static/images/hp_top_bg.png" mode=""></image> -->
+		<image class="bg"
+		src="https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com/fs/20250115/1736955760372.png" 
+		mode=""></image>
+		<view>
+			<view class="top-inner">
+				<view class="fixed-top-box" :style="{ background: bgColor }">
+					<!-- 这里是状态栏 -->
+					<view class="status_bar" :style="{height: statusBarHeight}"></view>
+					<!-- #ifdef APP -->
+					<view style="height: 70rpx;"></view>
+					<!-- #endif -->
+					<view class="top-title">
+						<view class="name">云联商城</view>
+						<!-- <view class="dot">•</view><view class="sub-name">七彩互联网医院</view> -->
+					</view>
+					<!-- 搜索框、购物车、客服 -->
+					<view class="func-cont" >
+						<view class="search-cont" >
+							<image class="icon-search" src="../../static/images/search.png" mode=""></image>
+							<input type="text" disabled value="" placeholder="搜索服务内容" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" @click="toSearch" />
+						</view>
+						<!-- 购物车 -->
+						<uni-badge size="small" :text="cartCount" absolute="rightTop" type="error">
+							<view class="img-item" @click="goAuthUrl('../shopping/cart')">
+								<image src="../../static/images/shopping_car.png" mode=""></image>
+							</view>
+						</uni-badge>
+						<view class="img-item" style="position: relative;">
+							<image src="../../static/images/service_gray.png" mode=""></image>
+							<button class="contact-btn" open-type="contact"></button>
+						</view>
+					</view>
+					<!-- <view class="tips">
+						
+						<view class="left"></view>
+						<view class="right"  @click="navTo('./cert')">资质证明</view>
+					</view> -->
+				</view>
+			</view>
+			<!-- 头部间距 -->
+			<view style="padding-bottom:220rpx" >
+				<view class="status_bar" :style="{height: statusBarHeight}"></view>
+			</view>
+			<!-- #ifdef APP -->
+			<view  >
+				<view  style="height: 60rpx"></view>
+			</view>
+			<!-- #endif -->
+			<!-- 轮播图 -->
+			<view class="banner-box" >
+				<view class="inner">
+					<swiper 
+						class="swiper" 
+						:indicator-dots="true" 
+						:circular="true" 
+						:autoplay="true" 
+						:interval="3000" 
+						:duration="1000"
+						indicator-color="rgba(255, 255, 255, 0.6)"
+						indicator-active-color="#ffffff">
+						<swiper-item class="swiper-item" v-for="(item,index) in advList" :key="index" @click="handleAdvClick(item)">
+							<image :src="item.imageUrl" mode=""></image>
+						</swiper-item>
+					</swiper>
+				</view>
+			</view>
+			
+			<!-- 菜单 -->
+			<view class="menu-content" >
+				<view class="menu-box">
+					 <Menu :list="menus" @menuClick="menuClick" v-if="menus.length>0" style="width:100%;"></Menu>
+				</view>
+			</view>
+			
+		</view>
+		 
+		<!-- 在线问诊、处方查询 -->
+		<view class="online-inquiry " >
+			<view class="item " @click="navTo('/pages_index/index/doctorArticleList?cateId=4&title=5G牧场')">
+				<image class="bg-img"  style="border-radius: 20rpx;"
+				src="https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com/fs/20250115/1736956599556.png" mode=""></image>
+				<view class="inner">
+					<text class="title color" >5G牧场</text>
+					<text class="sub-title">数字化管理牧场</text>
+					<!-- <image src="../../static/images/doctor.png" mode=""></image> -->
+				</view>
+			</view>
+			<view class="item " @click="goenper('/pages/enterprise/enterprise')">
+				<image class="bg-img " style="border-radius: 20rpx;"
+				src="https://beiliyo-2025.obs.cn-north-4.myhuaweicloud.com/fs/20250115/1736956595007.png" mode=""></image>
+				<view class="inner">
+					<text class="title" style="color: #3390C5;">智能生产线</text>
+					<text class="sub-title">高度自动化</text>
+					<!-- <image src="../../static/images/cu_search.png" mode=""></image> -->
+				</view>
+			</view>
+		</view>
+		
+		<view class="modules" >
+			<view class="module">
+				<!--养生有道-->
+				<view class="depts">
+					<view class="title">养生有道</view>
+					<view class="dept-box">
+						<view  @click="yangshengClick(item)"  class="dept" :key="index" v-for="(item,index) in menusB"  >
+							<image class="icon" :src="item.icon"></image>
+							<view class="title" >{{item.menuName}} </view>
+						</view>
+					</view>
+				</view>
+				
+				<view class="doctor-articles" >
+					<view class="title-box">
+						<view class="title">养生讲堂</view>
+						<view class="more"  @click="navTo('/pages_index/index/doctorArticleList')" >
+							<view class="text">更多</view>
+							<image src="/static/images/arrow_gray.png"></image>
+						</view>
+					</view>
+					<scroll-view :scroll-x="true" style="white-space: nowrap;">
+					<view class="article-box"  >
+						<view class="article" @click="navTo('/pages_index/index/doctorArticleDetails?articleId='+item.articleId)"  v-for="(item,index) in doctocArticles" :key="index">
+							<view class="image-box">
+								<image mode="aspectFill" :src="item.imageUrl"></image>
+								<view class="views">
+									{{item.views}}人观看
+								</view>
+								<view class="doctor">
+									<image mode="aspectFill" :src="item.avatar"></image>
+									<!-- <view class="right">
+										<view class="doc-name ellipsis">{{item.doctorName}}</view>
+										<view class="doc-position ellipsis">{{item.position}}</view>
+									</view> -->
+								</view>
+							</view>
+							<view class="article-title-box">
+								<view class="article-title ellipsis">{{item.title}}</view>
+							</view>
+						</view>
+					</view>
+					</scroll-view>
+				</view>
+				
+			    <!--养生干货-->
+			    <view class="articles" >
+			    	<view class="title-box">
+			    		<view class="title">养生干货</view>
+			    		<view class="more" @click="navTo('/pages_index/index/articleList')">
+			    			<view class="text">更多</view>
+			    			<image src="../../static/images/arrow_gray.png"></image>
+			    		</view>
+			    	</view>
+			    	<view class="article-box" v-if="articles.length>0">
+			    		<view class="item" :key="index" @click="navTo('/pages_index/index/articleDetails?articleId='+item.articleId)" v-for="(item,index) in articles">
+			    			<view class="left">
+			    				<view class="title">
+			    					{{item.title}}
+			    				</view>
+			    				<view class="views">
+			    					浏览量 {{item.views}}
+			    				</view>
+			    			</view>
+			    			<view class="right">
+			    				<image :src="item.imageUrl"></image>
+			    			</view>
+			    		</view>
+			    	</view>
+			    </view>
+			
+			</view>
+		</view>		
+		
+		<view class="index-cont">
+	
+			<!-- 热门榜单 -->
+			<NewProduct :detail="newProductList"/>
+			<HotProduct :detail="hotProductList"/>
+			<!-- 健康百科 -->
+			<view class="pub-item" style="margin-top: 20rpx;">
+				<view class="pub-title-box">
+					<text class="left">健康百科</text>
+					<view class="right" @click="switchTo('../healthy/index')">
+						<text class="text">更多</text>
+						<image src="../../static/images/arrow_gray.png" mode=""></image>
+					</view>
+				</view>
+				<view class="inner">
+					<view class="pub-tab-box">
+						<view class="tab-inner">
+							<view 
+								v-for="(item,index) in articleCateList" 
+								:key="index"
+								:class="item.cateId == cateId?'item active':'item'"
+								@click="articleCateChange(item)">
+								<view class="text">
+									{{ item.cateName }}
+									<image v-show="item.cateId == cateId" class="tab-bg" src="../../static/images/tab_bg.png" mode=""></image>
+								</view>
+							</view>
+						</view>
+						<image class="right-mask" src="../../static/images/mask.png" mode=""></image>
+					</view>
+					 
+					<view class="know-list">
+						<view class="item" v-for="(item,index) in articleList" :key="index" @click="showArticle(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?'/static/images/detault_head.jpg':subitem.avatar" mode=""></image>
+											</view>
+										</view>
+										<view class="readings">
+											<image class="eye" src="../../static/images/eye.png" mode=""></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>
+				</view>
+			</view>
+			<!-- 精选药品 -->
+			<!-- <TuiProduct ref="tuiProduct" /> -->
+		</view>
+		
+		
+		<!-- 限时消息 -->
+		<!-- <view class="message-box" >
+			<view class="left">
+				<image src="../../static/images/close24.png" mode="" @click="closeMsg"></image>
+				<view class="text ellipsis">关注公众号了解更新</view>
+			</view>
+			<view class="btn">查看</view>
+			
+		</view> -->
+		 <!-- #ifdef MP-WEIXIN -->
+		<view class="official-account" >
+		    <official-account @load="bindload" @error="binderror"></official-account>
+		</view>
+		<!-- #endif -->
+		<view class="popup-box" v-if="activityShow">
+		  <view class="info-mask"  @tap="closeActivity()" ></view>
+		  <view class="info-form"   >
+				<image  :src="activity.logoUrl" @tap="showActivity()" />
+		  </view>
+		</view>
+		<z-modal :show="tuiModalControl" placeholderText="请输入邀请码" :btnGroup="btnGroup" :contentType="2"  titleText="填写邀请码" @cancle="cancleTui" @sure="submitTui"   ></z-modal>
+		<tabbar :actindex="0"></tabbar>
+	</view>
+</template>
+
+<script>
+	import zModal from '@/components/z-modal/z-modal.vue'
+	import {getStoreActivity} from '@/api/activity.js'
+	import {getDepartmentList} from '@/api/doctorOrder.js'
+	import {getMenu,getCanvas,getIndexData,getTuiDoctor,getTuiArticle,
+	getTuiDoctorOrder,getCartCount,getpro,getMenuB} from '@/api/index'
+	import {getDoctorArticleList} from '@/api/doctorArticle.js'
+	import {getArticleList} from '@/api/article.js'
+	import {getStoreConfig} from '@/api/common'
+	import tabBg from "@/static/images/tab_bg.png"
+	import freeAudio from '@/components/chengpeng-audio/free-audio.vue'
+	import Menu from '@/components/Menu.vue'
+	import HotProduct from './components/HotProduct.vue'
+	import NewProduct from './components/NewProduct.vue'
+	// import TuiProduct from '@/components/tuiProduct.vue'
+	import {getUserInfo,bindPromoter} from '@/api/user'
+	export default {
+		components: {zModal,freeAudio,Menu,HotProduct,NewProduct},
+		data() {
+			return { 
+				btnGroup: [{
+						text: '取消',
+						color: '#FFFFFF',
+						bgColor: '#999999',
+						width: '150rpx',
+						height: '80rpx',
+						shape: 'fillet',
+						eventName: 'cancle'
+                    },{
+						text: '确定',
+						color: '#FFFFFF',
+						bgColor: '#018C39',
+						width: '150rpx',
+						height: '80rpx',
+						shape: 'fillet',
+						eventName: 'sure'
+                }],
+				tuiModalControl:false,
+				activity:null,
+				activityShow:false,
+				newProductList: [],
+				hotProductList: [],
+				tuiProductList:[],
+				menus:[],
+				canvas:[],
+				allDoctorTitle:"全部医生",
+				topLen:0,
+				deptId:0,
+				depts:[],
+				docTab:1,
+				top:0,
+				cartCount:0,
+				doctorOrderList:[],
+				orderType:0,
+				cateId:null,
+				articleList:[],
+				advList:[],
+				doctorList:[],
+				articleCateList:[],
+				doctocArticles:[],//养生讲堂
+				articles:[],//养生干货
+				// 状态栏的高度
+				statusBarHeight: uni.getStorageSync('menuInfo').statusBarHeight,
+				tabBg: tabBg, // tab切换背景
+				// 问诊案例类型
+				orderTypes: [{name:'全部',id:0,},{name:'图文',id:1,},{name:'语音',id:2,}],
+				// 限时消息是否显示
+				messageShow: true,
+				yangshengs:[
+					{id:"1",title:"药膳食疗",page:"/pages_index/index/medicatedFoodList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/3cfbd47911cf4753aa9497eac500728d.png"},
+					{id:"2",title:"经络穴位",page:"/pages_index/index/vesselList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e93536a9dc1a4f8ca09545097b12fdea.png"},
+					{id:"3",title:"问答专区",page:"/pages_index/index/questionsList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e896972bd56f4e358188af36f2c5af42.png"},
+					{id:"4",title:"疾病",page:"/pages_index/index/diseaseList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/d6f1851cccae414b8baf2ba07782f91b.png"},
+					{id:"5",title:"中药图解",page:"/pages_index/index/chineseMedicineList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/ff43572d0d004285b5a3b0ef2663c471.png"},
+					{id:"6",title:"名方今用",page:"/pages_index/index/famousPrescribeList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/45db770e58c34963b0d2ba24a958b617.png"},
+					{id:"7",title:"康复医案",page:"/pages_index/index/doctorArticleList",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/e793942797b24035b51f94d894bdfa0b.png"},
+					{id:"8",title:"更多",page:"",icon:"https://fs-1319721001.cos.ap-chongqing.myqcloud.com/fs/20240229/3ee6160289914ee4a8126573fe4dc0ae.png"}
+				],
+				userinfoa:[],
+				isuser:false,
+				menvKey:{},
+				menusB:[]
+			}
+			this.getStoreActivity();
+		},
+		onLoad(option) {
+			if(option.userCode!=null){
+				uni.setStorageSync('userCode',option.userCode);
+				if(this.utils.checkLoginState()){
+					this.getUserInfo();
+				}
+			}
+			if (option.hasOwnProperty('q') && option.q) {
+				// 通过下面这步解码,可以拿到url的值
+				const url = decodeURIComponent(option.q)
+				this.url=url;
+				// // 对url中携带的参数提取处理
+				const obj = this.utils.urlToObj(url)
+				uni.setStorageSync('userCode',obj.userCode);
+				if(this.utils.checkLoginState()){
+					this.getUserInfo();
+				}
+			}
+			this.getStoreActivity()
+		},
+		// 暂停所有音频(一般用于页面切换时停止正在播放的音频)
+		onUnload() { //普通页面在 onUnload 生命周期中执行
+		  uni.$emit('stop')
+		},
+		onHide() { //tabBar页面在onHide生命周期中执行
+		  uni.$emit('stop')
+		},
+		onPageScroll(e) {
+			//console.log(e)
+			this.top=e.scrollTop;
+		},
+		mounted() {
+			//this.getDepartmentList();
+			
+		},
+		onShareAppMessage(res) {
+			return {
+				title: '云联商城-您的专属健康解决方案',
+				path: `/pages/common/launch`,
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20241018/b810f26926904253ae46ea4e93b71dee.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+		},
+		onReachBottom() {
+			console.log("onReachBottom")
+			//this.$refs.tuiProduct.getTuiProducts();
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: '云联商城-您的专属健康解决方案',
+				query:'',//页面参数
+				imageUrl: 'https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20241018/b810f26926904253ae46ea4e93b71dee.png' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
+			}
+		},
+		computed: {
+			// 计算属性的 getter
+			bgColor: function() {
+				var top=this.top/30;
+				return 'rgba(255,255,255, ' + top + ')';
+			},
+		},
+		onShow() {
+			uni.hideTabBar();
+			this.getMenu();
+			this.getIndexData()
+			//this.getTuiDoctorOrder();
+			// console.log(uni.getStorageSync('isLocation'))
+			// if(uni.getStorageSync('isLocation')==""){
+			// 	this.getLocation();
+			// }
+			if(this.utils.checkLoginState()){
+				this.getCartCount();
+			}
+			if(uni.getStorageSync('AppToken')){
+				this.getUserInfo()
+			}else{
+				this.isuser=true
+			}
+			this.getStoreConfig();
+			//this.getTuiDoctor()
+			this.getCanvas();
+			this.getDoctorArticleList();
+			this.getArticleList();
+			this.getshowmanv()
+			this.getMenuB()
+		},
+		methods: {
+			getMenuB(){
+				getMenuB().then(res => {
+					if(res.code==200){
+						 this.menusB= res.data
+						 console.log('标题2',res)
+					}else{
+						 
+					}
+				});
+			},
+			getshowmanv(){
+				const data={
+					key:"store.appShow"
+				}
+				getpro(data).then(res=>{
+					this.menvKey=JSON.parse(res.data)
+					console.log('排序',this.menvKey)
+				})
+			},
+			getUserInfo(){
+				getUserInfo().then(
+					res => {
+						if(res.code==200){
+							if(res.user!=null){
+								this.userinfoa=res.user
+								// if(res.user.isPromoter==null||res.user.isPromoter==0){
+								// 	this.tuiModalControl=true
+								// }
+							}
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			cancleTui(e){
+				this.tuiModalControl=false
+			},
+			submitTui(e){
+				console.log(e)
+				if(e.inputText==null||e.inputText==""){
+					uni.showToast({
+						icon:'none',
+						title: "请输入邀请码",
+					});
+					return;
+				}
+				var data={userCode:e.inputText};
+				bindPromoter(data).then(
+					res => {
+						if(res.code==200){
+							 uni.showToast({
+							 	icon:'none',
+							 	title: res.msg,
+							 });
+							 this.tuiModalControl=false
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+				
+			},
+			bindload:function(detail){
+			},
+			binderror:function(detail){
+			},
+			closeActivity(){
+				this.activityShow=false;
+				// uni.setStorageSync(this.activity.activityId,null);
+			},
+			getStoreActivity() {
+			  let data = { }
+			  getStoreActivity(data).then(res => {
+					this.activity=res.activity;
+					if(this.activity!=null){
+						// if(uni.getStorageSync(this.activity.activityId)!=null)
+						// {
+						// 	uni.setStorageSync(this.activity.activityId,1);
+						// 	this.activityShow=true;
+						// }
+						// else{
+						// 	this.activityShow=false;
+						// }
+						this.activityShow=true;
+					}
+					else{
+						this.activityShow=false;
+					}
+			  })
+			},
+			showActivity(){
+				this.activityShow=false;
+				uni.navigateTo({
+					url: '/pages_shopping/shopping/activityDetails?activityId='+this.activity.activityId
+				})
+			},
+			menuClick(item){
+				if(item.linkType==1){
+					console.log(item.linkUrl)
+					if(item.linkUrl=="/pages/shopping/index"){
+						uni.switchTab({
+							url: item.linkUrl
+						})
+					}
+					else if(item.linkUrl=="/pages/healthy/index"){
+						uni.switchTab({
+							url: item.linkUrl
+						})
+					}else if(item.menuName=='会员福利'){
+					 uni.showToast({
+					 	icon:'none',
+					 	title: "开发中...",
+					 });
+				    }
+					else{
+						uni.navigateTo({
+							url: item.linkUrl
+						})
+						console.log(item.menuName)
+					}
+					
+				}
+				else if(item.linkType==0){
+					 uni.showToast({
+					 	icon:'none',
+					 	title: "开发中...",
+					 });
+				}
+				
+			},
+			goDev(){
+				uni.showToast({
+					icon:'none',
+					title: "开发中...",
+				});
+			},
+			handleAdvClick(item){
+				console.log(item);
+				if(item.showType==1){
+					uni.setStorageSync('url',item.advUrl);
+					uni.navigateTo({
+						url:"h5"
+					})
+				}
+				else if(item.showType==2){
+					 uni.navigateTo({
+					 	url:item.advUrl
+					 })
+				}
+				else if(item.showType==3){
+					 uni.setStorageSync('content',item.content);
+					 uni.navigateTo({
+					 	url:"content"
+					 })
+				}
+			},
+			deptChange(item){
+				this.deptId=item.departmentId;
+				this.getTuiDoctor();
+			},
+			getMenu(){
+				this.menus=[];
+				getMenu().then(res => {
+					if(res.code==200){
+						 // for (var i = 0; i < res.data.length; i++) {
+						 // 	const item=res.data[i];
+							// if(item.menuName.indexOf('健康百科')>=0 || item.menuName.indexOf('健康自测')>=0 
+							// || item.menuName.indexOf('健康档案')>=0 ||item.menuName.indexOf('用药咨询')>=0){
+							// 	this.menus.push(item);
+							// }
+						 // }
+						 // const menuNames = ['健康百科', '健康自测', '健康档案', '药品商城', '领券中心', '会员'];
+						 // this.menus = res.data.filter(item => menuNames.some(menuName => item.menuName.includes(menuName)) );
+						 this.menus = res.data;
+					}else{
+						 
+					}
+				});
+			},
+			getCanvas(){
+				getCanvas().then(res => {
+					if(res.code==200){
+						 console.log(res.data)
+						 this.canvas= JSON.parse(res.data.json)
+					}
+				});
+			},
+			getDepartmentList(){
+				this.depts=[];
+				getDepartmentList().then(res => {
+					if(res.code==200){
+						var allDept={departmentId:0,departmentName:"全部"}
+						this.depts.push(allDept);
+						this.depts=this.depts.concat(res.data);
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getTuiDoctor(){
+				let data = {departmentId:this.deptId,doctorType:this.docTab};
+				getTuiDoctor(data).then(
+					res => {
+						if(res.code==200){
+							 this.doctorList=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			docTabChange(val){
+				if(val==1){
+					this.allDoctorTitle="全部医师"
+				}
+				if(val==2){
+					this.allDoctorTitle="全部药师"
+				}
+				if(val==3){
+					this.allDoctorTitle="全部营养师"
+				}
+				this.docTab=val;
+				this.getTuiDoctor();
+			},
+			showImg(urls) {
+				 var imgArr =urls.split(',');
+				 //预览图片
+				 uni.previewImage({
+				 	urls: imgArr,
+				 	current: imgArr[0]
+				 });
+			},
+			getStoreConfig(){
+				getStoreConfig().then(
+					res => {
+						if(res.code==200){
+							uni.setStorageSync('config',JSON.stringify(res.data));
+						}
+					},
+					rej => {}
+				);
+				
+			},
+			goAuthUrl(url){
+				this.utils.isLogin().then(res => {
+					if(res){
+						uni.navigateTo({
+							url:url
+						})
+					}
+				})
+			},
+			// 跳转页面
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			}, 
+			getLocation(){
+				var that=this;
+				uni.authorize({
+					scope:'scope.userLocation',
+					success() {
+						uni.getLocation({
+							type: 'gcj02',//腾讯地图使用gcj02获取位置坐标
+							success: function (res) {
+								uni.setStorageSync('isLocation',1);
+								uni.setStorageSync('lng',res.longitude);
+								uni.setStorageSync('lat',res.latitude);
+							},
+						})
+					},
+					fail(err){
+						 console.log(err)
+					}
+				})
+			},
+			getIndexData(){
+				let data = {};
+				getIndexData(data).then(
+					res => {
+						if(res.code==200){
+							 this.advList=res.data.advList;
+							 this.articleCateList=res.data.articleCateList;
+							 if(this.articleCateList!=null&&this.articleCateList.length>0){
+								 this.cateId=this.articleCateList[0].cateId;
+								 this.getTuiArticle()
+							 }
+							 this.tuiProductList=res.data.tuiProductList
+							 this.newProductList = res.data.newProductList
+							 this.hotProductList = res.data.hotProductList
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getCartCount(){
+				this.utils.isLogin().then(res => {
+					if(res){
+						 getCartCount().then(
+						 	cartRes => {
+						 		if(cartRes.code==200){
+						 			 this.cartCount=cartRes.data;
+						 		}
+						 	},
+						 	rej => {}
+						 );
+					}
+				})
+			},
+			getTuiArticle(){
+				let data = {cateId:this.cateId};
+				getTuiArticle(data).then(
+					res => {
+						if(res.code==200){
+							 this.articleList=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getTuiDoctorOrder(){
+				let data = {orderType:this.orderType};
+				getTuiDoctorOrder(data).then(
+					res => {
+						if(res.code==200){
+							 this.doctorOrderList=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			showArticle(item){
+				uni.navigateTo({
+					url: '../healthy/detail?articleId='+item.articleId
+				})
+			},
+			showProduct(item){
+				uni.navigateTo({
+					url: '../shopping/productDetails?productId='+item.productId
+				})
+			},
+			// 顶部搜索
+			toSearch() {
+				uni.navigateTo({
+					url: './productSearch'
+				})
+			},
+			// 健康知识选中
+			articleCateChange(item) {
+				this.cateId = item.cateId;
+				this.getTuiArticle();
+			},
+			// 问诊案例选中
+			orderTypeChange(item) {
+				this.orderType = item.id;
+				console.log(this.orderType)
+				this.getTuiDoctorOrder();
+			},
+			// 关闭限时消息
+			closeMsg() {
+				this.messageShow = false
+			},
+			// 查看全部
+			viewAll(url) {
+				uni.navigateTo({
+					url: '/pages/home/' + url,
+				});
+			},
+			shopDoctor(item){
+				console.log(item);
+				uni.navigateTo({
+					url: "/pages_doctor/doctorDetail?doctorId="+item.doctorId
+				})
+			},
+			switchTo(url){
+				uni.switchTab({
+					url: url
+				})
+				return
+			},
+			yangshengClick(item){
+				console.log('点击跳转',item)
+				if(item.linkUrl==null || item.menuName=='健康咨询'){
+					uni.showToast({
+						icon:"none",
+						title: '暂无更多'
+					})
+					return;
+				}
+				uni.navigateTo({
+					url:item.linkUrl
+				})
+			},
+			// 在线问诊
+			openIm() {
+				uni.navigateTo({
+					url: '/pages_doctor/doctorOrderIM?orderId=10'
+				})
+			},
+			getDoctorArticleList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					pageNum:1,
+					pageSize:10
+				};
+				getDoctorArticleList(data).then(res => {
+					if(res.code==200){
+						this.doctocArticles=res.data.list;
+					}
+				});
+			},
+			getArticleList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui:1,
+					pageNum:1,
+					pageSize:10,
+				};
+				getArticleList(data).then(res => {
+					if(res.code==200){
+						this.articles=res.data.list;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+
+	.fixed-top-box{
+		width: 100%;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 1000;
+		transition: all 0.5s;
+		background-color: #018C39;
+		&.show-back{
+			// background: linear-gradient(135deg, #38e663  0%, #018C39 100%);
+		}
+		.status_bar {
+			
+			width: 100%;
+		}
+	}
+	.content{
+		width: 100%;
+		position: relative;
+		.bg{
+			width: 100%;
+			height: 380rpx;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+		.top-inner{
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			z-index: 5;
+			.top-title{
+				height: 88upx;
+				line-height: 88upx;
+				display: flex;
+				align-items: center;
+				justify-content: flex-start;
+				.name{
+					font-size: 42upx;
+					font-family: Source Han Sans CN;
+					font-weight: bold;
+					color: #018C39;
+					padding-left: 41upx;
+				}
+				.dot{
+					margin: 0upx 10upx;
+					font-size: 28upx;
+					color: #FFFFFF;
+					opacity: 0.5;
+				}
+				.sub-name{
+					font-size: 30upx;
+					font-family: Source Han Sans CN;
+					color: #FFFFFF;
+				}
+				
+				 
+			}
+			.func-cont{
+				box-sizing: border-box;
+				display: flex;
+				align-items: center;
+				padding: 30upx 20upx 30upx 20upx;
+				.search-cont{
+					box-sizing: border-box;
+					display: flex;
+					align-items: center;
+					width: 552upx;
+					height: 72upx;
+					background: #FFFFFF;
+					border-radius: 36upx;
+					padding: 0 30upx;
+					border: 2rpx solid #018C39;
+					.icon-search{
+						width: 28upx;
+						height: 28upx;
+						margin-right: 20upx;
+					}
+					input{
+						height: 60upx;
+						line-height: 60upx;
+						flex: 1;
+					}
+				}
+				/deep/.uni-badge{
+					border: none;
+					background-color: #FF3636;
+					font-family: Roboto;
+				}
+				.img-item{
+					width: 44upx;
+					height: 44upx;
+					margin-left: 30upx;
+					image{
+						width: 100%;
+						height: 100%;
+					}
+				}
+			}
+			.tips{
+				margin: 0upx 20rpx 30rpx ;
+				height: 40upx;
+				line-height: 40upx;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				.left{
+					font-size: 30upx;
+					color: #FFFFFF;
+				}
+				.right{
+					padding: 5upx 20rpx;
+					font-size: 24upx;
+					color: #FFFFFF;
+					background-color: #018C39;
+					border-radius: 50rpx;
+				}
+			}
+		}
+		.banner-box{
+			padding: 0 20upx;
+			.inner{
+				width: 100%;
+				height: 236upx;
+				border-radius: 10upx;
+				overflow: hidden;
+				.swiper,
+				.swiper-item,
+				.swiper-item image{
+					width: 100%;
+					height: 100%;
+				}
+				
+			}
+		}
+		.menu-content{
+			// width: 100%;
+			background-color: #fff;
+			overflow: hidden;
+			padding: 20upx 20upx 0;
+		}
+		.menu-box{
+			display: flex;
+			align-items: center;
+			background-color: #FFFFFF;
+		}
+		.online-inquiry{
+			box-sizing: border-box;
+			width: 100%;
+			height: 170upx;
+			padding: 20upx;
+			background: linear-gradient(180deg, rgba(255, 255, 255, 0.38) 62%, rgba(255, 255, 255, 0) 100%);
+			display: flex;
+			justify-content: space-between;
+			.item{
+				// width: 46.13%;
+				width: 346upx;
+				height: 150upx;
+				position: relative;
+				.bg-img,
+				.inner{
+					width: 100%;
+					height: 100%;
+					position: absolute;
+					top: 0;
+					left: 0;
+					z-index: 1;
+				}
+				.inner{
+					box-sizing: border-box;
+					z-index: 2;
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					padding-left: 32upx;
+					.title{
+						font-size: 30upx;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #111111;
+						margin-bottom: 20upx;
+					}
+					.sub-title{
+						font-size: 24upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+					}
+					image{
+						width: 80upx;
+						height: 90upx;
+						position: absolute;
+						right: 7upx;
+						bottom: 7upx;
+					}
+				}
+			}
+		}
+		.index-cont{
+			box-sizing: border-box;
+			padding: 0 20upx 120rpx;
+			.pub-item{
+				background: #FFFFFF;
+				border-radius: 16upx;
+				margin-bottom: 20upx;
+				.tabs{
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: flex-start;
+					height: 110rpx;
+					background-color: #F0F3F4;
+					.tab{
+						height: 110rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						position: relative;
+						flex: 1;
+						.img{
+							z-index: 1;
+							position: absolute;
+							top:0rpx;
+							left:0rpx;
+							width: 100%;
+							height: 100%;
+						}
+						.inner{
+							z-index: 2;
+							.title{
+								font-size: 32upx;
+								font-family: PingFang SC;
+								font-weight: bold;
+								color: #666666;
+							}
+							.active{
+								color: #018C39;
+							}
+						}
+						
+					}
+					
+					
+				}
+				.pub-title-box{
+					box-sizing: border-box;
+					padding: 36upx 30upx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.left{
+						font-size: 32upx;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.right{
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						.text{
+							font-size: 24rpx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							margin-right: 10upx;
+						}
+						image{
+							width: 14upx;
+							height: 24upx;
+						}
+					}
+					
+				}
+				.doc-tab-box{
+					padding: 14rpx 30rpx 0rpx 30rpx;
+					position: relative;
+					.tab-inner{
+						padding: 14upx 0 30upx;
+						display: flex;
+						overflow-x: auto;
+					}
+					.item{
+						font-size: 28upx;
+						white-space: nowrap;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						margin-right: 40upx;
+						position: relative;
+						&:last-child{
+							margin-right: 0;
+						}
+						&.active{
+							font-weight: bold;
+							color: #333333;
+						}
+						&.cases{
+							margin-right: 60upx;
+						}
+						.text{
+							position: relative;
+							z-index: 1;
+						}
+						.tab-bg{
+							width: 72upx;
+							height: 28upx;
+							position: absolute;
+							top: 17upx;
+							left: 50%;
+							transform: translateX(-36upx);
+							z-index: -1;
+						}
+					}
+					.right-mask{
+						width: 56upx;
+						height: 34upx;
+						position: absolute;
+						top: 25upx;
+						right: 0upx;
+						z-index: 1;
+					}
+				}
+				.doc-list{
+					padding: 20upx;
+					.item{
+						box-sizing: border-box;
+						background: #FFFFFF;
+						// border-radius: 16upx;
+						display: flex;
+						border-bottom: 1px solid #F0F0F0;
+						margin-bottom: 30rpx;
+						.head-box{
+							width: 120upx;
+							height: 120upx;
+							background: #EDF1F4;
+							border-radius: 50%;
+							overflow: hidden;
+							margin-right: 30upx;
+							image{
+								width: 100%;
+								height: 100%;
+							}
+						}
+						.info{
+							width: calc(100% - 150upx);
+							.top{
+								display: flex;
+								align-items: center;
+								font-family: PingFang SC;
+								line-height: 1;
+								.name{
+									font-size: 34upx;
+									font-weight: bold;
+									color: #111111;
+								}
+								.line{
+									width: 1px;
+									height: 26upx;
+									background: #DDDDDD;
+									margin: 0 20upx;
+								}
+								.other{
+									font-size: 28upx;
+									font-weight: 500;
+									color: #333333;
+								}
+							}
+							.unit-box{
+								display: flex;
+								margin-top: 24upx;
+								.level{
+									padding: 0 10upx;
+									height: 30upx;
+									line-height: 30upx;
+									font-size: 22upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #FFFFFF;
+									background: #018C39;
+									border-radius: 10upx 4upx 10upx 4upx;
+									margin-right: 12upx;
+								}
+								.name{
+									font-size: 28upx;
+									font-family: PingFang SC;
+									font-weight: 500;
+									color: #333333;
+									line-height: 30upx;
+								}
+							}
+							.expertise{
+								font-size: 26upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #666666;
+								line-height: 42upx;
+								margin: 22upx 0 26upx;
+							}
+							.rate-box{
+								display: flex;
+								align-items: center;
+								.star{
+									display: flex;
+									align-items: center;
+									image{
+										width: 22upx;
+										height: 22upx;
+										margin-right: 10upx;
+									}
+									text{
+										font-size: 26upx;
+										font-family: PingFang SC;
+										font-weight: bold;
+										color: #CEA764;
+										line-height: 1;
+									}
+								}
+								.line{
+									width: 1px;
+									height: 20upx;
+									background: #DDDDDD;
+									margin: 0 20upx;
+								}
+								.num-box{
+									display: flex;
+									align-items: center;
+									font-family: PingFang SC;
+									.label{
+										font-size: 24upx;
+										font-weight: 500;
+										color: #999999;
+										line-height: 1;
+										margin-right: 7px;
+									}
+									.num{
+										font-size: 26upx;
+										font-weight: bold;
+										color: #CEA764;
+										line-height: 1;
+									}
+								}
+							}
+							.price-box{
+								display: flex;
+								align-items: center;
+								margin-top: 38upx;
+								.btn-item{
+									display: flex;
+									align-items: center;
+									justify-content: center;
+									width: 164upx;
+									height: 56upx;
+									line-height: 56upx;
+									border: 1px solid rgba(43, 199, 185, 0.5);
+									border-radius: 28upx;
+									font-family: PingFang SC;
+									margin-right: 30upx;
+									&:last-child{
+										margin-right: 0;
+									}
+									.label{
+										font-size: 26upx;
+										font-weight: 500;
+										color: #018C39;
+										margin-right: 5upx;
+									}
+									.num{
+										font-size: 28upx;
+										font-weight: bold;
+										color: #018C39;
+									}
+								}
+							}
+						}
+					}
+					.item:last-child{
+						border-bottom: none;
+						margin-bottom: 0rpx;
+					}
+					.bottom-title{
+						height: 50rpx;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						font-size: 26rpx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #018C39;
+						image{
+							margin-left: 8rpx;
+							width: 14rpx;
+							height: 24rpx;
+						}
+					}
+				}
+				// 医师团队
+				.doc-cont{
+					box-sizing: border-box;
+					padding: 0 30upx;
+					.inner{
+						padding: 4upx 0 40upx;
+						display: flex;
+						overflow-x: auto;
+					}
+					.item{
+						display: flex;
+						align-items: center;
+						flex-direction: column;
+						margin-right: 40upx;
+						&:last-child{
+							margin-right: 0;
+						}
+						.head-box{
+							width: 120upx;
+							height: 120upx;
+							background: #F2F5F9;
+							border-radius: 50%;
+							margin-bottom: 20upx;
+							overflow: hidden;
+							image{
+								width: 100%;
+								height: 100%;
+							}
+						}
+						.name{
+							max-width: 120upx;
+							font-size: 28upx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							margin-bottom: 16upx;
+							text-align: center;
+						}
+						.position{
+							max-width: 120upx;
+							font-size: 24upx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #999999;
+							text-align: center;
+						}
+					}
+				}
+				.inner{
+					padding: 0 30upx;
+				}
+				// 健康知识
+				.pub-tab-box{
+					position: relative;
+					.tab-inner{
+						padding: 14upx 0 30upx;
+						display: flex;
+						overflow-x: auto;
+					}
+					.item{
+						font-size: 28upx;
+						white-space: nowrap;
+						line-height: 1;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #666666;
+						margin-right: 40upx;
+						position: relative;
+						&:last-child{
+							margin-right: 0;
+						}
+						&.active{
+							font-weight: bold;
+							color: #333333;
+						}
+						&.cases{
+							margin-right: 60upx;
+						}
+						.text{
+							position: relative;
+							z-index: 1;
+						}
+						.tab-bg{
+							width: 72upx;
+							height: 28upx;
+							position: absolute;
+							top: 17upx;
+							left: 50%;
+							transform: translateX(-36upx);
+							z-index: -1;
+						}
+					}
+					.right-mask{
+						width: 56upx;
+						height: 34upx;
+						position: absolute;
+						top: 14upx;
+						right: -30upx;
+						z-index: 1;
+					}
+				}
+				.know-list{
+					padding-right: 10upx;
+					.item{
+						padding: 30upx 0;
+						display: flex;
+						align-items: center;
+						justify-content: space-between;
+						border-bottom: 1px solid #F0F0F0;
+						&:last-child{
+							border-bottom: none;
+						}
+						.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%;
+							}
+						}
+					}
+				}
+				// 问诊案例
+				.cases-list{
+					padding-bottom: 10upx;
+					.item{
+						padding: 30upx 0;
+						border-bottom: 1px solid #F0F0F0;
+						&:last-child{
+							border-bottom: none;
+						}
+						.dec-text{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+							line-height: 48upx;
+						}
+						.images-box{
+							margin-top: 10upx;
+							display: flex;
+							flex-wrap: wrap;
+							.img-item{
+								width: 155upx;
+								height: 155upx;
+								background: #F5F5F5;
+								border-radius: 8upx;
+								margin: 0 10upx 10upx 0;
+								overflow: hidden;
+								image{
+									width: 100%;
+									height: 100%;
+								}
+								&:nth-child(4n){
+									margin-right: 0;
+								}
+							}
+						}
+						.doc-info{
+							display: flex;
+							align-items: center;
+							margin: 30upx 0 20upx;
+							.head{
+								width: 60upx;
+								height: 60upx;
+								background: #F2F5F9;
+								border-radius: 50%;
+								margin-right: 20upx;
+								overflow: hidden;
+								image{
+									width: 100%;
+									height: 100%;
+								}
+							}
+							.name{
+								font-size: 28upx;
+								line-height: 1;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+							}
+							.line{
+								width: 1px;
+								height: 22upx;
+								background: #DDDDDD;
+								margin: 0 16upx;
+							}
+							.posit,
+							.address{
+								font-size: 26upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+							}
+						}
+						.answer-box{
+							width: 100%;
+							// height: 117upx;
+							background: #F5F7F7;
+							border-radius: 10upx;
+							display: flex;
+							flex-direction: column;
+							justify-content: center;
+							.text-inner{
+								// height: 84upx;
+								font-size: 28upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #666666;
+								line-height: 42upx;
+								padding: 15upx;
+							}
+						}
+						.read-box{
+							margin-top: 30upx;
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+							image{
+								width: 24upx;
+								height: 19upx;
+								margin-right: 10upx;
+							}
+							.text{
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #999999;
+							}
+						}
+					}
+				}
+			}
+			// 精选药品
+			.feat-title{
+				margin-top: 30upx;
+				padding: 10upx 0 33upx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image{
+					width: 37upx;
+					height: 37upx;
+					margin: 0upx 20upx;
+				}
+				text{
+					font-size: 36upx;
+					line-height: 1;
+					font-family: PingFang SC;
+					font-weight: bold;
+					color: #111111;
+				}
+			}
+			.drug-list{
+				display: flex;
+				flex-wrap: wrap;
+				// margin-bottom: 20upx;
+				.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;
+						.title{
+							height: 80upx;
+							font-size: 26upx;
+							font-family: PingFang SC;
+							font-weight: 500;
+							color: #111111;
+							line-height: 40upx;
+						}
+						.price-box{
+							display: flex;
+							align-items: center;
+							margin-top: 20upx;
+							.now{
+								color: #FF6633;
+								display: flex;
+								align-items: flex-end;
+								margin-right: 20upx;
+								font-family: PingFang SC;
+								.unit{
+									font-size: 24upx;
+									line-height: 1.4;
+									margin-right: 4upx;
+								}
+								.num{
+									font-size: 36upx;
+									font-weight: bold;
+									line-height: 1;
+								}
+							}
+							.old{
+								font-size: 26upx;
+								font-family: PingFang SC;
+								text-decoration: line-through;
+								color: #BBBBBB;
+								line-height: 1;
+							}
+						}
+					}
+				}
+			}
+		}
+		
+		.modules{
+			.module{
+				.depts{
+					z-index: 101;
+					margin: 20rpx 15rpx 0rpx;
+					padding: 20rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #2A2B2E;
+					}
+					.dept-box{
+						margin-top: 15rpx;
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						flex-wrap:wrap;
+						.dept{
+							padding: 15rpx 5rpx;
+							width:25%;
+							display: flex;
+							flex-direction: column;
+							align-items: center;
+							justify-content: center;
+							padding:14rpx 0;
+							.icon{
+								width:58rpx;
+								height:58rpx;
+							}
+							.title{
+								margin-top: 10rpx;
+								font-size: 24upx;
+								font-family: PingFang SC;
+								font-weight: 500;
+								color: #111111;
+							}
+						}
+					}
+					
+				}
+				
+				.doctor-articles{
+					z-index: 101;
+					margin: 20rpx 15rpx 0rpx;
+					padding: 20rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					.title-box{
+						display: flex;
+						flex-direction: row;
+						align-items: center;
+						justify-content: space-between;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.more{
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+							.text{
+								font-size: 24rpx;
+								font-family: PingFang SC;
+								color: #9B9B9B;
+							}
+							image{
+								margin-left: 10rpx;
+								width:15rpx;
+								height:20rpx;
+							}
+							
+						}
+					}
+					.article-box{
+						padding: 20rpx 0rpx;
+						overflow-x: auto;
+						box-sizing: border-box;
+						display: flex;
+						align-items: center;
+						justify-content: flex-start;
+						.article{
+							width: 300rpx;
+							margin-right: 20rpx;
+							background: #f9f8fe;
+							display: flex;
+							flex-direction: column;
+							align-items: flex-start;
+							justify-content: flex-start;
+							&:last-child{
+								margin-right: 0rpx;
+							}
+							.image-box{
+								width: 300rpx;
+								height:400rpx;
+								position: relative;
+								border-radius: 20rpx;
+								image{
+									border-radius: 20rpx;
+									width: 300rpx;
+									height:400rpx;
+								}
+								.views{
+									position: absolute;
+									top:0rpx;
+									left:0rpx;
+									padding: 5rpx 10rpx;
+									background: rgba(0,0,0,0.25);
+									border-radius: 12rpx 0px 12rpx 0px;
+									opacity: 1;
+									font-size: 20rpx;
+									font-family: PingFang SC-Bold, PingFang SC;
+									font-weight: bold;
+									color: #FFFFFF;
+								}
+								.doctor{
+									margin: 10rpx;
+									display: flex;
+									align-items: center;
+									justify-content: flex-start;
+									position: absolute;
+									bottom:0rpx;
+									left:0rpx;
+									image{
+										border-radius: 50%;
+										width: 64rpx;
+										height:64rpx;
+									}
+									.right{
+										width: 200rpx;
+										margin-left: 10rpx;
+										display: flex;
+										flex-direction: column;
+										align-items: flex-start;
+										justify-content: space-between;
+										.doc-name{
+											width: 200rpx;
+											font-size: 30rpx;
+											font-weight: bold;
+											font-family: PingFang SC;
+											color: #fff;
+										}
+										.doc-position{
+											width: 100%;
+											font-size: 28rpx;
+											font-family: PingFang SC;
+											color: #fff;
+											font-weight: bold;
+											opacity: 0.8;
+										}
+									}
+								}
+							}
+							.article-title-box{
+								width: 100%;
+								margin-top: 10rpx;
+								display: flex;
+								align-items: center;
+								justify-content: flex-start;
+								.article-title{
+									font-size: 30rpx;
+									font-weight: bold;
+									font-family: PingFang SC;
+									color: #2A2B2E;
+								}
+								
+							}
+							 
+						}
+						
+					}
+				}
+				
+				.doctors{
+					z-index: 101;
+					margin: 20rpx 15rpx;
+					padding: 20rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					.title-box{
+						display: flex;
+						flex-direction: row;
+						align-items: center;
+						justify-content: space-between;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.more{
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+							.text{
+								font-size: 24rpx;
+								font-family: PingFang SC;
+								color: #9B9B9B;
+							}
+							image{
+								margin-left: 10rpx;
+								width:15rpx;
+								height:20rpx;
+							}
+							
+						}
+					}
+					
+				}
+				
+				.articles{
+					z-index: 101;
+					margin: 20rpx 15rpx;
+					padding: 20rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					.title-box{
+						display: flex;
+						flex-direction: row;
+						align-items: center;
+						justify-content: space-between;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.more{
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+							.text{
+								font-size: 24rpx;
+								font-family: PingFang SC;
+								color: #9B9B9B;
+							}
+							image{
+								margin-left: 10rpx;
+								width:15rpx;
+								height:20rpx;
+							}
+							
+						}
+					}
+					.article-box{
+						margin-top: 15rpx;
+						padding: 20rpx 0rpx 0rpx;
+						display: flex;
+						flex-direction: column;
+						align-items: flex-start;
+						justify-content: flex-start;
+						.item{
+							width: 100%;
+							margin-bottom: 20rpx;
+							display: flex;
+							align-items: flex-start;
+							justify-content: flex-start;
+							&:last-child{
+								margin-bottom: 0rpx;
+							}
+							.left{
+								flex:1;
+								height:160rpx;
+								margin-right: 15rpx;
+								display: flex;
+								flex-direction: column;
+								align-items: flex-start;
+								justify-content: space-between;
+								.title{
+									font-size: 28upx;
+									font-family: PingFang SC;
+									font-weight: bold;
+									color: #111111;
+								}
+								.views{
+									font-size: 24upx;
+									font-family: PingFang SC;
+									color: #9a9a9c;
+								}
+							}
+							.right{
+								image{
+									border-radius: 10rpx;
+									width:220rpx;
+									height:160rpx;
+									border: 1px solid #eeeeee;
+								}
+							}
+						}
+					}
+				}
+				
+				.packages{
+					z-index: 101;
+					margin: 20rpx 15rpx;
+					padding: 20rpx;
+					box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+					background-color: #fff;
+					border-radius: 15rpx;
+					.title-box{
+						display: flex;
+						flex-direction: row;
+						align-items: center;
+						justify-content: space-between;
+						.title{
+							font-size: 32upx;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.more{
+							display: flex;
+							align-items: center;
+							justify-content: flex-end;
+							.text{
+								font-size: 24rpx;
+								font-family: PingFang SC;
+								color: #9B9B9B;
+							}
+							image{
+								margin-left: 10rpx;
+								width:15rpx;
+								height:20rpx;
+							}
+							
+						}
+					}
+					.package-box{
+						padding: 20rpx 0rpx 0rpx;
+						display: flex;
+						align-items: flex-start;
+						justify-content: flex-start;
+						flex-wrap: wrap;
+						.item{
+							width: calc(50% - 20rpx);
+							border-radius: 15rpx;
+							margin: 10rpx;
+							display: flex;
+							flex-direction: column;
+							align-items: flex-start;
+							justify-content: flex-start;
+							&:last-child{
+							}
+							.top{
+								width:100%;
+								height:300rpx;
+								image{
+									border-radius: 15rpx 15rpx 0rpx 0rpx;
+									width:100%;
+									height:300rpx;
+								}
+								
+							}
+							.bottom{
+								width: 100%;
+								margin-top: 15rpx;
+								.title{
+									font-weight: bold;
+									font-size: 28upx;
+									font-family: PingFang SC;
+									color: #111111;
+								}
+								.price-box{
+									margin-top: 10rpx;
+									display: flex;
+									align-items: center;
+									justify-content: space-between;
+									width: 100%;
+									.price{
+										padding: 5rpx 10rpx;
+										background-color: #018C39;
+										border-radius: 30rpx;
+										font-size: 20upx;
+										font-family: PingFang SC;
+										color: #ffffff;
+									}
+									.count{
+										font-size: 24upx;
+										font-family: PingFang SC;
+										color: #333333;
+									}
+									
+								}
+							}
+						}
+					}
+					
+					
+				}
+			}
+			
+		}
+	}
+	.official-account{
+		box-sizing: border-box;
+		width: 100%;
+		height: 100upx;
+		position: fixed;
+		bottom: 30upx;
+		z-index: 99;
+		padding: 0 20upx 180rpx 20upx;
+	}
+	// 消息
+	.message-box{
+		box-sizing: border-box;
+		width: 100%;
+		height: 84upx;
+		background: #F3FFFD;
+		border: 1px solid #C7E9E5;
+		box-shadow: 0px 4upx 12upx 0px rgba(90, 203, 138, 0.16);
+		border-radius: 16upx;
+		position: fixed;
+		left: 50%;
+		transform: translateX(-50%);
+		bottom: 30upx;
+		z-index: 99;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 0 20upx 0 30upx;
+		.left{
+			flex:1;
+			display: flex;
+			align-items: center;
+			image{
+				width: 24upx;
+				height: 24upx;
+				margin-right: 18upx;
+			}
+			.text{
+				width: 90%;
+				font-size: 28upx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #018C39;
+			}
+		}
+		.btn{
+			width: 100upx;
+			height: 48upx;
+			line-height: 48upx;
+			text-align: center;
+			font-size: 24upx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #FFFFFF;
+			border: 1px solid #D2E6FF;
+			background: linear-gradient(135deg, #38e663  0%, #018C39 100%);
+			border-radius: 24upx;
+			margin-left: 30upx;
+		}
+		
+	}
+ 
+	.contact-btn{
+		display: inline-block;
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0;
+	   }
+	   
+	.popup-box{
+			position: fixed;
+			top: 0;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			z-index: 999;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			.info-mask {
+				position: fixed;
+				top: 0;
+				right: 0;
+				bottom: 0;
+				left: 0;
+				background-color: rgba($color: #000000, $alpha: 0.5);
+				z-index: 999;
+			}
+			.info-form {
+				z-index: 1000;
+				width: 450rpx;
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+				position: relative;
+				image{
+					width::100%;
+				}
+			}
+	}
+
+</style>
+ 

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