Selaa lähdekoodia

Signed-off-by: 李妹妹 <1639016684@qq.com>

李妹妹 4 viikkoa sitten
commit
e05642d81b
100 muutettua tiedostoa jossa 30119 lisäystä ja 0 poistoa
  1. 4 0
      .gitignore
  2. 346 0
      App.vue
  3. 38 0
      androidPrivacy.json
  4. 64 0
      api/common.js
  5. 52 0
      api/companyUser.js
  6. 52 0
      api/healthRecords.js
  7. 28 0
      api/healthTongue.js
  8. 150 0
      api/index.js
  9. 24 0
      api/test.js
  10. 227 0
      api/user.js
  11. BIN
      assets/css/bushu_icon.png
  12. 212 0
      assets/css/common.less
  13. 64 0
      assets/css/czy/emoji/biaoqin.js
  14. 3139 0
      assets/css/czy/emoji/sina.js
  15. 1595 0
      assets/css/czy/es.1.base.css
  16. 94 0
      assets/css/czy/es.2.color.css
  17. 28 0
      assets/css/czy/es.3.icon.css
  18. 101 0
      assets/css/czy/es.4.view.css
  19. BIN
      assets/css/kaluli_icon.png
  20. BIN
      assets/css/min_icon.png
  21. BIN
      assets/css/sports_record_icon.png
  22. BIN
      assets/css/time_icon.png
  23. 1 0
      assets/iconfont/iconfont.css
  24. 32 0
      common/ChainItem.js
  25. 11 0
      common/config.js
  26. 26 0
      common/css/flexCommon.css
  27. 97 0
      common/request.js
  28. 54 0
      common/util.js
  29. 106 0
      components/CustomCamera/WeChat/Layout.vue
  30. 194 0
      components/CustomCamera/WeChat/index.vue
  31. 50 0
      components/Loading.vue
  32. 162 0
      components/Menu.vue
  33. 0 0
      components/lx-calendar/lx-calendar.md
  34. 632 0
      components/lx-calendar/lx-calendar.vue
  35. 188 0
      components/nodata.nvue
  36. 356 0
      components/popupBottom/popupBottom.vue
  37. 454 0
      components/pushangyuqi-calendar/pushangyuqi-calendar.vue
  38. 384 0
      components/share-box/share-boxN.vue
  39. 78 0
      components/smsTempItem/smsTempItem.vue
  40. 205 0
      components/todo-list.vue
  41. 26 0
      components/uni-load-more.vue
  42. 1039 0
      components/userCard.vue
  43. 20 0
      index.html
  44. 405 0
      js_sdk/wa-permission/permission.js
  45. 110 0
      main.js
  46. 392 0
      manifest.json
  47. BIN
      nativeplugins/Ba-CameraView.zip
  48. BIN
      nativeplugins/Ba-CameraView/android/camera-release.aar
  49. 31 0
      nativeplugins/Ba-CameraView/package.json
  50. BIN
      nativeplugins/SmdtManager/android/smdtManager-release.aar
  51. 52 0
      nativeplugins/SmdtManager/package.json
  52. BIN
      nativeplugins/TyPulse/android/typulse-release.aar
  53. 145 0
      nativeplugins/TyPulse/package.json
  54. 2447 0
      package-lock.json
  55. 34 0
      package.json
  56. 361 0
      pages.json
  57. 544 0
      pages/auth/loginIndex.vue
  58. 74 0
      pages/common/launch.vue
  59. 1533 0
      pages/device/pulse/index.vue
  60. BIN
      pages/device/tongue.zip
  61. 502 0
      pages/device/tongue/facePhoto.nvue
  62. 1588 0
      pages/device/tongue/index.vue
  63. 559 0
      pages/device/tongue/indexOld.nvue
  64. 62 0
      pages/device/tongue/indexOld2.vue
  65. 299 0
      pages/device/tongue/photoPreview.vue
  66. 18 0
      pages/device/tongue/ques.vue
  67. 589 0
      pages/device/tongue/report.vue
  68. 459 0
      pages/device/tongue/test.nvue
  69. 204 0
      pages/device/tongue/testCameraAuto.nvue
  70. 132 0
      pages/device/tongue/tongueList.vue
  71. 111 0
      pages/index/appDownload.vue
  72. 33 0
      pages/index/download.vue
  73. 42 0
      pages/index/h5.vue
  74. 528 0
      pages/index/index.vue
  75. 1160 0
      pages/index/indexOld.vue
  76. 389 0
      pages/index/smdtManager/smdtManager.js
  77. 505 0
      pages/index/smdtManager/smdtManager.vue
  78. 1209 0
      pages/index/typulse.vue
  79. 1372 0
      pages/user/healthRecords/add.vue
  80. 1004 0
      pages/user/healthRecords/edit.vue
  81. 930 0
      pages/user/healthRecords/index.vue
  82. 648 0
      pages/user/healthReport.vue
  83. 984 0
      pages/user/myUserList.vue
  84. 231 0
      pages/user/userInfo.vue
  85. 42 0
      postcss.config.js
  86. 58 0
      readme.md
  87. BIN
      static/image/ai_right_icon.png
  88. BIN
      static/image/black_back.png
  89. BIN
      static/image/device/add_icon32.png
  90. BIN
      static/image/device/add_icon68.png
  91. BIN
      static/image/device/album_icon24.png
  92. BIN
      static/image/device/arrow_icon16.png
  93. BIN
      static/image/device/back_icon32.png
  94. BIN
      static/image/device/back_icon33.png
  95. BIN
      static/image/device/calendar_icon24.png
  96. BIN
      static/image/device/close_icon32.png
  97. BIN
      static/image/device/close_icon33.png
  98. BIN
      static/image/device/code_icon32.png
  99. BIN
      static/image/device/code_icon36.png
  100. BIN
      static/image/device/company_manage_icon32.png

+ 4 - 0
.gitignore

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

+ 346 - 0
App.vue

@@ -0,0 +1,346 @@
+<script>
+	import {
+		getDictByKey,
+		getAppVersion,
+		getRealLinkDomainName
+	} from '@/api/common';
+	import {
+		appCheckUdate,
+		openDownload
+	} from '@/utils/APPUpdate.js';
+	import {
+		getUserInfo,
+		getPushLogRead
+	} from '@/api/user';
+	import {
+		mapGetters,
+		mapActions
+	} from 'vuex';
+
+	let updateDownloadTask = null;
+	let notificationIntance = null;
+	let pausing = false;
+	let innerAudioContext;
+	let notification;
+	let uPushPlugin;
+
+	// #ifdef APP-PLUS
+	import {
+		getTlsSig
+	} from '@/api/common.js';
+	import {
+		qconfig
+	} from './utils/config';
+	// import { getImAdminToken } from '@/pages_im/api/imApi';
+	// import { ar } from 'date-fns/locale';
+	// #endif
+
+
+	let offlineMsg = null;
+	let offlineHandleNewMsg = null;
+
+	export default {
+		globalData: {
+			wsUrl: 'ws://doctor.ai.cdwjyyh.com',
+			corpId: 'ww70ac72e824957fc9', //客服企业id
+			miniprogamId: "gh_7a6a32e5ef61",
+		},
+		onLaunch: function(options) {
+			uni.hideTabBar();
+			//设置字体大小
+			// let fontsize = uni.getStorageSync('fontSize');
+			// if (fontsize) {
+			// 	uni.setStorageSync('fontSize', fontsize);
+			// } 
+			// else {
+			// 	let scale = this.getSystemFontScale();
+			// 	let oriFontSize = 18;
+			// 	fontsize = oriFontSize * scale;
+			// 	if (fontsize < oriFontSize) {
+			// 		fontsize = oriFontSize;
+			// 	}
+			// 	if (fontsize < 16) {
+			// 		fontsize = 16;
+			// 	}
+			// 	if (fontsize >= 21) {
+			// 		fontsize = 21;
+			// 	}
+			// 	uni.setStorageSync('fontSize', fontsize);
+			// }
+
+			uni.removeStorageSync('openUrl');
+			if (this.$isLogin()) {
+				uni.setStorageSync("onLaunch", 1);
+			}
+			let that = this;
+
+			// #ifdef APP-PLUS
+
+			//#endif
+		},
+		onLoad() {
+
+		},
+		onShow() {
+
+			var that = this;
+			// #ifdef APP-PLUS
+			if (uni.$u.os() === 'android') {
+				this.checkUpdateApp();
+			}
+			// this.checkPermission(["android.permission.BLUETOOTH_CONNECT"],"蓝牙",function(){
+			// 		console.log('checkPermission BLUETOOTH_CONNECT OK!');
+			// });
+
+			// #endif
+
+		},
+
+		onHide() {
+			console.log("qxj onHide");
+			uni.removeStorageSync('onLaunch');
+			// if(uni.$u.os() === 'android'){
+			// 	IMSDK.asyncApi(IMSDK.IMMethods.SetAppBackgroundStatus, IMSDK.uuid(), true);
+			// 	// meetingModule?.onListenerAppBackground(true);
+			// }
+
+		},
+		computed: {
+
+		},
+		methods: {
+			checkPermission(permissions, permissionName, success) {
+				plus.android.requestPermissions(permissions, function(e) {
+					if (e.deniedAlways.length > 0) { //权限被永久拒绝
+						// 弹出提示框解释为何需要读写手机储存权限,引导用户打开设置页面开启
+						uni.showModal({
+							title: permissionName + '权限',
+							content: '您可能拒绝了' + permissionName + '权限或您的设备无需设置权限',
+							success: function(res) {
+								if (res.confirm) {
+									// console.log('用户点击确定');
+								} else if (res.cancel) {
+									// console.log('用户点击取消');
+								}
+							}
+						});
+					}
+					if (e.deniedPresent.length > 0) { //权限被临时拒绝
+						plus.android.requestPermissions(permissions)
+					}
+					if (e.granted.length > 0) { //权限被允许
+						if (success) {
+							success();
+						}
+					}
+				}, function(e) {
+					
+				});
+			},
+			// 处理Launch信息
+			handlerLaunchMsg() {
+				let that = this;
+				// 监听通知点击事件
+				plus.push.addEventListener('click', function(msg) {
+					console.log('应用通过点击通知启动:', msg);
+					let newServerMsg = msg.payload;
+					// uni.switchTab({url: 'pages_im/pages/conversation/conversationList/index'});
+					//uni.$u.throttle(() => that.notifyGoToChat(newServerMsg), 1000);
+				});
+				// 获取启动时的通知
+				plus.push.getClientInfoAsync(function(info) {
+					console.log("qxj getClientInfoAsync", info);
+					if (info.id && info.id == "unipush") { //荣耀离线推送
+						offlineMsg = info;
+					}
+					if (info.title && info.content && info.payload) {
+						// uni.switchTab({url: 'pages_im/pages/conversation/conversationList/index'});
+					}
+					if (info.launch && info.launch.payload) {
+						let newServerMsg = info.launch.payload;
+						console.log('应用通过通知启动:', info);
+						// uni.switchTab({url: 'pages_im/pages/conversation/conversationList/index'});
+						//uni.$u.throttle(() => that.notifyGoToChat(newServerMsg), 1000);
+					}
+				}, function(err) {
+					console.error("Error getting client info:", err);
+				});
+			},
+
+			getSystemFontScale: function() {
+				let scale = 1;
+				if (uni.getSystemInfoSync) {
+					let systemInfo = uni.getSystemInfoSync();
+					if (systemInfo.fontSizeSetting) {
+						scale = systemInfo.fontSizeSetting / 16; // 16 是默认字体大小
+					}
+				}
+				return scale;
+			},
+			adjustFontSize: function() {
+				let scale = getSystemFontScale();
+				let rootElement = document.documentElement;
+				rootElement.style.fontSize = 16 * scale + 'px';
+			},
+			/* 检查更新 在线更新 */
+			checkUpdateApp() {
+				//  获取manifest.json里的配置信息
+				let that = this;
+				plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
+					// console.log("qxj widgetinfo:"+JSON.stringify(widgetinfo));
+					// 可以根据manifest.json里的应用名称来进行针对性的APP升级
+					if (widgetinfo.name == qconfig.appName) {
+						//APP名称
+						// 获取manifest.json里的版本号
+						let platform = uni.getSystemInfoSync().platform;
+						let isAndroid = platform == 'android';
+						let type = isAndroid ? 5 : 2;
+						// console.log("qxj widgetinfo:"+type);
+						getAppVersion(type).then((srcData) => {
+									if (srcData.code == 200) {
+										//console.log("qxj widgetinfo:"+srcData);
+										let data = srcData.data;
+										let version = widgetinfo.versionCode, //用户当前app版本
+											appVersion = data.versionCode, //升级包版本
+											appName = widgetinfo.name, //app名称
+											isForce = data.isForce, //是否强制热更新
+											updateConfig = JSON.parse(data.updateConfig),
+											appurl = data.url, //升级包地址
+											intro = data.note; //升级包提示
+										//如果用户版本号小于升级包版本号,先升级
+										let afterVer = false;
+										if (plus.runtime.channel == 'baidu') {
+											afterVer = that.$qconfig.isAppStore ? updateConfig.baidu : false;
+										} else if (plus.runtime.channel == 'huawei') {
+											afterVer = that.$qconfig.isAppStore ? updateConfig.huawei : false;
+										} else if (plus.runtime.channel == 'xiaomi') {
+											afterVer = that.$qconfig.isAppStore ? updateConfig.xiaomi : false;
+										} else if (plus.runtime.channel == 'yyb') {
+											afterVer = that.$qconfig.isAppStore ? updateConfig.yyb : false;
+										} else {
+											afterVer = that.$qconfig.isAppStore ? isForce : true;
+										}
+										if (data && version < appVersion && afterVer) {
+											uni.showModal({
+												title: '更新提示',
+												confirmText: '立即升级',
+												content: intro,
+												cancelText: '确定',
+												confirmText: '取消',
+												success: (res) => {
+													if (res.cancel) {
+														openDownload(srcData.data);
+													} else if (res.confirm) {
+														if (isForce == 1) {
+															uni.showToast({
+																title: '请先升级APP版本',
+																icon: 'none',
+																duration: 2000
+															});
+															//退出app
+															setTimeout(function() {
+																plus.runtime.quit();
+															}, 2000);
+														}
+													}
+												},
+												fail: () => {
+													uni.hideLoading();
+												}
+											});
+										}
+									}
+								},
+								(rej) => {}
+							)
+							.catch(() => {
+								//联网失败, 结束加载
+								this.mescroll.endErr();
+							});
+					}
+				});
+			}
+
+		}
+	};
+</script>
+
+<style lang="scss">
+	/*每个页面公共css */
+	@import '@/uni_modules/uview-plus/index.scss';
+
+	/*#ifndef APP-NVUE*/
+
+	view {
+		box-sizing: border-box;
+	}
+
+	.ellipsis {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+
+	.ellipsis2 {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 2;
+	}
+
+	uni-modal {
+		z-index: 1100;
+	}
+
+
+	.no-data-box {
+		height: 100%;
+		width: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		flex-direction: column;
+
+		image {
+			width: 264upx;
+			height: 212upx;
+		}
+
+		.empty-title {
+			margin-top: 20rpx;
+			font-size: 28rpx;
+			color: gray;
+		}
+	}
+
+	/*#endif*/
+</style>
+
+<style lang="less">
+	/*每个页面公共css */
+	// @import './assets/iconfont/iconfont.css';
+	@import './assets/css/common.less';
+	/* 全局flex样式 */
+	@import './common/css/flexCommon.css';
+
+	/*引入全局补充样式*/
+	@import './assets/css/czy/es.1.base.css';
+	@import './assets/css/czy/es.2.color.css';
+	@import './assets/css/czy/es.3.icon.css';
+	@import './assets/css/czy/es.4.view.css';
+
+	.textOne {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.textTwo {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+</style>

+ 38 - 0
androidPrivacy.json

@@ -0,0 +1,38 @@
+{
+    "version" : "1",
+    "prompt" : "template",
+    "title" : "服务协议和隐私政策",
+    "message" : "非常感谢您使用医疗设备,我们深知保护个人隐私的重要性,所以请您在使用前,仔细阅读并充分理解<a href=\"https://userapp.his.cdwjyyh.com/web/userAgreement\">《用户协议》</a>和<a href=\"https://userapp.his.cdwjyyh.com/web/privacyPolicy\">《隐私政策》</a>的内容。<br/>如您同意,请点击\"同意并使用开始\"开始使用我们的产品和服务。",
+    "buttonAccept" : "同意并接受",
+    "buttonRefuse" : "暂不同意",
+    "hrefLoader" : "system",
+    "backToExit" : "false",
+    "second" : {
+        "title" : "确认提示",
+        "message" : "  进入应用前,你需先同意<a href=\"https://userapp.his.cdwjyyh.com/web/userAgreement\">《服务协议》</a>和<a href=\"https://userapp.his.cdwjyyh.com/web/privacyPolicy\">《隐私政策》</a>,否则将退出应用。 ",
+        "buttonAccept" : "同意并继续",
+        "buttonRefuse" : "退出应用"
+    },
+    "disagreeMode" : {
+        "support" : false,
+        "loadNativePlugins" : false,
+        "visitorEntry" : false,
+        "showAlways" : true
+    },
+    "styles" : {
+        "backgroundColor" : "#ffffff",
+        "borderRadius" : "5px",
+        "title" : {
+            "color" : "#333"
+        },
+        "buttonAccept" : {
+            "color" : "#333"
+        },
+        "buttonRefuse" : {
+            "color" : "#88570B"
+        },
+        "buttonVisitor" : {
+            "color" : "#88570B"
+        }
+    }
+}

+ 64 - 0
api/common.js

@@ -0,0 +1,64 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ export function getDicts(data) {
+	 return request('/app/common/getDicts',data,'GET');
+ }
+ export function sendSmsCode(data) {
+ 	return request('/app/common/sendSmsCode',data,'POST','application/json;charset=UTF-8');
+ }
+ export function uploadOSS(data) {
+ 	 return request('/app/common/uploadOSS',data,'POST','application/json;charset=UTF-8');
+ }
+ export function getDictByKey(data) {
+ 	 return request('/app/common/getDictByKey',data,'GET');
+ }
+
+
+ export function getSelectUserList(nickName) {
+	 console.log("--------qxj getSelectUserList nickName:",nickName);
+	 let data = {"nickName":nickName};
+ 	 return request('/app/common/getSelectUserList',data,'GET');
+ }
+
+
+ export function getAppVersion(type) {
+	 let data = {"type":type+""};
+ 	 return request('/app/common/getAppVersion',data,'GET');
+ }
+
+
+ export function getCitys() {
+ 	 return request('/app/common/getCitys',{},'GET');
+ }
+
+
+ export function getHospitalList(data) {
+ 	 return request('/app/common/getHospitalList',data,'GET');
+ }
+ export function getDepartmentList(data) {
+ 	 return request('/app/common/getDepartmentList',data,'GET');
+ }
+ export function getConfigByKey(data) {
+ 	 return request('/app/common/getConfigByKey',data,'GET');
+ }
+ export function getTlsSig(data) {
+ 	 return request('/app/common/getTlsSig',data,'GET');
+ }
+ 
+ export function getRealLinkDomainName() {
+ 	 return request('/app/common/getRealLinkDomainName',null,'GET');
+ }
+ 
+  // 获取getWxConfig
+  export function getWxConfig(data,type) {
+  	return request('/app/wx/mp/getWxConfig', data, 'GET',undefined, 3);
+  }
+  
+ export function getIOSPayStatus(data) {
+ 	 return request('/app/common/getIOSPayStatus',data,'GET');
+ }
+ 
+ export function getQwCompanyList(data) {
+ 	 return request('/app/qwCompany/getQwCompanyList',data,'POST','application/json;charset=UTF-8');
+ }

+ 52 - 0
api/companyUser.js

@@ -0,0 +1,52 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ export function login(data) {
+ 	 return request('/app/companyUser/login',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getUserInfo(data) {
+ 	 return request('/app/companyUser/getUserInfo',data,'GET','application/json;charset=UTF-8');
+ }
+ export function getQrImg(data) {
+ 	 return request('/app/companyUser/getQrImg',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+ export function getCompanyUserCard(data) {
+ 	 return request('/app/companyUser/getCompanyUserCard',data,'GET','application/json;charset=UTF-8');
+ }
+ export function bindCompanyUser(data) {
+ 	 return request('/app/companyUser/bindCompanyUser',data,'POST','application/json;charset=UTF-8');
+ }
+ export function addVoicePrintUrl(data) {
+ 	 return request('/app/companyUser/addVoicePrintUrl',data,'POST','application/json;charset=UTF-8');
+ }
+ // 获取绑定
+ export function getBindInfo(data) {
+ 	 return request('/app/companyUser/getBindInfo',data,'GET','application/json;charset=UTF-8');
+ }
+ // 绑定销售
+ export function bindCompanyFsUser(id) {
+ 	 return request('/app/companyCompanyFsUser/bind/'+id,null,'GET','application/json;charset=UTF-8');
+ }
+  //  模板语音上传接口
+ export function companyUserVoiceNew(data) {
+ 	 return request('/app/companyUser/companyUserVoiceNew',data,'GET','application/json;charset=UTF-8');
+ }
+ // 模板语音上传接口
+ export function companyUserVoice(data) {
+ 	 return request('/app/companyUser/companyUserVoice',data,'GET','application/json;charset=UTF-8');
+ }
+ // 获取语音列表
+ export function querySopVoiceList(data) {
+ 	 return request('/app/companyUser/querySopVoiceList',data,'GET','application/json;charset=UTF-8');
+ }
+ // 获取语音详情
+ export function queryDetail(id) {
+ 	 return request('/app/companyUser/query/'+id,null,'GET','application/json;charset=UTF-8');
+ }
+  
+ export function createUserAllVoice(id) {
+ 	 return request('/app/companyUser/createUserAllVoice',null,'GET','application/json;charset=UTF-8');
+ }
+ 

+ 52 - 0
api/healthRecords.js

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

+ 28 - 0
api/healthTongue.js

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

+ 150 - 0
api/index.js

@@ -0,0 +1,150 @@
+import Request from '../common/request.js';
+let request = new Request().http
+
+ 
+ export function getIndexData() {
+ 	 return request('/app/index/getIndexData',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 bdCallBackReq(data) {
+ 	 return request('/app/common/bdCallBack',data,'GET');
+ }
+ 
+export function aiChatListByUser(data) {
+	 const url = '/doctorAi/app/aiDoctor/chatListByUser?doctorId='+data.doctorId+'&userId='+data.userId+'&patientId='+data.patientId
+ 	 return request(url,null,'POST','application/json;charset=UTF-8');
+ }
+ 
+export function getLocation() {
+  return new Promise((resolve, reject) => {
+    // #ifdef APP
+    uni.getLocation({
+      type: 'gcj02', // 必须设置为gcj02
+      geocode: true, // 是否解析地址信息,仅App支持
+      isHighAccuracy: true, // 开启高精度
+      success: (res) => {
+			resolve({
+			   ...res.address,
+			   longitude: res.longitude,
+			   latitude: res.latitude
+			})
+       },
+       fail: (err) => {
+		   console.log(err)
+		   reject(new Error('获取地理位置信息失败'))
+       }
+    })
+    // #endif
+    
+    // #ifdef H5
+
+	 uni.getLocation({
+	    type: 'gcj02', //wgs84
+	   isHighAccuracy: true, // 开启高精度定位
+	   success: function (res) {
+	 		console.log("qxj longitude:"+res.longitude);
+			uni.showToast({icon:'none',title: "qxj res:"+JSON.stringify(res)});
+	 		uni.request({
+	 		  method: "post",
+	 		  url: "https://restapi.amap.com/v3/geocode/regeo?key=ae15f2eb04bbc8e9f2963430f0943a42&location="+res.longitude+","+res.latitude+"&output=JSON",
+	 		  data: null,
+	 		  success: ({ data }) => {
+	 				console.log("qxj location:"+JSON.stringify(data));
+	 				const { addressComponent, formatted_address } = data.regeocode
+	 				//const [longitude, latitude] = addressComponent.streetNumber.location.split(',')
+					let addrCity=addressComponent.city;
+					if(Array.isArray(addressComponent.city)){
+						addrCity=addressComponent.province;
+					}
+	 				resolve({
+	 					  province: addressComponent.province,
+	 					  city: addrCity,
+	 					  district: addressComponent.district,
+	 					  street: addressComponent.township,
+	 					  address: formatted_address
+	 				})
+	 		  },
+	 		  fail: (error) => {
+	 			console.log(error)
+	 			reject(new Error('获取地理位置信息失败'))
+	 		  }
+	 		});
+	   },
+	   fail:function(res){
+	   	   //console.log(res);
+		   //uni.showToast({icon:'none',title: "qxj longitude error:"+JSON.stringify(res),duration:10000});
+	   	}
+	 });
+    // #endif
+  })
+}
+
+
+function getH5Location(){
+	uni.getLocation({
+	   type: 'gcj02',
+	  //isHighAccuracy: true, // 开启高精度定位
+	  success: ({ longitude, latitude }) => {
+			console.log("qxj longitude:"+longitude);
+			uni.request({
+			  method: 'GET',
+			  url: 'https://restapi.amap.com/v3/geocode/regeo?parameters',
+			  data: {
+				key: 'ae15f2eb04bbc8e9f2963430f0943a42',
+				location: `${longitude},${latitude}`,
+				output: 'JSON'
+			  },
+			  success: ({ data }) => {
+					console.log("qxj location:"+JSON.stringify(data));
+					const { addressComponent, formatted_address } = data.regeocode
+					const [longitude, latitude] = addressComponent.streetNumber.location.split(',')
+					resolve({
+						  longitude,
+						  latitude,
+						  province: addressComponent.province,
+						  city: addressComponent.city,
+						  district: addressComponent.district,
+						  street: addressComponent.township,
+						  address: formatted_address
+					})
+			  },
+			  fail: (error) => {
+				console.log(error)
+				reject(new Error('获取地理位置信息失败'))
+			  }
+			});
+	  }
+	});
+}

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

+ 227 - 0
api/user.js

@@ -0,0 +1,227 @@
+import Request from '../common/request.js';
+let request = new Request().http
+ 
+ // export function login(data) {
+ // 	 return request('/app/app/login',data,'POST','application/json;charset=UTF-8');
+ // }
+ //ipad
+ //登录
+ export function login(data) {
+ 	 return request('/app/user/login',data,'POST','application/json;charset=UTF-8');
+ }
+ //验证码
+ export function getCode(data) {
+ 	 return request('/app/common/captchaImage',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+//用户信息
+ export function selectUserInfo(data) {
+ 	 return request('/app/user/getUserInfo',data,'GET','application/json;charset=UTF-8');
+ }
+ //全部客户
+ export function selectUsernameOrPhoneOrTime(data) {
+ 	 return request('/app/fsUser/selectUsernameOrPhoneOrTime',data,'GET','application/json;charset=UTF-8');
+ }
+ //待问诊客户
+ export function selectNotGeneratedReport(data) {
+ 	 return request('/app/fsUser/selectNotGeneratedReport',data,'GET','application/json;charset=UTF-8');
+ }
+ //用户详情
+ export function selectQueryFsUser(data) {
+ 	 return request('/app/fsUser/selectQueryFsUser',data,'GET','application/json;charset=UTF-8');
+ }
+ //用户问诊记录
+ export function selectSuccessGeneratedReport(data) {
+ 	 return request('/app/fsUser/selectSuccessGeneratedReport',data,'GET','application/json;charset=UTF-8');
+ }
+ 
+ //新增客户
+ export function addUser(data) {
+ 	 return request('/app/fsUser/add',data,'POST','application/json;charset=UTF-8');
+ }
+ //修改客户
+ export function editUser(data) {
+ 	 return request('/app/fsUser/modifyOldAndNewUser',data,'POST','application/json;charset=UTF-8');
+ }
+ //导出报告
+ export function getExport(data) {
+ 	 return request('/app/fsUser/export',data,'GET','application/json;charset=UTF-8');
+ }
+ //查询报告
+ export function getDiagnosis(data) {
+ 	return request('/app/common/diagnosis', data, 'GET');
+ }
+ export function loginByWeChat(data) {
+ 	 return request('/app/app/loginByWeChat',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function loginByApple(data) {
+ 	 return request('/app/app/loginByApple',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function loginByMp(data) {
+ 	 return request('/app/wx/loginByMp?appId=wx7a3715e6f0d22c56',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function setPhone(data) {
+ 	 return request('/app/app/setPhone',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function setIPhoneNumber(data) { 
+ 	 return request('/app/app/setIPhoneNumber',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function bindWechat(data) {
+ 	 return request('/app/app/bindWeChat',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function register(data) {
+ 	 return request('/app/app/register',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getUserInfo() {
+ 	 return request('/app/user/getUserInfo',null,'GET');
+ }
+ 
+ export function checkLogin() {
+ 	 return request('/app/app/checkLogin',null,'GET');
+ }
+ export function getAllUsers(data) {
+ 	 return request('/app/app/getAllUsers',data,'GET');
+ }
+ export function getUserInfoByUserId(data) {
+ 	 return request('/app/app/getUserInfoByUserId',data,'GET');
+ }
+ 
+ export function setPwd(data) {
+ 	 return request('/app/app/setPwd',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function setHeadImg(data) {
+ 	 return request('/app/app/setHeadImg',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function setUserInfo(data) {
+ 	 return request('/app/user/editUser',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function editQrCode(data) {
+ 	 return request('/app/app/editQrCode',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 
+ export function getAlipayQrImg() {
+ 	 return request('/app/storePayment/getAlipayQrImg',null,'GET');
+ }
+ 
+ 
+ export function getMyCardList(data) {
+ 	 return request('/app/app/getMyCardList',data,'GET');
+ }
+ 
+ export function delMyCard(cId) {
+ 	 return request('/app/app/delMyCard?cardId='+cId,null,'POST');
+ }
+ 
+ export function getAppletScheme(cId) {
+ 	 return request('/app/app/getAppletScheme?cardId='+cId,null,'GET');
+ }
+ 
+ export function getShortUrl(url,title) {
+ 	 return request('/app/app/getShortUrl?url='+url+'&title='+title,null,'GET');
+ }
+ 
+ 
+ export function getMyCouponList(data) {
+ 	 return request('/app/user/getMyCouponList',data,'GET');
+ }
+ 
+ export function getMyEnableCouponList(data) {
+ 	 return request('/app/user/getMyEnableCouponList',data,'GET');
+ }
+ 
+ export function registerDoctor(data) {
+ 	return request('/app/user/registerDoctor',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ export function getMyCouponCount() {
+ 	 return request('/app/user/getMyCouponCount',null,'GET');
+ }
+ 
+ //查看推送设置
+ export function getUserPushSetting() {
+ 	 return request('/app/user/getUserPushSetting',null,'GET');
+ }
+ 
+ 
+ export function editUserPushSetting(data) {
+ 	 return request('/app/user/editUserPushSetting',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ // 健康管家二维码
+ export function getAppContactWay(userId) {
+ 	 return request('/app/user/getAppContactWay/'+userId,null,'GET');
+ }
+ 
+ // 退出登录 清除jpushId
+ export function logoutjpushId() {
+ 	 return request('/app/app/logout',null,'GET');
+ }
+ 
+ // 最新通知及未读条数
+ // export function getLastAndReadStatus() {
+ // 	 return request('/app/uniPushLog/getLastAndReadStatus',null,'GET');
+ // }
+ 
+ // 查询所有通知
+ export function getPushLog(data) {
+ 	 return request('/app/uniPushLog/list',data,'GET');
+ }
+ 
+ // 通知 一键已读
+ export function getPushLogRead(data) {
+ 	 return request('/app/uniPushLog/setIsRead',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+// 更新jpushId
+ export function updatePushId(data) {
+ 	 return request('/app/updatePushId',data,'GET');
+ }
+ 
+ // 更新用户是否绑定app
+  export function updateHistoryApp(data) {
+  	 return request('/app/user/updateHistoryApp',data,'GET');
+  }
+  
+  
+  // 账号注销
+ export function deleteUser(userId) {
+   return request('/app/user/deleteUser/'+userId,null,'POST');
+}
+   
+   
+  
+  
+ //新增弹窗记录
+ export function popAd(data) {
+ 	 return request('/app/pop/add',data,'GET');
+ }
+ 
+ // 判断是否需要弹窗
+ export function isCreateAd(data) {
+ 	 return request('/app/pop/isCreate',data,'GET');
+ }
+ 
+ // 投诉模板
+ export function templateList() {
+ 	 return request('/app/complaint/treeList',null,'GET');
+ } 
+ // 投诉
+ export function complaint(data) {
+ 	return request('/app/complaint',data,'POST','application/json;charset=UTF-8');
+ }
+ 
+ 

BIN
assets/css/bushu_icon.png


+ 212 - 0
assets/css/common.less

@@ -0,0 +1,212 @@
+  
+ page {
+   background: #f7f7f7;
+   height: 100%;
+ }
+ 
+ .container{
+   height: 100%;
+ } 
+  .border-line {
+  	position: relative;
+  	&::after {
+  		content: "";
+  		position: absolute;
+  		bottom: 0;
+  		left: 0;
+  		border-bottom: 1px solid #F5F7FA;
+  		width: 100%;
+  		transform: scaleY(0.5);
+  		border-top-color: #F5F7FA;
+  		border-right-color: #F5F7FA;
+  		border-left-color: #F5F7FA;
+  	}
+  }
+  /*单行文本溢出省略号*/
+  .one-t {
+    overflow: hidden;
+	/*#ifndef APP-NVUE*/  
+    white-space: nowrap;
+	/*#endif*/
+    text-overflow: ellipsis;
+    transition: all linear 0.2s;
+  }
+  
+  /*多行文本溢出省略号*/
+  .more-t {
+    overflow: hidden;
+    text-overflow: ellipsis;
+	/*#ifndef APP-NVUE*/  
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+	/*#endif*/
+    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;
+	flex-direction: row;
+  }
+  
+  /*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;
+ }
+ 
+ .cts-btn {
+ 	display: flex;
+ 	align-items: center;
+ 	justify-content: center;
+ 	width: 100%;
+ 	height: 80rpx;
+ 	// background: linear-gradient(to right, #35d861 0%, #35d861 100%);
+ 	// background: -moz-linear-gradient(to right, #35d861 0%, #35d861 100%);
+ 	background: #88570B;
+ 	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);
+ 	margin-left: 30rpx;
+ 	margin-right: 30rpx;
+ 	width: calc(100% - 30px);
+ }
+
+
+.flex{
+	flex: 1;
+}
+
+.page_container {
+	display: flex;
+	flex-direction: column;
+	height: 100vh;
+}
+
+.text_message_container {
+	word-break: break-all;
+}
+
+

+ 64 - 0
assets/css/czy/emoji/biaoqin.js

@@ -0,0 +1,64 @@
+const emojiList = [
+	{"url":"0@2x.gif","alt":"[惊讶]"},{"url":"1@2x.gif","alt":"[撇嘴]"},{"url":"2@2x.gif","alt":"[色]"},{"url":"3@2x.gif","alt":"[啊这]"},{"url":"4@2x.gif","alt":"[得意]"},{"url":"5@2x.gif","alt":"[流泪]"},{"url":"6@2x.gif","alt":"[害羞]"},
+	{"url":"7@2x.gif","alt":"[闭嘴]"},{"url":"8@2x.gif","alt":"[睡]"},{"url":"9@2x.gif","alt":"[大哭]"},{"url":"10@2x.gif","alt":"[尴尬]"},{"url":"11@2x.gif","alt":"[发怒]"},{"url":"12@2x.gif","alt":"[调皮]"},{"url":"13@2x.gif","alt":"[呲牙]"},
+	{"url":"14@2x.gif","alt":"[微笑]"},{"url":"15@2x.gif","alt":"[难过]"},{"url":"16@2x.gif","alt":"[酷]"},{"url":"18@2x.gif","alt":"[抓狂]"},{"url":"19@2x.gif","alt":"[吐]"},{"url":"20@2x.gif","alt":"[偷笑]"},{"url":"21@2x.gif","alt":"[可爱]"},
+	{"url":"22@2x.gif","alt":"[白眼]"},{"url":"23@2x.gif","alt":"[傲慢]"},{"url":"24@2x.gif","alt":"[饥饿]"},{"url":"25@2x.gif","alt":"[困]"},{"url":"26@2x.gif","alt":"[惊恐]"},{"url":"27@2x.gif","alt":"[流汗]"},{"url":"28@2x.gif","alt":"[憨笑]"},
+	{"url":"29@2x.gif","alt":"[悠闲]"},{"url":"30@2x.gif","alt":"[奋斗]"},{"url":"31@2x.gif","alt":"[咒骂]"},{"url":"32@2x.gif","alt":"[疑问]"},{"url":"33@2x.gif","alt":"[嘘]"},{"url":"34@2x.gif","alt":"[晕]"},{"url":"35@2x.gif","alt":"[折磨]"},
+	{"url":"36@2x.gif","alt":"[衰]"},{"url":"37@2x.gif","alt":"[骷髅]"},{"url":"38@2x.gif","alt":"[敲打]"},{"url":"39@2x.gif","alt":"[再见]"},{"url":"46@2x.gif","alt":"[猪头]"},{"url":"49@2x.gif","alt":"[抱抱]"},{"url":"53@2x.gif","alt":"[生日]"},
+	{"url":"54@2x.gif","alt":"[闪电]"},{"url":"55@2x.gif","alt":"[炸弹]"},{"url":"56@2x.gif","alt":"[刀]"},{"url":"57@2x.gif","alt":"[足球]"},{"url":"59@2x.gif","alt":"[便便]"},{"url":"60@2x.gif","alt":"[咖啡]"},{"url":"61@2x.gif","alt":"[饭]"},
+	{"url":"62@2x.gif","alt":"[药]"},{"url":"63@2x.gif","alt":"[玫瑰]"},{"url":"64@2x.gif","alt":"[凋谢]"},{"url":"66@2x.gif","alt":"[爱心]"},{"url":"67@2x.gif","alt":"[心碎]"},{"url":"69@2x.gif","alt":"[礼物]"},{"url":"72@2x.gif","alt":"[信封]"},
+	{"url":"74@2x.gif","alt":"[太阳]"},{"url":"75@2x.gif","alt":"[月亮]"},{"url":"76@2x.gif","alt":"[赞]"},{"url":"77@2x.gif","alt":"[踩]"},{"url":"78@2x.gif","alt":"[握手]"},{"url":"79@2x.gif","alt":"[胜利]"},{"url":"89@2x.gif","alt":"[西瓜]"},
+	{"url":"90@2x.gif","alt":"[下雨]"},{"url":"91@2x.gif","alt":"[多云]"},{"url":"96@2x.gif","alt":"[冷汗]"},{"url":"97@2x.gif","alt":"[擦汗]"},{"url":"98@2x.gif","alt":"[抠鼻]"},{"url":"99@2x.gif","alt":"[鼓掌]"},{"url":"100@2x.gif","alt":"[嗅大了]"},
+	{"url":"101@2x.gif","alt":"[坏笑]"},{"url":"102@2x.gif","alt":"[右哼哼]"},{"url":"103@2x.gif","alt":"[左哼哼]"},{"url":"104@2x.gif","alt":"[哈欠]"},{"url":"105@2x.gif","alt":"[鄙视]"},{"url":"106@2x.gif","alt":"[委屈]"},{"url":"107@2x.gif","alt":"[快哭了]"},
+	{"url":"108@2x.gif","alt":"[阴险]"},{"url":"109@2x.gif","alt":"[亲亲]"},{"url":"110@2x.gif","alt":"[吓]"},{"url":"111@2x.gif","alt":"[可怜]"},{"url":"112@2x.gif","alt":"[菜刀]"},{"url":"113@2x.gif","alt":"[啤酒]"},{"url":"114@2x.gif","alt":"[篮球]"},
+	{"url":"115@2x.gif","alt":"[乒乓]"},{"url":"116@2x.gif","alt":"[示爱]"},{"url":"117@2x.gif","alt":"[瓢虫]"},{"url":"118@2x.gif","alt":"[抱拳]"},{"url":"119@2x.gif","alt":"[勾引]"},{"url":"120@2x.gif","alt":"[拳头]"},{"url":"121@2x.gif","alt":"[差劲]"},
+	{"url":"122@2x.gif","alt":"[爱你]"},{"url":"123@2x.gif","alt":"[NO]"},{"url":"124@2x.gif","alt":"[OK]"},{"url":"136@2x.gif","alt":"[双喜]"},{"url":"137@2x.gif","alt":"[鞭炮]"},{"url":"138@2x.gif","alt":"[灯笼]"},{"url":"139@2x.gif","alt":"[麻将]"},
+	{"url":"140@2x.gif","alt":"[唱歌]"},{"url":"141@2x.gif","alt":"[包包]"},{"url":"142@2x.gif","alt":"[信]"},{"url":"143@2x.gif","alt":"[象棋]"},{"url":"144@2x.gif","alt":"[礼物]"},{"url":"145@2x.gif","alt":"[祈祷]"},{"url":"146@2x.gif","alt":"[爆筋]"},
+	{"url":"147@2x.gif","alt":"[棒棒糖]"},{"url":"148@2x.gif","alt":"[喝奶]"},{"url":"149@2x.gif","alt":"[吃面]"},{"url":"150@2x.gif","alt":"[香蕉]"},{"url":"151@2x.gif","alt":"[飞机]"},{"url":"152@2x.gif","alt":"[汽车]"},{"url":"153@2x.gif","alt":"[高铁]"},
+	{"url":"154@2x.gif","alt":"[动车]"},{"url":"155@2x.gif","alt":"[动车头]"},{"url":"156@2x.gif","alt":"[多云]"},{"url":"157@2x.gif","alt":"[下雨]"},{"url":"158@2x.gif","alt":"[钞票]"},{"url":"159@2x.gif","alt":"[熊猫]"},{"url":"160@2x.gif","alt":"[电灯泡]"},
+	{"url":"161@2x.gif","alt":"[七彩]"},{"url":"162@2x.gif","alt":"[闹钟]"},{"url":"163@2x.gif","alt":"[雨伞]"},{"url":"164@2x.gif","alt":"[气球]"},{"url":"165@2x.gif","alt":"[钻戒]"},{"url":"166@2x.gif","alt":"[座椅]"},{"url":"167@2x.gif","alt":"[纸巾]"},
+	{"url":"168@2x.gif","alt":"[药丸]"},{"url":"169@2x.gif","alt":"[手枪]"},{"url":"170@2x.gif","alt":"[青蛙]"},{"url":"171@2x.gif","alt":"[热汤]"},{"url":"172@2x.gif","alt":"[眨眼睛]"},{"url":"173@2x.gif","alt":"[泪奔]"},{"url":"174@2x.gif","alt":"[无奈]"},
+	{"url":"175@2x.gif","alt":"[卖萌]"},{"url":"176@2x.gif","alt":"[小纠结]"},{"url":"177@2x.gif","alt":"[喷血]"},{"url":"178@2x.gif","alt":"[斜眼笑]"},{"url":"179@2x.gif","alt":"[高傲]"},{"url":"180@2x.gif","alt":"[惊喜]"},{"url":"181@2x.gif","alt":"[骚扰]"},
+	{"url":"182@2x.gif","alt":"[笑哭]"},{"url":"183@2x.gif","alt":"[我最美]"},{"url":"184@2x.gif","alt":"[河蟹]"},{"url":"185@2x.gif","alt":"[羊驼]"},{"url":"186@2x.gif","alt":"[板栗]"},{"url":"187@2x.gif","alt":"[幽灵]"},{"url":"188@2x.gif","alt":"[鸡蛋]"},
+	{"url":"189@2x.gif","alt":"[魔方]"},{"url":"190@2x.gif","alt":"[转花圈]"},{"url":"191@2x.gif","alt":"[搓澡]"},{"url":"192@2x.gif","alt":"[红包]"},{"url":"200@2x.gif","alt":"[拜托]"},{"url":"201@2x.gif","alt":"[点赞]"},{"url":"202@2x.gif","alt":"[无聊]"},
+	{"url":"203@2x.gif","alt":"[托脸]"},{"url":"204@2x.gif","alt":"[吃]"},{"url":"205@2x.gif","alt":"[送花]"},{"url":"206@2x.gif","alt":"[害怕]"},{"url":"207@2x.gif","alt":"[花痴]"},{"url":"208@2x.gif","alt":"[小样儿]"},{"url":"210@2x.gif","alt":"[飙泪]"},
+	{"url":"211@2x.gif","alt":"[我不看]"},{"url":"212@2x.gif","alt":"[托腮]"},{"url":"245@2x.gif","alt":"[加油必胜]"},{"url":"246@2x.gif","alt":"[抱抱]"},{"url":"247@2x.gif","alt":"[白条]"},{"url":"260@2x.gif","alt":"[白条]"},{"url":"261@2x.gif","alt":"[搬砖中]"},
+	{"url":"262@2x.gif","alt":"[脑壳疼]"},{"url":"263@2x.gif","alt":"[沧桑]"},{"url":"264@2x.gif","alt":"[捂脸]"},{"url":"265@2x.gif","alt":"[辣眼睛]"},{"url":"266@2x.gif","alt":"[哦呦]"},{"url":"267@2x.gif","alt":"[头秃]"},{"url":"268@2x.gif","alt":"[问号脸]"},
+	{"url":"269@2x.gif","alt":"[暗中观察]"},{"url":"270@2x.gif","alt":"[emm]"},{"url":"271@2x.gif","alt":"[吃瓜]"},{"url":"272@2x.gif","alt":"[呵呵哒]"},{"url":"273@2x.gif","alt":"[白条]"},{"url":"274@2x.gif","alt":"[白条]"},{"url":"newemoji_002.gif","alt":"[好的]"},
+	{"url":"newemoji_003.gif","alt":"[白眼]"},{"url":"newemoji_004.gif","alt":"[鬼脸]"},{"url":"newemoji_005.gif","alt":"[马赛克]"},{"url":"newemoji_006.gif","alt":"[喝茶]"},{"url":"newemoji_007.gif","alt":"[摸鱼]"},{"url":"newemoji_008.gif","alt":"[大笑]"},{"url":"newemoji_009.gif","alt":"[请滚]"},
+	{"url":"newemoji_010.gif","alt":"[睁眼]"},{"url":"newemoji_011.gif","alt":"[儿子乖]"},{"url":"newemoji_012.gif","alt":"[脸疼]"},{"url":"newemoji_013.gif","alt":"[考虑]"},{"url":"newemoji_014.gif","alt":"[惊掉下巴]"},{"url":"newemoji_015.gif","alt":"[遮眼]"},{"url":"newemoji_016.gif","alt":"[比爱心]"},
+	{"url":"newemoji_017.gif","alt":"[喝彩]"}
+]
+export default emojiList;
+// const emojiList = [
+// 	{"url":"0@2x.png","alt":"[惊讶]"},{"url":"1@2x.png","alt":"[撇嘴]"},{"url":"2@2x.png","alt":"[色]"},{"url":"3@2x.png","alt":"[啊这]"},{"url":"4@2x.png","alt":"[得意]"},{"url":"5@2x.png","alt":"[流泪]"},{"url":"6@2x.png","alt":"[害羞]"},
+// 	{"url":"7@2x.png","alt":"[闭嘴]"},{"url":"8@2x.png","alt":"[睡]"},{"url":"9@2x.png","alt":"[大哭]"},{"url":"10@2x.png","alt":"[尴尬]"},{"url":"11@2x.png","alt":"[发怒]"},{"url":"12@2x.png","alt":"[调皮]"},{"url":"13@2x.png","alt":"[呲牙]"},
+// 	{"url":"14@2x.png","alt":"[微笑]"},{"url":"15@2x.png","alt":"[难过]"},{"url":"16@2x.png","alt":"[酷]"},{"url":"18@2x.png","alt":"[抓狂]"},{"url":"19@2x.png","alt":"[吐]"},{"url":"20@2x.png","alt":"[偷笑]"},{"url":"21@2x.png","alt":"[可爱]"},
+// 	{"url":"22@2x.png","alt":"[白眼]"},{"url":"23@2x.png","alt":"[傲慢]"},{"url":"24@2x.png","alt":"[饥饿]"},{"url":"25@2x.png","alt":"[困]"},{"url":"26@2x.png","alt":"[惊恐]"},{"url":"27@2x.png","alt":"[流汗]"},{"url":"28@2x.png","alt":"[憨笑]"},
+// 	{"url":"29@2x.png","alt":"[悠闲]"},{"url":"30@2x.png","alt":"[奋斗]"},{"url":"31@2x.png","alt":"[咒骂]"},{"url":"32@2x.png","alt":"[疑问]"},{"url":"33@2x.png","alt":"[嘘]"},{"url":"34@2x.png","alt":"[晕]"},{"url":"35@2x.png","alt":"[折磨]"},
+// 	{"url":"36@2x.png","alt":"[衰]"},{"url":"37@2x.png","alt":"[骷髅]"},{"url":"38@2x.png","alt":"[敲打]"},{"url":"39@2x.png","alt":"[再见]"},{"url":"46@2x.png","alt":"[猪头]"},{"url":"49@2x.png","alt":"[抱抱]"},{"url":"53@2x.png","alt":"[生日]"},
+// 	{"url":"54@2x.png","alt":"[闪电]"},{"url":"55@2x.png","alt":"[炸弹]"},{"url":"56@2x.png","alt":"[刀]"},{"url":"57@2x.png","alt":"[足球]"},{"url":"59@2x.png","alt":"[便便]"},{"url":"60@2x.png","alt":"[咖啡]"},{"url":"61@2x.png","alt":"[饭]"},
+// 	{"url":"62@2x.png","alt":"[药]"},{"url":"63@2x.png","alt":"[玫瑰]"},{"url":"64@2x.png","alt":"[凋谢]"},{"url":"66@2x.png","alt":"[爱心]"},{"url":"67@2x.png","alt":"[心碎]"},{"url":"69@2x.png","alt":"[礼物]"},{"url":"72@2x.png","alt":"[信封]"},
+// 	{"url":"74@2x.png","alt":"[太阳]"},{"url":"75@2x.png","alt":"[月亮]"},{"url":"76@2x.png","alt":"[赞]"},{"url":"77@2x.png","alt":"[踩]"},{"url":"78@2x.png","alt":"[握手]"},{"url":"79@2x.png","alt":"[胜利]"},{"url":"89@2x.png","alt":"[西瓜]"},
+// 	{"url":"90@2x.png","alt":"[下雨]"},{"url":"91@2x.png","alt":"[多云]"},{"url":"96@2x.png","alt":"[冷汗]"},{"url":"97@2x.png","alt":"[擦汗]"},{"url":"98@2x.png","alt":"[抠鼻]"},{"url":"99@2x.png","alt":"[鼓掌]"},{"url":"100@2x.png","alt":"[嗅大了]"},
+// 	{"url":"101@2x.png","alt":"[坏笑]"},{"url":"102@2x.png","alt":"[右哼哼]"},{"url":"103@2x.png","alt":"[左哼哼]"},{"url":"104@2x.png","alt":"[哈欠]"},{"url":"105@2x.png","alt":"[鄙视]"},{"url":"106@2x.png","alt":"[委屈]"},{"url":"107@2x.png","alt":"[快哭了]"},
+// 	{"url":"108@2x.png","alt":"[阴险]"},{"url":"109@2x.png","alt":"[亲亲]"},{"url":"110@2x.png","alt":"[吓]"},{"url":"111@2x.png","alt":"[可怜]"},{"url":"112@2x.png","alt":"[菜刀]"},{"url":"113@2x.png","alt":"[啤酒]"},{"url":"114@2x.png","alt":"[篮球]"},
+// 	{"url":"115@2x.png","alt":"[乒乓]"},{"url":"116@2x.png","alt":"[示爱]"},{"url":"117@2x.png","alt":"[瓢虫]"},{"url":"118@2x.png","alt":"[抱拳]"},{"url":"119@2x.png","alt":"[勾引]"},{"url":"120@2x.png","alt":"[拳头]"},{"url":"121@2x.png","alt":"[差劲]"},
+// 	{"url":"122@2x.png","alt":"[爱你]"},{"url":"123@2x.png","alt":"[NO]"},{"url":"124@2x.png","alt":"[OK]"},{"url":"136@2x.png","alt":"[双喜]"},{"url":"137@2x.png","alt":"[鞭炮]"},{"url":"138@2x.png","alt":"[灯笼]"},{"url":"139@2x.png","alt":"[麻将]"},
+// 	{"url":"140@2x.png","alt":"[唱歌]"},{"url":"141@2x.png","alt":"[包包]"},{"url":"142@2x.png","alt":"[信]"},{"url":"143@2x.png","alt":"[象棋]"},{"url":"144@2x.png","alt":"[礼物]"},{"url":"145@2x.png","alt":"[祈祷]"},{"url":"146@2x.png","alt":"[爆筋]"},
+// 	{"url":"147@2x.png","alt":"[棒棒糖]"},{"url":"148@2x.png","alt":"[喝奶]"},{"url":"149@2x.png","alt":"[吃面]"},{"url":"150@2x.png","alt":"[香蕉]"},{"url":"151@2x.png","alt":"[飞机]"},{"url":"152@2x.png","alt":"[汽车]"},{"url":"153@2x.png","alt":"[高铁]"},
+// 	{"url":"154@2x.png","alt":"[动车]"},{"url":"155@2x.png","alt":"[动车头]"},{"url":"156@2x.png","alt":"[多云]"},{"url":"157@2x.png","alt":"[下雨]"},{"url":"158@2x.png","alt":"[钞票]"},{"url":"159@2x.png","alt":"[熊猫]"},{"url":"160@2x.png","alt":"[电灯泡]"},
+// 	{"url":"161@2x.png","alt":"[七彩]"},{"url":"162@2x.png","alt":"[闹钟]"},{"url":"163@2x.png","alt":"[雨伞]"},{"url":"164@2x.png","alt":"[气球]"},{"url":"165@2x.png","alt":"[钻戒]"},{"url":"166@2x.png","alt":"[座椅]"},{"url":"167@2x.png","alt":"[纸巾]"},
+// 	{"url":"168@2x.png","alt":"[药丸]"},{"url":"169@2x.png","alt":"[手枪]"},{"url":"170@2x.png","alt":"[青蛙]"},{"url":"171@2x.png","alt":"[热汤]"},{"url":"172@2x.png","alt":"[眨眼睛]"},{"url":"173@2x.png","alt":"[泪奔]"},{"url":"174@2x.png","alt":"[无奈]"},
+// 	{"url":"175@2x.png","alt":"[卖萌]"},{"url":"176@2x.png","alt":"[小纠结]"},{"url":"177@2x.png","alt":"[喷血]"},{"url":"178@2x.png","alt":"[斜眼笑]"},{"url":"179@2x.png","alt":"[高傲]"},{"url":"180@2x.png","alt":"[惊喜]"},{"url":"181@2x.png","alt":"[骚扰]"},
+// 	{"url":"182@2x.png","alt":"[笑哭]"},{"url":"183@2x.png","alt":"[我最美]"},{"url":"184@2x.png","alt":"[河蟹]"},{"url":"185@2x.png","alt":"[羊驼]"},{"url":"186@2x.png","alt":"[板栗]"},{"url":"187@2x.png","alt":"[幽灵]"},{"url":"188@2x.png","alt":"[鸡蛋]"},
+// 	{"url":"189@2x.png","alt":"[魔方]"},{"url":"190@2x.png","alt":"[转花圈]"},{"url":"191@2x.png","alt":"[搓澡]"},{"url":"192@2x.png","alt":"[红包]"},{"url":"200@2x.png","alt":"[拜托]"},{"url":"201@2x.png","alt":"[点赞]"},{"url":"202@2x.png","alt":"[无聊]"},
+// 	{"url":"203@2x.png","alt":"[托脸]"},{"url":"204@2x.png","alt":"[吃]"},{"url":"205@2x.png","alt":"[送花]"},{"url":"206@2x.png","alt":"[害怕]"},{"url":"207@2x.png","alt":"[花痴]"},{"url":"208@2x.png","alt":"[小样儿]"},{"url":"210@2x.png","alt":"[飙泪]"},
+// 	{"url":"211@2x.png","alt":"[我不看]"},{"url":"212@2x.png","alt":"[托腮]"},{"url":"245@2x.png","alt":"[加油必胜]"},{"url":"246@2x.png","alt":"[抱抱]"},{"url":"247@2x.png","alt":"[白条]"},{"url":"260@2x.png","alt":"[白条]"},{"url":"261@2x.png","alt":"[搬砖中]"},
+// 	{"url":"262@2x.png","alt":"[脑壳疼]"},{"url":"263@2x.png","alt":"[沧桑]"},{"url":"264@2x.png","alt":"[捂脸]"},{"url":"265@2x.png","alt":"[辣眼睛]"},{"url":"266@2x.png","alt":"[哦呦]"},{"url":"267@2x.png","alt":"[头秃]"},{"url":"268@2x.png","alt":"[问号脸]"},
+// 	{"url":"269@2x.png","alt":"[暗中观察]"},{"url":"270@2x.png","alt":"[emm]"},{"url":"271@2x.png","alt":"[吃瓜]"},{"url":"272@2x.png","alt":"[呵呵哒]"},{"url":"273@2x.png","alt":"[白条]"},{"url":"274@2x.png","alt":"[白条]"},{"url":"newemoji_002.png","alt":"[好的]"},
+// 	{"url":"newemoji_003.png","alt":"[白眼]"},{"url":"newemoji_004.png","alt":"[鬼脸]"},{"url":"newemoji_005.png","alt":"[马赛克]"},{"url":"newemoji_006.png","alt":"[喝茶]"},{"url":"newemoji_007.png","alt":"[摸鱼]"},{"url":"newemoji_008.png","alt":"[大笑]"},{"url":"newemoji_009.png","alt":"[请滚]"},
+// 	{"url":"newemoji_010.png","alt":"[睁眼]"},{"url":"newemoji_011.png","alt":"[儿子乖]"},{"url":"newemoji_012.png","alt":"[脸疼]"},{"url":"newemoji_013.png","alt":"[考虑]"},{"url":"newemoji_014.png","alt":"[惊掉下巴]"},{"url":"newemoji_015.png","alt":"[遮眼]"},{"url":"newemoji_016.png","alt":"[比爱心]"},
+// 	{"url":"newemoji_017.png","alt":"[喝彩]"}
+// ]
+// export default emojiList;

+ 3139 - 0
assets/css/czy/emoji/sina.js

@@ -0,0 +1,3139 @@
+// 新浪表情包api https://api.weibo.com/2/emotions.json?source=1362404091
+const sinaEmoji = [
+    {
+        "phrase": "[微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e3/2018new_weixioa02_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e3/2018new_weixioa02_org.png",
+        "value": "[微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[可爱]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/09/2018new_keai_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/09/2018new_keai_org.png",
+        "value": "[可爱]",
+        "picid": ""
+    },
+    {
+        "phrase": "[太开心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2018new_taikaixin_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2018new_taikaixin_org.png",
+        "value": "[太开心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[鼓掌]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/2018new_guzhang_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/2018new_guzhang_thumb.png",
+        "value": "[鼓掌]",
+        "picid": ""
+    },
+    {
+        "phrase": "[嘻嘻]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/33/2018new_xixi_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/33/2018new_xixi_thumb.png",
+        "value": "[嘻嘻]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哈哈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/2018new_haha_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/2018new_haha_thumb.png",
+        "value": "[哈哈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[笑cry]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4a/2018new_xiaoku_thumb.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4a/2018new_xiaoku_thumb.png",
+        "value": "[笑cry]",
+        "picid": ""
+    },
+    {
+        "phrase": "[挤眼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/43/2018new_jiyan_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/43/2018new_jiyan_org.png",
+        "value": "[挤眼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[馋嘴]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fa/2018new_chanzui_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fa/2018new_chanzui_org.png",
+        "value": "[馋嘴]",
+        "picid": ""
+    },
+    {
+        "phrase": "[黑线]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a3/2018new_heixian_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a3/2018new_heixian_thumb.png",
+        "value": "[黑线]",
+        "picid": ""
+    },
+    {
+        "phrase": "[汗]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/28/2018new_han_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/28/2018new_han_org.png",
+        "value": "[汗]",
+        "picid": ""
+    },
+    {
+        "phrase": "[挖鼻]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9a/2018new_wabi_thumb.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9a/2018new_wabi_thumb.png",
+        "value": "[挖鼻]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7c/2018new_heng_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7c/2018new_heng_thumb.png",
+        "value": "[哼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[怒]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f6/2018new_nu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f6/2018new_nu_thumb.png",
+        "value": "[怒]",
+        "picid": ""
+    },
+    {
+        "phrase": "[委屈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a5/2018new_weiqu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a5/2018new_weiqu_thumb.png",
+        "value": "[委屈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[可怜]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/96/2018new_kelian_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/96/2018new_kelian_org.png",
+        "value": "[可怜]",
+        "picid": ""
+    },
+    {
+        "phrase": "[失望]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/2018new_shiwang_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/2018new_shiwang_thumb.png",
+        "value": "[失望]",
+        "picid": ""
+    },
+    {
+        "phrase": "[悲伤]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ee/2018new_beishang_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ee/2018new_beishang_org.png",
+        "value": "[悲伤]",
+        "picid": ""
+    },
+    {
+        "phrase": "[泪]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/2018new_leimu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/2018new_leimu_org.png",
+        "value": "[泪]",
+        "picid": ""
+    },
+    {
+        "phrase": "[允悲]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/83/2018new_kuxiao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/83/2018new_kuxiao_org.png",
+        "value": "[允悲]",
+        "picid": ""
+    },
+    {
+        "phrase": "[苦涩]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7e/2021_bitter_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7e/2021_bitter_thumb.png",
+        "value": "[苦涩]",
+        "picid": ""
+    },
+    {
+        "phrase": "[害羞]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c1/2018new_haixiu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c1/2018new_haixiu_org.png",
+        "value": "[害羞]",
+        "picid": ""
+    },
+    {
+        "phrase": "[污]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/10/2018new_wu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/10/2018new_wu_thumb.png",
+        "value": "[污]",
+        "picid": ""
+    },
+    {
+        "phrase": "[爱你]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f6/2018new_aini_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f6/2018new_aini_org.png",
+        "value": "[爱你]",
+        "picid": ""
+    },
+    {
+        "phrase": "[亲亲]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/2018new_qinqin_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/2018new_qinqin_thumb.png",
+        "value": "[亲亲]",
+        "picid": ""
+    },
+    {
+        "phrase": "[抱一抱]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/2020_hug_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/2020_hug_thumb.png",
+        "value": "[抱一抱]",
+        "picid": ""
+    },
+    {
+        "phrase": "[色]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/2018new_huaxin_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/2018new_huaxin_org.png",
+        "value": "[色]",
+        "picid": ""
+    },
+    {
+        "phrase": "[憧憬]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c9/2018new_chongjing_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c9/2018new_chongjing_org.png",
+        "value": "[憧憬]",
+        "picid": ""
+    },
+    {
+        "phrase": "[舔屏]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3e/2018new_tianping_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3e/2018new_tianping_thumb.png",
+        "value": "[舔屏]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哇]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3d/2022_wow_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3d/2022_wow_thumb.png",
+        "value": "[哇]",
+        "picid": ""
+    },
+    {
+        "phrase": "[坏笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4d/2018new_huaixiao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4d/2018new_huaixiao_org.png",
+        "value": "[坏笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[阴险]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9e/2018new_yinxian_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9e/2018new_yinxian_org.png",
+        "value": "[阴险]",
+        "picid": ""
+    },
+    {
+        "phrase": "[笑而不语]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2d/2018new_xiaoerbuyu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2d/2018new_xiaoerbuyu_org.png",
+        "value": "[笑而不语]",
+        "picid": ""
+    },
+    {
+        "phrase": "[偷笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/2018new_touxiao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/2018new_touxiao_org.png",
+        "value": "[偷笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[666]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2022_666_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2022_666_thumb.png",
+        "value": "[666]",
+        "picid": ""
+    },
+    {
+        "phrase": "[酷]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c4/2018new_ku_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c4/2018new_ku_org.png",
+        "value": "[酷]",
+        "picid": ""
+    },
+    {
+        "phrase": "[并不简单]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/2018new_bingbujiandan_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/2018new_bingbujiandan_thumb.png",
+        "value": "[并不简单]",
+        "picid": ""
+    },
+    {
+        "phrase": "[思考]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/30/2018new_sikao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/30/2018new_sikao_org.png",
+        "value": "[思考]",
+        "picid": ""
+    },
+    {
+        "phrase": "[疑问]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b8/2018new_ningwen_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b8/2018new_ningwen_org.png",
+        "value": "[疑问]",
+        "picid": ""
+    },
+    {
+        "phrase": "[费解]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2a/2018new_wenhao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2a/2018new_wenhao_thumb.png",
+        "value": "[费解]",
+        "picid": ""
+    },
+    {
+        "phrase": "[晕]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/07/2018new_yun_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/07/2018new_yun_thumb.png",
+        "value": "[晕]",
+        "picid": ""
+    },
+    {
+        "phrase": "[衰]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a2/2018new_shuai_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a2/2018new_shuai_thumb.png",
+        "value": "[衰]",
+        "picid": ""
+    },
+    {
+        "phrase": "[骷髅]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a1/2018new_kulou_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a1/2018new_kulou_thumb.png",
+        "value": "[骷髅]",
+        "picid": ""
+    },
+    {
+        "phrase": "[嘘]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b0/2018new_xu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b0/2018new_xu_org.png",
+        "value": "[嘘]",
+        "picid": ""
+    },
+    {
+        "phrase": "[闭嘴]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/62/2018new_bizui_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/62/2018new_bizui_org.png",
+        "value": "[闭嘴]",
+        "picid": ""
+    },
+    {
+        "phrase": "[傻眼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/dd/2018new_shayan_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/dd/2018new_shayan_org.png",
+        "value": "[傻眼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[裂开]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1b/202011_liekai_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1b/202011_liekai_thumb.png",
+        "value": "[裂开]",
+        "picid": ""
+    },
+    {
+        "phrase": "[感冒]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8c/2022_cold_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8c/2022_cold_thumb.png",
+        "value": "[感冒]",
+        "picid": ""
+    },
+    {
+        "phrase": "[吃惊]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/49/2018new_chijing_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/49/2018new_chijing_org.png",
+        "value": "[吃惊]",
+        "picid": ""
+    },
+    {
+        "phrase": "[吐]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/08/2018new_tu_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/08/2018new_tu_org.png",
+        "value": "[吐]",
+        "picid": ""
+    },
+    {
+        "phrase": "[生病]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3b/2018new_shengbing_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3b/2018new_shengbing_thumb.png",
+        "value": "[生病]",
+        "picid": ""
+    },
+    {
+        "phrase": "[拜拜]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fd/2018new_baibai_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fd/2018new_baibai_thumb.png",
+        "value": "[拜拜]",
+        "picid": ""
+    },
+    {
+        "phrase": "[鄙视]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/da/2018new_bishi_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/da/2018new_bishi_org.png",
+        "value": "[鄙视]",
+        "picid": ""
+    },
+    {
+        "phrase": "[白眼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ef/2018new_landelini_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ef/2018new_landelini_org.png",
+        "value": "[白眼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[左哼哼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/43/2018new_zuohengheng_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/43/2018new_zuohengheng_thumb.png",
+        "value": "[左哼哼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[右哼哼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c1/2018new_youhengheng_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c1/2018new_youhengheng_thumb.png",
+        "value": "[右哼哼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[抓狂]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/17/2018new_zhuakuang_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/17/2018new_zhuakuang_org.png",
+        "value": "[抓狂]",
+        "picid": ""
+    },
+    {
+        "phrase": "[怒骂]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/87/2018new_zhouma_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/87/2018new_zhouma_thumb.png",
+        "value": "[怒骂]",
+        "picid": ""
+    },
+    {
+        "phrase": "[打脸]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cb/2018new_dalian_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cb/2018new_dalian_org.png",
+        "value": "[打脸]",
+        "picid": ""
+    },
+    {
+        "phrase": "[顶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ae/2018new_ding_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ae/2018new_ding_org.png",
+        "value": "[顶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[互粉]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/2018new_hufen02_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/2018new_hufen02_org.png",
+        "value": "[互粉]",
+        "picid": ""
+    },
+    {
+        "phrase": "[钱]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a2/2018new_qian_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a2/2018new_qian_thumb.png",
+        "value": "[钱]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哈欠]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/55/2018new_dahaqian_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/55/2018new_dahaqian_org.png",
+        "value": "[哈欠]",
+        "picid": ""
+    },
+    {
+        "phrase": "[困]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/2018new_kun_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/2018new_kun_thumb.png",
+        "value": "[困]",
+        "picid": ""
+    },
+    {
+        "phrase": "[睡]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/2018new_shuijiao_thumb.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/2018new_shuijiao_thumb.png",
+        "value": "[睡]",
+        "picid": ""
+    },
+    {
+        "phrase": "[赢牛奶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9c/2021_yingniunai_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9c/2021_yingniunai_thumb.png",
+        "value": "[赢牛奶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[开学季]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/72/2021_kaixueji_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/72/2021_kaixueji_thumb.png",
+        "value": "[开学季]",
+        "picid": ""
+    },
+    {
+        "phrase": "[求饶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/moren_qiurao02_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/moren_qiurao02_thumb.png",
+        "value": "[求饶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[吃瓜]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/01/2018new_chigua_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/01/2018new_chigua_thumb.png",
+        "value": "[吃瓜]",
+        "picid": ""
+    },
+    {
+        "phrase": "[打call]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/moren_dacall02_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/moren_dacall02_thumb.png",
+        "value": "[打call]",
+        "picid": ""
+    },
+    {
+        "phrase": "[awsl]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/moren_awsl02_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/moren_awsl02_thumb.png",
+        "value": "[awsl]",
+        "picid": ""
+    },
+    {
+        "phrase": "[彩虹屁]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4b/2022_praise_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4b/2022_praise_thumb.png",
+        "value": "[彩虹屁]",
+        "picid": ""
+    },
+    {
+        "phrase": "[酸]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b3/hot_wosuanle_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b3/hot_wosuanle_thumb.png",
+        "value": "[酸]",
+        "picid": ""
+    },
+    {
+        "phrase": "[doge]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a1/2018new_doge02_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a1/2018new_doge02_org.png",
+        "value": "[doge]",
+        "picid": ""
+    },
+    {
+        "phrase": "[二哈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/22/2018new_erha_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/22/2018new_erha_org.png",
+        "value": "[二哈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[喵喵]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7b/2018new_miaomiao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7b/2018new_miaomiao_thumb.png",
+        "value": "[喵喵]",
+        "picid": ""
+    },
+    {
+        "phrase": "[单身狗]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/20/2021_alongdog_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/20/2021_alongdog_thumb.png",
+        "value": "[单身狗]",
+        "picid": ""
+    },
+    {
+        "phrase": "[揣手]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/2022_chuaishou_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/2022_chuaishou_thumb.png",
+        "value": "[揣手]",
+        "picid": ""
+    },
+    {
+        "phrase": "[举手]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fd/2022_raisehand_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fd/2022_raisehand_thumb.png",
+        "value": "[举手]",
+        "picid": ""
+    },
+    {
+        "phrase": "[抱抱]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/42/2018new_baobao_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/42/2018new_baobao_thumb.png",
+        "value": "[抱抱]",
+        "picid": ""
+    },
+    {
+        "phrase": "[摊手]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/62/2018new_tanshou_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/62/2018new_tanshou_org.png",
+        "value": "[摊手]",
+        "picid": ""
+    },
+    {
+        "phrase": "[跪了]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/75/2018new_gui_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/75/2018new_gui_org.png",
+        "value": "[跪了]",
+        "picid": ""
+    },
+    {
+        "phrase": "[中国赞]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/2018new_zhongguozan_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/2018new_zhongguozan_org.png",
+        "value": "[中国赞]",
+        "picid": ""
+    },
+    {
+        "phrase": "[鲜花]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d4/2018new_xianhua_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d4/2018new_xianhua_org.png",
+        "value": "[鲜花]",
+        "picid": ""
+    },
+    {
+        "phrase": "[航天员]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/53/2021_yuhangyuan_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/53/2021_yuhangyuan_thumb.png",
+        "value": "[航天员]",
+        "picid": ""
+    },
+    {
+        "phrase": "[红灯笼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e8/2021_lantern_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e8/2021_lantern_thumb.png",
+        "value": "[红灯笼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[烟花]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/96/2021_fireworks_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/96/2021_fireworks_thumb.png",
+        "value": "[烟花]",
+        "picid": ""
+    },
+    {
+        "phrase": "[雪花]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/13/yunying2020_snowflakes_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/13/yunying2020_snowflakes_thumb.png",
+        "value": "[雪花]",
+        "picid": ""
+    },
+    {
+        "phrase": "[丘比特]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/45/2021_qiubite_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/45/2021_qiubite_thumb.png",
+        "value": "[丘比特]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小丑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6f/2021_xiaochou_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6f/2021_xiaochou_thumb.png",
+        "value": "[小丑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[杰瑞]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/da/2021_jerry_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/da/2021_jerry_thumb.png",
+        "value": "[杰瑞]",
+        "picid": ""
+    },
+    {
+        "phrase": "[汤姆]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/31/2021_tom_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/31/2021_tom_thumb.png",
+        "value": "[汤姆]",
+        "picid": ""
+    },
+    {
+        "phrase": "[奶瓶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8c/2021_naiping_org.png",
+        "hot": false,
+        "common": true,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8c/2021_naiping_thumb.png",
+        "value": "[奶瓶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[报税]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0f/2022_baoshui_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0f/2022_baoshui_thumb.png",
+        "value": "[报税]",
+        "picid": ""
+    },
+    {
+        "phrase": "[交税]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8e/2022_jiaoshui_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8e/2022_jiaoshui_thumb.png",
+        "value": "[交税]",
+        "picid": ""
+    },
+    {
+        "phrase": "[嗅嗅]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e8/2022_Niffler_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e8/2022_Niffler_thumb.png",
+        "value": "[嗅嗅]",
+        "picid": ""
+    },
+    {
+        "phrase": "[格林德沃]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/56/2022_Grindelwald_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/56/2022_Grindelwald_thumb.png",
+        "value": "[格林德沃]",
+        "picid": ""
+    },
+    {
+        "phrase": "[邓布利多]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/92/2022_Dumbledore_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/92/2022_Dumbledore_thumb.png",
+        "value": "[邓布利多]",
+        "picid": ""
+    },
+    {
+        "phrase": "[新蝙蝠侠]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a4/2022_theBatman_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a4/2022_theBatman_thumb.png",
+        "value": "[新蝙蝠侠]",
+        "picid": ""
+    },
+    {
+        "phrase": "[谜语人]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/2022_theRiddler_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/2022_theRiddler_thumb.png",
+        "value": "[谜语人]",
+        "picid": ""
+    },
+    {
+        "phrase": "[送花花]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cb/2022_Flowers_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cb/2022_Flowers_thumb.png",
+        "value": "[送花花]",
+        "picid": ""
+    },
+    {
+        "phrase": "[福气虎]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/08/2022_AuspiciousTiger_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/08/2022_AuspiciousTiger_thumb.png",
+        "value": "[福气虎]",
+        "picid": ""
+    },
+    {
+        "phrase": "[暴发虎]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b8/2022_richtiger_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b8/2022_richtiger_thumb.png",
+        "value": "[暴发虎]",
+        "picid": ""
+    },
+    {
+        "phrase": "[虎爪比心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2b/2022_handheart_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2b/2022_handheart_thumb.png",
+        "value": "[虎爪比心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[许愿虎]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/2022_Wishingtiger_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/2022_Wishingtiger_thumb.png",
+        "value": "[许愿虎]",
+        "picid": ""
+    },
+    {
+        "phrase": "[萌虎贴贴]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/81/2022_Cutetigerkiss_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/81/2022_Cutetigerkiss_thumb.png",
+        "value": "[萌虎贴贴]",
+        "picid": ""
+    },
+    {
+        "phrase": "[单身奖杯]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/27/2022_Asingletrophy_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/27/2022_Asingletrophy_thumb.png",
+        "value": "[单身奖杯]",
+        "picid": ""
+    },
+    {
+        "phrase": "[绿马]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/df/2022_Greenhorse_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/df/2022_Greenhorse_thumb.png",
+        "value": "[绿马]",
+        "picid": ""
+    },
+    {
+        "phrase": "[2022]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/bc/2021_2022_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/bc/2021_2022_thumb.png",
+        "value": "[2022]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小雪人]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/2021_snowman_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/2021_snowman_thumb.png",
+        "value": "[小雪人]",
+        "picid": ""
+    },
+    {
+        "phrase": "[春游家族]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/2021_YoungFamily_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/2021_YoungFamily_thumb.png",
+        "value": "[春游家族]",
+        "picid": ""
+    },
+    {
+        "phrase": "[放假]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6b/2021_fangjia_org.png",
+        "hot": true,
+        "common": false,
+        "category": "",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6b/2021_fangjia_thumb.png",
+        "value": "[放假]",
+        "picid": ""
+    },
+    {
+        "phrase": "[心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/2018new_xin_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/2018new_xin_thumb.png",
+        "value": "[心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[伤心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2018new_xinsui_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2018new_xinsui_thumb.png",
+        "value": "[伤心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[男孩儿]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0a/2018new_nanhai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0a/2018new_nanhai_thumb.png",
+        "value": "[男孩儿]",
+        "picid": ""
+    },
+    {
+        "phrase": "[女孩儿]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/2018new_nvhai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/2018new_nvhai_thumb.png",
+        "value": "[女孩儿]",
+        "picid": ""
+    },
+    {
+        "phrase": "[握手]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e9/2018new_woshou_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e9/2018new_woshou_thumb.png",
+        "value": "[握手]",
+        "picid": ""
+    },
+    {
+        "phrase": "[赞]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e6/2018new_zan_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e6/2018new_zan_org.png",
+        "value": "[赞]",
+        "picid": ""
+    },
+    {
+        "phrase": "[good]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/2018new_good_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/2018new_good_org.png",
+        "value": "[good]",
+        "picid": ""
+    },
+    {
+        "phrase": "[弱]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3d/2018new_ruo_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3d/2018new_ruo_org.png",
+        "value": "[弱]",
+        "picid": ""
+    },
+    {
+        "phrase": "[NO]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2018new_no_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2018new_no_org.png",
+        "value": "[NO]",
+        "picid": ""
+    },
+    {
+        "phrase": "[耶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/2018new_ye_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/2018new_ye_thumb.png",
+        "value": "[耶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[拳头]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/2018new_quantou_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/2018new_quantou_thumb.png",
+        "value": "[拳头]",
+        "picid": ""
+    },
+    {
+        "phrase": "[ok]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/45/2018new_ok_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/45/2018new_ok_org.png",
+        "value": "[ok]",
+        "picid": ""
+    },
+    {
+        "phrase": "[加油]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9f/2018new_jiayou_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9f/2018new_jiayou_org.png",
+        "value": "[加油]",
+        "picid": ""
+    },
+    {
+        "phrase": "[来]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/42/2018new_guolai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/42/2018new_guolai_thumb.png",
+        "value": "[来]",
+        "picid": ""
+    },
+    {
+        "phrase": "[作揖]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e7/2018new_zuoyi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e7/2018new_zuoyi_org.png",
+        "value": "[作揖]",
+        "picid": ""
+    },
+    {
+        "phrase": "[haha]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1d/2018new_hahashoushi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1d/2018new_hahashoushi_org.png",
+        "value": "[haha]",
+        "picid": ""
+    },
+    {
+        "phrase": "[熊猫]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/2018new_xiongmao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/aa/2018new_xiongmao_thumb.png",
+        "value": "[熊猫]",
+        "picid": ""
+    },
+    {
+        "phrase": "[兔子]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c6/2018new_tuzi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c6/2018new_tuzi_thumb.png",
+        "value": "[兔子]",
+        "picid": ""
+    },
+    {
+        "phrase": "[猪头]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1c/2018new_zhutou_thumb.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1c/2018new_zhutou_thumb.png",
+        "value": "[猪头]",
+        "picid": ""
+    },
+    {
+        "phrase": "[草泥马]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3b/2018new_caonima_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3b/2018new_caonima_thumb.png",
+        "value": "[草泥马]",
+        "picid": ""
+    },
+    {
+        "phrase": "[奥特曼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c6/2018new_aoteman_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c6/2018new_aoteman_org.png",
+        "value": "[奥特曼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[太阳]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cd/2018new_taiyang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cd/2018new_taiyang_org.png",
+        "value": "[太阳]",
+        "picid": ""
+    },
+    {
+        "phrase": "[月亮]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d5/2018new_yueliang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d5/2018new_yueliang_org.png",
+        "value": "[月亮]",
+        "picid": ""
+    },
+    {
+        "phrase": "[浮云]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/61/2018new_yunduo_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/61/2018new_yunduo_thumb.png",
+        "value": "[浮云]",
+        "picid": ""
+    },
+    {
+        "phrase": "[下雨]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7e/2018new_yu_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7e/2018new_yu_thumb.png",
+        "value": "[下雨]",
+        "picid": ""
+    },
+    {
+        "phrase": "[沙尘暴]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b7/2018new_shachenbao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b7/2018new_shachenbao_org.png",
+        "value": "[沙尘暴]",
+        "picid": ""
+    },
+    {
+        "phrase": "[围观]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2018new_weiguan_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2018new_weiguan_org.png",
+        "value": "[围观]",
+        "picid": ""
+    },
+    {
+        "phrase": "[飞机]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4a/2018new_feiji_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/4a/2018new_feiji_thumb.png",
+        "value": "[飞机]",
+        "picid": ""
+    },
+    {
+        "phrase": "[照相机]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/78/2018new_xiangji_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/78/2018new_xiangji_thumb.png",
+        "value": "[照相机]",
+        "picid": ""
+    },
+    {
+        "phrase": "[话筒]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/48/2018new_huatong_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/48/2018new_huatong_org.png",
+        "value": "[话筒]",
+        "picid": ""
+    },
+    {
+        "phrase": "[音乐]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1f/2018new_yinyue_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1f/2018new_yinyue_org.png",
+        "value": "[音乐]",
+        "picid": ""
+    },
+    {
+        "phrase": "[喜]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e0/2018new_xizi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e0/2018new_xizi_thumb.png",
+        "value": "[喜]",
+        "picid": ""
+    },
+    {
+        "phrase": "[给力]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/36/2018new_geili_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/36/2018new_geili_thumb.png",
+        "value": "[给力]",
+        "picid": ""
+    },
+    {
+        "phrase": "[威武]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/2018new_weiwu_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/2018new_weiwu_thumb.png",
+        "value": "[威武]",
+        "picid": ""
+    },
+    {
+        "phrase": "[可乐]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/5f/moren_kele_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/5f/moren_kele_thumb.png",
+        "value": "[可乐]",
+        "picid": ""
+    },
+    {
+        "phrase": "[干杯]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/2018new_ganbei_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/2018new_ganbei_org.png",
+        "value": "[干杯]",
+        "picid": ""
+    },
+    {
+        "phrase": "[礼物]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0e/2018new_liwu_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0e/2018new_liwu_org.png",
+        "value": "[礼物]",
+        "picid": ""
+    },
+    {
+        "phrase": "[钟]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8e/2018new_zhong_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8e/2018new_zhong_org.png",
+        "value": "[钟]",
+        "picid": ""
+    },
+    {
+        "phrase": "[肥皂]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d6/2018new_feizao_thumb.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d6/2018new_feizao_thumb.png",
+        "value": "[肥皂]",
+        "picid": ""
+    },
+    {
+        "phrase": "[绿丝带]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cb/2018new_lvsidai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cb/2018new_lvsidai_thumb.png",
+        "value": "[绿丝带]",
+        "picid": ""
+    },
+    {
+        "phrase": "[围脖]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/64/2018new_weibo_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/64/2018new_weibo_org.png",
+        "value": "[围脖]",
+        "picid": ""
+    },
+    {
+        "phrase": "[浪]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/46/2018new_xinlang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/46/2018new_xinlang_thumb.png",
+        "value": "[浪]",
+        "picid": ""
+    },
+    {
+        "phrase": "[羞嗒嗒]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/df/lxhxiudada_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/df/lxhxiudada_thumb.gif",
+        "value": "[羞嗒嗒]",
+        "picid": ""
+    },
+    {
+        "phrase": "[好爱哦]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/74/lxhainio_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/74/lxhainio_thumb.gif",
+        "value": "[好爱哦]",
+        "picid": ""
+    },
+    {
+        "phrase": "[偷乐]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fa/lxhtouxiao_thumb.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fa/lxhtouxiao_thumb.gif",
+        "value": "[偷乐]",
+        "picid": ""
+    },
+    {
+        "phrase": "[赞啊]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/00/lxhzan_thumb.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/00/lxhzan_thumb.gif",
+        "value": "[赞啊]",
+        "picid": ""
+    },
+    {
+        "phrase": "[笑哈哈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/32/lxhwahaha_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/32/lxhwahaha_thumb.gif",
+        "value": "[笑哈哈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[好喜欢]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d6/lxhlike_thumb.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d6/lxhlike_thumb.gif",
+        "value": "[好喜欢]",
+        "picid": ""
+    },
+    {
+        "phrase": "[求关注]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ac/lxhqiuguanzhu_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ac/lxhqiuguanzhu_thumb.gif",
+        "value": "[求关注]",
+        "picid": ""
+    },
+    {
+        "phrase": "[胖丁微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/68/film_pangdingsmile_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/68/film_pangdingsmile_thumb.png",
+        "value": "[胖丁微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[佩奇]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c6/hot_pigpeiqi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c6/hot_pigpeiqi_thumb.png",
+        "value": "[佩奇]",
+        "picid": ""
+    },
+    {
+        "phrase": "[大侦探皮卡丘微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b3/pikaqiu_weixiao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b3/pikaqiu_weixiao_thumb.png",
+        "value": "[大侦探皮卡丘微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[圣诞老人111]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/93/xmax_oldman01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/93/xmax_oldman01_thumb.png",
+        "value": "[圣诞老人111]",
+        "picid": ""
+    },
+    {
+        "phrase": "[紫金草]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e5/gongjiri_zijinhua_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e5/gongjiri_zijinhua_thumb.png",
+        "value": "[紫金草]",
+        "picid": ""
+    },
+    {
+        "phrase": "[文明遛狗]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/93/gongyi_wenminglgnew_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/93/gongyi_wenminglgnew_thumb.png",
+        "value": "[文明遛狗]",
+        "picid": ""
+    },
+    {
+        "phrase": "[神马]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/60/horse2_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/60/horse2_thumb.gif",
+        "value": "[神马]",
+        "picid": ""
+    },
+    {
+        "phrase": "[马到成功]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b0/mdcg_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b0/mdcg_thumb.gif",
+        "value": "[马到成功]",
+        "picid": ""
+    },
+    {
+        "phrase": "[炸鸡啤酒]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/zhajibeer_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/zhajibeer_thumb.gif",
+        "value": "[炸鸡啤酒]",
+        "picid": ""
+    },
+    {
+        "phrase": "[最右]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/be/remen_zuiyou180605_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/be/remen_zuiyou180605_thumb.png",
+        "value": "[最右]",
+        "picid": ""
+    },
+    {
+        "phrase": "[织]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/41/zz2_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/41/zz2_thumb.gif",
+        "value": "[织]",
+        "picid": ""
+    },
+    {
+        "phrase": "[五仁月饼_旧]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/10/2018zhongqiu_yuebing_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/10/2018zhongqiu_yuebing_thumb.png",
+        "value": "[五仁月饼_旧]",
+        "picid": ""
+    },
+    {
+        "phrase": "[给你小心心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ca/qixi2018_xiaoxinxin_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ca/qixi2018_xiaoxinxin_thumb.png",
+        "value": "[给你小心心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[吃狗粮]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/qixi2018_chigouliang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/qixi2018_chigouliang_thumb.png",
+        "value": "[吃狗粮]",
+        "picid": ""
+    },
+    {
+        "phrase": "[弗莱见钱眼开]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/83/2018newyear_richdog_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/83/2018newyear_richdog_thumb.gif",
+        "value": "[弗莱见钱眼开]",
+        "picid": ""
+    },
+    {
+        "phrase": "[星星]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/76/hot_star171109_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/76/hot_star171109_thumb.png",
+        "value": "[星星]",
+        "picid": ""
+    },
+    {
+        "phrase": "[半星]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f9/hot_halfstar_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f9/hot_halfstar_thumb.png",
+        "value": "[半星]",
+        "picid": ""
+    },
+    {
+        "phrase": "[空星]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ff/hot_blankstar_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ff/hot_blankstar_thumb.png",
+        "value": "[空星]",
+        "picid": ""
+    },
+    {
+        "phrase": "[圣诞袜]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/2020_santastockings_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/2020_santastockings_thumb.png",
+        "value": "[圣诞袜]",
+        "picid": ""
+    },
+    {
+        "phrase": "[圣诞帽]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/74/2020_santahat_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/74/2020_santahat_thumb.png",
+        "value": "[圣诞帽]",
+        "picid": ""
+    },
+    {
+        "phrase": "[圣诞老人]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2020_santaclaus_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2020_santaclaus_thumb.png",
+        "value": "[圣诞老人]",
+        "picid": ""
+    },
+    {
+        "phrase": "[平安果]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ea/2020_apple_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ea/2020_apple_thumb.png",
+        "value": "[平安果]",
+        "picid": ""
+    },
+    {
+        "phrase": "[姜饼人]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/23/2020_gingerbread_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/23/2020_gingerbread_thumb.png",
+        "value": "[姜饼人]",
+        "picid": ""
+    },
+    {
+        "phrase": "[欢度国庆]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3b/guoqing20_huandugq_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3b/guoqing20_huandugq_thumb.png",
+        "value": "[欢度国庆]",
+        "picid": ""
+    },
+    {
+        "phrase": "[七夕布谷鸟]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/43/2020qixi_bugubird_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/43/2020qixi_bugubird_thumb.png",
+        "value": "[七夕布谷鸟]",
+        "picid": ""
+    },
+    {
+        "phrase": "[撒狗粮]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ec/qixi2020_sagouliang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ec/qixi2020_sagouliang_thumb.png",
+        "value": "[撒狗粮]",
+        "picid": ""
+    },
+    {
+        "phrase": "[求脱单]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/84/qixi2020_qiutuodan_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/84/qixi2020_qiutuodan_thumb.png",
+        "value": "[求脱单]",
+        "picid": ""
+    },
+    {
+        "phrase": "[酷炫街舞给手]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9a/yunying_jiewu03_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9a/yunying_jiewu03_thumb.png",
+        "value": "[酷炫街舞给手]",
+        "picid": ""
+    },
+    {
+        "phrase": "[这就是街舞3]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3d/yunying_jiewu02_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3d/yunying_jiewu02_thumb.png",
+        "value": "[这就是街舞3]",
+        "picid": ""
+    },
+    {
+        "phrase": "[毛巾助力]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c0/yunying_jiewu01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c0/yunying_jiewu01_thumb.png",
+        "value": "[毛巾助力]",
+        "picid": ""
+    },
+    {
+        "phrase": "[超新星运动会]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d0/yunying_starquanyunhui_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d0/yunying_starquanyunhui_thumb.png",
+        "value": "[超新星运动会]",
+        "picid": ""
+    },
+    {
+        "phrase": "[超人爸爸]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2020fuqinjie_chaorenbaba_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/6c/2020fuqinjie_chaorenbaba_thumb.png",
+        "value": "[超人爸爸]",
+        "picid": ""
+    },
+    {
+        "phrase": "[我爱爸爸]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a0/2020fuqinjie_woaibaba_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a0/2020fuqinjie_woaibaba_thumb.png",
+        "value": "[我爱爸爸]",
+        "picid": ""
+    },
+    {
+        "phrase": "[父与子]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2020fuqinjie_fuyuzi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2020fuqinjie_fuyuzi_thumb.png",
+        "value": "[父与子]",
+        "picid": ""
+    },
+    {
+        "phrase": "[棒棒糖]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/2020liuyi_bangbangtang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/2020liuyi_bangbangtang_thumb.png",
+        "value": "[棒棒糖]",
+        "picid": ""
+    },
+    {
+        "phrase": "[纸飞机]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/2020liuyi_zhifeiji_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/2020liuyi_zhifeiji_thumb.png",
+        "value": "[纸飞机]",
+        "picid": ""
+    },
+    {
+        "phrase": "[炸鸡腿]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8c/yunying_zhaji_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8c/yunying_zhaji_thumb.png",
+        "value": "[炸鸡腿]",
+        "picid": ""
+    },
+    {
+        "phrase": "[武汉加油]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/02/hot_wuhanjiayou_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/02/hot_wuhanjiayou_thumb.png",
+        "value": "[武汉加油]",
+        "picid": ""
+    },
+    {
+        "phrase": "[点亮橙色]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/87/gongyi_dlchengse03_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/87/gongyi_dlchengse03_thumb.png",
+        "value": "[点亮橙色]",
+        "picid": ""
+    },
+    {
+        "phrase": "[锦鲤]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/94/hbf2019_jinli_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/94/hbf2019_jinli_thumb.png",
+        "value": "[锦鲤]",
+        "picid": ""
+    },
+    {
+        "phrase": "[微风]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c7/2018new_weifeng_thumb.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c7/2018new_weifeng_thumb.png",
+        "value": "[微风]",
+        "picid": ""
+    },
+    {
+        "phrase": "[蜡烛]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/16/2018new_lazhu_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/16/2018new_lazhu_org.png",
+        "value": "[蜡烛]",
+        "picid": ""
+    },
+    {
+        "phrase": "[蛋糕]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f9/2018new_dangao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f9/2018new_dangao_org.png",
+        "value": "[蛋糕]",
+        "picid": ""
+    },
+    {
+        "phrase": "[看涨]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fe/kanzhangv2_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fe/kanzhangv2_thumb.gif",
+        "value": "[看涨]",
+        "picid": ""
+    },
+    {
+        "phrase": "[看跌]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c5/kandiev2_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c5/kandiev2_thumb.gif",
+        "value": "[看跌]",
+        "picid": ""
+    },
+    {
+        "phrase": "[带着微博去旅行]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ec/eventtravel_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "其他",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ec/eventtravel_thumb.gif",
+        "value": "[带着微博去旅行]",
+        "picid": ""
+    },
+    {
+        "phrase": "[绿植领养]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/06/2021_lvzhilingyang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "绿植",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/06/2021_lvzhilingyang_thumb.png",
+        "value": "[绿植领养]",
+        "picid": ""
+    },
+    {
+        "phrase": "[绿植挖土]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ef/2021_lvzhiwatu_org.png",
+        "hot": false,
+        "common": false,
+        "category": "绿植",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ef/2021_lvzhiwatu_thumb.png",
+        "value": "[绿植挖土]",
+        "picid": ""
+    },
+    {
+        "phrase": "[绿植托脸]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/33/2021_lvzhituolian_org.png",
+        "hot": false,
+        "common": false,
+        "category": "绿植",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/33/2021_lvzhituolian_thumb.png",
+        "value": "[绿植托脸]",
+        "picid": ""
+    },
+    {
+        "phrase": "[绿植乖巧]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/2021_lvzhiguaiqiao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "绿植",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/2021_lvzhiguaiqiao_thumb.png",
+        "value": "[绿植乖巧]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝爱心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/89/2021_LZheart_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/89/2021_LZheart_thumb.png",
+        "value": "[掌宝爱心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝加油]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/09/2021_LZfighting_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/09/2021_LZfighting_thumb.png",
+        "value": "[掌宝加油]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝可怜]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2021_LZpoor_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1e/2021_LZpoor_thumb.png",
+        "value": "[掌宝可怜]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝卖萌]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/53/2021_LZkawaii_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/53/2021_LZkawaii_thumb.png",
+        "value": "[掌宝卖萌]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝哭泣]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/27/2021_LZcry_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/27/2021_LZcry_thumb.png",
+        "value": "[掌宝哭泣]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝星星眼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/2021_LZstareyes_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/70/2021_LZstareyes_thumb.png",
+        "value": "[掌宝星星眼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[掌宝荧光棒]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/2021_LZyingguangbang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "掌宝",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/2021_LZyingguangbang_thumb.png",
+        "value": "[掌宝荧光棒]",
+        "picid": ""
+    },
+    {
+        "phrase": "[蕾伊]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/66/starwar_leiyi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/66/starwar_leiyi_thumb.png",
+        "value": "[蕾伊]",
+        "picid": ""
+    },
+    {
+        "phrase": "[凯洛伦]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cd/starwar_kailuolun_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cd/starwar_kailuolun_thumb.png",
+        "value": "[凯洛伦]",
+        "picid": ""
+    },
+    {
+        "phrase": "[BB8]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e9/starwar_bb8_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e9/starwar_bb8_thumb.png",
+        "value": "[BB8]",
+        "picid": ""
+    },
+    {
+        "phrase": "[冲锋队员]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/starwar_chongfengduiyuan_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/39/starwar_chongfengduiyuan_thumb.png",
+        "value": "[冲锋队员]",
+        "picid": ""
+    },
+    {
+        "phrase": "[达斯维达]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/starwar_dasiweida_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/starwar_dasiweida_thumb.png",
+        "value": "[达斯维达]",
+        "picid": ""
+    },
+    {
+        "phrase": "[C3PO]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c1/starwar_c3po_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c1/starwar_c3po_thumb.png",
+        "value": "[C3PO]",
+        "picid": ""
+    },
+    {
+        "phrase": "[丘巴卡]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/5d/starwar_qiubaka_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/5d/starwar_qiubaka_thumb.png",
+        "value": "[丘巴卡]",
+        "picid": ""
+    },
+    {
+        "phrase": "[R2D2]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/04/starwar_r2d2_org.png",
+        "hot": false,
+        "common": false,
+        "category": "星球大战",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/04/starwar_r2d2_thumb.png",
+        "value": "[R2D2]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦花心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/08/dorahaose_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/08/dorahaose_thumb.gif",
+        "value": "[哆啦A梦花心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦害怕]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c7/dorahaipa_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c7/dorahaipa_thumb.gif",
+        "value": "[哆啦A梦害怕]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦吃惊]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f0/dorachijing_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f0/dorachijing_thumb.gif",
+        "value": "[哆啦A梦吃惊]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦汗]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/61/dorahan_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/61/dorahan_thumb.gif",
+        "value": "[哆啦A梦汗]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9e/jqmweixiao_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9e/jqmweixiao_thumb.gif",
+        "value": "[哆啦A梦微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[伴我同行]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ef/jqmbwtxing_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ef/jqmbwtxing_thumb.gif",
+        "value": "[伴我同行]",
+        "picid": ""
+    },
+    {
+        "phrase": "[静香微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/jiqimaojingxiang_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/jiqimaojingxiang_thumb.gif",
+        "value": "[静香微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[大雄微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8e/jiqimaodaxiong_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/8e/jiqimaodaxiong_thumb.gif",
+        "value": "[大雄微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[胖虎微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2f/jiqimaopanghu_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/2f/jiqimaopanghu_thumb.gif",
+        "value": "[胖虎微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小夫微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/21/jiqimaoxiaofu_org.gif",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/21/jiqimaoxiaofu_thumb.gif",
+        "value": "[小夫微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/54/dora_xiao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/54/dora_xiao_thumb.png",
+        "value": "[哆啦A梦笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦无奈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/96/dora_wunai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/96/dora_wunai_thumb.png",
+        "value": "[哆啦A梦无奈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦美味]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/21/dora_meiwei_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/21/dora_meiwei_thumb.png",
+        "value": "[哆啦A梦美味]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦开心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/df/dora_kaixin_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/df/dora_kaixin_thumb.png",
+        "value": "[哆啦A梦开心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哆啦A梦亲亲]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e0/dora_qinqin_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哆啦A梦",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e0/dora_qinqin_thumb.png",
+        "value": "[哆啦A梦亲亲]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f0/xhrnew_weixiao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f0/xhrnew_weixiao_org.png",
+        "value": "[小黄人微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人剪刀手]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/63/xhrnew_jiandaoshou_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/63/xhrnew_jiandaoshou_org.png",
+        "value": "[小黄人剪刀手]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人不屑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b2/xhrnew_buxie_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/b2/xhrnew_buxie_org.png",
+        "value": "[小黄人不屑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人高兴]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/41/xhrnew_gaoxing_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/41/xhrnew_gaoxing_org.png",
+        "value": "[小黄人高兴]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人惊讶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fd/xhrnew_jingya_thumb.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/fd/xhrnew_jingya_thumb.png",
+        "value": "[小黄人惊讶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人委屈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/79/xhrnew_weiqu_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/79/xhrnew_weiqu_org.png",
+        "value": "[小黄人委屈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人坏笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/be/xhrnew_huaixiao_thumb.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/be/xhrnew_huaixiao_thumb.png",
+        "value": "[小黄人坏笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人白眼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/xhrnew_baiyan_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/xhrnew_baiyan_org.png",
+        "value": "[小黄人白眼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人无奈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/15/xhrnew_wunai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/15/xhrnew_wunai_thumb.png",
+        "value": "[小黄人无奈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小黄人得意]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c8/xhrnew_deyi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "小黄人",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/c8/xhrnew_deyi_thumb.png",
+        "value": "[小黄人得意]",
+        "picid": ""
+    },
+    {
+        "phrase": "[钢铁侠]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/27/avengers_ironman01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/27/avengers_ironman01_thumb.png",
+        "value": "[钢铁侠]",
+        "picid": ""
+    },
+    {
+        "phrase": "[美国队长]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d8/avengers_captain01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d8/avengers_captain01_thumb.png",
+        "value": "[美国队长]",
+        "picid": ""
+    },
+    {
+        "phrase": "[雷神]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/avengers_thor01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/avengers_thor01_thumb.png",
+        "value": "[雷神]",
+        "picid": ""
+    },
+    {
+        "phrase": "[浩克]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/44/avengers_hulk01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/44/avengers_hulk01_thumb.png",
+        "value": "[浩克]",
+        "picid": ""
+    },
+    {
+        "phrase": "[黑寡妇]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0e/avengers_blackwidow01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/0e/avengers_blackwidow01_thumb.png",
+        "value": "[黑寡妇]",
+        "picid": ""
+    },
+    {
+        "phrase": "[鹰眼]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/93/avengers_clint01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/93/avengers_clint01_thumb.png",
+        "value": "[鹰眼]",
+        "picid": ""
+    },
+    {
+        "phrase": "[惊奇队长]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/44/avengers_captainmarvel01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/44/avengers_captainmarvel01_thumb.png",
+        "value": "[惊奇队长]",
+        "picid": ""
+    },
+    {
+        "phrase": "[奥克耶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/62/avengers_aokeye01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/62/avengers_aokeye01_thumb.png",
+        "value": "[奥克耶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[蚁人]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cc/avengers_antman01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/cc/avengers_antman01_thumb.png",
+        "value": "[蚁人]",
+        "picid": ""
+    },
+    {
+        "phrase": "[灭霸]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ce/avengers_thanos01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/ce/avengers_thanos01_thumb.png",
+        "value": "[灭霸]",
+        "picid": ""
+    },
+    {
+        "phrase": "[蜘蛛侠]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/avengers_spiderman01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/e2/avengers_spiderman01_thumb.png",
+        "value": "[蜘蛛侠]",
+        "picid": ""
+    },
+    {
+        "phrase": "[洛基]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1f/avengers_locki01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1f/avengers_locki01_thumb.png",
+        "value": "[洛基]",
+        "picid": ""
+    },
+    {
+        "phrase": "[奇异博士]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9c/avengers_drstranger01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/9c/avengers_drstranger01_thumb.png",
+        "value": "[奇异博士]",
+        "picid": ""
+    },
+    {
+        "phrase": "[冬兵]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/91/avengers_wintersolider01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/91/avengers_wintersolider01_thumb.png",
+        "value": "[冬兵]",
+        "picid": ""
+    },
+    {
+        "phrase": "[黑豹]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/avengers_panther01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/avengers_panther01_thumb.png",
+        "value": "[黑豹]",
+        "picid": ""
+    },
+    {
+        "phrase": "[猩红女巫]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a9/avengers_witch01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/a9/avengers_witch01_thumb.png",
+        "value": "[猩红女巫]",
+        "picid": ""
+    },
+    {
+        "phrase": "[幻视]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/07/avengers_vision01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/07/avengers_vision01_thumb.png",
+        "value": "[幻视]",
+        "picid": ""
+    },
+    {
+        "phrase": "[星爵]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/35/avengers_starlord01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/35/avengers_starlord01_thumb.png",
+        "value": "[星爵]",
+        "picid": ""
+    },
+    {
+        "phrase": "[格鲁特]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7a/avengers_gelute01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7a/avengers_gelute01_thumb.png",
+        "value": "[格鲁特]",
+        "picid": ""
+    },
+    {
+        "phrase": "[螳螂妹]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7c/avengers_mantis01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/7c/avengers_mantis01_thumb.png",
+        "value": "[螳螂妹]",
+        "picid": ""
+    },
+    {
+        "phrase": "[无限手套]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/38/avengers_gauntlet01_org.png",
+        "hot": false,
+        "common": false,
+        "category": "复仇者联盟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/38/avengers_gauntlet01_thumb.png",
+        "value": "[无限手套]",
+        "picid": ""
+    },
+    {
+        "phrase": "[胖红拽]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/de/angerbird_panghongzhuai_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/de/angerbird_panghongzhuai_thumb.png",
+        "value": "[胖红拽]",
+        "picid": ""
+    },
+    {
+        "phrase": "[胖红生气]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/angerbird_shengqi_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/angerbird_shengqi_thumb.png",
+        "value": "[胖红生气]",
+        "picid": ""
+    },
+    {
+        "phrase": "[胖红微笑]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f9/angerbird_panghongweixiao_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/f9/angerbird_panghongweixiao_thumb.png",
+        "value": "[胖红微笑]",
+        "picid": ""
+    },
+    {
+        "phrase": "[飞镖黄跳舞]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d2/angerbird_feibiaohuang_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d2/angerbird_feibiaohuang_thumb.png",
+        "value": "[飞镖黄跳舞]",
+        "picid": ""
+    },
+    {
+        "phrase": "[炸弹黑hi]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/angerbird_zhadanhei_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/86/angerbird_zhadanhei_thumb.png",
+        "value": "[炸弹黑hi]",
+        "picid": ""
+    },
+    {
+        "phrase": "[三三蹦跳]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/33/angerbird_sansna_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/33/angerbird_sansna_thumb.png",
+        "value": "[三三蹦跳]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小V开心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/80/angerbird_xiaovkaixin_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/80/angerbird_xiaovkaixin_thumb.png",
+        "value": "[小V开心]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小V生气]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/01/angerbird_xiaov_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/01/angerbird_xiaov_thumb.png",
+        "value": "[小V生气]",
+        "picid": ""
+    },
+    {
+        "phrase": "[佐伊卖萌]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/angerbird_zuoyimaimeng_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/angerbird_zuoyimaimeng_thumb.png",
+        "value": "[佐伊卖萌]",
+        "picid": ""
+    },
+    {
+        "phrase": "[小猪惊讶]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/56/angerbird_xiaozhujingya_org.png",
+        "hot": false,
+        "common": false,
+        "category": "愤怒的小鸟",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/56/angerbird_xiaozhujingya_thumb.png",
+        "value": "[小猪惊讶]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哪吒委屈]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d4/nezha_weiqu02_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哪吒",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/d4/nezha_weiqu02_thumb.png",
+        "value": "[哪吒委屈]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哪吒得意]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1d/nezha_deyi02_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哪吒",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/1d/nezha_deyi02_thumb.png",
+        "value": "[哪吒得意]",
+        "picid": ""
+    },
+    {
+        "phrase": "[哪吒开心]",
+        "type": "face",
+        "url": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/35/nezha_kaixin02_org.png",
+        "hot": false,
+        "common": false,
+        "category": "哪吒",
+        "icon": "https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/35/nezha_kaixin02_thumb.png",
+        "value": "[哪吒开心]",
+        "picid": ""
+    }
+]
+export default sinaEmoji;

+ 1595 - 0
assets/css/czy/es.1.base.css

@@ -0,0 +1,1595 @@
+.es{
+	display: flex;
+	flex-direction: row;
+	justify-content: flex-start;
+	position: relative;
+}
+
+.es-fx{
+	flex: 1;
+}
+
+.es-ver{
+	flex-direction: column;
+}
+
+.es-ac{
+	align-items: center;
+}
+.es-ae{
+	align-items: flex-end;
+}
+
+.es-pc{
+	justify-content: center;
+}
+
+.es-pe{
+	justify-content: flex-end;
+}
+
+.es-f1{
+	/*#ifndef APP-NVUE*/   
+	flex-grow: 1;
+	 /*#endif*/ 
+}
+.es-f2{
+	/*#ifndef APP-NVUE*/   
+	flex-grow: 2;
+	 /*#endif*/ 
+}
+.es-f3{
+	/*#ifndef APP-NVUE*/   
+	flex-grow: 3;
+	 /*#endif*/ 
+}
+.es-f4{
+	/*#ifndef APP-NVUE*/   
+	flex-grow: 4;
+	/*#endif*/ 
+}
+
+/*#ifndef APP-NVUE*/   
+.es > div,.es > view{
+	flex-shrink: 0;
+}
+/*#endif*/ 
+
+.es-f1,.es-f2,.es-f3,.es-f4{
+	/*#ifndef APP-NVUE*/ 
+	flex-shrink: 1 !important;
+	/*#endif*/ 
+	overflow: hidden;
+}
+
+/*es+es-pc+es-ac*/
+.es-center{
+	justify-content: space-between;
+}
+.es-max-btn{
+	display: flex;
+	flex-direction: row;
+	position: relative;
+	align-items: center;
+	justify-content: center;
+}
+
+/*margin*/
+.es-ml-1{ margin-left:1rpx; }
+.es-ml-2{ margin-left:2rpx; }
+.es-ml-3{ margin-left:3rpx; }
+.es-ml-4{ margin-left:4rpx; }
+.es-ml-5{ margin-left:5rpx; }
+.es-ml-6{ margin-left:6rpx; }
+.es-ml-7{ margin-left:7rpx; }
+.es-ml-8{ margin-left:8rpx; }
+.es-ml-9{ margin-left:9rpx; }
+.es-ml-10{ margin-left:10rpx; }
+.es-ml-11{ margin-left:11rpx; }
+.es-ml-12{ margin-left:12rpx; }
+.es-ml-13{ margin-left:13rpx; }
+.es-ml-14{ margin-left:14rpx; }
+.es-ml-15{ margin-left:15rpx; }
+.es-ml-16{ margin-left:16rpx; }
+.es-ml-17{ margin-left:17rpx; }
+.es-ml-18{ margin-left:18rpx; }
+.es-ml-19{ margin-left:19rpx; }
+.es-ml-20{ margin-left:20rpx; }
+.es-ml-21{ margin-left:21rpx; }
+.es-ml-22{ margin-left:22rpx; }
+.es-ml-23{ margin-left:23rpx; }
+.es-ml-24{ margin-left:24rpx; }
+.es-ml-25{ margin-left:25rpx; }
+.es-ml-26{ margin-left:26rpx; }
+.es-ml-27{ margin-left:27rpx; }
+.es-ml-28{ margin-left:28rpx; }
+.es-ml-29{ margin-left:29rpx; }
+.es-ml-30{ margin-left:30rpx; }
+.es-ml-31{ margin-left:31rpx; }
+.es-ml-32{ margin-left:32rpx; }
+.es-ml-33{ margin-left:33rpx; }
+.es-ml-34{ margin-left:34rpx; }
+.es-ml-35{ margin-left:35rpx; }
+.es-ml-36{ margin-left:36rpx; }
+.es-ml-37{ margin-left:37rpx; }
+.es-ml-38{ margin-left:38rpx; }
+.es-ml-39{ margin-left:39rpx; }
+.es-ml-40{ margin-left:40rpx; }
+.es-ml-41{ margin-left:41rpx; }
+.es-ml-42{ margin-left:42rpx; }
+.es-ml-43{ margin-left:43rpx; }
+.es-ml-44{ margin-left:44rpx; }
+.es-ml-45{ margin-left:45rpx; }
+.es-ml-46{ margin-left:46rpx; }
+.es-ml-47{ margin-left:47rpx; }
+.es-ml-48{ margin-left:48rpx; }
+.es-ml-49{ margin-left:49rpx; }
+.es-ml-50{ margin-left:50rpx; }
+
+.es-mr-1{ margin-right:1rpx; }
+.es-mr-2{ margin-right:2rpx; }
+.es-mr-3{ margin-right:3rpx; }
+.es-mr-4{ margin-right:4rpx; }
+.es-mr-5{ margin-right:5rpx; }
+.es-mr-6{ margin-right:6rpx; }
+.es-mr-7{ margin-right:7rpx; }
+.es-mr-8{ margin-right:8rpx; }
+.es-mr-9{ margin-right:9rpx; }
+.es-mr-10{ margin-right:10rpx; }
+.es-mr-11{ margin-right:11rpx; }
+.es-mr-12{ margin-right:12rpx; }
+.es-mr-13{ margin-right:13rpx; }
+.es-mr-14{ margin-right:14rpx; }
+.es-mr-15{ margin-right:15rpx; }
+.es-mr-16{ margin-right:16rpx; }
+.es-mr-17{ margin-right:17rpx; }
+.es-mr-18{ margin-right:18rpx; }
+.es-mr-19{ margin-right:19rpx; }
+.es-mr-20{ margin-right:20rpx; }
+.es-mr-21{ margin-right:21rpx; }
+.es-mr-22{ margin-right:22rpx; }
+.es-mr-23{ margin-right:23rpx; }
+.es-mr-24{ margin-right:24rpx; }
+.es-mr-25{ margin-right:25rpx; }
+.es-mr-26{ margin-right:26rpx; }
+.es-mr-27{ margin-right:27rpx; }
+.es-mr-28{ margin-right:28rpx; }
+.es-mr-29{ margin-right:29rpx; }
+.es-mr-30{ margin-right:30rpx; }
+.es-mr-31{ margin-right:31rpx; }
+.es-mr-32{ margin-right:32rpx; }
+.es-mr-33{ margin-right:33rpx; }
+.es-mr-34{ margin-right:34rpx; }
+.es-mr-35{ margin-right:35rpx; }
+.es-mr-36{ margin-right:36rpx; }
+.es-mr-37{ margin-right:37rpx; }
+.es-mr-38{ margin-right:38rpx; }
+.es-mr-39{ margin-right:39rpx; }
+.es-mr-40{ margin-right:40rpx; }
+.es-mr-41{ margin-right:41rpx; }
+.es-mr-42{ margin-right:42rpx; }
+.es-mr-43{ margin-right:43rpx; }
+.es-mr-44{ margin-right:44rpx; }
+.es-mr-45{ margin-right:45rpx; }
+.es-mr-46{ margin-right:46rpx; }
+.es-mr-47{ margin-right:47rpx; }
+.es-mr-48{ margin-right:48rpx; }
+.es-mr-49{ margin-right:49rpx; }
+.es-mr-50{ margin-right:50rpx; }
+
+.es-mt-1{ margin-top:1rpx; }
+.es-mt-2{ margin-top:2rpx; }
+.es-mt-3{ margin-top:3rpx; }
+.es-mt-4{ margin-top:4rpx; }
+.es-mt-5{ margin-top:5rpx; }
+.es-mt-6{ margin-top:6rpx; }
+.es-mt-7{ margin-top:7rpx; }
+.es-mt-8{ margin-top:8rpx; }
+.es-mt-9{ margin-top:9rpx; }
+.es-mt-10{ margin-top:10rpx; }
+.es-mt-11{ margin-top:11rpx; }
+.es-mt-12{ margin-top:12rpx; }
+.es-mt-13{ margin-top:13rpx; }
+.es-mt-14{ margin-top:14rpx; }
+.es-mt-15{ margin-top:15rpx; }
+.es-mt-16{ margin-top:16rpx; }
+.es-mt-17{ margin-top:17rpx; }
+.es-mt-18{ margin-top:18rpx; }
+.es-mt-19{ margin-top:19rpx; }
+.es-mt-20{ margin-top:20rpx; }
+.es-mt-21{ margin-top:21rpx; }
+.es-mt-22{ margin-top:22rpx; }
+.es-mt-23{ margin-top:23rpx; }
+.es-mt-24{ margin-top:24rpx; }
+.es-mt-25{ margin-top:25rpx; }
+.es-mt-26{ margin-top:26rpx; }
+.es-mt-27{ margin-top:27rpx; }
+.es-mt-28{ margin-top:28rpx; }
+.es-mt-29{ margin-top:29rpx; }
+.es-mt-30{ margin-top:30rpx; }
+.es-mt-31{ margin-top:31rpx; }
+.es-mt-32{ margin-top:32rpx; }
+.es-mt-33{ margin-top:33rpx; }
+.es-mt-34{ margin-top:34rpx; }
+.es-mt-35{ margin-top:35rpx; }
+.es-mt-36{ margin-top:36rpx; }
+.es-mt-37{ margin-top:37rpx; }
+.es-mt-38{ margin-top:38rpx; }
+.es-mt-39{ margin-top:39rpx; }
+.es-mt-40{ margin-top:40rpx; }
+.es-mt-41{ margin-top:41rpx; }
+.es-mt-42{ margin-top:42rpx; }
+.es-mt-43{ margin-top:43rpx; }
+.es-mt-44{ margin-top:44rpx; }
+.es-mt-45{ margin-top:45rpx; }
+.es-mt-46{ margin-top:46rpx; }
+.es-mt-47{ margin-top:47rpx; }
+.es-mt-48{ margin-top:48rpx; }
+.es-mt-49{ margin-top:49rpx; }
+.es-mt-50{ margin-top:50rpx; }
+
+.es-mb-1{ margin-bottom:1rpx; }
+.es-mb-2{ margin-bottom:2rpx; }
+.es-mb-3{ margin-bottom:3rpx; }
+.es-mb-4{ margin-bottom:4rpx; }
+.es-mb-5{ margin-bottom:5rpx; }
+.es-mb-6{ margin-bottom:6rpx; }
+.es-mb-7{ margin-bottom:7rpx; }
+.es-mb-8{ margin-bottom:8rpx; }
+.es-mb-9{ margin-bottom:9rpx; }
+.es-mb-10{ margin-bottom:10rpx; }
+.es-mb-11{ margin-bottom:11rpx; }
+.es-mb-12{ margin-bottom:12rpx; }
+.es-mb-13{ margin-bottom:13rpx; }
+.es-mb-14{ margin-bottom:14rpx; }
+.es-mb-15{ margin-bottom:15rpx; }
+.es-mb-16{ margin-bottom:16rpx; }
+.es-mb-17{ margin-bottom:17rpx; }
+.es-mb-18{ margin-bottom:18rpx; }
+.es-mb-19{ margin-bottom:19rpx; }
+.es-mb-20{ margin-bottom:20rpx; }
+.es-mb-21{ margin-bottom:21rpx; }
+.es-mb-22{ margin-bottom:22rpx; }
+.es-mb-23{ margin-bottom:23rpx; }
+.es-mb-24{ margin-bottom:24rpx; }
+.es-mb-25{ margin-bottom:25rpx; }
+.es-mb-26{ margin-bottom:26rpx; }
+.es-mb-27{ margin-bottom:27rpx; }
+.es-mb-28{ margin-bottom:28rpx; }
+.es-mb-29{ margin-bottom:29rpx; }
+.es-mb-30{ margin-bottom:30rpx; }
+.es-mb-31{ margin-bottom:31rpx; }
+.es-mb-32{ margin-bottom:32rpx; }
+.es-mb-33{ margin-bottom:33rpx; }
+.es-mb-34{ margin-bottom:34rpx; }
+.es-mb-35{ margin-bottom:35rpx; }
+.es-mb-36{ margin-bottom:36rpx; }
+.es-mb-37{ margin-bottom:37rpx; }
+.es-mb-38{ margin-bottom:38rpx; }
+.es-mb-39{ margin-bottom:39rpx; }
+.es-mb-40{ margin-bottom:40rpx; }
+.es-mb-41{ margin-bottom:41rpx; }
+.es-mb-42{ margin-bottom:42rpx; }
+.es-mb-43{ margin-bottom:43rpx; }
+.es-mb-44{ margin-bottom:44rpx; }
+.es-mb-45{ margin-bottom:45rpx; }
+.es-mb-46{ margin-bottom:46rpx; }
+.es-mb-47{ margin-bottom:47rpx; }
+.es-mb-48{ margin-bottom:48rpx; }
+.es-mb-49{ margin-bottom:49rpx; }
+.es-mb-50{ margin-bottom:50rpx; }
+
+/*padding*/
+.es-pl-1{ padding-left:1rpx; }
+.es-pl-2{ padding-left:2rpx; }
+.es-pl-3{ padding-left:3rpx; }
+.es-pl-4{ padding-left:4rpx; }
+.es-pl-5{ padding-left:5rpx; }
+.es-pl-6{ padding-left:6rpx; }
+.es-pl-7{ padding-left:7rpx; }
+.es-pl-8{ padding-left:8rpx; }
+.es-pl-9{ padding-left:9rpx; }
+.es-pl-10{ padding-left:10rpx; }
+.es-pl-11{ padding-left:11rpx; }
+.es-pl-12{ padding-left:12rpx; }
+.es-pl-13{ padding-left:13rpx; }
+.es-pl-14{ padding-left:14rpx; }
+.es-pl-15{ padding-left:15rpx; }
+.es-pl-16{ padding-left:16rpx; }
+.es-pl-17{ padding-left:17rpx; }
+.es-pl-18{ padding-left:18rpx; }
+.es-pl-19{ padding-left:19rpx; }
+.es-pl-20{ padding-left:20rpx; }
+.es-pl-21{ padding-left:21rpx; }
+.es-pl-22{ padding-left:22rpx; }
+.es-pl-23{ padding-left:23rpx; }
+.es-pl-24{ padding-left:24rpx; }
+.es-pl-25{ padding-left:25rpx; }
+.es-pl-26{ padding-left:26rpx; }
+.es-pl-27{ padding-left:27rpx; }
+.es-pl-28{ padding-left:28rpx; }
+.es-pl-29{ padding-left:29rpx; }
+.es-pl-30{ padding-left:30rpx; }
+.es-pl-31{ padding-left:31rpx; }
+.es-pl-32{ padding-left:32rpx; }
+.es-pl-33{ padding-left:33rpx; }
+.es-pl-34{ padding-left:34rpx; }
+.es-pl-35{ padding-left:35rpx; }
+.es-pl-36{ padding-left:36rpx; }
+.es-pl-37{ padding-left:37rpx; }
+.es-pl-38{ padding-left:38rpx; }
+.es-pl-39{ padding-left:39rpx; }
+.es-pl-40{ padding-left:40rpx; }
+.es-pl-41{ padding-left:41rpx; }
+.es-pl-42{ padding-left:42rpx; }
+.es-pl-43{ padding-left:43rpx; }
+.es-pl-44{ padding-left:44rpx; }
+.es-pl-45{ padding-left:45rpx; }
+.es-pl-46{ padding-left:46rpx; }
+.es-pl-47{ padding-left:47rpx; }
+.es-pl-48{ padding-left:48rpx; }
+.es-pl-49{ padding-left:49rpx; }
+.es-pl-50{ padding-left:50rpx; }
+
+.es-pr-1{ padding-right:1rpx; }
+.es-pr-2{ padding-right:2rpx; }
+.es-pr-3{ padding-right:3rpx; }
+.es-pr-4{ padding-right:4rpx; }
+.es-pr-5{ padding-right:5rpx; }
+.es-pr-6{ padding-right:6rpx; }
+.es-pr-7{ padding-right:7rpx; }
+.es-pr-8{ padding-right:8rpx; }
+.es-pr-9{ padding-right:9rpx; }
+.es-pr-10{ padding-right:10rpx; }
+.es-pr-11{ padding-right:11rpx; }
+.es-pr-12{ padding-right:12rpx; }
+.es-pr-13{ padding-right:13rpx; }
+.es-pr-14{ padding-right:14rpx; }
+.es-pr-15{ padding-right:15rpx; }
+.es-pr-16{ padding-right:16rpx; }
+.es-pr-17{ padding-right:17rpx; }
+.es-pr-18{ padding-right:18rpx; }
+.es-pr-19{ padding-right:19rpx; }
+.es-pr-20{ padding-right:20rpx; }
+.es-pr-21{ padding-right:21rpx; }
+.es-pr-22{ padding-right:22rpx; }
+.es-pr-23{ padding-right:23rpx; }
+.es-pr-24{ padding-right:24rpx; }
+.es-pr-25{ padding-right:25rpx; }
+.es-pr-26{ padding-right:26rpx; }
+.es-pr-27{ padding-right:27rpx; }
+.es-pr-28{ padding-right:28rpx; }
+.es-pr-29{ padding-right:29rpx; }
+.es-pr-30{ padding-right:30rpx; }
+.es-pr-31{ padding-right:31rpx; }
+.es-pr-32{ padding-right:32rpx; }
+.es-pr-33{ padding-right:33rpx; }
+.es-pr-34{ padding-right:34rpx; }
+.es-pr-35{ padding-right:35rpx; }
+.es-pr-36{ padding-right:36rpx; }
+.es-pr-37{ padding-right:37rpx; }
+.es-pr-38{ padding-right:38rpx; }
+.es-pr-39{ padding-right:39rpx; }
+.es-pr-40{ padding-right:40rpx; }
+.es-pr-41{ padding-right:41rpx; }
+.es-pr-42{ padding-right:42rpx; }
+.es-pr-43{ padding-right:43rpx; }
+.es-pr-44{ padding-right:44rpx; }
+.es-pr-45{ padding-right:45rpx; }
+.es-pr-46{ padding-right:46rpx; }
+.es-pr-47{ padding-right:47rpx; }
+.es-pr-48{ padding-right:48rpx; }
+.es-pr-49{ padding-right:49rpx; }
+.es-pr-50{ padding-right:50rpx; }
+.es-pl-51{ padding-left:51rpx; }
+.es-pl-52{ padding-left:52rpx; }
+.es-pl-53{ padding-left:53rpx; }
+.es-pl-54{ padding-left:54rpx; }
+.es-pl-55{ padding-left:55rpx; }
+.es-pl-56{ padding-left:56rpx; }
+.es-pl-57{ padding-left:57rpx; }
+.es-pl-58{ padding-left:58rpx; }
+.es-pl-59{ padding-left:59rpx; }
+
+.es-pt-1{ padding-top:1rpx; }
+.es-pt-2{ padding-top:2rpx; }
+.es-pt-3{ padding-top:3rpx; }
+.es-pt-4{ padding-top:4rpx; }
+.es-pt-5{ padding-top:5rpx; }
+.es-pt-6{ padding-top:6rpx; }
+.es-pt-7{ padding-top:7rpx; }
+.es-pt-8{ padding-top:8rpx; }
+.es-pt-9{ padding-top:9rpx; }
+.es-pt-10{ padding-top:10rpx; }
+.es-pt-11{ padding-top:11rpx; }
+.es-pt-12{ padding-top:12rpx; }
+.es-pt-13{ padding-top:13rpx; }
+.es-pt-14{ padding-top:14rpx; }
+.es-pt-15{ padding-top:15rpx; }
+.es-pt-16{ padding-top:16rpx; }
+.es-pt-17{ padding-top:17rpx; }
+.es-pt-18{ padding-top:18rpx; }
+.es-pt-19{ padding-top:19rpx; }
+.es-pt-20{ padding-top:20rpx; }
+.es-pt-21{ padding-top:21rpx; }
+.es-pt-22{ padding-top:22rpx; }
+.es-pt-23{ padding-top:23rpx; }
+.es-pt-24{ padding-top:24rpx; }
+.es-pt-25{ padding-top:25rpx; }
+.es-pt-26{ padding-top:26rpx; }
+.es-pt-27{ padding-top:27rpx; }
+.es-pt-28{ padding-top:28rpx; }
+.es-pt-29{ padding-top:29rpx; }
+.es-pt-30{ padding-top:30rpx; }
+.es-pt-31{ padding-top:31rpx; }
+.es-pt-32{ padding-top:32rpx; }
+.es-pt-33{ padding-top:33rpx; }
+.es-pt-34{ padding-top:34rpx; }
+.es-pt-35{ padding-top:35rpx; }
+.es-pt-36{ padding-top:36rpx; }
+.es-pt-37{ padding-top:37rpx; }
+.es-pt-38{ padding-top:38rpx; }
+.es-pt-39{ padding-top:39rpx; }
+.es-pt-40{ padding-top:40rpx; }
+.es-pt-41{ padding-top:41rpx; }
+.es-pt-42{ padding-top:42rpx; }
+.es-pt-43{ padding-top:43rpx; }
+.es-pt-44{ padding-top:44rpx; }
+.es-pt-45{ padding-top:45rpx; }
+.es-pt-46{ padding-top:46rpx; }
+.es-pt-47{ padding-top:47rpx; }
+.es-pt-48{ padding-top:48rpx; }
+.es-pt-49{ padding-top:49rpx; }
+.es-pt-50{ padding-top:50rpx; }
+
+.es-pb-1{ padding-bottom:1rpx; }
+.es-pb-2{ padding-bottom:2rpx; }
+.es-pb-3{ padding-bottom:3rpx; }
+.es-pb-4{ padding-bottom:4rpx; }
+.es-pb-5{ padding-bottom:5rpx; }
+.es-pb-6{ padding-bottom:6rpx; }
+.es-pb-7{ padding-bottom:7rpx; }
+.es-pb-8{ padding-bottom:8rpx; }
+.es-pb-9{ padding-bottom:9rpx; }
+.es-pb-10{ padding-bottom:10rpx; }
+.es-pb-11{ padding-bottom:11rpx; }
+.es-pb-12{ padding-bottom:12rpx; }
+.es-pb-13{ padding-bottom:13rpx; }
+.es-pb-14{ padding-bottom:14rpx; }
+.es-pb-15{ padding-bottom:15rpx; }
+.es-pb-16{ padding-bottom:16rpx; }
+.es-pb-17{ padding-bottom:17rpx; }
+.es-pb-18{ padding-bottom:18rpx; }
+.es-pb-19{ padding-bottom:19rpx; }
+.es-pb-20{ padding-bottom:20rpx; }
+.es-pb-21{ padding-bottom:21rpx; }
+.es-pb-22{ padding-bottom:22rpx; }
+.es-pb-23{ padding-bottom:23rpx; }
+.es-pb-24{ padding-bottom:24rpx; }
+.es-pb-25{ padding-bottom:25rpx; }
+.es-pb-26{ padding-bottom:26rpx; }
+.es-pb-27{ padding-bottom:27rpx; }
+.es-pb-28{ padding-bottom:28rpx; }
+.es-pb-29{ padding-bottom:29rpx; }
+.es-pb-30{ padding-bottom:30rpx; }
+.es-pb-31{ padding-bottom:31rpx; }
+.es-pb-32{ padding-bottom:32rpx; }
+.es-pb-33{ padding-bottom:33rpx; }
+.es-pb-34{ padding-bottom:34rpx; }
+.es-pb-35{ padding-bottom:35rpx; }
+.es-pb-36{ padding-bottom:36rpx; }
+.es-pb-37{ padding-bottom:37rpx; }
+.es-pb-38{ padding-bottom:38rpx; }
+.es-pb-39{ padding-bottom:39rpx; }
+.es-pb-40{ padding-bottom:40rpx; }
+.es-pb-41{ padding-bottom:41rpx; }
+.es-pb-42{ padding-bottom:42rpx; }
+.es-pb-43{ padding-bottom:43rpx; }
+.es-pb-44{ padding-bottom:44rpx; }
+.es-pb-45{ padding-bottom:45rpx; }
+.es-pb-46{ padding-bottom:46rpx; }
+.es-pb-47{ padding-bottom:47rpx; }
+.es-pb-48{ padding-bottom:48rpx; }
+.es-pb-49{ padding-bottom:49rpx; }
+.es-pb-50{ padding-bottom:50rpx; }
+
+
+
+
+/* widthPercent */
+.es-wp-1{ width:1%; }
+.es-wp-2{ width:2%; }
+.es-wp-3{ width:3%; }
+.es-wp-4{ width:4%; }
+.es-wp-5{ width:5%; }
+.es-wp-6{ width:6%; }
+.es-wp-7{ width:7%; }
+.es-wp-8{ width:8%; }
+.es-wp-9{ width:9%; }
+.es-wp-10{ width:10%; }
+.es-wp-11{ width:11%; }
+.es-wp-12{ width:12%; }
+.es-wp-13{ width:13%; }
+.es-wp-14{ width:14%; }
+.es-wp-15{ width:15%; }
+.es-wp-16{ width:16%; }
+.es-wp-17{ width:17%; }
+.es-wp-18{ width:18%; }
+.es-wp-19{ width:19%; }
+.es-wp-20{ width:20%; }
+.es-wp-21{ width:21%; }
+.es-wp-22{ width:22%; }
+.es-wp-23{ width:23%; }
+.es-wp-24{ width:24%; }
+.es-wp-25{ width:25%; }
+.es-wp-26{ width:26%; }
+.es-wp-27{ width:27%; }
+.es-wp-28{ width:28%; }
+.es-wp-29{ width:29%; }
+.es-wp-30{ width:30%; }
+.es-wp-31{ width:31%; }
+.es-wp-32{ width:32%; }
+.es-wp-33{ width:33%; }
+.es-wp-333{ width:33.33%; }
+.es-wp-34{ width:34%; }
+.es-wp-35{ width:35%; }
+.es-wp-36{ width:36%; }
+.es-wp-37{ width:37%; }
+.es-wp-38{ width:38%; }
+.es-wp-39{ width:39%; }
+.es-wp-40{ width:40%; }
+.es-wp-41{ width:41%; }
+.es-wp-42{ width:42%; }
+.es-wp-43{ width:43%; }
+.es-wp-44{ width:44%; }
+.es-wp-45{ width:45%; }
+.es-wp-46{ width:46%; }
+.es-wp-47{ width:47%; }
+.es-wp-48{ width:48%; }
+.es-wp-49{ width:49%; }
+.es-wp-50{ width:50%; }
+.es-wp-51{ width:51%; }
+.es-wp-52{ width:52%; }
+.es-wp-53{ width:53%; }
+.es-wp-54{ width:54%; }
+.es-wp-55{ width:55%; }
+.es-wp-56{ width:56%; }
+.es-wp-57{ width:57%; }
+.es-wp-58{ width:58%; }
+.es-wp-59{ width:59%; }
+.es-wp-60{ width:60%; }
+.es-wp-61{ width:61%; }
+.es-wp-62{ width:62%; }
+.es-wp-63{ width:63%; }
+.es-wp-64{ width:64%; }
+.es-wp-65{ width:65%; }
+.es-wp-66{ width:66%; }
+.es-wp-67{ width:67%; }
+.es-wp-68{ width:68%; }
+.es-wp-69{ width:69%; }
+.es-wp-70{ width:70%; }
+.es-wp-71{ width:71%; }
+.es-wp-72{ width:72%; }
+.es-wp-73{ width:73%; }
+.es-wp-74{ width:74%; }
+.es-wp-75{ width:75%; }
+.es-wp-76{ width:76%; }
+.es-wp-77{ width:77%; }
+.es-wp-78{ width:78%; }
+.es-wp-79{ width:79%; }
+.es-wp-80{ width:80%; }
+.es-wp-81{ width:81%; }
+.es-wp-82{ width:82%; }
+.es-wp-83{ width:83%; }
+.es-wp-84{ width:84%; }
+.es-wp-85{ width:85%; }
+.es-wp-86{ width:86%; }
+.es-wp-87{ width:87%; }
+.es-wp-88{ width:88%; }
+.es-wp-89{ width:89%; }
+.es-wp-90{ width:90%; }
+.es-wp-91{ width:91%; }
+.es-wp-92{ width:92%; }
+.es-wp-93{ width:93%; }
+.es-wp-94{ width:94%; }
+.es-wp-95{ width:95%; }
+.es-wp-96{ width:96%; }
+.es-wp-97{ width:97%; }
+.es-wp-98{ width:98%; }
+.es-wp-99{ width:99%; }
+.es-wp-100{ width:100%; }
+
+/* border */
+.es-b-b{ border-bottom: 1px #F7F8FA solid; }
+.es-b-t{ border-top: 1px #F7F8FA solid; }
+.es-b-l{ border-left: 1px #F7F8FA solid; }
+.es-b-r{ border-right: 1px #F7F8FA solid; }
+.es-br{ border-radius: 1000rpx;}
+.es-br-1{ border-radius: 1rpx; }
+.es-br-2{ border-radius: 2rpx; }
+.es-br-3{ border-radius: 3rpx; }
+.es-br-4{ border-radius: 4rpx; }
+.es-br-5{ border-radius: 5rpx; }
+.es-br-6{ border-radius: 6rpx; }
+.es-br-7{ border-radius: 7rpx; }
+.es-br-8{ border-radius: 8rpx; }
+.es-br-9{ border-radius: 9rpx; }
+.es-br-10{ border-radius: 10rpx; }
+.es-br-11{ border-radius: 11rpx; }
+.es-br-12{ border-radius: 12rpx; }
+.es-br-13{ border-radius: 13rpx; }
+.es-br-14{ border-radius: 14rpx; }
+.es-br-15{ border-radius: 15rpx; }
+.es-br-16{ border-radius: 16rpx; }
+.es-br-17{ border-radius: 17rpx; }
+.es-br-18{ border-radius: 18rpx; }
+.es-br-19{ border-radius: 19rpx; }
+.es-br-20{ border-radius: 20rpx; }
+.es-br-21{ border-radius: 21rpx; }
+.es-br-22{ border-radius: 22rpx; }
+.es-br-23{ border-radius: 23rpx; }
+.es-br-24{ border-radius: 24rpx; }
+.es-br-25{ border-radius: 25rpx; }
+.es-br-26{ border-radius: 26rpx; }
+.es-br-27{ border-radius: 27rpx; }
+.es-br-28{ border-radius: 28rpx; }
+.es-br-29{ border-radius: 29rpx; }
+.es-br-30{ border-radius: 30rpx; }
+.es-br-31{ border-radius: 31rpx; }
+.es-br-32{ border-radius: 32rpx; }
+.es-br-33{ border-radius: 33rpx; }
+.es-br-34{ border-radius: 34rpx; }
+.es-br-35{ border-radius: 35rpx; }
+.es-br-36{ border-radius: 36rpx; }
+.es-br-37{ border-radius: 37rpx; }
+.es-br-38{ border-radius: 38rpx; }
+.es-br-39{ border-radius: 39rpx; }
+.es-br-40{ border-radius: 40rpx; }
+.es-br-41{ border-radius: 41rpx; }
+.es-br-42{ border-radius: 42rpx; }
+.es-br-43{ border-radius: 43rpx; }
+.es-br-44{ border-radius: 44rpx; }
+.es-br-45{ border-radius: 45rpx; }
+.es-br-46{ border-radius: 46rpx; }
+.es-br-47{ border-radius: 47rpx; }
+.es-br-48{ border-radius: 48rpx; }
+.es-br-49{ border-radius: 49rpx; }
+.es-br-50{ border-radius: 50rpx; }
+.es-br-51{ border-radius: 51rpx; }
+.es-br-52{ border-radius: 52rpx; }
+.es-br-53{ border-radius: 53rpx; }
+.es-br-54{ border-radius: 54rpx; }
+.es-br-55{ border-radius: 55rpx; }
+.es-br-56{ border-radius: 56rpx; }
+.es-br-57{ border-radius: 57rpx; }
+.es-br-58{ border-radius: 58rpx; }
+.es-br-59{ border-radius: 59rpx; }
+.es-br-60{ border-radius: 60rpx; }
+.es-br-61{ border-radius: 61rpx; }
+.es-br-62{ border-radius: 62rpx; }
+.es-br-63{ border-radius: 63rpx; }
+.es-br-64{ border-radius: 64rpx; }
+.es-br-65{ border-radius: 65rpx; }
+.es-br-66{ border-radius: 66rpx; }
+.es-br-67{ border-radius: 67rpx; }
+.es-br-68{ border-radius: 68rpx; }
+.es-br-69{ border-radius: 69rpx; }
+.es-br-70{ border-radius: 70rpx; }
+.es-br-71{ border-radius: 71rpx; }
+.es-br-72{ border-radius: 72rpx; }
+.es-br-73{ border-radius: 73rpx; }
+.es-br-74{ border-radius: 74rpx; }
+.es-br-75{ border-radius: 75rpx; }
+.es-br-76{ border-radius: 76rpx; }
+.es-br-77{ border-radius: 77rpx; }
+.es-br-78{ border-radius: 78rpx; }
+.es-br-79{ border-radius: 79rpx; }
+.es-br-80{ border-radius: 80rpx; }
+.es-br-ban{ border-radius: 50%; }
+
+
+ /*#ifndef APP-NVUE*/  
+/* float */
+.es-fl{ float:left; }
+.es-fr{ float:right; }
+ /*#endif*/ 
+ 
+ 
+/* other common style */
+.es-view-w-x{ padding-left:30rpx; padding-right:30rpx;position: relative;
+    /*#ifndef APP-NVUE*/   
+    overflow: auto;
+	 /*#endif*/ 
+}
+.es-view-w-y{ margin-left:30rpx;margin-right:30rpx;
+/*#ifndef APP-NVUE*/   
+overflow: auto;
+/*#endif*/ 
+position: relative;}
+
+.es-omit,.es-omit-1{overflow: hidden;text-overflow: ellipsis;
+   /*#ifndef APP-NVUE*/   
+   white-space: nowrap;
+   /*#endif*/ 
+}
+
+.es-omit-2{overflow: hidden;text-overflow: ellipsis; 
+  /*#ifndef APP-NVUE*/   
+   display:-webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;
+   /*#endif*/ 
+}
+.es-omit-3{overflow: hidden;text-overflow: ellipsis;
+ /*#ifndef APP-NVUE*/   
+   display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;
+  /*#endif*/ 
+}
+.es-omit-4{overflow: hidden;text-overflow: ellipsis;
+ /*#ifndef APP-NVUE*/   
+   display: -webkit-box;-webkit-line-clamp: 4;-webkit-box-orient: vertical;
+  /*#endif*/ 
+}
+.es-omit-5{overflow: hidden;text-overflow: ellipsis;
+ /*#ifndef APP-NVUE*/   
+   display: -webkit-box;-webkit-line-clamp: 5;-webkit-box-orient: vertical;
+ /*#endif*/ 
+}
+
+.es-on-act:active,.es-max-btn:active{opacity: 0.7;}
+.es-on-bc:active{background: #cfcfcf !important;}
+
+.es-hide,.es-hidden{  
+	/*#ifndef APP-NVUE*/   
+	display: none; 
+	/*#endif*/
+}
+
+.es-oa{ 
+	/*#ifndef APP-NVUE*/   
+	overflow: auto;
+	/*#endif*/
+}
+
+.es-oh{ overflow: hidden;}
+
+.es-fix-top{ position: fixed;left:0;top:0;width:100%; z-index:10;}
+
+.es-fix-bottom{ position: fixed;left:0; bottom:0;width:100%; z-index:10;}
+.es-auto-bottom{ 
+	/*#ifndef APP-NVUE*/  
+	padding-bottom: env(safe-area-inset-bottom);
+	/*#endif*/
+}
+.es-auto-top{ /* padding-top: var(--status-bar-height); */ /* padding-top: env(safe-area-inset-top); */}
+.es-shadow-top,.es-fix-top.es-bc-white{ box-shadow: 0px -3px 8px rgba(0, 0, 0, 0.03);}
+
+.es-fix-top.es-bc-white{
+	box-shadow: 0 0 8rpx rgba(0,0,0,0.05);
+}
+
+.es-deleteline{ text-decoration:line-through;}
+.es-underline{ text-decoration:underline;}
+
+.es-block{ position: relative;overflow: hidden;}
+/*#ifndef APP-NVUE*/   
+.es-block > view:nth-child(1){ padding-top:100%;width:100%;}
+.es-block > view:nth-child(2){ width:100%;height:100%;position: absolute;left:0;top:0;overflow: hidden;z-index:1;}
+.es-block > view:nth-child(3){position: absolute;overflow: hidden;z-index:2;}
+/*#endif*/
+
+/* icon */
+/* .es-icon-default{background-image: url(/static/logo.png);} */
+.es-icon,.es-icon-auto,.es-icon-default,
+.es-icon-10,.es-icon-11,.es-icon-12,.es-icon-13,.es-icon-14,.es-icon-15,.es-icon-16,.es-icon-17,.es-icon-18,.es-icon-19,
+.es-icon-20,.es-icon-21,.es-icon-22,.es-icon-23,.es-icon-24,.es-icon-25,.es-icon-26,.es-icon-27,.es-icon-28,.es-icon-29,
+.es-icon-30,.es-icon-31,.es-icon-32,.es-icon-33,.es-icon-34,.es-icon-35,.es-icon-36,.es-icon-37,.es-icon-38,.es-icon-39,
+.es-icon-40,.es-icon-41,.es-icon-42,.es-icon-43,.es-icon-44,.es-icon-45,.es-icon-46,.es-icon-47,.es-icon-48,.es-icon-49,
+.es-icon-50,.es-icon-51,.es-icon-52,.es-icon-53,.es-icon-54,.es-icon-55,.es-icon-56,.es-icon-57,.es-icon-58,.es-icon-59,
+.es-icon-60,.es-icon-61,.es-icon-62,.es-icon-63,.es-icon-64,.es-icon-65,.es-icon-66,.es-icon-67,.es-icon-68,.es-icon-69,
+.es-icon-70,.es-icon-71,.es-icon-72,.es-icon-73,.es-icon-74,.es-icon-75,.es-icon-76,.es-icon-77,.es-icon-78,.es-icon-79,
+.es-icon-80,.es-icon-81,.es-icon-82,.es-icon-83,.es-icon-84,.es-icon-85,.es-icon-86,.es-icon-87,.es-icon-88,.es-icon-89,
+.es-icon-90,.es-icon-91,.es-icon-92,.es-icon-93,.es-icon-94,.es-icon-95,.es-icon-96,.es-icon-97,.es-icon-98,.es-icon-99,
+.es-icon-100,.es-icon-101,.es-icon-102,.es-icon-103,.es-icon-104,.es-icon-105,.es-icon-106,.es-icon-107,.es-icon-108,.es-icon-109,
+.es-icon-110,.es-icon-111,.es-icon-112,.es-icon-113,.es-icon-114,.es-icon-115,.es-icon-116,.es-icon-117,.es-icon-118,.es-icon-119,
+.es-icon-120,.es-icon-121,.es-icon-122,.es-icon-123,.es-icon-124,.es-icon-125,.es-icon-126,.es-icon-127,.es-icon-128,.es-icon-129,
+.es-icon-130,.es-icon-131,.es-icon-132,.es-icon-133,.es-icon-134,.es-icon-135,.es-icon-136,.es-icon-137,.es-icon-138,.es-icon-139,
+.es-icon-140,.es-icon-141,.es-icon-142,.es-icon-143,.es-icon-144,.es-icon-145,.es-icon-146,.es-icon-147,.es-icon-148,.es-icon-149,
+.es-icon-150,.es-icon-151,.es-icon-152,.es-icon-153,.es-icon-154,.es-icon-155,.es-icon-156,.es-icon-157,.es-icon-158,.es-icon-159,
+.es-icon-160,.es-icon-161,.es-icon-162,.es-icon-163,.es-icon-164,.es-icon-165,.es-icon-166,.es-icon-167,.es-icon-168,.es-icon-169,
+.es-icon-170,.es-icon-171,.es-icon-172,.es-icon-173,.es-icon-174,.es-icon-175,.es-icon-176,.es-icon-177,.es-icon-178,.es-icon-179,
+.es-icon-180,.es-icon-181,.es-icon-182,.es-icon-183,.es-icon-184,.es-icon-185,.es-icon-186,.es-icon-187,.es-icon-188,.es-icon-189,
+.es-icon-190,.es-icon-191,.es-icon-192,.es-icon-193,.es-icon-194,.es-icon-195,.es-icon-196,.es-icon-197,.es-icon-198,.es-icon-199,
+.es-icon-200{
+	/*#ifndef APP-NVUE*/   
+	background-size:  100% 100%;
+    /*#endif*/ 
+	overflow: hidden;
+}
+
+
+/*#ifndef APP-NVUE*/
+.es-icon image,.es-icon-auto image,
+.es-icon-10 image,.es-icon-11 image,.es-icon-12 image,.es-icon-13 image,.es-icon-14 image,.es-icon-15 image,.es-icon-16 image,.es-icon-17 image,.es-icon-18 image,.es-icon-19 image,
+.es-icon-20 image,.es-icon-21 image,.es-icon-22 image,.es-icon-23 image,.es-icon-24 image,.es-icon-25 image,.es-icon-26 image,.es-icon-27 image,.es-icon-28 image,.es-icon-29 image,
+.es-icon-30 image,.es-icon-31 image,.es-icon-32 image,.es-icon-33 image,.es-icon-34 image,.es-icon-35 image,.es-icon-36 image,.es-icon-37 image,.es-icon-38 image,.es-icon-39 image,
+.es-icon-40 image,.es-icon-41 image,.es-icon-42 image,.es-icon-43 image,.es-icon-44 image,.es-icon-45 image,.es-icon-46 image,.es-icon-47 image,.es-icon-48 image,.es-icon-49 image,
+.es-icon-50 image,.es-icon-51 image,.es-icon-52 image,.es-icon-53 image,.es-icon-54 image,.es-icon-55 image,.es-icon-56 image,.es-icon-57 image,.es-icon-58 image,.es-icon-59 image,
+.es-icon-60 image,.es-icon-61 image,.es-icon-62 image,.es-icon-63 image,.es-icon-64 image,.es-icon-65 image,.es-icon-66 image,.es-icon-67 image,.es-icon-68 image,.es-icon-69 image,
+.es-icon-70 image,.es-icon-71 image,.es-icon-72 image,.es-icon-73 image,.es-icon-74 image,.es-icon-75 image,.es-icon-76 image,.es-icon-77 image,.es-icon-78 image,.es-icon-79 image,
+.es-icon-80 image,.es-icon-81 image,.es-icon-82 image,.es-icon-83 image,.es-icon-84 image,.es-icon-85 image,.es-icon-86 image,.es-icon-87 image,.es-icon-88 image,.es-icon-89 image,
+.es-icon-90 image,.es-icon-91 image,.es-icon-92 image,.es-icon-93 image,.es-icon-94 image,.es-icon-95 image,.es-icon-96 image,.es-icon-97 image,.es-icon-98 image,.es-icon-99 image,
+.es-icon-100 image,.es-icon-101 image,.es-icon-102 image,.es-icon-103 image,.es-icon-104 image,.es-icon-105 image,.es-icon-106 image,.es-icon-107 image,.es-icon-108 image,.es-icon-109 image,
+.es-icon-110 image,.es-icon-111 image,.es-icon-112 image,.es-icon-113 image,.es-icon-114 image,.es-icon-115 image,.es-icon-116 image,.es-icon-117 image,.es-icon-118 image,.es-icon-119 image,
+.es-icon-120 image,.es-icon-121 image,.es-icon-122 image,.es-icon-123 image,.es-icon-124 image,.es-icon-125 image,.es-icon-126 image,.es-icon-127 image,.es-icon-128 image,.es-icon-129 image,
+.es-icon-130 image,.es-icon-131 image,.es-icon-132 image,.es-icon-133 image,.es-icon-134 image,.es-icon-135 image,.es-icon-136 image,.es-icon-137 image,.es-icon-138 image,.es-icon-139 image,
+.es-icon-140 image,.es-icon-141 image,.es-icon-142 image,.es-icon-143 image,.es-icon-144 image,.es-icon-145 image,.es-icon-146 image,.es-icon-147 image,.es-icon-148 image,.es-icon-149 image,
+.es-icon-150 image,.es-icon-151 image,.es-icon-152 image,.es-icon-153 image,.es-icon-154 image,.es-icon-155 image,.es-icon-156 image,.es-icon-157 image,.es-icon-158 image,.es-icon-159 image,
+.es-icon-160 image,.es-icon-161 image,.es-icon-162 image,.es-icon-163 image,.es-icon-164 image,.es-icon-165 image,.es-icon-166 image,.es-icon-167 image,.es-icon-168 image,.es-icon-169 image,
+.es-icon-170 image,.es-icon-171 image,.es-icon-172 image,.es-icon-173 image,.es-icon-174 image,.es-icon-175 image,.es-icon-176 image,.es-icon-177 image,.es-icon-178 image,.es-icon-179 image,
+.es-icon-180 image,.es-icon-181 image,.es-icon-182 image,.es-icon-183 image,.es-icon-184 image,.es-icon-185 image,.es-icon-186 image,.es-icon-187 image,.es-icon-188 image,.es-icon-189 image,
+.es-icon-190 image,.es-icon-191 image,.es-icon-192 image,.es-icon-193 image,.es-icon-194 image,.es-icon-195 image,.es-icon-196 image,.es-icon-197 image,.es-icon-198 image,.es-icon-199 image,
+.es-icon-200 image{
+	width:100%;
+	height:100%;
+}
+ /*#endif*/ 
+
+
+.es-bg-auto{
+	/*#ifndef APP-NVUE*/   
+	background-size: 100% auto;
+	background-repeat: no-repeat;
+	 /*#endif*/ 
+}
+
+
+/* common */
+
+
+.es-icon,.es-icon-default{ width:48rpx;height:48rpx; overflow: hidden;
+  /*#ifndef APP-NVUE*/   
+   background-size: 100% 100% !important;
+   /*#endif*/ 
+}
+.es-icon-10{ width:10rpx;height:10rpx;
+   /*#ifndef APP-NVUE*/   
+   background-size: 100% 100% !important;
+  /*#endif*/ 
+}
+.es-icon-11{ width:11rpx;height:11rpx;
+    /*#ifndef APP-NVUE*/   
+	 background-size: 100% 100% !important; 
+	/*#endif*/ 
+}
+.es-icon-12{ width:12rpx;height:12rpx;
+    background-size: 100% 100% !important;
+ }
+ 
+.es-icon-13{  width:13rpx;height:13rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-14{  width:14rpx;height:14rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-15{  width:15rpx;height:15rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-16{  width:16rpx;height:16rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-17{  width:17rpx;height:17rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-18{  width:18rpx;height:18rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-19{  width:19rpx;height:19rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-20{  width:20rpx;height:20rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-21{  width:21rpx;height:21rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-22{  width:22rpx;height:22rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-23{  width:23rpx;height:23rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-24{  width:24rpx;height:24rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-25{  width:25rpx;height:25rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-26{  width:26rpx;height:26rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-27{  width:27rpx;height:27rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-28{  width:28rpx;height:28rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-29{  width:29rpx;height:29rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-30{  width:30rpx;height:30rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+
+
+.es-icon-31{ width:31rpx;height:31rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-32{ width:32rpx;height:32rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-33{ width:33rpx;height:33rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-34{ width:34rpx;height:34rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-35{ width:35rpx;height:35rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+
+.es-icon-37{  width:37rpx;height:37rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-38{  width:38rpx;height:38rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-39{  width:39rpx;height:39rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-40{  width:40rpx;height:40rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-41{  width:41rpx;height:41rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-42{  width:42rpx;height:42rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-43{  width:43rpx;height:43rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-44{  width:44rpx;height:44rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-45{  width:45rpx;height:45rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-46{  width:46rpx;height:46rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-47{  width:47rpx;height:47rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-48{  width:48rpx;height:48rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-49{  width:49rpx;height:49rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-50{  width:50rpx;height:50rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-51{  width:51rpx;height:51rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-52{  width:52rpx;height:52rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-53{  width:53rpx;height:53rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-54{  width:54rpx;height:54rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-55{  width:55rpx;height:55rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+
+.es-icon-56{  width:56rpx;height:56rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-57{  width:57rpx;height:57rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-58{  width:58rpx;height:58rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-59{  width:59rpx;height:59rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-60{  width:60rpx;height:60rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-61{  width:61rpx;height:61rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-62{  width:62rpx;height:62rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-63{  width:63rpx;height:63rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-64{  width:64rpx;height:64rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-65{  width:65rpx;height:65rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-66{  width:66rpx;height:66rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-67{  width:67rpx;height:67rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-68{  width:68rpx;height:68rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-69{  width:69rpx;height:69rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-70{  width:70rpx;height:70rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+
+.es-icon-71{  width:71rpx;height:71rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-72{  width:72rpx;height:72rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-73{  width:73rpx;height:73rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-74{  width:74rpx;height:74rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-75{  width:75rpx;height:75rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-76{  width:76rpx;height:76rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-77{  width:77rpx;height:77rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-78{  width:78rpx;height:78rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+.es-icon-79{  width:79rpx;height:79rpx;  /*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/  }
+
+
+.es-icon-80{ width:80rpx;height:80rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-81{ width:81rpx;height:81rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-82{ width:82rpx;height:82rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-83{ width:83rpx;height:83rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-84{ width:84rpx;height:84rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-85{ width:85rpx;height:85rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-86{ width:86rpx;height:86rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-87{ width:87rpx;height:87rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-88{ width:88rpx;height:88rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-89{ width:89rpx;height:89rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-90{ width:90rpx;height:90rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+
+
+
+
+.es-icon-91{ width:91rpx;height:91rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-92{ width:92rpx;height:92rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-93{ width:93rpx;height:93rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-94{ width:94rpx;height:94rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-95{ width:95rpx;height:95rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-96{ width:96rpx;height:96rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-97{ width:97rpx;height:97rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-98{ width:98rpx;height:98rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-99{ width:99rpx;height:99rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-100{ width:100rpx;height:100rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-101{ width:101rpx;height:101rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-102{ width:102rpx;height:102rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-103{ width:103rpx;height:103rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-104{ width:104rpx;height:104rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-105{ width:105rpx;height:105rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-106{ width:106rpx;height:106rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-107{ width:107rpx;height:107rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-108{ width:108rpx;height:108rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-109{ width:109rpx;height:109rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-110{ width:110rpx;height:110rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-111{ width:111rpx;height:111rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-112{ width:112rpx;height:112rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-113{ width:113rpx;height:113rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-114{ width:114rpx;height:114rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-115{ width:115rpx;height:115rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-116{ width:116rpx;height:116rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-117{ width:117rpx;height:117rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-118{ width:118rpx;height:118rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-119{ width:119rpx;height:119rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-120{ width:120rpx;height:120rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-121{ width:121rpx;height:121rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-122{ width:122rpx;height:122rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-123{ width:123rpx;height:123rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-124{ width:124rpx;height:124rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-125{ width:125rpx;height:125rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-126{ width:126rpx;height:126rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-127{ width:127rpx;height:127rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-128{ width:128rpx;height:128rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-129{ width:129rpx;height:129rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-130{ width:120rpx;height:120rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-131{ width:131rpx;height:131rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-132{ width:132rpx;height:132rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-133{ width:133rpx;height:133rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-134{ width:134rpx;height:134rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-135{ width:135rpx;height:135rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-136{ width:136rpx;height:136rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-137{ width:137rpx;height:137rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-138{ width:138rpx;height:138rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-139{ width:139rpx;height:139rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-140{ width:140rpx;height:140rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+
+
+
+.es-icon-141{ width:141rpx;height:141rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-142{ width:142rpx;height:142rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-143{ width:143rpx;height:143rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-144{ width:144rpx;height:144rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-145{ width:145rpx;height:145rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-146{ width:146rpx;height:146rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-147{ width:147rpx;height:147rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-148{ width:148rpx;height:148rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-149{ width:149rpx;height:149rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-150{ width:150rpx;height:150rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-151{ width:151rpx;height:151rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-152{ width:152rpx;height:152rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-153{ width:153rpx;height:153rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-154{ width:154rpx;height:154rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-155{ width:155rpx;height:155rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-156{ width:156rpx;height:156rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-157{ width:157rpx;height:157rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-158{ width:158rpx;height:158rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-159{ width:159rpx;height:159rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-160{ width:160rpx;height:160rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-161{ width:161rpx;height:161rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-162{ width:162rpx;height:162rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-163{ width:163rpx;height:163rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-164{ width:164rpx;height:164rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-165{ width:165rpx;height:165rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-166{ width:166rpx;height:166rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-167{ width:167rpx;height:167rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-168{ width:168rpx;height:168rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-169{ width:169rpx;height:169rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-170{ width:170rpx;height:170rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-171{ width:171rpx;height:171rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-172{ width:172rpx;height:172rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-173{ width:173rpx;height:173rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-174{ width:174rpx;height:174rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-175{ width:175rpx;height:175rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-176{ width:176rpx;height:176rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-177{ width:177rpx;height:177rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-178{ width:178rpx;height:178rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-179{ width:179rpx;height:179rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-180{ width:180rpx;height:180rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-181{ width:181rpx;height:181rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-182{ width:182rpx;height:182rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-183{ width:183rpx;height:183rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-184{ width:184rpx;height:184rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-185{ width:185rpx;height:185rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-186{ width:186rpx;height:186rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-187{ width:187rpx;height:187rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-188{ width:188rpx;height:188rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-189{ width:189rpx;height:189rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-190{ width:190rpx;height:190rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-191{ width:191rpx;height:191rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-192{ width:192rpx;height:192rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-193{ width:193rpx;height:193rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-194{ width:194rpx;height:194rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-195{ width:195rpx;height:195rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-196{ width:196rpx;height:196rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-197{ width:197rpx;height:197rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-198{ width:198rpx;height:198rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-199{ width:199rpx;height:199rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+.es-icon-200{ width:190rpx;height:190rpx;/*#ifndef  APP-NVUE*/  background-size:  100%  100%  !important;  /*#endif*/ }
+
+
+
+
+/* font.css */
+/* fontWeight */
+.es-fw{font-weight: bold;}
+.es-fw1,.es-fw-600{ font-weight: 600; }
+.es-fw2,.es-fw-bold,.es-fw-700{ font-weight: 700; }
+.es-fw-500{ font-weight: 500; }
+.es-fw-400{ font-weight: 400; }
+.es-fw-n{font-weight: normal;}
+
+
+/* font orientation */
+.es-tc{ text-align: center; }
+.es-tl{ text-align: left; }
+.es-tr{ text-align: right; }
+
+/* fontSize */
+.es-fs-10{ font-size:10rpx; }
+.es-fs-11{ font-size:11rpx; }
+.es-fs-12{ font-size:12rpx; }
+.es-fs-13{ font-size:13rpx; }
+.es-fs-14{ font-size:14rpx; }
+.es-fs-15{ font-size:15rpx; }
+.es-fs-16{ font-size:16rpx; }
+.es-fs-17{ font-size:17rpx; }
+.es-fs-18{ font-size:18rpx; }
+.es-fs-19{ font-size:19rpx; }
+.es-fs-20{ font-size:20rpx; }
+.es-fs-21{ font-size:21rpx; }
+.es-fs-22{ font-size:22rpx; }
+.es-fs-23{ font-size:23rpx; }
+.es-fs-24{ font-size:24rpx; }
+.es-fs-25{ font-size:25rpx; }
+.es-fs-26{ font-size:26rpx; }
+.es-fs-27{ font-size:27rpx; }
+.es-fs-28{ font-size:28rpx; }
+.es-fs-29{ font-size:29rpx; }
+.es-fs-30{ font-size:30rpx; }
+.es-fs-31{ font-size:31rpx; }
+.es-fs-32{ font-size:32rpx; }
+.es-fs-33{ font-size:33rpx; }
+.es-fs-34{ font-size:34rpx; }
+.es-fs-35{ font-size:35rpx; }
+.es-fs-36{ font-size:36rpx; }
+.es-fs-37{ font-size:37rpx; }
+.es-fs-38{ font-size:38rpx; }
+.es-fs-39{ font-size:39rpx; }
+.es-fs-40{ font-size:40rpx; }
+.es-fs-41{ font-size:41rpx; }
+.es-fs-42{ font-size:42rpx; }
+.es-fs-43{ font-size:43rpx; }
+.es-fs-44{ font-size:44rpx; }
+.es-fs-45{ font-size:45rpx; }
+.es-fs-46{ font-size:46rpx; }
+.es-fs-47{ font-size:47rpx; }
+.es-fs-48{ font-size:48rpx; }
+.es-fs-49{ font-size:49rpx; }
+.es-fs-50{ font-size:50rpx; }
+.es-fs-51{ font-size:51rpx; }
+.es-fs-52{ font-size:52rpx; }
+.es-fs-53{ font-size:53rpx; }
+.es-fs-54{ font-size:54rpx; }
+.es-fs-55{ font-size:55rpx; }
+.es-fs-56{ font-size:56rpx; }
+.es-fs-57{ font-size:57rpx; }
+.es-fs-58{ font-size:58rpx; }
+.es-fs-59{ font-size:59rpx; }
+.es-fs-60{ font-size:60rpx; }
+.es-fs-61{ font-size:61rpx; }
+.es-fs-62{ font-size:62rpx; }
+.es-fs-63{ font-size:63rpx; }
+.es-fs-64{ font-size:64rpx; }
+.es-fs-65{ font-size:65rpx; }
+.es-fs-66{ font-size:66rpx; }
+.es-fs-67{ font-size:67rpx; }
+.es-fs-68{ font-size:68rpx; }
+.es-fs-69{ font-size:69rpx; }
+.es-fs-70{ font-size:70rpx; }
+.es-fs-71{ font-size:71rpx; }
+.es-fs-72{ font-size:72rpx; }
+.es-fs-73{ font-size:73rpx; }
+.es-fs-74{ font-size:74rpx; }
+.es-fs-75{ font-size:75rpx; }
+.es-fs-76{ font-size:76rpx; }
+.es-fs-77{ font-size:77rpx; }
+.es-fs-78{ font-size:78rpx; }
+.es-fs-79{ font-size:79rpx; }
+.es-fs-80{ font-size:80rpx; }
+.es-fs-81{ font-size:81rpx; }
+.es-fs-82{ font-size:82rpx; }
+.es-fs-83{ font-size:83rpx; }
+.es-fs-84{ font-size:84rpx; }
+.es-fs-85{ font-size:85rpx; }
+.es-fs-86{ font-size:86rpx; }
+.es-fs-87{ font-size:87rpx; }
+.es-fs-88{ font-size:88rpx; }
+.es-fs-89{ font-size:89rpx; }
+.es-fs-90{ font-size:90rpx; }
+.es-fs-91{ font-size:91rpx; }
+.es-fs-92{ font-size:92rpx; }
+.es-fs-93{ font-size:93rpx; }
+.es-fs-94{ font-size:94rpx; }
+.es-fs-95{ font-size:95rpx; }
+.es-fs-96{ font-size:96rpx; }
+.es-fs-97{ font-size:97rpx; }
+.es-fs-98{ font-size:98rpx; }
+.es-fs-99{ font-size:99rpx; }
+.es-fs-100{ font-size:100rpx; }
+
+
+
+/* height */
+.es-h-1{ height:1rpx; }
+.es-h-2{ height:2rpx; }
+.es-h-3{ height:3rpx; }
+.es-h-4{ height:4rpx; }
+.es-h-5{ height:5rpx; }
+.es-h-6{ height:6rpx; }
+.es-h-7{ height:7rpx; }
+.es-h-8{ height:8rpx; }
+.es-h-9{ height:9rpx; }
+.es-h-10{ height:10rpx; }
+.es-h-11{ height:11rpx; }
+.es-h-12{ height:12rpx; }
+.es-h-13{ height:13rpx; }
+.es-h-14{ height:14rpx; }
+.es-h-15{ height:15rpx; }
+.es-h-16{ height:16rpx; }
+.es-h-17{ height:17rpx; }
+.es-h-18{ height:18rpx; }
+.es-h-19{ height:19rpx; }
+.es-h-20{ height:20rpx; }
+.es-h-21{ height:21rpx; }
+.es-h-22{ height:22rpx; }
+.es-h-23{ height:23rpx; }
+.es-h-24{ height:24rpx; }
+.es-h-25{ height:25rpx; }
+.es-h-26{ height:26rpx; }
+.es-h-27{ height:27rpx; }
+.es-h-28{ height:28rpx; }
+.es-h-29{ height:29rpx; }
+.es-h-30{ height:30rpx; }
+.es-h-31{ height:31rpx; }
+.es-h-32{ height:32rpx; }
+.es-h-33{ height:33rpx; }
+.es-h-34{ height:34rpx; }
+.es-h-35{ height:35rpx; }
+.es-h-36{ height:36rpx; }
+.es-h-37{ height:37rpx; }
+.es-h-38{ height:38rpx; }
+.es-h-39{ height:39rpx; }
+.es-h-40{ height:40rpx; }
+.es-h-41{ height:41rpx; }
+.es-h-42{ height:42rpx; }
+.es-h-43{ height:43rpx; }
+.es-h-44{ height:44rpx; }
+.es-h-45{ height:45rpx; }
+.es-h-46{ height:46rpx; }
+.es-h-47{ height:47rpx; }
+.es-h-48{ height:48rpx; }
+.es-h-49{ height:49rpx; }
+.es-h-50{ height:50rpx; }
+.es-h-51{ height:51rpx; }
+.es-h-52{ height:52rpx; }
+.es-h-53{ height:53rpx; }
+.es-h-54{ height:54rpx; }
+.es-h-55{ height:55rpx; }
+.es-h-56{ height:56rpx; }
+.es-h-57{ height:57rpx; }
+.es-h-58{ height:58rpx; }
+.es-h-59{ height:59rpx; }
+.es-h-60{ height:60rpx; }
+.es-h-61{ height:61rpx; }
+.es-h-62{ height:62rpx; }
+.es-h-63{ height:63rpx; }
+.es-h-64{ height:64rpx; }
+.es-h-65{ height:65rpx; }
+.es-h-66{ height:66rpx; }
+.es-h-67{ height:67rpx; }
+.es-h-68{ height:68rpx; }
+.es-h-69{ height:69rpx; }
+.es-h-70{ height:70rpx; }
+.es-h-71{ height:71rpx; }
+.es-h-72{ height:72rpx; }
+.es-h-73{ height:73rpx; }
+.es-h-74{ height:74rpx; }
+.es-h-75{ height:75rpx; }
+.es-h-76{ height:76rpx; }
+.es-h-77{ height:77rpx; }
+.es-h-78{ height:78rpx; }
+.es-h-79{ height:79rpx; }
+.es-h-80{ height:80rpx; }
+.es-h-81{ height:81rpx; }
+.es-h-82{ height:82rpx; }
+.es-h-83{ height:83rpx; }
+.es-h-84{ height:84rpx; }
+.es-h-85{ height:85rpx; }
+.es-h-86{ height:86rpx; }
+.es-h-87{ height:87rpx; }
+.es-h-88{ height:88rpx; }
+/* #ifdef MP-WEIXIN */
+/* .es-h-88{ height:41px; } */
+/* #endif */
+.es-h-89{ height:89rpx; }
+.es-h-90{ height:90rpx; }
+.es-h-91{ height:91rpx; }
+.es-h-92{ height:92rpx; }
+.es-h-93{ height:93rpx; }
+.es-h-94{ height:94rpx; }
+.es-h-95{ height:95rpx; }
+.es-h-96{ height:96rpx; }
+.es-h-97{ height:97rpx; }
+.es-h-98{ height:98rpx; }
+.es-h-99{ height:99rpx; }
+
+.es-h-100{ height:100rpx; }
+.es-h-101{ height:101rpx; }
+.es-h-102{ height:102rpx; }
+.es-h-103{ height:103rpx; }
+.es-h-104{ height:104rpx; }
+.es-h-105{ height:105rpx; }
+.es-h-106{ height:106rpx; }
+.es-h-107{ height:107rpx; }
+.es-h-108{ height:108rpx; }
+.es-h-109{ height:109rpx; }
+.es-h-110{ height:110rpx; }
+.es-h-111{ height:111rpx; }
+.es-h-112{ height:112rpx; }
+.es-h-113{ height:113rpx; }
+.es-h-114{ height:114rpx; }
+.es-h-115{ height:115rpx; }
+.es-h-116{ height:116rpx; }
+.es-h-117{ height:117rpx; }
+.es-h-118{ height:118rpx; }
+.es-h-119{ height:119rpx; }
+.es-h-120{ height:120rpx; }
+.es-h-121{ height:121rpx; }
+.es-h-122{ height:122rpx; }
+.es-h-123{ height:123rpx; }
+.es-h-124{ height:124rpx; }
+.es-h-125{ height:125rpx; }
+.es-h-126{ height:126rpx; }
+.es-h-127{ height:127rpx; }
+.es-h-128{ height:128rpx; }
+.es-h-129{ height:129rpx; }
+.es-h-130{ height:140rpx; }
+.es-h-131{ height:141rpx; }
+.es-h-132{ height:142rpx; }
+.es-h-133{ height:143rpx; }
+.es-h-134{ height:144rpx; }
+.es-h-135{ height:145rpx; }
+.es-h-136{ height:146rpx; }
+.es-h-137{ height:147rpx; }
+.es-h-138{ height:148rpx; }
+.es-h-139{ height:149rpx; }
+.es-h-140{ height:140rpx; }
+.es-h-141{ height:141rpx; }
+.es-h-142{ height:142rpx; }
+.es-h-143{ height:143rpx; }
+.es-h-144{ height:144rpx; }
+.es-h-145{ height:145rpx; }
+.es-h-146{ height:146rpx; }
+.es-h-147{ height:147rpx; }
+.es-h-148{ height:148rpx; }
+.es-h-149{ height:149rpx; }
+.es-h-150{ height:150rpx; }
+.es-h-151{ height:151rpx; }
+.es-h-152{ height:152rpx; }
+.es-h-153{ height:153rpx; }
+.es-h-154{ height:154rpx; }
+.es-h-155{ height:155rpx; }
+.es-h-156{ height:156rpx; }
+.es-h-157{ height:157rpx; }
+.es-h-158{ height:158rpx; }
+.es-h-159{ height:159rpx; }
+.es-h-160{ height:160rpx; }
+.es-h-161{ height:161rpx; }
+.es-h-162{ height:162rpx; }
+.es-h-163{ height:163rpx; }
+.es-h-164{ height:164rpx; }
+.es-h-165{ height:165rpx; }
+.es-h-166{ height:166rpx; }
+.es-h-167{ height:167rpx; }
+.es-h-168{ height:168rpx; }
+.es-h-169{ height:169rpx; }
+.es-h-170{ height:170rpx; }
+.es-h-171{ height:171rpx; }
+.es-h-172{ height:172rpx; }
+.es-h-173{ height:173rpx; }
+.es-h-174{ height:174rpx; }
+.es-h-175{ height:175rpx; }
+.es-h-176{ height:176rpx; }
+.es-h-177{ height:177rpx; }
+.es-h-178{ height:178rpx; }
+.es-h-179{ height:179rpx; }
+.es-h-180{ height:180rpx; }
+.es-h-181{ height:181rpx; }
+.es-h-182{ height:182rpx; }
+.es-h-183{ height:183rpx; }
+.es-h-184{ height:184rpx; }
+.es-h-185{ height:185rpx; }
+.es-h-186{ height:186rpx; }
+.es-h-187{ height:187rpx; }
+.es-h-188{ height:188rpx; }
+.es-h-189{ height:189rpx; }
+.es-h-190{ height:190rpx; }
+.es-h-191{ height:191rpx; }
+.es-h-192{ height:192rpx; }
+.es-h-193{ height:193rpx; }
+.es-h-194{ height:194rpx; }
+.es-h-195{ height:195rpx; }
+.es-h-196{ height:196rpx; }
+.es-h-197{ height:197rpx; }
+.es-h-198{ height:198rpx; }
+.es-h-199{ height:199rpx; }
+.es-h-200{ height:200rpx; }
+
+/* width */
+.es-w-1{ width:1rpx; }
+.es-w-2{ width:2rpx; }
+.es-w-3{ width:3rpx; }
+.es-w-4{ width:4rpx; }
+.es-w-5{ width:5rpx; }
+.es-w-6{ width:6rpx; }
+.es-w-7{ width:7rpx; }
+.es-w-8{ width:8rpx; }
+.es-w-9{ width:9rpx; }
+.es-w-10{ width:10rpx; }
+.es-w-11{ width:11rpx; }
+.es-w-12{ width:12rpx; }
+.es-w-13{ width:13rpx; }
+.es-w-14{ width:14rpx; }
+.es-w-15{ width:15rpx; }
+.es-w-16{ width:16rpx; }
+.es-w-17{ width:17rpx; }
+.es-w-18{ width:18rpx; }
+.es-w-19{ width:19rpx; }
+.es-w-20{ width:20rpx; }
+.es-w-21{ width:21rpx; }
+.es-w-22{ width:22rpx; }
+.es-w-23{ width:23rpx; }
+.es-w-24{ width:24rpx; }
+.es-w-25{ width:25rpx; }
+.es-w-26{ width:26rpx; }
+.es-w-27{ width:27rpx; }
+.es-w-28{ width:28rpx; }
+.es-w-29{ width:29rpx; }
+.es-w-30{ width:30rpx; }
+.es-w-31{ width:31rpx; }
+.es-w-32{ width:32rpx; }
+.es-w-33{ width:33rpx; }
+.es-w-34{ width:34rpx; }
+.es-w-35{ width:35rpx; }
+.es-w-36{ width:36rpx; }
+.es-w-37{ width:37rpx; }
+.es-w-38{ width:38rpx; }
+.es-w-39{ width:39rpx; }
+.es-w-40{ width:40rpx; }
+.es-w-41{ width:41rpx; }
+.es-w-42{ width:42rpx; }
+.es-w-43{ width:43rpx; }
+.es-w-44{ width:44rpx; }
+.es-w-45{ width:45rpx; }
+.es-w-46{ width:46rpx; }
+.es-w-47{ width:47rpx; }
+.es-w-48{ width:48rpx; }
+.es-w-49{ width:49rpx; }
+.es-w-50{ width:50rpx; }
+.es-w-51{ width:51rpx; }
+.es-w-52{ width:52rpx; }
+.es-w-53{ width:53rpx; }
+.es-w-54{ width:54rpx; }
+.es-w-55{ width:55rpx; }
+.es-w-56{ width:56rpx; }
+.es-w-57{ width:57rpx; }
+.es-w-58{ width:58rpx; }
+.es-w-59{ width:59rpx; }
+.es-w-60{ width:60rpx; }
+.es-w-61{ width:61rpx; }
+.es-w-62{ width:62rpx; }
+.es-w-63{ width:63rpx; }
+.es-w-64{ width:64rpx; }
+.es-w-65{ width:65rpx; }
+.es-w-66{ width:66rpx; }
+.es-w-67{ width:67rpx; }
+.es-w-68{ width:68rpx; }
+.es-w-69{ width:69rpx; }
+.es-w-70{ width:70rpx; }
+.es-w-71{ width:71rpx; }
+.es-w-72{ width:72rpx; }
+.es-w-73{ width:73rpx; }
+.es-w-74{ width:74rpx; }
+.es-w-75{ width:75rpx; }
+.es-w-76{ width:76rpx; }
+.es-w-77{ width:77rpx; }
+.es-w-78{ width:78rpx; }
+.es-w-79{ width:79rpx; }
+.es-w-80{ width:80rpx; }
+.es-w-81{ width:81rpx; }
+.es-w-82{ width:82rpx; }
+.es-w-83{ width:83rpx; }
+.es-w-84{ width:84rpx; }
+.es-w-85{ width:85rpx; }
+.es-w-86{ width:86rpx; }
+.es-w-87{ width:87rpx; }
+.es-w-88{ width:88rpx; }
+.es-w-89{ width:89rpx; }
+.es-w-90{ width:90rpx; }
+.es-w-91{ width:91rpx; }
+.es-w-92{ width:92rpx; }
+.es-w-93{ width:93rpx; }
+.es-w-94{ width:94rpx; }
+.es-w-95{ width:95rpx; }
+.es-w-96{ width:96rpx; }
+.es-w-97{ width:97rpx; }
+.es-w-98{ width:98rpx; }
+.es-w-99{ width:99rpx; }
+
+.es-w-100{ width:100rpx; }
+.es-w-101{ width:101rpx; }
+.es-w-102{ width:102rpx; }
+.es-w-103{ width:103rpx; }
+.es-w-104{ width:104rpx; }
+.es-w-105{ width:105rpx; }
+.es-w-106{ width:106rpx; }
+.es-w-107{ width:107rpx; }
+.es-w-108{ width:108rpx; }
+.es-w-109{ width:109rpx; }
+.es-w-110{ width:110rpx; }
+.es-w-111{ width:111rpx; }
+.es-w-112{ width:112rpx; }
+.es-w-113{ width:113rpx; }
+.es-w-114{ width:114rpx; }
+.es-w-115{ width:115rpx; }
+.es-w-116{ width:116rpx; }
+.es-w-117{ width:117rpx; }
+.es-w-118{ width:118rpx; }
+.es-w-119{ width:119rpx; }
+.es-w-120{ width:120rpx; }
+.es-w-121{ width:121rpx; }
+.es-w-122{ width:122rpx; }
+.es-w-123{ width:123rpx; }
+.es-w-124{ width:124rpx; }
+.es-w-125{ width:125rpx; }
+.es-w-126{ width:126rpx; }
+.es-w-127{ width:127rpx; }
+.es-w-128{ width:128rpx; }
+.es-w-129{ width:129rpx; }
+.es-w-130{ width:140rpx; }
+.es-w-131{ width:141rpx; }
+.es-w-132{ width:142rpx; }
+.es-w-133{ width:143rpx; }
+.es-w-134{ width:144rpx; }
+.es-w-135{ width:145rpx; }
+.es-w-136{ width:146rpx; }
+.es-w-137{ width:147rpx; }
+.es-w-138{ width:148rpx; }
+.es-w-139{ width:149rpx; }
+.es-w-140{ width:140rpx; }
+.es-w-141{ width:141rpx; }
+.es-w-142{ width:142rpx; }
+.es-w-143{ width:143rpx; }
+.es-w-144{ width:144rpx; }
+.es-w-145{ width:145rpx; }
+.es-w-146{ width:146rpx; }
+.es-w-147{ width:147rpx; }
+.es-w-148{ width:148rpx; }
+.es-w-149{ width:149rpx; }
+.es-w-150{ width:150rpx; }
+.es-w-151{ width:151rpx; }
+.es-w-152{ width:152rpx; }
+.es-w-153{ width:153rpx; }
+.es-w-154{ width:154rpx; }
+.es-w-155{ width:155rpx; }
+.es-w-156{ width:156rpx; }
+.es-w-157{ width:157rpx; }
+.es-w-158{ width:158rpx; }
+.es-w-159{ width:159rpx; }
+.es-w-160{ width:160rpx; }
+.es-w-161{ width:161rpx; }
+.es-w-162{ width:162rpx; }
+.es-w-163{ width:163rpx; }
+.es-w-164{ width:164rpx; }
+.es-w-165{ width:165rpx; }
+.es-w-166{ width:166rpx; }
+.es-w-167{ width:167rpx; }
+.es-w-168{ width:168rpx; }
+.es-w-169{ width:169rpx; }
+.es-w-170{ width:170rpx; }
+.es-w-171{ width:171rpx; }
+.es-w-172{ width:172rpx; }
+.es-w-173{ width:173rpx; }
+.es-w-174{ width:174rpx; }
+.es-w-175{ width:175rpx; }
+.es-w-176{ width:176rpx; }
+.es-w-177{ width:177rpx; }
+.es-w-178{ width:178rpx; }
+.es-w-179{ width:179rpx; }
+.es-w-180{ width:180rpx; }
+.es-w-181{ width:181rpx; }
+.es-w-182{ width:182rpx; }
+.es-w-183{ width:183rpx; }
+.es-w-184{ width:184rpx; }
+.es-w-185{ width:185rpx; }
+.es-w-186{ width:186rpx; }
+.es-w-187{ width:187rpx; }
+.es-w-188{ width:188rpx; }
+.es-w-189{ width:189rpx; }
+.es-w-190{ width:190rpx; }
+.es-w-191{ width:191rpx; }
+.es-w-192{ width:192rpx; }
+.es-w-193{ width:193rpx; }
+.es-w-194{ width:194rpx; }
+.es-w-195{ width:195rpx; }
+.es-w-196{ width:196rpx; }
+.es-w-197{ width:197rpx; }
+.es-w-198{ width:198rpx; }
+.es-w-199{ width:199rpx; }
+.es-w-200{ width:200rpx; }
+
+
+.es-p-a{position: absolute;}
+.es-p-f{position: fixed;}
+.es-p-r{position: relative;}
+

+ 94 - 0
assets/css/czy/es.2.color.css

@@ -0,0 +1,94 @@
+/* backgroundColor color borderColor */
+.es-bc,.es-max-btn{ background: #88570B;color:white; }
+.es-c{ color: #88570B !important; }
+.es-brc{ border:1px #88570B solid !important; }
+.es-bc-tint{
+	background-color: rgba(255, 92, 3, 0.1);
+}
+
+.es-bc-tint2{
+	background-color: rgba(255, 92, 3, 0.2);
+}
+
+.es-bc-tint05{
+	background-color: rgba(255, 92, 3, 0.05);
+}
+
+.es-bc-theme{ background-color:#88570B; color:white; }
+
+.es-bc-yellow{ background:#F57221; color:white; }
+.es-c-yellow{ color:#F57221; }
+.es-btc-yellow{ border:1px #F57221 solid !important;}
+
+
+.es-bc-yellow-tint{ background:#FCB75B; color:white; }
+.es-c-yellow-tint{ color:#FCB75B; }
+.es-brc-yellow{ border:1px #FCB75B solid !important;}
+
+
+.es-bc-blue{ background:#00a1ea;color:white; }
+.es-c-blue{ color:#00a1ea; }
+.es-brc-gray{ border:1px #00a1ea solid !important;}
+
+.es-bc-gray{  background: #C4C4C4; color:white; }
+.es-c-gray{ color: #C4C4C4; }
+.es-brc-gray{ border:1px #C4C4C4 solid !important;}
+
+.es-bc-gray-tint{ background:#F7F8FA; }
+
+.es-bc-f1{ background:#f1f1f1; color:#666666; }
+.es-bc-f3{ background:#f3f3f3; color:#666666; }
+.es-bc-d7{ background:#d7d7d7; color:#666666; }
+
+.es-brc-f1{ border:#f1f1f1 1px solid; }
+.es-brc-f3{ border:#f3f3f3 1px solid; }
+.es-brc-d7{ border:#d7d7d7 1px solid; }
+
+
+.es-bc-white{ background:#FFFFFF; }
+.es-brc-white{ border:#FFFFFF 1px solid; }
+.es-c-white{ color:#ffffff; }
+
+.es-c-red{ color:#EE5845; }
+.es-bc-red{ background:#EE5845;color:white; }
+.es-brc-red{ border:#EE5845 1px solid; }
+
+.es-c-purple{ color:#5473E8; }
+.es-bc-purple{ background:#5473E8;color:white; }
+.es-brc-purple{ border:#5473E8 1px solid; }
+
+.es-bc-black{background: #1F2129;}
+
+.es-bc-c4{ background:#c4c4c4;color:white; }
+.es-bc-f7{background:#F7F8FA;}
+.es-bc-f8{background:#F8F8F8;}
+.es-bc-db{background:#DBDBDB;}
+.es-bc-f9{background:#f9f9f9;}
+.es-bc-90{background: #9096AB !important;color:white;}
+.es-bc-e6{background-color: #e6e5e4;}
+.es-bc-fa{background-color: #fafafa;}
+
+
+/* fontColor */
+/* page{ color:#454545; } */
+.es-c-99{ color:#999999; }
+.es-t-y,.es-c-66{ color:#666666; }
+.es-t-z,.es-c-c4{ color:#C4C4C4; }
+.es-c-45{ color:#454545; }
+.es-c-cc{ color:#cccccc; }
+.es-c-7b{color:#7b7b7b;}
+.es-c-6c{color: #6c6c6c;}
+.es-t-x{color:#9096AB;}
+
+.es-c-b4{color: #b4b4b4;}
+.es-c-6a{color: #6a6a6a;}
+
+.es-c-00{color: #000000;}
+.es-c-33{color: #333333;}
+.es-c-66{color: #666666;}
+.es-c-99{color: #999999;}
+.es-c-ec{color: #ececec;}
+.es-c-e1{color: #e1e1e1;}
+.es-c-e5{color: #e5e5e5;}
+
+/*input*/

+ 28 - 0
assets/css/czy/es.3.icon.css

@@ -0,0 +1,28 @@
+
+/* .es-icon-default{
+	background-image: url("@/static/logo.png");
+} */
+
+/* .es-icon-play{
+	background-image: url("@/static/image/course/play.png");
+} */
+
+/* .es-icon-ret-white{
+	background-image: url("@/static/images/other/ret-white.png");
+	width: 18rpx;
+	height: 31rpx;
+	background-size: 100% 100%;
+} */
+
+/* .es-top-bg{
+	background-image: url(/static/image/home/home_top_bg.png);
+} */
+
+/* .es-icon-ret-right{
+	background-image: url("@/static/images/other/ret-right2.png");
+	width: 19rpx;
+	height: 19rpx;
+	background-size: 100% 100%;
+	margin-top: 3rpx;
+	margin-left: 6rpx;
+} */

+ 101 - 0
assets/css/czy/es.4.view.css

@@ -0,0 +1,101 @@
+/*
+	存放本项目使用的一些扩展类
+*/
+/* page {
+	font-family: ".PingFang SC";
+	font-size: 28rpx;
+	font-weight: 400;
+
+	background: #F7F8FA;
+} */
+
+button::after {
+	border: none;
+}
+
+button {
+	border-radius: 0;
+	font-size: 30rpx;
+	line-height: 1em;
+	padding-left: 0;
+	padding-right: 0;
+}
+
+.es-min-btn {
+	padding: 8rpx 31rpx;
+	border-radius: 200rpx;
+	font-size: 26rpx;
+}
+
+.es-min-btn2 {
+	padding: 14rpx 36rpx;
+	border-radius: 200rpx;
+	font-size: 28rpx;
+	font-weight: 600;
+}
+
+.es-min-btn-n {
+	padding: 8rpx 31rpx;
+	border-radius: 200rpx;
+	font-size: 26rpx;
+	color: #9096AB;
+	border: 1px #9096AB solid;
+}
+
+.es-min-btn-n.ac {
+	color: #12C194;
+	border: 1px #12C194 solid;
+}
+
+.es-ipt,
+.es-text {
+	overflow: hidden;
+}
+
+.es-ipt,
+.es-ipt input {
+	height: 76rpx;
+}
+
+.es-text,
+.es-text textarea {
+	height: 158rpx;
+}
+
+.es-text textarea,
+.es-ipt input {
+	padding: 0 24rpx;
+	background: #F7F8FA;
+	font-size: 28rpx;
+	width: calc(100% - 50rpx);
+}
+
+.es-text textarea {
+	padding-top: 15rpx !important;
+	padding-bottom: 15rpx !important;
+}
+
+.es-ipt.es-bc-white,
+.es-ipt.es-bc-white input,
+.es-text.es-bc-white textarea {
+	background: white;
+}
+
+
+
+.es-max-btn {
+	height: 80rpx;
+	border-radius: 15rpx;
+	background-color: #12C194;
+	color: white;
+	font-size: 28rpx;
+}
+
+
+/* .label {
+	color: #12C194;
+	background: rgba(18, 193, 148, 0.1);
+	padding: 10rpx 25rpx;
+	border-radius: 100rpx;
+	font-size: 24rpx;
+ }*/

BIN
assets/css/kaluli_icon.png


BIN
assets/css/min_icon.png


BIN
assets/css/sports_record_icon.png


BIN
assets/css/time_icon.png


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
assets/iconfont/iconfont.css


+ 32 - 0
common/ChainItem.js

@@ -0,0 +1,32 @@
+// 定义链的某一项
+function ChainItem(fn) {
+    this.fn = fn;
+    this.next = null;
+}
+
+ChainItem.prototype = {
+    constructor: ChainItem,
+    
+    // 设置下一项
+    setNext: function(next) {
+        this.next = next;
+        return next;
+    },
+    
+    // 开始执行
+    start: function() {
+        return this.fn.apply(this, arguments);
+    },
+    
+    // 转到链的下一项执行
+    toNext: function() {
+        if (this.next) {
+           return this.start.apply(this.next, arguments);
+        } else {
+			return Promise.reject("无匹配的执行项目");
+            // console.log('无匹配的执行项目');
+        }
+    }
+};
+
+export default ChainItem;

+ 11 - 0
common/config.js

@@ -0,0 +1,11 @@
+/**
+ * 本项目只有这里修改相应配置信息
+ */
+
+const config1={
+	"navTitleStyle":"font-weight:620;font-family: PingFang SC;"
+	
+};
+export default{
+	config1:config1
+}

+ 26 - 0
common/css/flexCommon.css

@@ -0,0 +1,26 @@
+/* flex布局 */
+.u-f,
+.u-f-ac,
+.u-f-ajc {
+	display: flex;
+}
+
+.u-f-ac,
+.u-f-ajc {
+	align-items: center;
+}
+
+.u-f-ajc {
+	justify-content: center;
+}
+
+.u-f-jsb {
+	justify-content: space-between;
+}
+
+.u-f-fc {
+	flex-direction: column;
+}
+.u-f-ww{
+	flex-wrap: wrap;
+}

+ 97 - 0
common/request.js

@@ -0,0 +1,97 @@
+// uni-app请求封装
+export default class Request {
+	http(router, data = {}, method,contentType) {
+		let that = this;
+	    //let path ='http://192.168.110.11:8007';//app
+		let path='https://devapi.ylrzfs.com/prod-api';
+		let token = uni.getStorageSync('AppToken');
+		
+		// // #ifdef H5
+		// 	path ='http://app.fbylive.com';//h5接口
+		// // #endif
+		
+		// // 看课模块
+		// if(router.indexOf("/app/course/getRealLink") != -1 ) {
+		// 	path ='http://app.fbylive.com';
+		// }
+		// // 腕表模块
+		// if(router.indexOf("/watch-api") != -1 ) {
+		// 	router = router.replace('/watch-api','')
+		// 	// path = 'http://42.194.245.189:8114'
+		// }
+		// // doctorAi模块
+		// if(router.indexOf("/doctorAi") != -1 ) {
+		// 	router = router.replace('/doctorAi','')
+		// 	// path = 'http://doctor.ai.cdwjyyh.com'
+		// }
+		// // 手动发课
+		// if(router.indexOf("/companyapp") != -1 ) {
+		// 	token= uni.getStorageSync('ManageToken');
+		// }
+		uni.setStorageSync('requestPath',path);
+		// uni.showLoading({
+		// 	  title: '加载中'
+		// });
+		return new Promise((resolve, reject) => {
+			let CompanyUserToken = uni.getStorageSync('CompanyUserToken');
+			var httpContentType='application/x-www-form-urlencoded';
+			if(contentType!=undefined){
+				httpContentType=contentType;
+			}
+			var routers=router;
+			//console.log("---qxj request url",`${path}${router}`+" params:"+JSON.stringify(data)+" \n AppToken:"+token);
+			// 请求
+			uni.request({
+				header: {
+					// 'Content-Type': 'application/x-www-form-urlencoded',
+					'Content-Type': httpContentType,
+					'AppToken': token,
+					'CompanyUserToken':CompanyUserToken //业务员token
+				},
+				url: `${path}${router}`,
+				data: data,
+				method: method,
+				success: (res) => {
+					//收到开发者服务器成功返回的回调函数
+					if(res.data.code==401){ //没有权限直接退出到登录界面
+						let pages = getCurrentPages();
+						let url = pages[ pages.length - 1]; //当前页页面实例
+						//如果登录界面已打开,自动关闭
+						if(url!=undefined&&url.route=="pages/auth/login"){
+							resolve(res.data)
+							return;
+						}
+					}
+					if(res.token) {
+						uni.setStorageSync('AppToken',res.token)
+					}
+					resolve(res.data)
+				},
+				fail:(res) =>{
+					if (res.errMsg=='request:fail') {
+					       uni.showToast({
+					                 title: '服务器错误,请稍后重试',
+					                 icon: 'none'
+					               });
+							}
+					//接口调用失败的回调函数
+				},
+				complete:(res) =>{
+					// console.log("complete=======",path,router,res.data)
+					//接口调用结束的回调函数(调用成功、失败都会执行)
+					if (res.data&&res.data.code == 401) {
+						uni.$emit('loginOut');
+						this.$logout();
+						return false
+					}
+					uni.hideLoading();
+				}
+				
+			});
+	
+	
+		})
+		 
+	}
+	
+}

+ 54 - 0
common/util.js

@@ -0,0 +1,54 @@
+function friendlyDate(timestamp) {
+	var formats = {
+		'year': '%n% 年前',
+		'month': '%n% 月前',
+		'day': '%n% 天前',
+		'hour': '%n% 小时前',
+		'minute': '%n% 分钟前',
+		'second': '%n% 秒前',
+	};
+
+	var now = Date.now();
+	var seconds = Math.floor((now - timestamp) / 1000);
+	var minutes = Math.floor(seconds / 60);
+	var hours = Math.floor(minutes / 60);
+	var days = Math.floor(hours / 24);
+	var months = Math.floor(days / 30);
+	var years = Math.floor(months / 12);
+
+	var diffType = '';
+	var diffValue = 0;
+	if (years > 0) {
+		diffType = 'year';
+		diffValue = years;
+	} else {
+		if (months > 0) {
+			diffType = 'month';
+			diffValue = months;
+		} else {
+			if (days > 0) {
+				diffType = 'day';
+				diffValue = days;
+			} else {
+				if (hours > 0) {
+					diffType = 'hour';
+					diffValue = hours;
+				} else {
+					if (minutes > 0) {
+						diffType = 'minute';
+						diffValue = minutes;
+					} else {
+						diffType = 'second';
+						diffValue = seconds === 0 ? (seconds = 1) : seconds;
+					}
+				}
+			}
+		}
+	}
+	return formats[diffType].replace('%n%', diffValue);
+}
+
+
+export {
+	friendlyDate
+}

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

@@ -0,0 +1,106 @@
+
+<!-- 公共布局组件 -->
+<template>
+	<view class="custom-camera">
+		<view class="camera-wrap" :style="{height:cameraHeight+'px'}">
+			<slot></slot>
+		</view>
+		<view class="camera-footer" id="camera-footer">
+			<view class="usenum">当前可免费试用<text style="color: #F54D04;margin: 0 6rpx;">{{usenum || 0}}</text>次</view>
+			<view class="camera-options">
+				<view class="camera-options-left camera-item">
+					<image src="@/static/images/album_icon.png" mode="scaleToFill" style="width: 65rpx;height:60rpx;" @click="handleClikFn('album')"></image>
+					<text>相册上传</text>
+				</view>
+				<view class="camera-options-center camera-item" @click="handleClikFn('shutter')">
+					<view class="photograph-btn"></view>
+				</view>
+				<view class="camera-options-ritht camera-item">
+					<image src="/static/images/tongue_diagnosis_record_icon.png" mode="scaleToFill" style="width: 67rpx;height:60rpx;" @click="handleClikFn('reportlist')"></image>
+					<text>舌诊记录</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	// 提供一个相机的插槽位置
+	// 底部可以自定义最右侧按钮(相册/反转)
+	export default {
+		data() {
+			return {
+				cameraHeight: '', //相机画面宽度
+				optionsHeight: '', //操作区域
+				usenum: 2
+			}
+		},
+		methods: {
+			handleClikFn(instruct) {
+				this.$emit('instruct', instruct)
+			}
+		},
+		mounted() {
+			const query = uni.createSelectorQuery().in(this);
+			query
+			  .select("#camera-footer")
+			  .boundingClientRect((data) => {
+				this.cameraHeight = uni.getSystemInfoSync().screenHeight - data.height
+			  })
+			  .exec();
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.custom-camera {
+		height: 100vh;
+		background-color: #000;
+		
+		.usenum {
+			font-family: SourceHanSansCN;
+			font-weight: 400;
+			font-size: 19rpx;
+			color: #FFFFFF;
+			padding: 14rpx;
+			text-align: center;
+		}
+		.camera-options {
+			width: 100%;
+			padding-top: 13rpx;
+			padding-bottom: 60rpx;
+			box-sizing: border-box;
+			font-family: SourceHanSansCN;
+			font-weight: 400;
+			font-size: 27rpx;
+			color: #FFFFFF;
+			display: flex;
+			align-items: center;
+			justify-content: space-evenly;
+			.camera-item {
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				image {
+					margin-bottom: 21rpx;
+				}
+			}
+			.camera-options-center {
+				width: 131rpx;
+				height: 131rpx;
+				border-radius: 50%;
+				border: 3px solid #FFFFFF;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.photograph-btn {
+				width: 109rpx;
+				height: 109rpx;
+				background: #F54D04;
+				border-radius: 50%;
+			}
+		}
+	}
+</style>
+

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

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

+ 50 - 0
components/Loading.vue

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

+ 162 - 0
components/Menu.vue

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

+ 0 - 0
components/lx-calendar/lx-calendar.md


+ 632 - 0
components/lx-calendar/lx-calendar.vue

@@ -0,0 +1,632 @@
+
+<template>
+	<view class="date">
+		<view class="head">
+			<!-- <view class="icon" @click="switch_month_week('prev',true)"><text class="iconfont icon-fanhui" /></view> -->
+			<view class="title">{{nowYear+'年'+nowMonth+'月'}}</view>
+			<!-- <view class="icon" @click="switch_month_week('next',true)"><text class="iconfont next icon-fanhui" /></view> -->
+		</view>
+		<view class="date_dl" >
+			<view class="dd" v-for="(item,index) in week" :key="index">{{item}}</view>
+		</view>
+		<!-- <swiper :style="{height:(retract ? 2 * 80 : (week_list.length + 1) * 80 ) + 'rpx'}" :current="current" circular @change="change_date"> -->
+		<swiper :style="{height:'480rpx'}" :current="current" circular @change="change_date">
+			<swiper-item>
+				<view class="date_dl" v-show="!retract || index == to_prev_week_index" v-for="(item,index) in   week_list_prev_co" :key="index">
+					<view class="dd" @click="item_click(vo,index,key)" v-for="(vo,key) in item" :key="key">
+						<view class="num" :class="[vo.today ? 'today' : '',vo.type == 'month' ? 'month' : (retract ? '' : 'disabled')]">{{vo.day}}</view>
+						<view v-show="vo.dot && (vo.type == 'month' || retract)" class="dot"></view>
+					</view>
+				</view>
+				<!-- <view @click="open" class="retract icon"><text class="iconfont next icon-fanhui" :class="[retract ? '' : 'retract_icon']" /></view> -->
+			</swiper-item>
+			<swiper-item>
+				
+				<view class="date_dl" v-show="!retract || index == to_week_index" v-for="(item,index) in week_list" :key="index">
+					<view class="dd" @click="item_click(vo,index,key)" v-for="(vo,key) in item" :key="key">
+						<view class="num" :class="[vo.today ? 'today' : '',vo.type == 'month' ? 'month' : (retract ? '' : 'disabled')]">{{vo.day}}</view>
+						<view v-show="vo.dot && (vo.type == 'month' || retract)" class="dot"></view>
+					</view>
+				</view>
+				<!-- <view @click="open" class="retract icon"><text class="iconfont next icon-fanhui" :class="[retract ? '' : 'retract_icon']" /></view> -->
+			</swiper-item>
+			<swiper-item>
+				
+				<view class="date_dl" v-show="!retract || index == to_next_week_index" v-for="(item,index) in  week_list_next_co" :key="index">
+					<view class="dd" @click="item_click(vo,index,key)" v-for="(vo,key) in item" :key="key">
+						<view class="num" :class="[vo.today ? 'today' : '',vo.type == 'month' ? 'month' : (retract ? '' : 'disabled')]">{{vo.day}}</view>
+						<view v-show="vo.dot && (vo.type == 'month' || retract)" class="dot"></view>
+					</view>
+				</view>
+				<!-- <view @click="open" class="retract icon"><text class="iconfont next icon-fanhui" :class="[retract ? '' : 'retract_icon']" /></view> -->
+			</swiper-item>
+		</swiper>
+	</view>
+</template>
+
+<script>
+export default {
+	props:{
+		value:{
+			type:[String,Number],
+			default:''
+		},
+		dot_lists:{
+			type:Array,
+			default:()=>{
+				return [];
+			}
+		}
+	},
+	data(){
+		return {
+			debug:false,
+			week:['日','一','二','三','四','五','六'],
+			week_list:[],
+			week_list_prev:[],
+			week_list_prev_week:[],
+			week_list_next:[],
+			week_list_next_week:[],
+			now_date:'',
+			start_date:'',
+			end_date:'',
+			prev_date:'',
+			next_date:'',
+			nowYear:'',
+			nowMonth:'',
+			nowDay:'',
+			retract: true,
+			to_week_index:0,
+			to_prev_week_index:0,
+			to_next_week_index:0,
+			nowTime:0,
+			dot_list:[],
+			current: 1,
+			date:'',
+		}
+	},
+	watch:{
+		value(value){
+			this.get_date(this.date_parse(value));
+		},
+		
+		dot_lists:{
+			immediate:true,
+			handler(value){
+				this.dot_list = value;
+				this.set_doc_lists_update()
+			}
+		}
+	},
+	computed:{
+		week_list_prev_co(){
+			return this.retract ?  this.week_list_prev_week : this.week_list_prev
+		},
+		week_list_next_co(){
+			return this.retract ?  this.week_list_next_week : this.week_list_next
+		}
+	},
+	created(){
+		this.init();
+	},
+	methods:{
+		change(){
+			let value = {
+				fulldate:this.date.replace(/-(\d)(?!\d)/g, '-0$1')
+			};
+			this.$emit('change',value)
+		},
+		init(){
+			if(this.value){
+				this.get_date(this.date_parse(this.value));
+			}else{
+				this.get_date();
+			}
+			
+			this.doc_list_update();
+			this.update_month();
+			
+		},
+		open(){
+			this.retract = !this.retract;
+			this.get_date(this.nowTime);
+			this.set_to_day('week_list_prev')
+			this.set_to_day('week_list_next')
+			
+			this.change_week();
+			
+			if(this.retract){
+				this.update_swiper_item('week')
+			}else{
+				this.update_swiper_item('month')
+			}
+			this.set_doc_lists_update();
+		},
+		change_week(){
+			
+			if(this.to_week_index < this.week_list.length - 1){
+				this.to_next_week_index = this.to_week_index + 1;
+				this.week_list_next_week = this.week_list;
+			}else{
+				this.to_next_week_index = 0;
+				this.week_list_next_week = this.week_list_next;
+			}
+			
+			if(this.to_week_index == 0 ){
+				
+				this.update_month();
+				
+				// if(){
+				let next_day = this.week_list_prev[this.week_list_prev.length - 1][6].day;
+				
+				// }
+				this.to_prev_week_index = this.week_list_prev.length - 1 - Math.ceil(next_day / 7);
+				
+				this.week_list_prev_week = JSON.parse(JSON.stringify(this.week_list_prev));
+				
+				
+				
+				
+				
+			}else{
+				this.to_prev_week_index = this.to_week_index - 1;
+				this.week_list_prev_week = this.week_list;
+			}
+			
+			// if(this.current == 1){
+
+			// }
+			// let to_week_index = this.to_week_index;
+			// if(this.current == 2){
+			// 	this.to_next_week_index = this.to_week_index;
+			// 	this.to_week_index = this.to_week_index - 1;
+			// 	this.to_prev_week_index =  this.to_next_week_index + 1;
+			// }else if(this.current == 0){
+			// 	this.to_next_week_index = this.to_week_index;
+			// 	this.to_week_index = this.to_week_index - 1;
+			// 	this.to_prev_week_index =  this.to_next_week_index + 1;
+			// }
+			
+			
+			
+			
+			
+			
+		},
+		change_date_week(type){
+			let week_list = this.week_list;
+			let to_week_index = this.to_week_index;
+			if(type == 'prev'){
+				this.to_week_index = this.to_prev_week_index;
+				this.to_prev_week_index = this.to_next_week_index
+				this.to_next_week_index = to_week_index;
+				
+				this.week_list = this.week_list_prev_week
+				this.week_list_prev_week = this.week_list_next_week;
+				this.week_list_next_week = week_list;
+				
+				
+
+			}else if(type == 'next'){
+				this.to_week_index = this.to_next_week_index;
+				this.to_next_week_index = this.to_prev_week_index
+				this.to_prev_week_index = to_week_index;
+				
+				this.week_list = this.week_list_next_week
+				this.week_list_next_week = this.week_list_prev_week;
+				this.week_list_prev_week = week_list;
+				
+				
+			}
+			
+			this.set_to_day_all();
+		},
+		change_date_month(type){
+			let week_list = this.week_list;
+			if(type == 'prev'){
+				this.week_list = this.week_list_prev
+				this.week_list_prev = this.week_list_next;
+				this.week_list_next = week_list;
+			}else if(type == 'next'){
+				this.week_list = this.week_list_next
+				this.week_list_next = this.week_list_prev;
+				this.week_list_prev = week_list;
+			}
+		},
+		change_date(e){
+			
+			let primary_current = this.current
+			let current = e.detail.current;
+			
+			this.current = current;
+
+			if(primary_current - current == -1 || primary_current - current == 2){
+				
+				if(this.retract){
+					this.switch_month_week('next')
+					this.change_week()
+					if(primary_current - current == -1 && current != 1){
+						this.change_date_week('prev')
+					}else if(primary_current - current == 2){
+						this.change_date_week('next')
+					}
+				}else{
+					this.get_date(this.get_month('next'));
+					this.update_month();
+					if(primary_current - current == -1 && current != 1){
+						this.change_date_month('prev')
+					}else if(primary_current - current == 2){
+						this.change_date_month('next')
+					}
+				}
+			}else{
+				if(this.retract){
+					this.switch_month_week('prev')
+					this.change_week()
+					if(primary_current - current == 1 && current != 1){
+						this.change_date_week('next')
+					}else if(primary_current - current == -2){
+						this.change_date_week('prev')
+					}
+					
+					
+				}else{
+					this.get_date(this.get_month('prev'));
+					this.update_month();
+					if(primary_current - current == 1 && current != 1){
+						this.change_date_month('next')
+					}else if(primary_current - current == -2){
+						this.change_date_month('prev')
+					}
+				}
+			}
+
+			this.set_to_day_all();
+			this.set_doc_lists_update();
+			this.change()
+		},
+		update_month(){
+			this.get_date(this.get_month('prev'),'prev');
+			this.get_date(this.get_month('next'),'next');
+		},
+		set_doc_lists_update(){
+			this.doc_list_update('week_list');
+			this.doc_list_update('week_list_prev');
+			this.doc_list_update('week_list_next');
+			this.doc_list_update('week_list_prev_week')
+			this.doc_list_update('week_list_next_week')
+		},
+		doc_list_update(week_list = 'week_list'){
+			let list = [];
+			
+			this[week_list].map((item,index)=>{
+				list.push(item.map((vo,key)=>{
+					if(this.dot_list.indexOf(vo.date) > -1 || this.dot_list.indexOf(vo.date.replace(/-(\d)(?!\d)/g, '-0$1')) > -1 ){
+						vo.dot = true;
+						
+					}else{
+						vo.dot = false;
+					}
+					return {...vo}
+				}))
+			})
+			this[week_list] = list;
+		},
+		set_to_day(type){
+			let list = [];
+			
+			this[type].map((item,index)=>{
+				list.push(item.map((vo,key)=>{
+					if(vo.date == `${this.date}`){
+						vo.today = true;
+					}else{
+						vo.today = false;
+					}
+					return {...vo};
+				}))
+			})
+			this[type] = list;
+		},
+		item_click(item,item_index = -1){
+			if(!this.retract && item.type !== 'month'){
+				return false;
+			}
+			this.date = item.date;;
+			if(item.type == 'month'){
+				this.nowDay = item.day;
+				if(item_index >= 0) this.to_week_index = item_index;
+				
+			}else if(this.retract){
+				this.nowDay = item.day;
+			}
+			
+			let now_arr = item.date.split('-')
+			this.nowYear = now_arr[0];
+			this.nowMonth = now_arr[1];
+			this.nowDay = now_arr[2];
+			
+			
+			this.set_to_day_all(item_index);
+			
+			this.nowTime = this.date_parse(`${item.date}`);
+			
+			this.change()
+			this.set_doc_lists_update();
+			
+		},
+		set_to_day_all(item_index){
+			this.set_to_day('week_list')
+			this.set_to_day('week_list_prev')
+			this.set_to_day('week_list_next')
+			this.set_to_day('week_list_prev_week')
+			this.set_to_day('week_list_next_week')
+			
+		},
+		get_month(type){
+			let nowMonth = this.nowMonth;
+			let nowYear = Number(this.nowYear);
+			let nowDay = this.nowDay;
+			
+			if(type == 'prev'){
+				if(nowMonth == 1){
+					nowMonth = 12;
+					nowYear = nowYear - 1;
+				}else{
+					nowMonth--;
+				}
+			}else if(type == 'next'){
+				if(nowMonth == 12){
+					nowMonth = 1;
+					nowYear = nowYear + 1;
+				}else{
+					nowMonth++;
+				}
+			}
+			
+			let days = this.get_month_days(nowMonth,nowYear);
+			if(nowDay > days){
+				nowDay = days;
+			}
+
+			return this.date_parse(`${nowYear}-${nowMonth}-${nowDay}`);
+		},
+		
+		date_parse(str){
+			return Date.parse(str.replace(/-(\d)(?!\d)/g, '-0$1'));
+		},
+		switch_month_week(type = 'next',update_week = false){
+			if(this.retract){
+				if(type == 'prev'){
+					this.get_date(this.nowTime - 86400 * 7 * 1000);
+				}else if(type == 'next'){
+					this.get_date(this.nowTime + 86401 * 7 * 1000);
+				}
+				if(update_week){
+					this.update_swiper_item('week');
+					this.set_doc_lists_update();
+				}
+			}else{
+				this.get_date(this.get_month(type))
+				this.update_swiper_item('month');
+			}
+			this.set_doc_lists_update();
+			
+			this.set_to_day_all();
+			
+			if(update_week){
+				this.change()
+			}
+			
+		},
+		update_swiper_item(type = 'month'){
+			if(type == 'month'){
+				if(this.current == 0){
+					this.change_date_month('next')
+				}else if(this.current == 2){
+					this.change_date_month('prev')
+				}
+			}else if(type == 'week'){
+
+				if(this.current == 0){
+					this.change_date_week('next')
+				}else if(this.current == 2){
+					this.change_date_week('prev')
+				}
+			}
+		},
+		next(){
+			this.get_date(this.next_date)
+		},
+		get_date(value = '',type = 'same'){
+			let date = new Date();
+			if(value){
+				date = new Date(value);
+			}
+			let nowMonth = date.getMonth() + 1,
+				nowYear = date.getFullYear(),
+				nowDay = date.getDate(),
+				nowTime = date.getTime(),
+				nowWeek = date.getDay();
+
+			
+			let days = this.get_month_days(nowMonth,nowYear);
+			let start_date = new Date(nowYear,nowMonth - 1, 1);
+			let end_date = new Date(nowYear,nowMonth - 1, days);
+			let prev_date = new Date(start_date.getTime() - 1);
+			let prev_date_days = prev_date.getDate();
+			let next_date = new Date(end_date.getTime() + 86401 * 1000);
+			let next_date_days = next_date.getDate();
+			let start_week = start_date.getDay();
+			let date_arrs = [];
+			
+			let week_list = [];
+			let count_days = 35;
+			
+			for(let i = prev_date_days - start_week + 1; i <= prev_date_days; i++){
+				date_arrs.push({
+					day:i,
+					type:'prev',
+					date:`${prev_date.getFullYear()}-${prev_date.getMonth()+1}-${i}`
+				})
+			}
+			
+			for(let i = 1; i <= days; i++){
+				date_arrs.push({
+					day:i,
+					type:'month',
+					today:i == nowDay ? true : false,
+					date:`${nowYear}-${nowMonth}-${i}`
+				})
+				
+				if(i == nowDay && type == 'same'){
+					this.date = `${nowYear}-${nowMonth}-${i}`;
+				}
+				
+			}
+			if(this.debug) console.log(value,date,this.date,`${next_date.getFullYear()}-${next_date.getMonth()+1}-${next_date.getDate()}`)
+			let date_arrs_length = date_arrs.length;
+			
+			// if(date_arrs_length > 35){
+				count_days = 42;
+			// }
+			for(let i = 1; i <= count_days - date_arrs_length; i++){
+				date_arrs.push({
+					day:i,
+					type:'next',
+					date:`${next_date.getFullYear()}-${next_date.getMonth()+1}-${i}`
+				})
+			}
+			
+			for(let i = 0; i < date_arrs.length / 7; i++){
+				let arr = [];
+				for(let j = 0; j < 7; j++){
+					
+					if(date_arrs[i * 7 + j].today){
+						if(type == 'same'){
+							this.to_week_index = i
+						}
+					}
+					arr.push(date_arrs[i * 7 + j]);
+				}
+				week_list.push(arr);
+			}
+			
+			if(type == 'same'){
+				this.week_list = week_list;
+				this.nowYear = nowYear;
+				this.nowMonth = nowMonth;
+				this.nowDay = nowDay;
+				this.nowTime = nowTime;
+				this.start_date = start_date;
+				this.end_date = end_date;
+				this.prev_date = prev_date;
+				this.next_date = next_date;
+				
+				
+			}else if(type == 'prev'){
+				this.week_list_prev = week_list;
+			}else if(type == 'next'){
+				this.week_list_next = week_list;
+			}
+			
+		},
+		get_month_days(nowMonth,nowYear){
+			let month_arr = [1,3,5,7,8,10,12];
+			let days = 0;
+			if(nowMonth == 2){
+				if(nowYear % 4 == 0){
+					days = 29;
+				}else{
+					days = 28;
+				}
+			}else if(month_arr.indexOf(nowMonth) >= 0){
+				days = 31;
+			}else{
+				days = 30;
+			}
+			return days;
+		}
+	}
+}
+</script>
+
+<style lang="less">
+@import (less) '../../static/lx-calendar/fonts/iconfont.css';
+
+@color: #FFFFFF;
+@color_disabled: #C3F0E7;
+@color_standard: #fff;
+@color_border: #f5f5f5;
+.date{
+	width: 750rpx;
+}
+.head{
+	display: flex; 
+	align-items: center; 
+	height: 80rpx; 
+	// justify-content: center;
+	// border-bottom: 1rpx solid @color_border; 
+	color:@color_standard;
+	padding-left: 40upx;
+	.title{
+		width: 200rpx;
+		font-size: 30rpx; 
+		text-align: left;
+	}
+	.icon{
+		display: block;
+		.next{
+			transform: rotate(180deg); display: block;
+		}
+	}
+}
+.retract{
+	display: flex; justify-content: center; align-items: center; height: 80rpx;;
+	.iconfont{
+		transform: rotate(270deg);
+		&.retract_icon{
+			transform: rotate(90deg);
+		}
+	}
+}
+.date_dl{
+	display: flex; width: 100%;
+	.dd{
+		flex:1; text-align: center;
+		height: 80rpx;
+		font-size: 26rpx;
+		color: #CFF8F0;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		position: relative;
+		.num{
+			width: 60rpx;
+			height: 60rpx; 
+			border-radius: 12upx; 
+			line-height: 60rpx; 
+			&.disabled{
+				color: @color_disabled;
+			}
+			&.month{
+				color: @color_standard;
+			}
+			&.today{
+				background: @color; 
+				color: #FF5C03;
+			}
+		}
+		.dot{
+			width: 8rpx; 
+			height: 8rpx; 
+			border-radius: 50%; 
+			background: @color;
+			position: absolute; 
+			bottom: 0; 
+			left: 50%; 
+			transform: translateX(-50%);
+		}
+	}
+}
+</style>

+ 188 - 0
components/nodata.nvue

@@ -0,0 +1,188 @@
+<template>
+	<view class="nodata">
+		<view class="nodata-content">
+			<view class="text-view a-i-c j-c-c t-a-c">
+				<text class="title">{{textTypes[networkType]}}</text>
+			</view>
+			<view class="icon-view"></view>
+			<view class="opera-view">
+				<view class="btn btn-default" v-if="networkType!='none'" @click="retry">
+					<text class="btn-text">重试</text>
+				</view>
+				<view class="btn btn-default" v-if="networkType=='none'" @click="openSettings">
+					<text class="btn-text">设置</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'nodata',
+		data() {
+			return {
+				textTypes: {
+					none: "暂无网络"
+				},
+				isConnected: false,
+				networkType: "none"
+			}
+		},
+		mounted() {
+			this.isIOS = (uni.getSystemInfoSync().platform === 'ios');
+			uni.onNetworkStatusChange((res) => {
+				this.isConnected = res.isConnected;
+				this.networkType = res.networkType;
+			});
+			uni.getNetworkType({
+				success: (res) => {
+					this.networkType = res.networkType;
+				}
+			});
+		},
+		methods: {
+			retry() {
+				this.$emit('retry');
+			},
+			async openSettings() {
+				if (this.networkType == "none") {
+					this.openSystemSettings();
+					return;
+				}
+			},
+			openAppSettings() {
+				this.gotoAppSetting();
+			},
+			openSystemSettings() {
+				if (this.isIOS) {
+					this.gotoiOSSetting();
+				} else {
+					this.gotoAndroidSetting();
+				}
+			},
+			network() {
+				var result = null;
+				var cellularData = plus.ios.newObject("CTCellularData");
+				var state = cellularData.plusGetAttribute("restrictedState");
+				if (state == 0) {
+					result = null;
+					console.log("StateUnknown");
+				} else if (state == 2) {
+					result = 1;
+					console.log("已经开启了互联网权限:NotRestricted");
+				} else if (state == 1) {
+					result = 2;
+					console.log("Restricted");
+				}
+				plus.ios.deleteObject(cellularData);
+				return result;
+			},
+			gotoAppSetting() {
+				if (this.isIOS) {
+					var UIApplication = plus.ios.import("UIApplication");
+					var application2 = UIApplication.sharedApplication();
+					var NSURL2 = plus.ios.import("NSURL");
+					var setting2 = NSURL2.URLWithString("app-settings:");
+					application2.openURL(setting2);
+					plus.ios.deleteObject(setting2);
+					plus.ios.deleteObject(NSURL2);
+					plus.ios.deleteObject(application2);
+				} else {
+					var Intent = plus.android.importClass("android.content.Intent");
+					var Settings = plus.android.importClass("android.provider.Settings");
+					var Uri = plus.android.importClass("android.net.Uri");
+					var mainActivity = plus.android.runtimeMainActivity();
+					var intent = new Intent();
+					intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+					var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+					intent.setData(uri);
+					mainActivity.startActivity(intent);
+				}
+			},
+			gotoiOSSetting() {
+				var UIApplication = plus.ios.import("UIApplication");
+				var application2 = UIApplication.sharedApplication();
+				var NSURL2 = plus.ios.import("NSURL");
+				var setting2 = NSURL2.URLWithString("App-prefs:root=General");
+				application2.openURL(setting2);
+				plus.ios.deleteObject(setting2);
+				plus.ios.deleteObject(NSURL2);
+				plus.ios.deleteObject(application2);
+			},
+			gotoAndroidSetting() {
+				var Intent = plus.android.importClass("android.content.Intent");
+				var Settings = plus.android.importClass("android.provider.Settings");
+				var mainActivity = plus.android.runtimeMainActivity();
+				var intent = new Intent(Settings.ACTION_SETTINGS);
+				mainActivity.startActivity(intent);
+			}
+		}
+	}
+</script>
+
+<style>
+	.a-i-c {
+		align-items: center;
+	}
+
+	.j-c-c {
+		justify-content: center;
+	}
+
+	.t-a-c {
+		text-align: center;
+	}
+
+	.nodata {
+		flex: 1;
+		flex-direction: column;
+		/* #ifndef APP-PLUS */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		justify-content: center;
+		padding: 30px;
+		background-color: #f8f8f8;
+	}
+
+	.nodata-content {
+		transform: translateY(-50px);
+	}
+
+	.text-view {
+		margin-bottom: 40px;
+	}
+
+	.title {
+		color: #999999;
+		font-size: 18px;
+	}
+
+	.opera-view {
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.btn {
+		padding: 5px 10px;
+		width: 128px;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		text-align: center;
+	}
+
+	.btn-text {
+		color: #999999;
+		font-size: 15px;
+	}
+
+	.btn-default {
+		border-color: #999999;
+		border-style: solid;
+		border-width: 1px;
+		border-radius: 3px;
+	}
+</style>

+ 356 - 0
components/popupBottom/popupBottom.vue

@@ -0,0 +1,356 @@
+<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="{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" :style="{height:`${PopHeight}px`}">
+						
+		    			 <mescroll-item v-if="type==0" ref="mescrollItem" :videoId="cmdId"></mescroll-item>
+						 
+						 <course-comment-item v-if="type==1" ref="mescrollItem" :courseId="cmdId"></course-comment-item>
+						 
+		    		</view>
+		    	</scroll-view>
+		    </view>
+		
+		</view>
+	</view>
+	
+<!-- 	<view :style="{'z-index':zindex,height:`${PopHeight}px`}" style="position: absolute;left: 0;right: 0;bottom: 0;">
+        <mescroll-item ref="mescrollItem" :videoId="videoId"></mescroll-item>
+	</view> -->
+	
+</template>
+
+<script>
+	import iconClose from '@/static/images/close40.png'
+	import MescrollItem from "@/pages/course/video/comment.vue"
+	import CourseCommentItem from "@/pages/course/comment.vue"
+	// 第二步: 引入mescroll-comp.js
+	import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js";
+	
+	export default {
+		mixins: [MescrollCompMixin],
+		components: {
+			MescrollItem,
+			CourseCommentItem
+		},
+		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
+			},
+			zindex: {
+				type: [String, Number],
+				default: 1000
+			},
+			maskZindex: {
+				type: [String, Number],
+				default: 999
+			},
+			always: { //是否每次打开都重新计算内容高度
+				type: Boolean,
+				default: false
+			},
+	
+			cmdId: { //
+				type: [String, Number],
+				default:0
+			},
+			smsNum: { //
+				type: [String, Number],
+				default:0
+			},
+			type: { //
+				type: [String, Number],
+				default:0
+			}
+
+		},
+		
+		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
+				if(newval){
+					this.$refs.mescrollItem.showBotBar(this.smsNum);
+				}
+				
+
+			},
+			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');
+				this.$refs.mescrollItem.hideBotBar();
+			},
+			// //触底
+			onScrollToLower(e) {
+				console.log("qxj onScrollToLower");
+				// this.$emit("reachBottom");
+				uni.$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() {
+				
+				const systemInfo = uni.getSystemInfoSync();
+				let viewHeight=systemInfo.screenHeight;
+				
+				this.height =viewHeight*0.7;
+				console.log("qxj viewHeight:"+this.height);
+				
+				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: white;
+			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: 15rpx 70rpx 0;
+				padding-top: 30rpx;
+				box-sizing: border-box;
+				height: 80rpx;
+				.title {
+					font-size: 26rpx;
+					font-family: PingFang SC;
+					font-weight: normal !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: 30rpx;
+		padding-top: 0;
+		box-sizing: border-box;
+
+		&::after {
+			display: block;
+			width: 100%;
+			content: "\00A0";
+			overflow: hidden;
+			opacity: 0;
+			height: 1rpx;
+		}
+
+	}
+</style>

+ 454 - 0
components/pushangyuqi-calendar/pushangyuqi-calendar.vue

@@ -0,0 +1,454 @@
+<template>
+	<view class="calendar">
+		<view class="table">
+			<view class="chose-head">
+				<view class="chose-item">
+					<view class="btn" @click="yearsub">
+						<image src="../../static/images/arrow_left12.png" mode=""></image>
+					</view>
+					<view class="year-td">
+						<picker mode="selector" :range="years" @change="yearchange" :value="y">
+							<view class="text">{{years[y]}}年</view>
+						</picker>
+					</view>
+					<view class="btn" @click="yearadd">
+						<image src="../../static/images/arrow_right12.png" mode=""></image>
+					</view>
+				</view>
+				
+				<view class="chose-item">
+					<view class="btn" @click="monthsub">
+						<image src="../../static/images/arrow_left12.png" mode=""></image>
+					</view>
+					<view class="month-td">
+						<picker mode="selector" :range="months" @change="monthchange" :value="m">
+							<view class="text">{{months[m]}}月</view>
+						</picker>
+					</view>
+					<view class="btn" @click="monthadd">
+						<image src="../../static/images/arrow_right12.png" mode=""></image>
+					</view>
+				</view>
+			</view>
+
+			<view class="week">
+				<view class="item">日</view>
+				<view class="item">一</view>
+				<view class="item">二</view>
+				<view class="item">三</view>
+				<view class="item">四</view>
+				<view class="item">五</view>
+				<view class="item">六</view>
+			</view>
+
+
+			<view class="date-tr" v-for="(i,index) in dates" :key="index">
+				<view v-for="(j,k) in i" :key="k" :style="{color:j[0]}" :class="j[2]=='#FF5C03'?'td active':'td'" @click="itemChose(j,index,k)">{{j[1]}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				year: 2022,
+				month: 12,
+				date: 19,
+				/* 年月是当天的日期,日是这个月日历的第一天,
+				其实就是上个月的最后一个周日,这里是随便定义的,
+				后面在mounted里面根据当前日期赋值 */
+				years: [], //存放1900到2100共200年
+				months: [], //存放1到12月
+				y: 0,
+				m: 0, //picker的迭代器
+				dates: [
+					[],
+					[],
+					[],
+					[],
+					[],
+					[]
+				], //外层括号表示一个月,内层括号表示一周,每个元素是一天
+				activeDateStr: '', // 当前选中的时间
+			}
+		},
+		
+		mounted() {
+			for (let i = 1900; i <= 2100; i++) {
+				this.years.push(i);
+			}
+			for (let i = 1; i <= 12; i++) {
+				this.months.push(i);
+			}
+		
+			//获取当前时间和月份
+			var date = new Date();
+			this.year = date.getFullYear();
+			this.month = date.getMonth() + 1;
+			let dayNum = date.getDate();
+		
+			for (let i = 0; i < 200; i++) {
+				if (this.years[i] == this.year) {
+					this.y = i;
+					break;
+				}
+			}
+			for (let i = 0; i < 12; i++) {
+				if (this.months[i] == this.month) {
+					this.m = i;
+					break;
+				}
+			}
+		
+			//当前月份的天数和上个月的天数
+			var maxdays = this.maxdformat();
+			var maxday = maxdays[0];
+			var premaxday = maxdays[1];
+		
+			//通过当月一号的星期来计算上个月的最后一个星期日时几号
+			date.setDate(1);
+			var weekday = date.getDay();
+			this.date = premaxday - weekday + 1;
+		
+			//编排这个月的日历
+			this.datesformat(maxday, premaxday);
+			
+			let mothnum = this.months[this.m]
+			if(mothnum<10) {
+				mothnum = '0'+mothnum
+			}
+			if(dayNum<10) {
+				dayNum = '0'+dayNum
+			}
+			this.activeDateStr = this.years[this.y] + '-' + mothnum + '-' + dayNum
+		},
+		methods: {
+			//编排日历
+			datesformat(maxday, premaxday) {
+				//获取当前日期,用来突出显示当前日期
+				var date = new Date();
+				var y = date.getFullYear();
+				var m = date.getMonth() + 1;
+				var d = date.getDate();
+
+				var i = 0,
+					j = 0;
+				for (i; i < 3; i++) {
+					for (j = 0; j < 7; j++) {
+						let cache = ['#222222', '', '#fff']; //第一个元素用来定义字体颜色,第二个是日期,第三个元素是背景色,用来突出显示当前日期
+						if (this.date > 21 && this.date <= premaxday) {
+							cache[0] = '#BBBBBB';
+						}
+						/* 上个月的日期显示为灰色,只能判断前半个月,
+						   因为如果到这个月的21号之后的话造成这个月的日期也变为灰色,
+						   选21是因为前3周不可能到21号(1号在周日的话会放在第二周),
+						   并且上个月的最后一个星期日必然是21号之后 */
+						else if (this.year == y && this.month == m && this.date == d) {
+							cache[2] = '#FF5C03'; // 当前日期背景颜色
+							cache[0] = '#fff'; // 当前日期文字颜色
+						}
+						if (this.date <= premaxday) {
+							cache[1] = this.date++;
+						} else {
+							this.date = 1;
+							cache[1] = this.date++; //日期递增,如果超过上个月的最后一天的话重新从1号开始
+						}
+						this.dates[i].push(cache);
+					}
+				}
+				for (i; i < 6; i++) {
+					for (j = 0; j < 7; j++) {
+						let cache = ['#222222', '', "#fff"]
+						if (this.date < 14 || this.date == maxday + 1) {
+							cache[0] = '#BBBBBB'
+						} else if (this.year == y && this.month == m && this.date == d) {
+							cache[2] = '#FF5C03'
+							cache[0] = '#fff'; // 当前日期文字颜色
+						}
+						if (this.date <= maxday) {
+							cache[1] = this.date++;
+						} else {
+							this.date = 1;
+							cache[1] = this.date++;
+						}
+						/* 基本与上半月相似,下个月的日期显示为灰色,
+						   选14是因为第4周的第一天最早是15号(1号在周日并放在第二周的情况),
+						   并且下个月出现最多日期的情况(2月1号是周一)也不会有14天 */
+						this.dates[i].push(cache);
+					}
+				}
+			},
+
+			//计算当月的天数和上个月的天数
+			maxdformat() {
+				var maxday = 30;
+				var premaxday = 30; //都定义为30天,这样小月就不用判断了
+				if (this.month == 2) {
+					if (this.year % 400 == 0 || (this.year % 4 == 0 && this.year % 100 != 0)) { //二月判断平闰年
+						maxday = 29;
+					} else {
+						maxday = 28;
+					}
+				} else if (this.month == 1 || this.month == 3 || this.month == 5 || this.month == 7 ||
+					this.month == 8 || this.month == 10 || this.month == 12) { //给大月赋值
+					maxday = 31;
+				}
+
+				//计算上个月的天数,月份+1直接用上面的
+				if (this.month == 3) {
+					if (this.year % 400 == 0 || (this.year % 4 == 0 && this.year % 100 != 0)) {
+						premaxday = 29;
+					} else {
+						premaxday = 28;
+					}
+				} else if (this.month == 2 || this.month == 4 || this.month == 6 || this.month == 8 ||
+					this.month == 9 || this.month == 11 || this.month == 1) {
+					premaxday = 31;
+				}
+				return [maxday, premaxday];
+			},
+
+			//下一个月
+			monthadd() {
+				//月份加一,十二月下一个月是一月
+				if (this.month == 12) {
+					this.y++;
+					this.year++;
+					this.m = 0;
+					this.month = 1;
+				} else {
+					this.m++;
+					this.month++;
+				}
+
+				var maxdays = this.maxdformat();
+				var maxday = maxdays[0];
+				var premaxday = maxdays[1];
+
+				//这个月的最后一个周日,就是下个月日历的第一天
+				if (this.dates[5][0][1] > 14) {
+					this.date = this.dates[5][0][1];
+				} else {
+					this.date = this.dates[4][0][1];
+				}
+				this.dates = [
+					[],
+					[],
+					[],
+					[],
+					[],
+					[]
+				]; //日历初始化
+				this.datesformat(maxday, premaxday); //编排下个月的日历
+			},
+
+			//上一个月
+			monthsub() {
+				if (this.month == 1) {
+					this.m = 11;
+					this.month = 12;
+					this.y--;
+					this.year--;
+				} else {
+					this.m--;
+					this.month--;
+				}
+				var maxdays = this.maxdformat();
+				var maxday = maxdays[0];
+				var premaxday = maxdays[1];
+
+				//根据上个月的最后一个周日,计算上个月日历的第一天
+				if (this.dates[0][0][1] <= 28) {
+					this.date = premaxday + this.dates[0][0][1] - 28;
+				} else {
+					this.date = premaxday + this.dates[0][0][1] - 35;
+				}
+				this.dates = [
+					[],
+					[],
+					[],
+					[],
+					[],
+					[]
+				];
+
+				this.datesformat(maxday, premaxday)
+			},
+
+			//下一年,就是把下一个月运行12次
+			yearadd() {
+				for (let c = 0; c < 12; c++) {
+					this.monthadd();
+				}
+			},
+
+			//上一年,就是把上一个月运行12次
+			yearsub() {
+				for (let c = 0; c < 12; c++) {
+					this.monthsub();
+				}
+			},
+
+			//picker直接选择年份,计算中间差几年,然后运行几次上一年或下一年
+			yearchange(e) {
+				this.y = e.target.value
+				let d = this.year - this.years[this.y];
+				if (d > 0) {
+					for (let i = 0; i < d; i++) {
+						this.yearsub();
+					}
+				} else {
+					for (let i = 0; i < 0 - d; i++) {
+						this.yearadd();
+					}
+				}
+				this.y += d;
+			},
+
+			//picker直接选择月份
+			monthchange(e) {
+				this.m = e.target.value
+				let d = this.month - this.months[this.m];
+				if (d > 0) {
+					for (let i = 0; i < d; i++) {
+						this.monthsub();
+					}
+				} else {
+					for (let i = 0; i < 0 - d; i++) {
+						this.monthadd();
+					}
+				}
+				this.m += d;
+			},
+			// 日期选择
+			itemChose(day,w,k) {
+				if(day[0] == '#222222'){ // 取消所有选中数据
+					for(let i=0;i<6;i++) {
+						for(let j=0;j<7;j++) {
+							if(this.dates[i][j][0] != '#BBBBBB' && this.dates[i][j][2] == '#FF5C03') {
+								this.dates[i][j][2] = '#fff'
+								this.dates[i][j][0] = '#222222'
+							}
+						}
+					}
+					this.dates[w][k][2] = '#FF5C03'
+					this.dates[w][k][0] = '#fff'
+					let newValue = ['#fff', day[1], "#FF5C03"]
+					this.$set(this.dates[w], k, newValue)
+				}
+				let mothnum = this.months[this.m]
+				if(mothnum<10) {
+					mothnum = '0'+mothnum
+				}
+				let dayNum = day[1]
+				if(dayNum<10) {
+					dayNum = '0'+dayNum
+				}
+				this.activeDateStr = this.years[this.y] + '-' + mothnum + '-' + dayNum
+			}
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+	.calendar{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.chose-head{
+			width: 100%;
+			height: 88upx;
+			border-bottom: 2upx solid #EEEEEE;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 0 97upx 0 67upx;
+			.chose-item{
+				display: flex;
+				align-items: center;
+				.btn{
+					width: 40upx;
+					height: 40upx;
+					background: #F2F4F5;
+					border-radius: 6upx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					image{
+						width: 11upx;
+						height: 18upx;
+					}
+				}
+				.year-td{
+					width: 160upx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					.text{
+						font-size: 30upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #222222;
+					}
+				}
+				.month-td{
+					width: 100upx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					.text{
+						font-size: 30upx;
+						font-family: PingFang SC;
+						font-weight: 500;
+						color: #222222;
+					}
+				}
+			}
+		}
+		.table{
+			width: 100%;
+			.week{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 0 20upx;
+				.item{
+					width: 10%;
+					height: 60upx;
+					line-height: 60upx;
+					margin: 12upx 0;
+					font-size: 26upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #222222;
+					text-align: center;
+				}
+			}
+			.date-tr{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding: 0 20upx;
+				.td{
+					width: 10%;
+					height: 60upx;
+					line-height: 60upx;
+					margin: 12upx 0;
+					font-size: 26upx;
+					text-align: center;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #222222;
+					border-radius: 6upx;
+					&.active{
+						background-color: #FF5C03;
+					}
+				}
+			}
+		}
+	}
+	
+</style>

+ 384 - 0
components/share-box/share-boxN.vue

@@ -0,0 +1,384 @@
+<template>
+	<view class="share-content" :style="{'width':viewWidth+'px'}">
+		<view class="share-inner" style="width: 100%;">
+			
+			<view class="share-item" :style="{'width':viewWidth/viewCount+'px'}" @click="wxShare(0)">
+				<image class="image" src="/static/images/icon_wx.png" mode=""></image>
+				<text class="text">微信</text>
+			</view>
+			<view class="share-item" :style="{'width':viewWidth/viewCount+'px'}" @click="wxShare(1)">
+				<image class="image" src="/static/images/icon_pyq.png" mode=""></image>
+				<text class="text">朋友圈</text>
+			</view>
+			<view class="share-item" :style="{'width':viewWidth/viewCount+'px'}" @click="qwShare()">
+				<image class="image" src="/static/images/icon_qwshare.png" mode=""></image>
+				<text class="text">发给同事</text>
+			</view>
+			
+			<view class="share-item" :style="{'width':viewWidth/viewCount+'px'}" @click="copyUrl()" v-if="operate.indexOf('copyUrl') > -1">
+				<image class="image" src="/static/images/icon_copy_link.png" mode=""></image>
+				<text class="text">复制链接</text>
+			</view>
+			
+			<view class="share-item tsjy" :style="{'width':viewWidth/viewCount+'px'}" @click="goToFeedback()">
+				<image class="image" src="/static/image/my/tsjy.png" mode=""></image>  
+				<text class="text">举报</text>
+			</view>
+			
+		</view>
+		<text class="cancel-btn" @click="closeShare">取消</text>
+	</view>
+
+</template>
+
+<script>
+	// import {shareCourse} from '@/api/course'
+	// import { shareVideo } from '@/api/shortvideo'
+	import { getQwCompanyList } from '@/api/common.js'
+	import { registerQW } from '@/utils/common.js'
+	export default {
+		name: "share-box",
+		props: {
+			shareItem: {
+				type: Object,
+				default: function() {
+					return {
+						imageUrl: "",
+						title: "",
+						url: "",
+						summary: url,
+						courseId: 0,
+						videoId: 0,
+						isMini: false,
+						compressImage: 0, // 是否需要压缩
+						showReport:false,
+					}; // type 0:课程 1视频
+				}
+			},
+			operate: {
+				type: Array,
+				default:['WXSceneSession','WXSceneTimeline','copyUrl']
+			}
+		},
+		data() {
+			return {
+				viewWidth: 0,
+				viewCount:4.0,
+				companyList:[]
+			};
+		},
+		mounted() {
+			const systemInfo = uni.getSystemInfoSync();
+			this.viewWidth = systemInfo.screenWidth;
+			if(this.shareItem.showReport){
+				this.viewCount=5.2;
+			}
+		},
+		methods: {
+			wxShare(type) {
+				if (this.isEmpty(this.shareItem.title)) {
+					uni.showToast({
+						title: "数据未加载",
+						icon: "none",
+						position: 'top',
+						duration: 2000
+					})
+					return;
+				}
+				// #ifdef APP-PLUS
+				if (!plus.runtime.isAgreePrivacy()) {
+					uni.showToast({
+						title: "请同意隐私政策",
+						icon: "none",
+						position: 'top',
+						duration: 2000
+					})
+					return;
+				}
+				// #endif
+				let that = this;
+				let sceneStr = type == 0 ? "WXSceneSession" : "WXSceneTimeline";
+				// 仅支持分享微信小程序到微信聊天界面,想进入朋友圈需改为分享图片方式,在图片中包含小程序码
+				if (sceneStr == 'WXSceneTimeline' || !this.shareItem.isMini) {
+					uni.share({
+						provider: "weixin",
+						scene: sceneStr,
+						type: 0,
+						imageUrl: this.shareItem.imageUrl, //分享封面图片
+						title: this.shareItem.title, // 分享标题
+						href: this.shareItem.url, //跳转链接
+						summary: this.shareItem.summary, // 分享内容文字
+						success: function(res) {
+							that.doShare();
+							uni.showToast({
+								title: "分享成功",
+								icon: 'none'
+							});
+						},
+						fail: function(err) {
+							// 此处是调起微信分享失败的回调
+						},
+						complete: (e) => {
+							console.log("WXSceneTimeline", e)
+						}
+					});
+				} else {
+					if(this.shareItem.compressImage == 1) {
+						uni.downloadFile({
+							url: this.shareItem.imageUrl, //仅为示例,并非真实接口地址。
+							success: (images)=> {
+								uni.compressImage({
+								  src: images.tempFilePath,
+								  quality: 40,
+								  width:  '50%',
+								  height: '50%',
+								  success: res => {
+										this.shareMini(res.tempFilePath,sceneStr)
+								  },
+								  fail: function(err) {
+								  	// 此处是压缩失败
+								  }
+								})
+							}
+						});
+					} else {
+						this.shareMini(this.shareItem.imageUrl)
+					}
+				}
+			},
+			shareMini(imageUrl,sceneStr) {
+				const that = this
+				uni.share({
+					provider: "weixin",
+					scene: sceneStr,
+					type: 5,
+					imageUrl: imageUrl, //分享封面图片
+					title: this.shareItem.title, // 分享标题
+					//summary: this.shareItem.summary,    // 分享内容文字
+					miniProgram: {
+						id: "gh_7a6a32e5ef61",
+						path: this.shareItem.path,
+						type: 0, //0-正式版; 1-测试版; 2-体验版。 默认值为0。
+						webUrl: "http://uniapp.dcloud.io"
+					},
+					success: function(res) {
+						that.doShare();
+						uni.showToast({
+							title: "分享成功",
+							icon: 'none'
+						});
+					},
+					fail: function(err) {
+						// 此处是调起微信分享失败的回调
+					},
+					complete: (e) => {
+						console.log("WXSceneSession", e)
+					}
+				});
+			},
+			doShare() {
+				if (!this.shareItem.isMini) {
+					if (this.shareItem.courseId > 0) {
+						this.shareCourse();
+					}
+				}
+				if(this.shareItem.videoId > 0) {
+					this.shareVideo();
+				}
+			},
+			isEmpty(obj) {
+				if (typeof obj == "undefined" || obj == null || obj == "") {
+					return true;
+				} else {
+					return false;
+				}
+			},
+			shareCourse() {
+				shareCourse(this.shareItem.courseId).then(res => {
+			
+					},
+					rej => {}
+				);
+			},
+			shareVideo() {
+				shareVideo({videoId:this.shareItem.videoId})
+			},
+			copyUrl() {
+				uni.setClipboardData({
+					data: this.shareItem.url,
+					success: () => {
+						uni.showToast({
+							title: '复制成功',
+							icon: 'none'
+						});
+					},
+					fail: () => {
+						uni.showToast({
+							title: '复制失败',
+							icon: 'none'
+						});
+					}
+				});
+			},
+			closeShare() {
+				return this.$emit('closeShare');
+			},
+			showToast(title) {
+				uni.showToast({
+					icon: 'none',
+					title: title,
+					duration: 3000
+				});
+			},
+			qwShare() {
+				if (this.isEmpty(this.shareItem.title)) {
+					uni.showToast({
+						title: "数据未加载",
+						icon: "none",
+						position: 'top',
+						duration: 2000
+					})
+					return;
+				}
+				// #ifdef APP-PLUS
+				if (!plus.runtime.isAgreePrivacy()) {
+					uni.showToast({
+						title: "请同意隐私政策",
+						icon: "none",
+						position: 'top',
+						duration: 2000
+					})
+					return;
+				}
+				// #endif
+				this.getQwCompanyList()
+			},
+			getQwCompanyList(){
+				let token = uni.getStorageSync('CompanyUserToken');
+				if (!token) {
+					 uni.showToast({
+						title: "请先登录销售账号",
+						icon: 'none'
+					 });
+					 return
+				}
+				
+				uni.showLoading()
+				getQwCompanyList().then(res=>{
+					uni.hideLoading()
+					if(res.code == 200&&res.qwCompanyList&&res.qwCompanyList.length > 0) {
+						this.companyList = res.qwCompanyList
+						if(this.companyList.length==1) {
+							this.initregisterQW(0)
+						} else {
+							uni.showActionSheet({
+								itemList: this.companyList.map(item=>item.corpName),
+								success: (res)=> {
+									console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+									this.initregisterQW(res.tapIndex)
+								},
+								fail: (res)=> {
+									console.log(res.errMsg);
+								}
+							});
+						}
+					} else {
+						uni.showToast({
+							title: "暂无可分享企业微信账号",
+							icon: 'none'
+						});
+					}
+				}).catch(()=>{
+					uni.hideLoading()
+				})
+			},
+			// 初始化注册到企业微信并分享
+			initregisterQW(index) {
+				getApp().globalData.shareSchema = this.companyList[index].yjfyySchema; //应用跳转标识,显示在具体应用下的 Schema字段
+				getApp().globalData.shareCorpId = this.companyList[index].corpId; //企业唯一标识。创建企业后显示在,我的企业 CorpID字段
+				getApp().globalData.shareAgentid = this.companyList[index].yjfyyAgentId; //应用
+				getApp().globalData.shareAppid_gh = this.companyList[index].yjfyyAppId;
+				registerQW((installed) => {
+					this.doShare();
+					this.$emit('closeShare')
+				},this.shareItem)
+			},
+			goToFeedback(){
+				uni.navigateTo({
+					url: "/pages/user/feedback"
+				});
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.share-content {
+		//border-radius: 40upx 40upx 0px 0px;
+		width: 100%;
+		height: auto; /* 改为自适应高度 */
+		padding-bottom: 20rpx; /* 增加底部间距 */
+		background: #fff;
+	}
+
+	.share-inner {
+		padding: 20rpx 0; /* 增加上下内边距 */
+		width: 100%;
+		flex: 1;
+		height: auto; /* 改为自适应高度 */
+		flex-direction: row;
+		flex-wrap: wrap;
+		display: flex; /* 确保弹性布局生效 */
+	}
+
+	.share-item {
+		/* width: 20%; 注释掉这行 */
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		height: 180rpx; /* 增加高度 */
+		box-sizing: border-box;
+		//flex: 1; /* 添加这个属性使5个项等宽 */
+		min-width: 0; /* 防止内容溢出 */
+	}
+
+	.share-item .image {
+		width: 80rpx;
+		height: 80rpx;
+		margin-top: 10rpx; /* 减少顶部间距 */
+	}
+	
+	.share-item .text {
+		font-size: 28rpx;
+		font-weight: 500;
+		color: #111111;
+		height: auto; /* 改为自适应高度 */
+		margin-top: 10rpx; /* 减少间距 */
+		text-align: center; /* 文字居中 */
+		white-space: nowrap; /* 防止文字换行 */
+	}
+	
+	.tsjy .image {
+		width: 48rpx;
+		height: 48rpx;
+		margin-top: 22rpx; /* 减少顶部间距 */
+	}
+
+	.tsjy .text {
+		width: auto; /* 改为自适应宽度 */
+		height: auto; /* 改为自适应高度 */
+		margin-top: 30rpx; /* 减少间距 */
+	}
+
+	.cancel-btn {
+		height: 90rpx; /* 增加高度 */
+		line-height: 90rpx; /* 垂直居中 */
+		text-align: center;
+		font-size: 32upx;
+		font-family: PingFang SC;
+		font-weight: 500;
+		color: #111111;
+		border-top: 2upx solid #E8E8E8;
+		background-color: #FFF;
+	}
+</style>

+ 78 - 0
components/smsTempItem/smsTempItem.vue

@@ -0,0 +1,78 @@
+<template>
+	   <view class="u-page__item">
+			<view class="qcell"  v-for="(item, i) in list"  :key="i" @click="smsTempClick(i)">
+			    <view class="topbox x-bc">
+			    	<view class="left">{{ item.title }}</view>
+			    </view>
+				<view class="content">{{ item.content }}</view>
+				<!-- <view class="line"></view> -->
+			</view>
+		</view>
+</template>
+
+<script>
+	export default {
+		props:{
+			list: {
+				type: Array,
+				default(){
+					return []
+				}
+			}
+		},
+		methods: {
+		   smsTempClick(i){
+		   	   return this.$emit('smsTempClick',i);
+		   }
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.item_content{
+		background-color: #f7f7f7;
+		margin-left: 30rpx;
+		margin-right: 30rpx;
+		padding-top: 28rpx;
+	}
+	.u-page__item{
+		background: #F7F7F7;
+		margin-top: 40rpx;
+		
+		.qcell{
+			display: flex;
+			flex-direction: column;
+			background-color: #fff;
+			border-radius: 10px;
+			margin: 10px;
+			.topbox{
+				padding:30rpx 30rpx; 
+			}
+			.left{
+				font-size: 28rpx;
+				color: #333;
+			}
+			.right{
+				color: #999;
+				font-size: 24rpx;
+			}
+			.icon{
+				width:100% ;
+				height: 100%;
+				margin-bottom: 16rpx;
+			}
+			
+			.content{
+				font-size: 28rpx;
+				color: #999;
+				padding:0 30rpx 30rpx; 
+			}
+			
+			.line{
+			    border-bottom: 0.5px solid #eee;
+				padding:0 30rpx;
+			}
+		}
+	}
+
+</style>

+ 205 - 0
components/todo-list.vue

@@ -0,0 +1,205 @@
+<template>
+	
+		<view class="doto-inner">
+			<!--   <mescroll-body ref="mescrollRef" class="mescrollRef" @init="mescrollInit" top="0" bottom="0" :down="downOption" @down="downCallback" :up="upOption"
+			     @up="upCallback" @emptyclick="emptyClick"> -->	
+					 <block v-for="(item,index) in listData" :key="index">
+						<view class="cell">
+							<view class="item">
+								<view class="leftContent">
+									<view class="top">
+										<image class="icon" src="/static/images/home/thing_time.png"></image>
+										<view class="content">{{ item.content }}</view>
+									</view>
+									<view class="date">{{ item.eventTime }}</view>
+								</view>
+								<view class="rightContent">
+									<text v-if="item.status==0" class="state">未完成</text>
+									<text v-else class="dstate">已完成</text>
+								</view>
+							</view>
+							<u-line color="#eee" />
+						</view>
+					 </block>
+					 
+				 <!-- </mescroll-body>	 -->	 
+					 
+	<!-- 		<view>
+				<view class="item">
+					<view class="leftContent">
+						<view class="top">
+							<image class="icon" src="/static/images/home/thing_time.png"></image>
+							<view class="content">打电话跟进20个意向客户</view>
+						</view>
+						
+						<view class="date">2022-12-22</view>
+					</view>
+					<view class="rightContent">
+						<text class="state">未完成</text>
+					</view>
+				</view>
+				<u-line  color="#eee" />
+			</view> -->
+			
+		
+	</view>	
+</template>
+
+<script>
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		name:"todo-list",
+		props: {
+			listData: {
+				type: Array,
+				default: null
+			},
+			isHot: {
+				type: Boolean,
+				default: false
+			},
+			permission: {
+				type: Object,
+				default: function(){
+					return {};
+				}
+			}
+		},
+		data() {
+			return {
+				downOption: {
+					auto: false, 
+					use:false,
+				},
+				upOption: {
+					auto: false, // 不自动加载
+					use:false,
+					page: {
+						num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量
+					},
+					noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
+				    toTop:{
+				    	width:0,
+				    }
+				},
+			}
+		},
+		methods: {
+			clickItem(e) {
+				try {
+					this.$Router.push({
+						name: "newsDetail",
+						query: e
+					})
+				} catch (er) {
+					//TODO handle the exception
+					console.error(er)
+				}
+		
+			},
+			formatTitle(title) {
+				if (title != undefined) {
+					var string = this.removeHTMLTag(title);
+					string = this.escape2Html(string);
+					return string;
+				}
+				return ''
+			},
+			/*移除HTML标签代码*/
+			removeHTMLTag(str) {
+				str = str.replace(/<\/?[^>]*>/g, ''); //去除HTML tag
+				str = str.replace(/[ | ]*\n/g, ''); //去除行尾空白
+				str = str.replace(/\n[\s| | ]*\r/g, ''); //去除多余空行
+				str = str.replace(/&nbsp;/ig, ''); //去掉空格 
+				return str;
+			},
+			//转意符换成普通字符
+			escape2Html(str) {
+				var arrEntities = {
+					'lt': '<',
+					'gt': '>',
+					'nbsp': ' ',
+					'amp': '&',
+					'quot': '"'
+				};
+				return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function(all, t) {
+					return arrEntities[t];
+				});
+			}
+		}
+		
+	}
+</script>
+
+<style lang="scss">
+	
+	.doto-inner{
+		margin: 0rpx 0;
+		//display: flex;
+		//flex-wrap: wrap;  //flex-wrap 设置当项目在容器中一行无法显示的时候如何处理。 nowrap 不换行  wrap://正常换行  wrap-reverse:向上换行,第一行位于下方
+		
+		.cell{
+			padding-top: 22rpx;
+		    // margin-bottom: 16rpx;
+		}
+		.item{
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			justify-content: space-between;
+			padding-bottom: 20rpx;
+			.leftContent{
+				width: calc(90% - 38rpx);
+				.top{
+					display: flex;
+					flex-direction: row;
+				}
+				.icon{
+					width: 28rpx;
+					height: 28rpx;
+					margin-left: 21rpx;
+					margin-top: 10rpx;
+				}
+				.content{
+					color: #111;
+					font-size: 30rpx;
+					margin-left: 20rpx;
+					font-weight: 400;
+				}
+				.date{
+					margin-top: 22rpx;
+					font-size: 22rpx;
+					color: #999;
+					margin-left: 66rpx;
+				}
+				
+			}
+			.rightContent{
+				
+				display: flex;
+				align-items: center;
+				.state{
+					// width: 92rpx;
+					// height: 40rpx;
+					// background-color: #eeeeee;
+					// border-radius: 8rpx;
+					font-size: 24rpx;
+					text-align: center;
+				    color: #F79912;
+				}
+				.dstate{
+					// width: 92rpx;
+					// height: 40rpx;
+					// background-color: #eeeeee;
+					// border-radius: 8rpx;
+					font-size: 24rpx;
+					text-align: center;
+				    color: #FF5C03;
+				}
+			}
+		}
+	}
+
+</style>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 26 - 0
components/uni-load-more.vue


+ 1039 - 0
components/userCard.vue

@@ -0,0 +1,1039 @@
+<template>
+	<view v-if="show" class="mask" @click="onMaskClick">
+		<!-- 弹窗容器(阻止冒泡,避免点击内容关闭弹窗) -->
+		<view class="popup-container" @click.stop>
+			<!-- 弹窗头部 -->
+			<view class="popup-header">
+				<text class="popup-title">{{ isEdit ? '编辑用户' : title }}</text>
+				<view class="close-btn" @click="onClose">
+					<image src="/static/image/device/close_icon32.png" mode="widthFix"></image>
+				</view>
+			</view>
+
+			<!-- 弹窗主体内容 -->
+			<view class="popup-content">
+				<view class="card-box">
+					<view class="card-title">用户基本信息</view>
+					<view class="form-item2">
+						<view class="x-f">
+							<text class="label">姓名:</text>
+							<input type="text" v-model="form.username" class="form-input" placeholder="请输入姓名"
+								placeholder-class="text-input" />
+						</view>
+
+						<view class="x-f">
+							<text class="label">年龄:</text>
+							<input type="number" v-model="form.age" class="form-input" placeholder="请输入年龄"
+								placeholder-class="text-input" />
+						</view>
+					</view>
+
+					<view class="form-item2">
+						<text class="label">性别:</text>
+						<radio-group class="r-box">
+							<label style="margin-right: 30px;">
+								<radio color="#8F6726" value="1" :checked="form.sex === 1" @click="genderChange(1)"
+									style="margin-right: 12px;" />
+								<text class="option-text">男</text>
+							</label>
+							<label>
+								<radio color="#8F6726" value="0" :checked="form.sex === 0" @click="genderChange(0)"
+									style="margin-right: 12px;" />
+								<text class="option-text">女</text>
+							</label>
+						</radio-group>
+					</view>
+					<view class="form-item2">
+						<view class="x-f">
+							<text class="label">身高(cm):</text>
+							<input type="digit" v-model="form.height" class="form-input" placeholder="请输入身高"
+								placeholder-class="text-input" />
+						</view>
+						<view class="x-f">
+							<text class="label">体重(kg):</text>
+							<input type="digit" v-model="form.weight" class="form-input" placeholder="请输入体重"
+								placeholder-class="text-input" />
+						</view>
+					</view>
+					<view class="form-item">
+						<text class="label">手机号:</text>
+						<input type="number" v-model="form.phone" maxlength="11" class="form-input" placeholder="请输入手机号"
+							placeholder-class="text-input" />
+					</view>
+				</view>
+
+				<view class="card-box">
+					<view class="card-title">既往病史(多选)</view>
+					<view class="form-item3">
+						<view class="card-list">
+							<view v-for="(item,index) in qw" :key="item.id"
+								:class="selectedIds.includes(item.id)?'card-btn active':'card-btn'"
+								@click="changeQw(item)" :title="item.name">
+								{{item.name}}
+							</view>
+							<view class="card-btn" style="padding: 0;border: 0;"></view>
+							<view class="card-btn" style="padding: 0;border: 0;"></view>
+						</view>
+						<input v-if="isQw" type="text" v-model="otherQw" class="other-input" placeholder="请输入相关描述"
+							placeholder-class="text-input" />
+					</view>
+				</view>
+				<view class="card-box">
+					<view class="card-title">过敏史</view>
+					<view class="form-item3">
+						<view class="card-list">
+							<view v-for="(item,index) in all" :key="item.id"
+								:class="aIndex==item.id?'card-btn active':'card-btn'" @click="changeAll(item)"
+								:title="item.name">
+								{{item.name}}
+							</view>
+							<view class="card-btn" style="padding: 0;border: 0;"></view>
+							<view class="card-btn" style="padding: 0;border: 0;"></view>
+						</view>
+						<input v-if="isAll" type="text" v-model="otherAll" class="other-input" placeholder="请输入相关描述"
+							placeholder-class="text-input" />
+					</view>
+				</view>
+				<view class="card-box">
+					<view class="card-title">生活习惯</view>
+					<view class="form-item3">
+						<!-- <text class="label">既往病史:</text> -->
+						<view class="card-list">
+							<view v-for="(item,index) in habits" :key="item.qId" class="card-text">
+								{{index+1}}、{{item.typeName}}
+								<view class="card-text-box">
+									<view v-for="(it,idx) in item.option" :key="it.id" class="card-btn2"
+										@click="changeH(it,item)" :class="{ 'active': item.selectedId == it.id}"
+										:title="it.name">
+										{{it.name}}
+									</view>
+									<view class="card-btn2" style="padding: 0;border: 0;"></view>
+									<view class="card-btn2" style="padding: 0;border: 0;"></view>
+								</view>
+
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!-- 弹窗底部按钮 -->
+			<view class="popup-footer">
+				<view class="btn2 cancel-btn2" @click="onClose">
+					<text>取消</text>
+				</view>
+				<!-- <view class="btn2 confirm-btn2" @click="onConfirm">
+		  <text>下一步</text>
+		</view> -->
+				<view class="btn2 confirm-btn2" @click="onConfirm">
+					<text>确认</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		el
+	} from 'date-fns/locale';
+
+	export default {
+		name: 'UserFormPopup',
+		props: {
+			// 控制弹窗显示/隐藏
+			show: {
+				type: Boolean,
+				default: false
+			},
+			// 弹窗标题(默认“新建用户”,可自定义)
+			title: {
+				type: String,
+				default: '新建用户'
+			},
+			// 初始表单数据(用于编辑场景)
+			initialForm: {
+				type: Object,
+				default: () => ({})
+			}
+		},
+		data() {
+			return {
+				form: {
+					username: '', // 姓名
+					phone: '', // 手机号
+					sex: 1, // 性别(1-男,0-女)
+					age: '', // 年龄
+					height: '', // 身高
+					weight: '', // 体重
+					previousMedicalHistory: '', // 既往病史
+					habitList: [], //饮食习惯
+					historyOfAllergies: '' //过敏史
+				},
+				isEdit: false,
+				qIndex: null,
+				aIndex: null,
+				isAll: false,
+				isQw: false,
+				otherAll: null,
+				otherQw: null,
+				selectedIds: [],
+				initialFormKeys:[],
+				qw: [{
+						name: '无',
+						id: 1
+					},
+					{
+						name: '糖尿病',
+						id: 2
+					},
+					{
+						name: '高血压',
+						id: 3
+					},
+					{
+						name: '心脑血管疾病',
+						id: 4
+					},
+					{
+						name: '胃病',
+						id: 5
+					},
+					{
+						name: '排便异常',
+						id: 6
+					},
+					{
+						name: '肝病',
+						id: 7
+					},
+					{
+						name: '肾病',
+						id: 8
+					},
+					{
+						name: '其他',
+						id: 9,
+						isQw: true
+					},
+				],
+				all: [{
+						name: '无',
+						id: 1
+					},
+					{
+						name: '药物',
+						id: 2
+					},
+					{
+						name: '食物',
+						id: 3
+					},
+					{
+						name: '花粉',
+						id: 4
+					},
+					{
+						name: '其他',
+						id: 5,
+						isAll: true
+					},
+				],
+				habits: [{
+						typeName: '睡眠状况',
+						qId: 1,
+						option: [{
+							name: '很差',
+							id: 1,
+						}, {
+							name: '差',
+							id: 2
+						}, {
+							name: '一般',
+							id: 3
+						}, {
+							name: '良好',
+							id: 4
+						}, ],
+						selectedId: null // 存储选中的选项ID
+					},
+					{
+						typeName: '睡眠时间',
+						qId: 2,
+						option: [{
+							name: '<6小时',
+							id: 1,
+						}, {
+							name: '6-8小时',
+							id: 2
+						}, {
+							name: '9-10小时',
+							id: 3
+						}, {
+							name: '>10小时',
+							id: 4
+						}, ],
+						selectedId: null // 存储选中的选项ID
+					},
+					{
+						typeName: '是否经常熬夜',
+						qId: 3,
+						option: [{
+							name: '经常',
+							id: 1,
+						}, {
+							name: '偶尔',
+							id: 2
+						}, {
+							name: '很少',
+							id: 3
+						}, {
+							name: '无',
+							id: 4
+						}, ],
+						selectedId: null // 存储选中的选项ID
+					},
+					{
+						typeName: '饮食习惯',
+						qId: 4,
+						option: [{
+								name: '正常就餐',
+								id: 1,
+							},
+							{
+								name: '暴饮暴食',
+								id: 2,
+							},
+							{
+								name: '压力大进食',
+								id: 3
+							},
+							{
+								name: '就外就餐多',
+								id: 4
+							},
+							{
+								name: '不吃早餐',
+								id: 5
+							},
+
+						],
+						selectedId: null // 存储选中的选项ID
+					},
+					{
+						typeName: '日常运动量',
+						qId: 5,
+						option: [{
+								name: '久坐不动',
+								id: 1,
+							},
+							{
+								name: '轻度运动',
+								id: 2
+							},
+							{
+								name: '中度运动',
+								id: 3
+							},
+							{
+								name: '大量运动',
+								id: 4
+							},
+						],
+						selectedId: null // 存储选中的选项ID
+					},
+					{
+						typeName: '每周锻炼次数',
+						qId: 6,
+						option: [{
+								name: '≤2次',
+								id: 1,
+							},
+							{
+								name: '3-5次',
+								id: 2
+							},
+							{
+								name: '>5次',
+								id: 3
+							},
+						],
+						selectedId: null // 存储选中的选项ID
+					},
+					{
+						typeName: '每次锻炼时间多少分钟',
+						qId: 7,
+						option: [{
+								name: '≤20分钟',
+								id: 1,
+							},
+							{
+								name: '20-40分钟',
+								id: 2
+							},
+							{
+								name: '41-60分钟',
+								id: 3
+							},
+							{
+								name: '>60分钟',
+								id: 4
+							},
+						],
+						selectedId: null // 存储选中的选项ID
+					},
+				]
+			};
+		},
+		watch: {
+			// 监听初始数据变化(用于编辑时回显)
+			initialForm: {
+				immediate: true,
+				handler(val) {
+
+					if (val && Object.keys(val).length > 0) {
+						this.form = {
+							...val
+						};
+						this.isEdit = true
+						this.init()
+						//console.log(this.form,'---')
+					} else {
+						this.isEdit = false
+					}
+				}
+			},
+			// 监听弹窗显示状态,每次显示时重置表单(可选)
+			show(newVal) {
+				//console.log(newVal)
+				if (!newVal) {
+					this.resetForm();
+				}
+
+			}
+		},
+		created() {
+		    // 初始化时记录form的所有初始键(只执行一次)
+		    const formKeys = Object.keys(this.form);
+			const extraKeys = ['userId','id','username','fsUserId'];
+			    // 3. 合并并去重(避免重复字段)
+		    this.initialFormKeys = [...new Set([...formKeys, ...extraKeys])];
+			if (!Array.isArray(this.form.habitList)) {
+			    this.form.habitList = [];
+			 }
+		  },
+		methods: {
+			//回显数据处理
+			init() {
+				// 1. 既往病史回显
+				if (this.form.previousMedicalHistory !== '') {
+					const historyArr = this.form.previousMedicalHistory.split(',');
+					const presetNames = this.qw.map(item => item.name);
+					// 1. 筛选出属于预设选项的内容,回显到选中状态
+					const selectedPresetIds = this.qw
+						.filter(option => historyArr.includes(option.name))
+						.map(option => option.id);
+					this.selectedIds = selectedPresetIds;
+
+					// 2. 筛选出不属于预设选项的内容(归为“其他”)
+					const otherTexts = historyArr.filter(text =>
+						!presetNames.includes(text) // 排除预设选项名称
+					);
+
+					// 3. 处理“其他”选项的回显
+					if (otherTexts.length > 0) {
+						// 自动勾选“其他”选项
+						if (!this.selectedIds.includes(9)) {
+							this.selectedIds.push(9);
+						}
+						// 合并所有非预设内容到“其他”输入框
+						this.isQw = true;
+						this.otherQw = otherTexts.join(','); // 多个非预设内容用逗号拼接
+					}
+				}
+
+				// 2. 过敏史回显
+				if (this.form.historyOfAllergies !== '') {
+					const allergyItem = this.all.find(item => item.name === this.form.historyOfAllergies);
+					this.aIndex = allergyItem ? allergyItem.id : 5; // 找不到则默认“其他”
+					if (this.aIndex === 5) {
+						this.isAll = true;
+						this.otherAll = this.form.historyOfAllergies;
+					}
+				}
+
+				// 3. 生活习惯回显
+				if (Array.isArray(this.form.habitList) && this.form.habitList.length > 0) {
+				  this.habits.forEach(habit => {
+				    const matched = this.form.habitList.find(item => item.qId === habit.qId);
+				    if (matched) {
+				      habit.selectedId = matched.optionId; // 回显选中状态
+				    }else {
+      // 可选:无匹配数据时,强制清空选中状态(避免残留旧数据)
+      habit.selectedId = null; 
+    }
+				  });
+				}
+				
+			},
+			// 重置表单
+			resetForm() {
+				this.form = {
+					username: '',
+					phone: '',
+					sex: 1,
+					age: '',
+					height: '',
+					weight: '',
+					previousMedicalHistory: '',
+					habitList: [],
+					historyOfAllergies: ''
+				};
+				this.selectedIds = [],
+					this.habits.forEach(item => {
+						item.selectedId = null; // 遍历每个问题,清空选中ID
+					});
+				this.isEdit = false,
+					this.qIndex = null,
+					this.aIndex = null,
+					this.isAll = null,
+					this.isQw = null,
+					this.otherAll = null,
+					this.otherQw = null
+			},
+			// 性别切换
+			genderChange(sex) {
+				this.form.sex = sex;
+			},
+			changeQw(item) {
+				this.qIndex = item.id
+				// 检查当前项是否已选中
+				const index = this.selectedIds.indexOf(item.id);
+				if (item.id === 1) { // 选中“无”
+					this.selectedIds = [1];
+					this.isQw = false;
+					this.otherQw = '';
+					return;
+				}
+				if (index > -1) {
+					// 如果已选中,则移除
+					this.selectedIds.splice(index, 1);
+					// 如果移除的是"其他"选项,隐藏输入框
+					if (item.isQw) {
+						this.isQw = false;
+						this.otherQw = '';
+					}
+				} else {
+					this.selectedIds = this.selectedIds.filter(id => id !== 1);
+					// 如果未选中,则添加
+					this.selectedIds.push(item.id);
+					// 如果选中的是"其他"选项,显示输入框
+					if (item.isQw) {
+						this.isQw = true;
+					}
+				}
+			},
+			// 拼接选中的病史为字符串
+			getSelectedHistoryString() {
+				// 收集所有选中项的名称
+				const selectedNames = [];
+
+				this.selectedIds.forEach(id => {
+					const item = this.qw.find(item => item.id === id);
+					if (item) {
+						//console.log(item,'item')
+						// 如果是"其他"选项且有输入内容,使用输入的内容
+						if (item.id === 9 ) {
+							const otherVal = (this.otherQw || '').trim();
+							  if (otherVal) { // 仅当有有效内容时才添加
+							    selectedNames.push(otherVal);
+							  }
+						}
+						// 排除没有输入内容的"其他"选项
+						else if (item.id !== 9) {
+							selectedNames.push(item.name);
+						}
+					}
+				});
+
+				// 将数组拼接为逗号分隔的字符串
+				return selectedNames.join(','); // 使用中文逗号分隔
+			},
+			//拼接选中的过敏史名称为字符串
+			getAllergyString() {
+				if (!this.aIndex) return '';
+
+				const selectedItem = this.all.find(item => item.id === this.aIndex);
+				if (!selectedItem) return '';
+
+				// 处理"其他"选项
+				if (this.aIndex === 5) {
+					const otherVal = this.otherAll || ''; // 若为null/undefined,转为空字符串
+					    if (otherVal.trim()) { // 此时调用trim()不会报错
+					      return otherVal.trim();
+					    }
+				}
+
+				return selectedItem.name;
+			},
+			changeAll(item) {
+				this.aIndex = item.id
+				if (item.isAll) {
+					this.isAll = true
+				} else {
+					this.isAll = false
+				}
+			},
+			changeH(option, question) {
+				//console.log(question,'question')
+				// 单选逻辑:设置当前问题的选中ID为点击的选项ID
+				question.selectedId = option.id
+				this.updateHabitList(question, option)
+			},
+			// 更新生活习惯列表
+			updateHabitList(question, selectedOption) {
+				if (!Array.isArray(this.form.habitList)) {
+				    this.form.habitList = []; // 强制转为空数组
+				  }
+				// 查找当前问题在habitList中的索引
+				const index = this.form.habitList.findIndex(item => item.qId === question.qId);
+
+				// 构建生活习惯数据对象
+				const habitData = {
+					qId: question.qId,
+					typeName: question.typeName,
+					optionId: selectedOption.id,
+					optionName: selectedOption.name,
+				};
+				// 如果已存在则更新,否则添加
+				if (index > -1) {
+					this.form.habitList.splice(index, 1, habitData);
+				} else {
+					this.form.habitList.push(habitData);
+				}
+				//console.log(this.form.habitList)
+			},
+			// 关闭弹窗
+			onClose() {
+				this.$emit('close');
+			},
+			// 点击遮罩层关闭(可选)
+			onMaskClick() {
+				this.$emit('close');
+			},
+			// 确认提交
+			onConfirm() {
+				// 表单校验
+				if (this.form.username == null || this.form.username == '') {
+					uni.showToast({
+						title: "姓名不能为空",
+						icon: "none"
+					})
+					return
+				}
+				if (this.form.age == null || this.form.age == '') {
+					uni.showToast({
+						title: "年龄不能为空",
+						icon: "none"
+					})
+					return
+				}
+				if (this.form.height == null || this.form.height == '') {
+					uni.showToast({
+						title: "身高不能为空",
+						icon: "none"
+					})
+					return
+				}
+				if (this.form.weight == null || this.form.weight == '') {
+					uni.showToast({
+						title: "体重不能为空",
+						icon: "none"
+					})
+					return
+				}
+				const phoneError = this.checkPhone(this.form.phone);
+				if (phoneError) {
+					uni.showToast({
+						title: phoneError, // 直接显示具体错误
+						icon: "none"
+					});
+					return;
+				}
+				const isOtherSelected = this.selectedIds.includes(9);
+				if (isOtherSelected && (this.otherQw==null || this.otherQw=='')) {
+					uni.showToast({
+						title: "请输入其他描述",
+						icon: "none"
+					})
+					return
+				}
+				this.form.previousMedicalHistory = this.getSelectedHistoryString();
+				if (this.form.previousMedicalHistory == '') {
+					uni.showToast({
+						title: "既往病史不能为空",
+						icon: "none"
+					})
+					return;
+				}
+				this.form.historyOfAllergies = this.getAllergyString();
+				if (this.form.historyOfAllergies=='') {
+					uni.showToast({
+						title: "过敏史不能为空",
+						icon: "none"
+					})
+					return;
+				}
+				if (this.aIndex == 5 && (this.otherAll==null || this.otherAll=='')) {
+					uni.showToast({
+						title: "请输入其他描述",
+						icon: "none"
+					})
+					return
+				}
+
+				const unselected = this.habits.find(question => question.selectedId === null);
+				if (unselected) {
+					uni.showToast({
+						title: `请选择${unselected.typeName}`,
+						icon: "none"
+					})
+					return;
+				}
+
+				// 校验通过,提交表单数据
+				if (this.isEdit) {
+					 const submitData = {};
+					      this.initialFormKeys.forEach(key => {
+					        submitData[key] = this.form[key]; // 即使值为空也保留键
+					      });
+						  
+					submitData.habitList = this.form.habitList.filter(item => !item.option);
+					// 修改逻辑:通常需要携带唯一标识(如id)
+					this.$emit('update', {
+						...submitData
+					});
+				} else {
+					this.$emit('confirm', {
+						...this.form
+					});
+				}
+			},
+			// 手机号校验函数
+			checkPhone(val) {
+				const phone = val?.trim(); // 去除首尾空格
+
+				// 1. 非空校验
+				if (!phone) {
+					uni.showToast({
+						title: "手机号不能为空",
+						icon: "none"
+					});
+					return "请输入正确的手机号";
+				}
+
+				// 2. 格式校验(中国大陆手机号规则:11位数字,以1开头)
+				const phoneReg = /^1[3-9]\d{9}$/; // 正则表达式
+				if (!phoneReg.test(phone)) {
+					uni.showToast({
+						title: "请输入正确的手机号",
+						icon: "none"
+					});
+					return "请输入正确的手机号";
+				}
+
+				// 校验通过
+				return '';
+			}
+
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	/* 遮罩层 */
+	.mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 999;
+	}
+
+	/* 弹窗容器 */
+	.popup-container {
+		width: 85%;
+		height: 85%;
+		/* max-width: 500px; */
+		background-color: #fff;
+		border-radius: 12px;
+		overflow: hidden;
+	}
+
+	/* 弹窗头部 */
+	.popup-header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 20px;
+		border-bottom: 1px solid #eee;
+		background: #E9DDCD;
+	}
+
+	.popup-title {
+		flex: 1;
+		font-family: Source Han Serif CN, Source Han Serif CN;
+		font-weight: bold;
+		font-size: 24px;
+		color: #8F6726;
+		text-align: center;
+	}
+
+	.close-btn {
+		width: 24px;
+		height: 24px;
+	}
+
+	.close-btn image {
+		width: 100%;
+		height: 100%;
+	}
+
+	/* 弹窗内容 */
+	.popup-content {
+		padding: 30px;
+		height: 80%;
+		overflow-y: auto;
+	}
+
+	.popup-content::-webkit-scrollbar {
+		display: block !important;
+		width: 10px !important;
+		/* 滚动条宽度 */
+	}
+
+	.popup-content::-webkit-scrollbar-thumb {
+		background: #8F6726 !important;
+		/* 滚动条滑块颜色 */
+		border-radius: 5px !important;
+		/* 滑块圆角 */
+	}
+
+	.card-box {
+		border-radius: 12px;
+		border: 1px solid #8F6726;
+		padding: 20px;
+		margin-bottom: 20px;
+	}
+
+	.card-title {
+		font-size: 24px;
+		color: #222;
+		/* margin-bottom: 20px; */
+	}
+
+	.card-list {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		flex-direction: row;
+		justify-content: space-between;
+		flex-wrap: wrap;
+		gap: 15px;
+		margin-top: 20px;
+	}
+
+	.card-text {
+		display: flex;
+		align-items: flex-start;
+		flex-direction: column;
+		width: 100%;
+		font-size: 20px;
+		color: #8F6726;
+		padding-bottom: 20px;
+		// border-bottom: 1px solid #E9DDCD;
+
+		// margin-bottom: 10px;
+		&:last-child {
+			border-bottom: 0;
+		}
+	}
+
+	.card-text-box {
+		display: flex;
+		align-items: center;
+		flex-direction: row;
+		justify-content: space-between;
+		flex-wrap: wrap;
+		width: 100%;
+		gap: 15px;
+		margin-top: 10px;
+	}
+
+	.card-btn2 {
+		width: calc(100% /3.5);
+		color: #8F6726;
+		border: 1px solid #8F6726;
+		border-radius: 6px;
+		padding: 10px;
+		text-align: center;
+		white-space: nowrap;
+		/* 强制文字不换行 */
+		overflow: hidden;
+		/* 隐藏溢出的文字 */
+		text-overflow: ellipsis;
+
+		/* 溢出部分显示省略号 */
+		&.active {
+			background: #8F6726;
+			color: #fff;
+		}
+
+		/* margin-top: 20px; */
+	}
+
+	.card-btn3 {
+		width: calc(100% /3.5);
+		white-space: nowrap;
+		/* 强制文字不换行 */
+		overflow: hidden;
+		/* 隐藏溢出的文字 */
+		text-overflow: ellipsis;
+		/* 溢出部分显示省略号 */
+	}
+
+	.card-btn {
+		// flex:1;
+		width: calc(100% / 3.5);
+		color: #8F6726;
+		font-size: 20px;
+		border: 1px solid #8F6726;
+		border-radius: 6px;
+		padding: 10px;
+		text-align: center;
+		white-space: nowrap;
+		/* 强制文字不换行 */
+		overflow: hidden;
+		/* 隐藏溢出的文字 */
+		text-overflow: ellipsis;
+		/* 溢出部分显示省略号 */
+
+		&.active {
+			background: #8F6726;
+			color: #fff;
+		}
+	}
+
+	.form-item {
+		display: flex;
+		align-items: center;
+		margin-top: 20px;
+	}
+
+	.form-item2 {
+		display: flex;
+		justify-content: space-between;
+		margin-top: 20px;
+	}
+
+	.form-item3 {
+		display: flex;
+		align-items: flex-start;
+		flex-direction: column;
+	}
+
+	.x-f {
+		display: flex;
+		align-items: center;
+		width: 48%;
+	}
+
+	.x-c {
+		display: flex;
+		align-items: center;
+		width: 30%;
+	}
+
+	.label {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 20px;
+		color: #222;
+	}
+
+	.form-input {
+		flex: 1;
+		height: 47px;
+		line-height: 47px;
+		padding: 0px 15px;
+		box-sizing: border-box;
+		border: 1px solid #E9DDCD;
+		border-radius: 6px;
+		font-size: 18px;
+	}
+
+	.other-input {
+		width: 100%;
+		margin-top: 20px;
+		height: 47px;
+		line-height: 47px;
+		box-sizing: border-box;
+		padding: 0 15px;
+		border: 1px solid #E9DDCD;
+		border-radius: 6px;
+		font-size: 18px;
+	}
+
+	.text-input {
+		color: #ccc;
+	}
+
+	.r-box {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		// justify-content: space-between;
+	}
+
+	.option-text {
+		font-size: 18px;
+		color: #333;
+	}
+
+	.uni-label-pointer {
+		display: flex;
+		align-items: center;
+	}
+
+	/* 弹窗底部 */
+	.popup-footer {
+		display: flex;
+		padding: 20upx 30upx;
+		border-top: 1px solid #eee;
+	}
+
+	.btn2 {
+		flex: 1;
+		height: 53px;
+		line-height: 53px;
+		text-align: center;
+		border-radius: 12px;
+		font-size: 20px;
+		margin: 0 10px;
+	}
+
+	.cancel-btn2 {
+		background-color: #f5f5f5;
+		color: #666;
+	}
+
+	.confirm-btn2 {
+		background-color: #8F6726;
+		color: #fff;
+	}
+</style>

+ 20 - 0
index.html

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

+ 405 - 0
js_sdk/wa-permission/permission.js

@@ -0,0 +1,405 @@
+var isIos  
+// #ifdef APP-PLUS  
+isIos = (plus.os.name == "iOS")  
+// #endif  
+
+// 判断推送权限是否开启  
+function judgeIosPermissionPush() {  
+    var result = false;  
+    var UIApplication = plus.ios.import("UIApplication");  
+    var app = UIApplication.sharedApplication();  
+    var enabledTypes = 0;  
+    if (app.currentUserNotificationSettings) {  
+        var settings = app.currentUserNotificationSettings();  
+        enabledTypes = settings.plusGetAttribute("types");  
+        console.log("enabledTypes1:" + enabledTypes);  
+        if (enabledTypes == 0) {  
+            console.log("推送权限没有开启");  
+        } else {  
+            result = true;  
+            console.log("已经开启推送功能!")  
+        }  
+        plus.ios.deleteObject(settings);  
+    } else {  
+        enabledTypes = app.enabledRemoteNotificationTypes();  
+        if (enabledTypes == 0) {  
+            console.log("推送权限没有开启!");  
+        } else {  
+            result = true;  
+            console.log("已经开启推送功能!")  
+        }  
+        console.log("enabledTypes2:" + enabledTypes);  
+    }  
+    plus.ios.deleteObject(app);  
+    plus.ios.deleteObject(UIApplication);  
+    return result;  
+}  
+
+// 判断定位权限是否开启  
+function judgeIosPermissionLocation() {  
+    var result = false;  
+    var cllocationManger = plus.ios.import("CLLocationManager");  
+    var status = cllocationManger.authorizationStatus();  
+    result = (status != 2)  
+    console.log("定位权限开启:" + result);  
+    // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation  
+    /* var enable = cllocationManger.locationServicesEnabled();  
+    var status = cllocationManger.authorizationStatus();  
+    console.log("enable:" + enable);  
+    console.log("status:" + status);  
+    if (enable && status != 2) {  
+        result = true;  
+        console.log("手机定位服务已开启且已授予定位权限");  
+    } else {  
+        console.log("手机系统的定位没有打开或未给予定位权限");  
+    } */  
+    plus.ios.deleteObject(cllocationManger);  
+    return result;  
+}  
+
+// 判断麦克风权限是否开启  
+function judgeIosPermissionRecord() {  
+    var result = false;  
+    var avaudiosession = plus.ios.import("AVAudioSession");  
+    var avaudio = avaudiosession.sharedInstance();  
+    var permissionStatus = avaudio.recordPermission();  
+    console.log("permissionStatus:" + permissionStatus);  
+    if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {  
+        console.log("麦克风权限没有开启");  
+    } else {  
+        result = true;  
+        console.log("麦克风权限已经开启");  
+    }  
+    plus.ios.deleteObject(avaudiosession);  
+    return result;  
+}  
+
+// 判断相机权限是否开启  
+function judgeIosPermissionCamera() {  
+    var result = false;  
+    var AVCaptureDevice = plus.ios.import("AVCaptureDevice");  
+    var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');  
+    console.log("authStatus:" + authStatus);  
+    if (authStatus == 3) {  
+        result = true;  
+        console.log("相机权限已经开启");  
+    } else {  
+        console.log("相机权限没有开启");  
+    }  
+    plus.ios.deleteObject(AVCaptureDevice);  
+    return result;  
+}  
+
+// 判断相册权限是否开启  
+function judgeIosPermissionPhotoLibrary() {  
+    var result = false;  
+    var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");  
+    var authStatus = PHPhotoLibrary.authorizationStatus();  
+    console.log("authStatus:" + authStatus);  
+    if (authStatus == 3) {  
+        result = true;  
+        console.log("相册权限已经开启");  
+    } else {  
+        console.log("相册权限没有开启");  
+    }  
+    plus.ios.deleteObject(PHPhotoLibrary);  
+    return result;  
+}  
+
+// 判断通讯录权限是否开启  
+function judgeIosPermissionContact() {  
+    var result = false;  
+    var CNContactStore = plus.ios.import("CNContactStore");  
+    var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);  
+    if (cnAuthStatus == 3) {  
+        result = true;  
+        console.log("通讯录权限已经开启");  
+    } else {  
+        console.log("通讯录权限没有开启");  
+    }  
+    plus.ios.deleteObject(CNContactStore);  
+    return result;  
+}  
+
+// 判断日历权限是否开启  
+function judgeIosPermissionCalendar() {  
+    var result = false;  
+    var EKEventStore = plus.ios.import("EKEventStore");  
+    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);  
+    if (ekAuthStatus == 3) {  
+        result = true;  
+        console.log("日历权限已经开启");  
+    } else {  
+        console.log("日历权限没有开启");  
+    }  
+    plus.ios.deleteObject(EKEventStore);  
+    return result;  
+}  
+
+// 判断备忘录权限是否开启  
+function judgeIosPermissionMemo() {  
+    var result = false;  
+    var EKEventStore = plus.ios.import("EKEventStore");  
+    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);  
+    if (ekAuthStatus == 3) {  
+        result = true;  
+        console.log("备忘录权限已经开启");  
+    } else {  
+        console.log("备忘录权限没有开启");  
+    }  
+    plus.ios.deleteObject(EKEventStore);  
+    return result;  
+}  
+
+// Android权限查询  
+function requestAndroidPermission(permissionID) {  
+    return new Promise((resolve, reject) => {  
+        plus.android.requestPermissions(  
+            permissionID.split(","),  
+            // [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装  
+            function(resultObj) {  
+                var result = 0;  
+                for (var i = 0; i < resultObj.granted.length; i++) {  
+                    var grantedPermission = resultObj.granted[i];  
+                    console.log('已获取的权限:' + grantedPermission);  
+                    result = 1  
+                }  
+                for (var i = 0; i < resultObj.deniedPresent.length; i++) {  
+                    var deniedPresentPermission = resultObj.deniedPresent[i];  
+                    console.log('拒绝本次申请的权限:' + deniedPresentPermission);  
+                    result = 0  
+                }  
+                for (var i = 0; i < resultObj.deniedAlways.length; i++) {  
+                    var deniedAlwaysPermission = resultObj.deniedAlways[i];  
+                    console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);  
+                    result = -1  
+                }  
+                resolve(result);  
+                // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限  
+                // if (result != 1) {  
+                // gotoAppPermissionSetting()  
+                // }  
+            },  
+            function(error) {  
+                console.log('申请权限错误:' + error.code + " = " + error.message);  
+                resolve({  
+                    code: error.code,  
+                    message: error.message  
+                });  
+            }  
+        );  
+    });  
+}  
+
+// 使用一个方法,根据参数判断权限  
+function judgeIosPermission(permissionID) {  
+    if (permissionID == "location") {  
+        return judgeIosPermissionLocation()  
+    } else if (permissionID == "camera") {  
+        return judgeIosPermissionCamera()  
+    } else if (permissionID == "photoLibrary") {  
+        return judgeIosPermissionPhotoLibrary()  
+    } else if (permissionID == "record") {  
+        return judgeIosPermissionRecord()  
+    } else if (permissionID == "push") {  
+        return judgeIosPermissionPush()  
+    } else if (permissionID == "contact") {  
+        return judgeIosPermissionContact()  
+    } else if (permissionID == "calendar") {  
+        return judgeIosPermissionCalendar()  
+    } else if (permissionID == "memo") {  
+        return judgeIosPermissionMemo()  
+    }  
+    return false;  
+}  
+
+// 跳转到**应用**的权限页面  
+function gotoAppPermissionSetting(type) {  
+    if (isIos) {  
+        var UIApplication = plus.ios.import("UIApplication");  
+        var application2 = UIApplication.sharedApplication();  
+        var NSURL2 = plus.ios.import("NSURL");  
+        // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");       
+        var setting2 = NSURL2.URLWithString("app-settings:");  
+        application2.openURL(setting2);  
+
+        plus.ios.deleteObject(setting2);  
+        plus.ios.deleteObject(NSURL2);  
+        plus.ios.deleteObject(application2);  
+    } else {  
+       
+        var Intent = plus.android.importClass("android.content.Intent");  
+        var Settings = plus.android.importClass("android.provider.Settings");  
+        var Uri = plus.android.importClass("android.net.Uri");  
+        var mainActivity = plus.android.runtimeMainActivity();  
+        var intent = new Intent();  
+		var settings=Settings.ACTION_APPLICATION_DETAILS_SETTINGS;
+		if(type=="push"){
+			settings=Settings.ACTION_APP_NOTIFICATION_SETTINGS;//推送通知
+		}else{
+			var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+			intent.setData(uri);
+		}
+		intent.setAction(settings);
+        mainActivity.startActivity(intent);  
+    }  
+}  
+
+// 检查系统的设备服务是否开启  
+// var checkSystemEnableLocation = async function () {  
+function checkSystemEnableLocation() {  
+    if (isIos) {  
+        var result = false;  
+        var cllocationManger = plus.ios.import("CLLocationManager");  
+        var result = cllocationManger.locationServicesEnabled();  
+        console.log("系统定位开启:" + result);  
+        plus.ios.deleteObject(cllocationManger);  
+        return result;  
+    } else {  
+        var context = plus.android.importClass("android.content.Context");  
+        var locationManager = plus.android.importClass("android.location.LocationManager");  
+        var main = plus.android.runtimeMainActivity();  
+        var mainSvr = main.getSystemService(context.LOCATION_SERVICE);  
+        var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);  
+        console.log("系统定位开启:" + result);  
+        return result  
+    }  
+}  
+
+let permissionMap = {  
+    "android": {  
+        "CAMERA_EXTERNAL_STORAGE": {  
+            "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE,android.permission.CAMERA",  
+            "title": "相机/相册权限说明",  
+            "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、问诊等场景中读取和写入相册和文件内容"  
+        },  
+        "CAMERA": {  
+            "name": "android.permission.CAMERA",  
+            "title": "相机权限说明",  
+            "content": "便于您使用该功能上传图片,用于问诊等场景中发送拍摄图片"  
+        },  
+        "EXTERNAL_STORAGE": {  
+            "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE",  
+            "title": "相册权限说明",  
+            "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、问诊等场景中读取和写入相册和文件内容"  
+        },
+		"PUSH": {
+		    "name": "android.permission.INTERNET",  
+		    "title": "推送权限说明",  
+		    "content": "便于您使用该功能接收问诊、用药、订单等各种系统消息"  
+		},
+		"CALL_PHONE": {
+		    "name": "android.permission.CALL_PHONE",  
+		    "title": "拨打电话权限说明",  
+		    "content": "便于您使用该功能拨打电话"  
+		},
+		  
+		  
+    },  
+    "ios": {}  
+}  
+
+let view = null;  
+
+function showViewDesc(permission) {  
+    let plat = isIos ? "ios" : "android";  
+    view = new plus.nativeObj.View('per-modal', {  
+        top: '0px',  
+        left: '0px',  
+        width: '100%',  
+        backgroundColor: 'rgba(0,0,0,0.2)',  
+        //opacity: '.9'     
+    })  
+    view.drawRect({  
+        color: '#fff',  
+        radius: '5px'  
+    }, {  
+        top: '30px',  
+        left: '5%',  
+        width: '90%',  
+        height: "100px",  
+    })  
+    view.drawText(permissionMap[plat][permission]["title"], {  
+        top: '40px',  
+        left: "8%",  
+        height: "30px"  
+    }, {  
+        align: "left",  
+        color: "#000",  
+    }, {  
+        onClick: function(e) {  
+            console.log(e);  
+        }  
+    })  
+    view.drawText(permissionMap[plat][permission]["content"], {  
+        top: '65px',  
+        height: "60px",  
+        left: "8%",  
+        width: "84%"  
+    }, {  
+        whiteSpace: 'normal',  
+        size: "14px",  
+        align: "left",  
+        color: "#656563"  
+    })  
+    view.show();  
+}  
+
+export function premissionCheck(permission) {  
+    return new Promise((resolve, reject) => {  
+        let plat = isIos ? "ios" : "android";  
+        if (isIos) { // ios  
+            // const camera = permission.judgeIosPermission("camera");//判断ios是否给予摄像头权限  
+            // //ios相册没权限,系统会自动弹出授权框  
+            // //let photoLibrary = permission.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限  
+            // if(camera){  
+            //     resolve();  
+            // }else{  
+            //     reject('需要开启相机使用权限');  
+            // }  
+            resolve(1)  
+        } else { // android  
+            let permission_arr = permissionMap[plat][permission]["name"].split(",");  
+            let flag = true;  
+            for(let i = 0;i<permission_arr.length;i++) {  
+                let status = plus.navigator.checkPermission(permission_arr[i]);  
+                if(status == "undetermined") {  
+                    flag = false;  
+                }  
+            }  
+            if (flag == false) { // 未完全授权  
+                showViewDesc(permission);  
+                requestAndroidPermission(permissionMap[plat][permission]["name"]).then((res) => {  
+					//view.close();  
+					setTimeout(()=>{
+						 view.close();  
+					},1000);
+                   
+                    if (res == -1) {  
+                        uni.showModal({  
+                            title: '提示',  
+                            content: '操作权限已被拒绝,请手动前往设置',  
+                            confirmText: "立即设置",  
+                            success: (res) => {  
+                                if (res.confirm) {  
+                                    gotoAppPermissionSetting(permission)  
+                                }  
+                            }  
+                        })  
+                    }  
+                    resolve(res)  
+                })  
+            } else {  
+                resolve(1)  
+            }  
+        }  
+    })  
+}  
+
+// module.exports = {  
+//     judgeIosPermission: judgeIosPermission,  
+//     requestAndroidPermission: requestAndroidPermission,  
+//     checkSystemEnableLocation: checkSystemEnableLocation,  
+//     gotoAppPermissionSetting: gotoAppPermissionSetting
+    
+// }

+ 110 - 0
main.js

@@ -0,0 +1,110 @@
+
+import App from './App'
+import Vue from 'vue'
+
+import store from './store'
+// 引入全局uView
+import uView from "@/node_modules/uview-ui";
+
+import {parseIDCardInfo,logout,parseText,getDictLabelName,parseIdCard,getAge,parsePhone,isEmpty,
+isLogin,navBack,navTo,getUserInfo,formatHour,dateFormatStr,registerIdCode,updateMsgDot,handleBindCompanyFsUser,
+setSource,companyUserIsLogin,checkWechatInstalled,isAndroid,isIos,loginNavTo} from './utils/common.js'
+
+import { showLoginPage,getRegistrationID } from './utils/login.js'
+import { formatSeconds,formatDate } from './utils/tools.js'
+import { qconfig } from './utils/config.js'
+// 时间格式化
+import timeFormat from './utils/timeFormat.js'
+//数据格式化
+import dataProcess from './utils/dataProcess.js'
+// Vuex
+import Vuex from 'vuex'
+
+// #ifndef VUE3
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+// Vuex 插件注册
+Vue.use(Vuex)
+Vue.use(uView);
+Vue.prototype.$isLogin = isLogin;
+Vue.prototype.$isEmpty = isEmpty;
+Vue.prototype.$parsePhone = parsePhone;
+Vue.prototype.$showLoginPage = showLoginPage;
+Vue.prototype.$getRegistrationID = getRegistrationID;
+Vue.prototype.$navBack = navBack;
+Vue.prototype.$navTo = navTo;
+Vue.prototype.$qconfig = qconfig;
+Vue.prototype.$getAge = getAge;
+Vue.prototype.$parseIdCard = parseIdCard;
+Vue.prototype.$getDictLabelName = getDictLabelName;
+Vue.prototype.$parseText = parseText;
+Vue.prototype.$logout = logout;
+Vue.prototype.$getUserInfo = getUserInfo;
+Vue.prototype.$dateFormatStr = dateFormatStr;
+Vue.prototype.$registerIdCode = registerIdCode;
+Vue.prototype.$formatSeconds = formatSeconds;
+Vue.prototype.$formatDate = formatDate;
+Vue.prototype.$parseIDCardInfo = parseIDCardInfo;
+Vue.prototype.$timeFormat = timeFormat;
+Vue.prototype.$formatHour = formatHour;
+Vue.prototype.$dataProcess = dataProcess;
+// Vue.prototype.$updateMsgDot = updateMsgDot;
+Vue.prototype.$handleBindCompanyFsUser = handleBindCompanyFsUser;
+Vue.prototype.$setSource = setSource;
+Vue.prototype.$companyUserIsLogin = companyUserIsLogin;
+Vue.prototype.$checkWechatInstalled = checkWechatInstalled;
+Vue.prototype.$isAndroid = isAndroid;
+Vue.prototype.$isIos = isIos;
+Vue.prototype.$loginNavTo = loginNavTo;
+
+const app = new Vue({
+  store,	
+  ...App
+});
+
+// 引入请求封装
+// require("./pages_im/util/request/index")(app);
+
+app.$mount()
+// #endif
+
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+	const app = createSSRApp(App)
+	app.use(uviewPlus)
+	app.use(Vuex)
+	app.use(store)
+	app.config.globalProperties.$isLogin = isLogin
+	app.config.globalProperties.$isEmpty = isEmpty
+	app.config.globalProperties.$parsePhone = parsePhone
+	app.config.globalProperties.$showLoginPage = showLoginPage
+	app.config.globalProperties.$getRegistrationID = getRegistrationID
+	app.config.globalProperties.$navBack = navBack
+	app.config.globalProperties.$navTo = navTo
+	app.config.globalProperties.$qconfig = qconfig
+	app.config.globalProperties.$getAge = getAge
+	app.config.globalProperties.$parseIdCard = parseIdCard
+	app.config.globalProperties.$getDictLabelName = getDictLabelName
+	app.config.globalProperties.$parseText = parseText
+	app.config.globalProperties.$logout = logout,
+	app.config.globalProperties.$getUserInfo = getUserInfo,
+	app.config.globalProperties.$dateFormatStr = dateFormatStr,
+	app.config.globalProperties.$registerIdCode = registerIdCode,
+	app.config.globalProperties.$formatSeconds = formatSeconds, 
+	app.config.globalProperties.$formatDate = formatDate,
+	app.config.globalProperties.$parseIDCardInfo = parseIDCardInfo
+	app.config.globalProperties.$timeFormat = timeFormat;
+	app.config.globalProperties.$formatHour = formatHour;
+	app.config.globalProperties.$dataProcess = dataProcess;
+	// app.config.globalProperties.$updateMsgDot = updateMsgDot;
+	app.config.globalProperties.$handleBindCompanyFsUser = handleBindCompanyFsUser;
+	app.config.globalProperties.$setSource = setSource;
+	app.config.globalProperties.$loginNavTo = loginNavTo;
+	return {
+		app
+	}
+}
+// #endif

+ 392 - 0
manifest.json

@@ -0,0 +1,392 @@
+{
+    "name" : "医疗设备",
+    "appid" : "__UNI__5EE3147",
+    "description" : "汇集丰富的中医药知识,足不出户学中医。包含药膳、经络、中药、名方等,靠谱的医学科普让您学会居家调养,健康生活。",
+    "versionName" : "1.1.1",
+    "versionCode" : 111,
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "image" : {
+            //关闭图片压缩 扫码时
+            "compress" : false
+        },
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : false,
+            "delay" : 0
+        },
+        "safearea" : {
+            "bottom" : {
+                "offset" : "none"
+            }
+        },
+        "compatible" : {
+            "ignoreVersion" : true
+        },
+        "disallowOverscroll" : true, // 确保这里没有设置为 false
+        "scaleMode" : "system", // 确保这里设置为 "system"
+
+        /* 模块配置 */
+        "modules" : {
+            "Geolocation" : {},
+            "Camera" : {},
+            "Bluetooth" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.REQUEST_NOTIFICATION_POLICY\" />",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>",
+                    "<uses-permission android:name=\"com.huawei.android.launcher.permission.CHANGE_BADGE\"/>"
+                ],
+                "notificationChannels" : [
+                    {
+                        "id" : "sticky_channel",
+                        "name" : "IM通知",
+                        "importance" : "high", // 高优先级
+                        "description" : "",
+                        "lights" : true,
+                        "vibration" : true
+                    }
+                ],
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
+                "schemes" : "rtlive",
+                "targetSdkVersion" : 30,
+                "permissionExternalStorage" : {
+                    "request" : "none", //可取值none、once、always。
+                    "prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
+                },
+                "permissionPhoneState" : {
+                    "request" : "none", //可取值none、once、always。
+                    "prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
+                },
+                "minSdkVersion" : 24
+            },
+            /* ios打包配置 */
+            "ios" : {
+                "dSYMs" : false,
+                "inAppPurchase" : [ "vip_month_one", "vip_month_twelve", "vip_month_three" ],
+                "capabilities" : {
+                    "entitlements" : {
+                        "com.apple.developer.associated-domains" : [ "applinks:rtlink.ylrzcloud.com" ]
+                    }
+                },
+                "privacyDescription" : {
+                    "NSPhotoLibraryUsageDescription" : "便于您使用该功能上传您的照片/图片/视频及用于更换头像、下载、问诊等场景中读取相册和文件内容",
+                    "NSPhotoLibraryAddUsageDescription" : "便于您使用该功能上传您的照片/图片/视频及用于更换头像、下载、问诊等场景中写入相册和文件内容",
+                    "NSCameraUsageDescription" : "便于您使用该功能上传图片,用于问诊等场景中发送拍摄图片",
+                    "NSMicrophoneUsageDescription" : "用于发送语音消息、声音采集录制等场景中需要使用麦克风",
+                    "NSBluetoothPeripheralUsageDescription" : "便于您使用该功能连接设备,用于问诊等场景",
+                    "NSBluetoothAlwaysUsageDescription" : "便于您使用该功能连接设备,用于问诊等场景"
+                },
+                "urltypes" : "wwauthf15af5d781bee541000038,wwauth8fddae4df911c6aa000073,wwauthe6e3a3fd25eae04e000015,wwauth44239b22628b206c000099,wwauthdbd998fbb222fd91000093,wwautheb0666cc79d79da5000036,wwauth91088a1e17d81d6d000060,wwautha594e16ad105f9b7000054,wwauth6a7548362b9cad48000058,wwauth70ac72e824957fc9000006,wwauth5a88c4f879f204c5000046,wwauth96c0b2ad89546e5a000012,wwauth12ce922187cbbd36000029,wwauth07d0b538b8fdd29a000034,wwauth3a7bc63475e9f3dd000030,wwauth0590bdbaca51d96e000032,wwauthf49d502737165389000014,wwauth98294fb364da9d9c000031,wwauthdf650a12d59fd4d9000034,wwauth5b5506c754838051000029,wwautha425b9bfad14ba55000008,wwauth4a42ea8c821dc033000013,wwauth27a91d87668dd96d000006",
+                "urlschemewhitelist" : "weixin,weixinULAPI"
+            },
+            /* SDK配置 */
+            "sdkConfigs" : {
+                "ad" : {},
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wx703c4bd07bbd1695",
+                        "UniversalLinks" : "https://rtlink.ylrzcloud.com/uni-universallinks/__UNI__33EAA2D/"
+                    }
+                },
+                "speech" : {},
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wx703c4bd07bbd1695",
+                        "UniversalLinks" : "https://rtlink.ylrzcloud.com/uni-universallinks/__UNI__33EAA2D/"
+                    },
+                    "univerify" : {},
+                    "apple" : {}
+                },
+                "geolocation" : {
+                    "amap" : {
+                        "name" : "amap_15123833209AC3AbYs22",
+                        "__platform__" : [ "ios", "android" ],
+                        "appkey_ios" : "09e2b83babff2b384c0313f4460476a5",
+                        "appkey_android" : "daba44c5e6ad7e5f9d756b4a8c549af2"
+                    },
+                    "system" : {
+                        "__platform__" : [ "ios", "android" ]
+                    }
+                },
+                "push" : {
+                    "unipush" : {
+                        "offline" : true,
+                        "icons" : {
+                            "small" : {
+                                "ldpi" : "unpackage/res/icons/18x18.png",
+                                "mdpi" : "unpackage/res/icons/24x24.png",
+                                "hdpi" : "unpackage/res/icons/36x36.png",
+                                "xhdpi" : "unpackage/res/icons/48x48.png",
+                                "xxhdpi" : "unpackage/res/icons/72x72.png"
+                            }
+                        },
+                        "hms" : {},
+                        "vivo" : {},
+                        "honor" : {},
+                        "oppo" : {},
+                        "mi" : {}
+                    }
+                },
+                "maps" : {},
+                "payment" : {
+                    "appleiap" : {}
+                }
+            },
+            // "push" : {
+            //     "unipush" : null
+            // }
+            "splashscreen" : {
+                "androidStyle" : "common",
+                "useOriginalMsgbox" : true,
+                "android" : {
+                    "hdpi" : "static/images/launch/480x762.png",
+                    "xhdpi" : "static/images/launch/720x1242.png",
+                    "xxhdpi" : "static/images/launch/1080x2340.png"
+                },
+                "iosStyle" : "common"
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            }
+        },
+        "nativePlugins" : {
+            "Ba-CameraView" : {
+                "__plugin_info__" : {
+                    "name" : "Ba-CameraView",
+                    "description" : "",
+                    "platforms" : "Android",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {}
+                }
+            },
+            "SmdtManager" : {
+                "__plugin_info__" : {
+                    "name" : "SMDT设备管理插件",
+                    "description" : "SMDT设备管理插件,适用于Android工业设备和智能终端",
+                    "platforms" : "Android",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {}
+                }
+            },
+            "TyPulse" : {
+                "__plugin_info__" : {
+                    "name" : "TyPulse",
+                    "description" : "TyPulse 测脉插件 - 支持多种测脉模式的 Uniapp 原生插件",
+                    "platforms" : "Android",
+                    "url" : "",
+                    "android_package_name" : "",
+                    "ios_bundle_id" : "",
+                    "isCloud" : false,
+                    "bought" : -1,
+                    "pid" : "",
+                    "parameters" : {}
+                }
+            }
+        },
+        "uniStatistics" : {
+            "enable" : true
+        },
+        "uniCloud" : {
+            "provider" : "aliyun",
+            "spaceId" : "96f0e031-f37a-48ef-84c7-2023f6360c0a",
+            "clientSecret" : "9+KF0lfvaf+If/thEM0DEg==",
+            "endpoint" : "https://api.next.bspapp.com"
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx703c4bd07bbd1695",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "获取您的位置信息为了更好的推荐服务"
+            }
+        },
+        "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false,
+        "version" : "2"
+    },
+    "vueVersion" : "2",
+    "compilerOptions" : {
+        "minify" : true,
+        "treeShaking" : true,
+        "sourceMap" : false
+    },
+    // "compatConfig" : {
+    //     "MODE" : 2 // 启用Vue2兼容模式
+    // }
+    "h5" : {
+        "title" : "医疗设备",
+        "devServer" : {
+            "https" : false
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : true
+            }
+        },
+        "router" : {
+            "mode" : "history",
+            "base" : "/"
+        },
+        "sdkConfigs" : {
+            "maps" : {
+                "amap" : {
+                    "key" : "ae15f2eb04bbc8e9f2963430f0943a42",
+                    "securityJsCode" : "",
+                    "serviceHost" : ""
+                }
+            }
+        },
+        "template" : "template.h5.html"
+    },
+    "sassImplementationName" : "node-sass",
+    "channel_list" : [
+        {
+            "id" : "master",
+            "name" : "官方渠道"
+        },
+        {
+            "id" : "baidu",
+            "name" : "百度"
+        },
+        {
+            "id" : "yyb",
+            "name" : "应用宝"
+        },
+        {
+            "id" : "yybh5",
+            "name" : "应用宝h5"
+        },
+        {
+            "id" : "yybadv",
+            "name" : "应用宝投流"
+        },
+        {
+            "id" : "yybadv1",
+            "name" : "应用宝投流1"
+        },
+        {
+            "id" : "huawei",
+            "name" : "华为"
+        },
+        {
+            "id" : "honor",
+            "name" : "荣耀"
+        },
+        {
+            "id" : "xiaomi",
+            "name" : "小米"
+        },
+        {
+            "id" : "oppo",
+            "name" : "oppo"
+        },
+        {
+            "id" : "vivo",
+            "name" : "vivo"
+        },
+        {
+            "id" : "softworks",
+            "name" : "软著"
+        }
+    ],
+    "app-harmony" : {
+        "distribute" : {
+            "modules" : {},
+            "bundleName" : "com.mytek.device"
+        }
+    },
+    "_spaceID" : "mp-788b1d8f-c300-465c-9e38-c986b162ae93"
+}
+// 高优先级
+//可取值none、once、always。
+//可取值none、once、always。
+

BIN
nativeplugins/Ba-CameraView.zip


BIN
nativeplugins/Ba-CameraView/android/camera-release.aar


+ 31 - 0
nativeplugins/Ba-CameraView/package.json

@@ -0,0 +1,31 @@
+{
+	"name": "Ba-CameraView",
+	"id": "Ba-CameraView",
+	"version": "1.1",
+	"description": "",
+	"_dp_type": "nativeplugin",
+	"_dp_nativeplugin": {
+		"android": {
+			"plugins": [{
+				"type": "component",
+				"name": "Ba-CameraView",
+				"class": "com.ba.camera.CameraView"
+			}],
+			"integrateType": "aar",
+			"minSdkVersion": 21,
+			"excludeDependencies": [],
+			"dependencies": [
+				"androidx.appcompat:appcompat:1.3.0",
+				"com.google.android.material:material:1.5.0",
+				"androidx.exifinterface:exifinterface:1.3.7",
+				"androidx.camera:camera-core:1.0.2",
+				"androidx.camera:camera-camera2:1.0.2",
+				"androidx.camera:camera-lifecycle:1.0.2",
+				"androidx.camera:camera-view:1.0.0-alpha25",
+				"com.theartofdev.edmodo:android-image-cropper:2.8.+"
+			],
+			"useAndroidX": true,
+			"abis": ["armeabi-v7a", "arm64-v8a", "x86"]
+		}
+	}
+}

BIN
nativeplugins/SmdtManager/android/smdtManager-release.aar


+ 52 - 0
nativeplugins/SmdtManager/package.json

@@ -0,0 +1,52 @@
+{
+  "name": "SmdtManager",
+  "id": "SmdtManager",
+  "displayName": "SMDT设备管理插件",
+  "version": "1.0.0",
+  "description": "SMDT设备管理插件,适用于Android工业设备和智能终端",
+  "main": "index.js",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "_dp_type": "nativeplugin",
+  "_dp_nativeplugin": {
+    "android": {
+      "plugins": [
+        {
+          "type": "module",
+          "name": "SmdtManager", 
+          "class": "com.smdt.manager.SmdtManager"
+        }
+      ],
+      "integrateType": "aar",
+      "dependencies": [
+        "androidx.appcompat:appcompat:1.4.2",
+        "com.alibaba:fastjson:1.2.83"
+      ],
+      "permissions": [
+        "android.permission.ACCESS_NETWORK_STATE",
+        "android.permission.BLUETOOTH",
+        "android.permission.BLUETOOTH_ADMIN",
+        "android.permission.SYSTEM_ALERT_WINDOW",
+        "android.permission.WRITE_EXTERNAL_STORAGE",
+        "android.permission.READ_EXTERNAL_STORAGE",
+        "android.permission.CAMERA",
+        "android.permission.VIBRATE",
+        "android.permission.FLASHLIGHT",
+        "android.permission.ACCESS_WIFI_STATE",
+        "android.permission.CHANGE_WIFI_STATE",
+        "android.permission.ACCESS_FINE_LOCATION",
+        "android.permission.ACCESS_COARSE_LOCATION"
+      ],
+      "minSdkVersion": "21",
+      "abis": [
+        "armeabi-v7a",
+        "arm64-v8a",
+        "x86",
+        "x86_64"
+      ]
+    }
+  },
+  "author": "SMDT",
+  "license": "MIT"
+}

BIN
nativeplugins/TyPulse/android/typulse-release.aar


+ 145 - 0
nativeplugins/TyPulse/package.json

@@ -0,0 +1,145 @@
+{
+  "name": "TyPulse",
+  "id": "TyPulse",
+  "version": "1.0.0",
+  "description": "TyPulse 测脉插件 - 支持多种测脉模式的 Uniapp 原生插件",
+  "main": "index.js",
+  "_dp_type": "nativeplugin",
+  "_dp_nativeplugin": {
+    "android": {
+      "plugins": [
+        {
+          "type": "module",
+          "name": "TyPulseManager",
+          "class": "com.taiyi.typulse.TyPulseManager"
+        }
+      ],
+      "integrateType": "aar",
+      "dependencies": [
+        "androidx.recyclerview:recyclerview:1.0.0",
+        "com.alibaba:fastjson:1.1.46.android",
+        "com.google.android.material:material:1.5.0",
+        "com.android.volley:volley:1.2.1",
+        "org.greenrobot:eventbus:3.2.0",
+        "io.reactivex.rxjava2:rxjava:2.2.8",
+        "io.reactivex.rxjava2:rxandroid:2.1.1",
+        "com.jakewharton.rxbinding2:rxbinding:2.2.0",
+        "com.aliyun.dpa:oss-android-sdk:2.9.2",
+        "com.github.PhilJay:MPAndroidChart:v3.1.0",
+        "com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50",
+        "com.github.bumptech.glide:glide:4.12.0",
+        "com.opencsv:opencsv:5.5.2",
+        "androidx.cardview:cardview:1.0.0"
+      ],
+      "permissions": [
+        "android.permission.BLUETOOTH",
+        "android.permission.BLUETOOTH_ADMIN",
+        "android.permission.ACCESS_COARSE_LOCATION",
+        "android.permission.ACCESS_FINE_LOCATION",
+        "android.permission.BLUETOOTH_CONNECT",
+        "android.permission.BLUETOOTH_SCAN",
+        "android.permission.BLUETOOTH_ADVERTISE",
+        "android.permission.USB_PERMISSION",
+        "android.permission.WRITE_EXTERNAL_STORAGE",
+        "android.permission.READ_EXTERNAL_STORAGE",
+        "android.permission.INTERNET",
+        "android.permission.ACCESS_NETWORK_STATE",
+        "android.permission.WAKE_LOCK"
+      ],
+      "minSdkVersion": "21",
+      "abis": [
+        "armeabi-v7a",
+        "arm64-v8a"
+      ]
+    }
+  },
+  "keywords": [
+    "测脉",
+    "脉搏",
+    "健康",
+    "医疗",
+    "蓝牙",
+    "USB",
+    "传感器",
+    "pulse",
+    "measurement",
+    "taiyi"
+  ],
+  "author": "TaiYi Technology",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": ""
+  },
+  "engines": {
+    "HBuilderX": "^3.0.0"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "蓝牙权限、位置权限、USB权限、存储权限、网络权限"
+    },
+    "npmurl": ""
+  },
+  
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "n",
+          "Android Browser": "n",
+          "微信浏览器(Android)": "n",
+          "QQ浏览器(Android)": "n"
+        },
+        "H5-pc": {
+          "Chrome": "n",
+          "IE": "n",
+          "Edge": "n",
+          "Firefox": "n",
+          "Safari": "n"
+        },
+        "小程序": {
+          "微信": "n",
+          "阿里": "n",
+          "百度": "n",
+          "字节跳动": "n",
+          "QQ": "n",
+          "钉钉": "n",
+          "快手": "n",
+          "飞书": "n",
+          "京东": "n"
+        },
+        "快应用": {
+          "华为": "n",
+          "联盟": "n"
+        }
+      }
+    }
+  }
+}

+ 2447 - 0
package-lock.json

@@ -0,0 +1,2447 @@
+{
+    "name": "elise-audio-play",
+    "version": "0.0.1",
+    "lockfileVersion": 3,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "elise-audio-play",
+            "version": "0.0.1",
+            "dependencies": {
+                "@openim/client-sdk": "0.0.13",
+                "aegis-web-sdk": "^1.39.2",
+                "aegis-weex-sdk": "^1.38.1",
+                "date-fns": "^2.30.0",
+                "dayjs": "^1.11.13",
+                "image-tools": "^1.4.0",
+                "jsqr": "^1.4.0",
+                "jweixin-module": "^1.6.0",
+                "md5": "^2.3.0",
+                "open-im-sdk": "^3.4.1",
+                "openim-uniapp-polyfill": "^1.4.3",
+                "uuid": "^9.0.0",
+                "uview-ui": "^2.0.34",
+                "vuex": "^4.1.0",
+                "weixin-js-sdk": "^1.6.5",
+                "xgplayer": "^3.0.21",
+                "xlsx": "^0.18.5"
+            },
+            "devDependencies": {
+                "@dcloudio/vue-cli-plugin-uni": "^2.0.2-4010520240507001",
+                "autoprefixer": "^10.4.19",
+                "eslint": "^8.57.1",
+                "postcss": "^8.5.6"
+            }
+        },
+        "node_modules/@babel/runtime": {
+            "version": "7.27.0",
+            "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.0.tgz",
+            "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
+            "dependencies": {
+                "regenerator-runtime": "^0.14.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@dcloudio/uni-stat": {
+            "version": "2.0.2-4050720250324001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-2.0.2-4050720250324001.tgz",
+            "integrity": "sha512-LdDDWqPOPdQfwAXAwQbtKhhSg+iuq2xxVdRt/E71OUELaMxJnFXRHkQ0uIlHGg6bhVcId/btsj/t6F2fqsSKwQ==",
+            "dev": true
+        },
+        "node_modules/@dcloudio/vue-cli-plugin-uni": {
+            "version": "2.0.2-4050720250324001",
+            "resolved": "https://registry.npmmirror.com/@dcloudio/vue-cli-plugin-uni/-/vue-cli-plugin-uni-2.0.2-4050720250324001.tgz",
+            "integrity": "sha512-K5iUAnnega8jouqKCjfuvY67jPXo0xG9xlmHdE7BJCrP+eLca+Sn2XjRZOFN2y118Y7KFB1HxC3V9gefUgUa2Q==",
+            "dev": true,
+            "dependencies": {
+                "@dcloudio/uni-stat": "^2.0.2-4050720250324001",
+                "buffer-json": "^2.0.0",
+                "clone-deep": "^4.0.1",
+                "cross-env": "^5.2.0",
+                "envinfo": "^6.0.1",
+                "hash-sum": "^1.0.2",
+                "loader-utils": "^1.1.0",
+                "lru-cache": "^4.1.2",
+                "mkdirp": "^0.5.1",
+                "module-alias": "^2.1.0",
+                "neo-async": "^2.6.1",
+                "postcss-import": "^12.0.1",
+                "postcss-selector-parser": "^5.0.0",
+                "postcss-value-parser": "^3.3.1",
+                "strip-json-comments": "^2.0.1",
+                "update-check": "^1.5.3",
+                "webpack-merge": "^4.1.4",
+                "wrap-loader": "^0.2.0",
+                "xregexp": "4.0.0"
+            },
+            "bin": {
+                "uniapp-cli": "bin/uniapp-cli.js"
+            },
+            "peerDependencies": {
+                "copy-webpack-plugin": ">=5",
+                "postcss": ">=7"
+            }
+        },
+        "node_modules/@eslint-community/eslint-utils": {
+            "version": "4.6.0",
+            "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz",
+            "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==",
+            "dev": true,
+            "dependencies": {
+                "eslint-visitor-keys": "^3.4.3"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+            }
+        },
+        "node_modules/@eslint-community/regexpp": {
+            "version": "4.12.1",
+            "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+            "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+            "dev": true,
+            "engines": {
+                "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@eslint/eslintrc": {
+            "version": "2.1.4",
+            "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+            "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+            "dev": true,
+            "dependencies": {
+                "ajv": "^6.12.4",
+                "debug": "^4.3.2",
+                "espree": "^9.6.0",
+                "globals": "^13.19.0",
+                "ignore": "^5.2.0",
+                "import-fresh": "^3.2.1",
+                "js-yaml": "^4.1.0",
+                "minimatch": "^3.1.2",
+                "strip-json-comments": "^3.1.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/@eslint/js": {
+            "version": "8.57.1",
+            "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz",
+            "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@humanwhocodes/config-array": {
+            "version": "0.13.0",
+            "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+            "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+            "deprecated": "Use @eslint/config-array instead",
+            "dev": true,
+            "dependencies": {
+                "@humanwhocodes/object-schema": "^2.0.3",
+                "debug": "^4.3.1",
+                "minimatch": "^3.0.5"
+            },
+            "engines": {
+                "node": ">=10.10.0"
+            }
+        },
+        "node_modules/@humanwhocodes/module-importer": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+            "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.22"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/nzakas"
+            }
+        },
+        "node_modules/@humanwhocodes/object-schema": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+            "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+            "deprecated": "Use @eslint/object-schema instead",
+            "dev": true
+        },
+        "node_modules/@nodelib/fs.scandir": {
+            "version": "2.1.5",
+            "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.stat": "2.0.5",
+                "run-parallel": "^1.1.9"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.stat": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.walk": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.scandir": "2.1.5",
+                "fastq": "^1.6.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@openim/client-sdk": {
+            "version": "0.0.13",
+            "resolved": "https://registry.npmmirror.com/@openim/client-sdk/-/client-sdk-0.0.13.tgz",
+            "integrity": "sha512-piiSzG5oD0BsaVjBbeeoWVQtyaiFLQNPOcQIh7UAVbK0Qd4bwMFYTLjlGuAJ2IfUtv2QJsR8+dWXaPs/aGBo7Q==",
+            "dependencies": {
+                "@openim/protocol": "^0.0.7-alpha.1",
+                "base64-arraybuffer": "^1.0.2",
+                "loglevel": "^1.9.2",
+                "spark-md5": "^3.0.2"
+            }
+        },
+        "node_modules/@openim/protocol": {
+            "version": "0.0.7",
+            "resolved": "https://registry.npmmirror.com/@openim/protocol/-/protocol-0.0.7.tgz",
+            "integrity": "sha512-OWc1ZGToI06NA9PVxzKUOSzN9RcEe6wx5R/dGqyDfEtBReqRw553cO7KlfYHyltvKovImhWK9X0079IBqc6h6g=="
+        },
+        "node_modules/@ungap/structured-clone": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+            "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+            "dev": true
+        },
+        "node_modules/@vue/devtools-api": {
+            "version": "6.6.4",
+            "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+            "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+        },
+        "node_modules/acorn": {
+            "version": "8.14.1",
+            "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz",
+            "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+            "dev": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-jsx": {
+            "version": "5.3.2",
+            "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+            "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+            "dev": true,
+            "peerDependencies": {
+                "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+            }
+        },
+        "node_modules/adler-32": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+            "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/aegis-web-sdk": {
+            "version": "1.39.2",
+            "resolved": "https://registry.npmmirror.com/aegis-web-sdk/-/aegis-web-sdk-1.39.2.tgz",
+            "integrity": "sha512-mu2jfgACsyvfOaKN2auYmVcQjPCkWtzPWU/ywofIgU44oGmTfDSBNaskUa0CtdVOq5XDWdtiCxzjT+dKmyFPhw==",
+            "dependencies": {
+                "web-vitals": "^3.4.0"
+            }
+        },
+        "node_modules/aegis-weex-sdk": {
+            "version": "1.38.1",
+            "resolved": "https://registry.npmmirror.com/aegis-weex-sdk/-/aegis-weex-sdk-1.38.1.tgz",
+            "integrity": "sha512-xUBU536yLpmvUiP4vKOFDSnS0BZplFzF0LmvwixMGa1TJ+DwxGzIAkG65+NDnXMgcxuxZGZIl8qdd4OnfkwQiQ=="
+        },
+        "node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "dev": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/argparse": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+            "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+            "dev": true
+        },
+        "node_modules/autoprefixer": {
+            "version": "10.4.21",
+            "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz",
+            "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "browserslist": "^4.24.4",
+                "caniuse-lite": "^1.0.30001702",
+                "fraction.js": "^4.3.7",
+                "normalize-range": "^0.1.2",
+                "picocolors": "^1.1.1",
+                "postcss-value-parser": "^4.2.0"
+            },
+            "bin": {
+                "autoprefixer": "bin/autoprefixer"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            },
+            "peerDependencies": {
+                "postcss": "^8.1.0"
+            }
+        },
+        "node_modules/autoprefixer/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "dev": true
+        },
+        "node_modules/autoprefixer/node_modules/postcss-value-parser": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+            "dev": true
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+            "dev": true
+        },
+        "node_modules/base64-arraybuffer": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+            "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
+            "engines": {
+                "node": ">= 0.6.0"
+            }
+        },
+        "node_modules/big.js": {
+            "version": "5.2.2",
+            "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
+            "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+            "dev": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/browserslist": {
+            "version": "4.24.4",
+            "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.4.tgz",
+            "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "caniuse-lite": "^1.0.30001688",
+                "electron-to-chromium": "^1.5.73",
+                "node-releases": "^2.0.19",
+                "update-browserslist-db": "^1.1.1"
+            },
+            "bin": {
+                "browserslist": "cli.js"
+            },
+            "engines": {
+                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+            }
+        },
+        "node_modules/buffer-json": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/buffer-json/-/buffer-json-2.0.0.tgz",
+            "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==",
+            "dev": true
+        },
+        "node_modules/callsites": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/caniuse-lite": {
+            "version": "1.0.30001713",
+            "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz",
+            "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ]
+        },
+        "node_modules/cfb": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+            "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+            "dependencies": {
+                "adler-32": "~1.3.0",
+                "crc-32": "~1.2.0"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/charenc": {
+            "version": "0.0.2",
+            "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
+            "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/clone-deep": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz",
+            "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+            "dev": true,
+            "dependencies": {
+                "is-plain-object": "^2.0.4",
+                "kind-of": "^6.0.2",
+                "shallow-clone": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/codepage": {
+            "version": "1.15.0",
+            "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+            "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+            "dev": true
+        },
+        "node_modules/crc-32": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+            "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+            "bin": {
+                "crc32": "bin/crc32.njs"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/cross-env": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-5.2.1.tgz",
+            "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==",
+            "dev": true,
+            "dependencies": {
+                "cross-spawn": "^6.0.5"
+            },
+            "bin": {
+                "cross-env": "dist/bin/cross-env.js",
+                "cross-env-shell": "dist/bin/cross-env-shell.js"
+            },
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/cross-spawn": {
+            "version": "6.0.6",
+            "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.6.tgz",
+            "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
+            "dev": true,
+            "dependencies": {
+                "nice-try": "^1.0.4",
+                "path-key": "^2.0.1",
+                "semver": "^5.5.0",
+                "shebang-command": "^1.2.0",
+                "which": "^1.2.9"
+            },
+            "engines": {
+                "node": ">=4.8"
+            }
+        },
+        "node_modules/crypt": {
+            "version": "0.0.2",
+            "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
+            "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/cssesc": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-2.0.0.tgz",
+            "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+            "dev": true,
+            "bin": {
+                "cssesc": "bin/cssesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/d": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+            "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+            "dependencies": {
+                "es5-ext": "^0.10.64",
+                "type": "^2.7.2"
+            },
+            "engines": {
+                "node": ">=0.12"
+            }
+        },
+        "node_modules/danmu.js": {
+            "version": "1.1.13",
+            "resolved": "https://registry.npmmirror.com/danmu.js/-/danmu.js-1.1.13.tgz",
+            "integrity": "sha512-knFd0/cB2HA4FFWiA7eB2suc5vCvoHdqio33FyyCSfP7C+1A+zQcTvnvwfxaZhrxsGj4qaQI2I8XiTqedRaVmg==",
+            "dependencies": {
+                "event-emitter": "^0.3.5"
+            }
+        },
+        "node_modules/date-fns": {
+            "version": "2.30.0",
+            "resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-2.30.0.tgz",
+            "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+            "dependencies": {
+                "@babel/runtime": "^7.21.0"
+            },
+            "engines": {
+                "node": ">=0.11"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/date-fns"
+            }
+        },
+        "node_modules/dayjs": {
+            "version": "1.11.13",
+            "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+            "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+        },
+        "node_modules/debug": {
+            "version": "4.4.0",
+            "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
+            "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+            "dev": true,
+            "dependencies": {
+                "ms": "^2.1.3"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/deep-extend": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz",
+            "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/deep-is": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+            "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+            "dev": true
+        },
+        "node_modules/delegate": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+            "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+        },
+        "node_modules/doctrine": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
+            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+            "dev": true,
+            "dependencies": {
+                "esutils": "^2.0.2"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/downloadjs": {
+            "version": "1.4.7",
+            "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz",
+            "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
+        },
+        "node_modules/electron-to-chromium": {
+            "version": "1.5.136",
+            "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz",
+            "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==",
+            "dev": true
+        },
+        "node_modules/emojis-list": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
+            "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/envinfo": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmmirror.com/envinfo/-/envinfo-6.0.1.tgz",
+            "integrity": "sha512-IbMWvMQulMm1hiky1Zt5YTcSDEdZs0r9bt77mcLa4RUAKRYTGZvrb3MtAt47FuldPxwL+u2LtQex1FajIW1/Cw==",
+            "dev": true,
+            "bin": {
+                "envinfo": "dist/cli.js"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/es5-ext": {
+            "version": "0.10.64",
+            "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+            "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+            "hasInstallScript": true,
+            "dependencies": {
+                "es6-iterator": "^2.0.3",
+                "es6-symbol": "^3.1.3",
+                "esniff": "^2.0.1",
+                "next-tick": "^1.1.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/es6-iterator": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+            "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+            "dependencies": {
+                "d": "1",
+                "es5-ext": "^0.10.35",
+                "es6-symbol": "^3.1.1"
+            }
+        },
+        "node_modules/es6-symbol": {
+            "version": "3.1.4",
+            "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+            "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+            "dependencies": {
+                "d": "^1.0.2",
+                "ext": "^1.7.0"
+            },
+            "engines": {
+                "node": ">=0.12"
+            }
+        },
+        "node_modules/escalade": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+            "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+            "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/eslint": {
+            "version": "8.57.1",
+            "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz",
+            "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+            "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+            "dev": true,
+            "dependencies": {
+                "@eslint-community/eslint-utils": "^4.2.0",
+                "@eslint-community/regexpp": "^4.6.1",
+                "@eslint/eslintrc": "^2.1.4",
+                "@eslint/js": "8.57.1",
+                "@humanwhocodes/config-array": "^0.13.0",
+                "@humanwhocodes/module-importer": "^1.0.1",
+                "@nodelib/fs.walk": "^1.2.8",
+                "@ungap/structured-clone": "^1.2.0",
+                "ajv": "^6.12.4",
+                "chalk": "^4.0.0",
+                "cross-spawn": "^7.0.2",
+                "debug": "^4.3.2",
+                "doctrine": "^3.0.0",
+                "escape-string-regexp": "^4.0.0",
+                "eslint-scope": "^7.2.2",
+                "eslint-visitor-keys": "^3.4.3",
+                "espree": "^9.6.1",
+                "esquery": "^1.4.2",
+                "esutils": "^2.0.2",
+                "fast-deep-equal": "^3.1.3",
+                "file-entry-cache": "^6.0.1",
+                "find-up": "^5.0.0",
+                "glob-parent": "^6.0.2",
+                "globals": "^13.19.0",
+                "graphemer": "^1.4.0",
+                "ignore": "^5.2.0",
+                "imurmurhash": "^0.1.4",
+                "is-glob": "^4.0.0",
+                "is-path-inside": "^3.0.3",
+                "js-yaml": "^4.1.0",
+                "json-stable-stringify-without-jsonify": "^1.0.1",
+                "levn": "^0.4.1",
+                "lodash.merge": "^4.6.2",
+                "minimatch": "^3.1.2",
+                "natural-compare": "^1.4.0",
+                "optionator": "^0.9.3",
+                "strip-ansi": "^6.0.1",
+                "text-table": "^0.2.0"
+            },
+            "bin": {
+                "eslint": "bin/eslint.js"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint-scope": {
+            "version": "7.2.2",
+            "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
+            "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint-visitor-keys": {
+            "version": "3.4.3",
+            "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+            "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint/node_modules/cross-spawn": {
+            "version": "7.0.6",
+            "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+            "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+            "dev": true,
+            "dependencies": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/eslint/node_modules/path-key": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/eslint/node_modules/shebang-command": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+            "dev": true,
+            "dependencies": {
+                "shebang-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/eslint/node_modules/shebang-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/eslint/node_modules/which": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "node-which": "bin/node-which"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/esniff": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+            "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+            "dependencies": {
+                "d": "^1.0.1",
+                "es5-ext": "^0.10.62",
+                "event-emitter": "^0.3.5",
+                "type": "^2.7.2"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/espree": {
+            "version": "9.6.1",
+            "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
+            "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^8.9.0",
+                "acorn-jsx": "^5.3.2",
+                "eslint-visitor-keys": "^3.4.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/esquery": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz",
+            "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+            "dev": true,
+            "dependencies": {
+                "estraverse": "^5.1.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/esrecurse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+            "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+            "dev": true,
+            "dependencies": {
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esutils": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/event-emitter": {
+            "version": "0.3.5",
+            "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+            "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+            "dependencies": {
+                "d": "1",
+                "es5-ext": "~0.10.14"
+            }
+        },
+        "node_modules/eventemitter3": {
+            "version": "4.0.7",
+            "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+            "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+        },
+        "node_modules/ext": {
+            "version": "1.7.0",
+            "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+            "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+            "dependencies": {
+                "type": "^2.7.2"
+            }
+        },
+        "node_modules/fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+            "dev": true
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+            "dev": true
+        },
+        "node_modules/fast-levenshtein": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+            "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+            "dev": true
+        },
+        "node_modules/fastq": {
+            "version": "1.19.1",
+            "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
+            "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+            "dev": true,
+            "dependencies": {
+                "reusify": "^1.0.4"
+            }
+        },
+        "node_modules/file-entry-cache": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+            "dev": true,
+            "dependencies": {
+                "flat-cache": "^3.0.4"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/find-up": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+            "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+            "dev": true,
+            "dependencies": {
+                "locate-path": "^6.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/flat-cache": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz",
+            "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+            "dev": true,
+            "dependencies": {
+                "flatted": "^3.2.9",
+                "keyv": "^4.5.3",
+                "rimraf": "^3.0.2"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/flatted": {
+            "version": "3.3.3",
+            "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz",
+            "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+            "dev": true
+        },
+        "node_modules/frac": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+            "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/fraction.js": {
+            "version": "4.3.7",
+            "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz",
+            "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+            "dev": true,
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "type": "patreon",
+                "url": "https://github.com/sponsors/rawify"
+            }
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+            "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+            "dev": true
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+            "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+            "dev": true,
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.2.3",
+            "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "deprecated": "Glob versions prior to v9 are no longer supported",
+            "dev": true,
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.1.1",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
+            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.3"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/globals": {
+            "version": "13.24.0",
+            "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
+            "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.20.2"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/graphemer": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
+            "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+            "dev": true
+        },
+        "node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/hash-sum": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz",
+            "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+            "dev": true
+        },
+        "node_modules/hasown": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+            "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+            "dev": true,
+            "dependencies": {
+                "function-bind": "^1.1.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
+        "node_modules/ignore": {
+            "version": "5.3.2",
+            "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
+            "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/image-tools": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmmirror.com/image-tools/-/image-tools-1.4.0.tgz",
+            "integrity": "sha512-TKtvJ6iUwM0mfaD4keMnk1ENHFC470QEjBfA3IlvKdEOufzvWbjbaoNcoyYq6HlViF8+d5tOS1ooE6j7CHf1lQ=="
+        },
+        "node_modules/import-fresh": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
+            "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+            "dev": true,
+            "dependencies": {
+                "parent-module": "^1.0.0",
+                "resolve-from": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/imurmurhash": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.19"
+            }
+        },
+        "node_modules/indexes-of": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz",
+            "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==",
+            "dev": true
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+            "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+            "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+            "dev": true,
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+            "dev": true
+        },
+        "node_modules/ini": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
+            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+            "dev": true
+        },
+        "node_modules/is-buffer": {
+            "version": "1.1.6",
+            "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+        },
+        "node_modules/is-core-module": {
+            "version": "2.16.1",
+            "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz",
+            "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+            "dev": true,
+            "dependencies": {
+                "hasown": "^2.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-glob": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+            "dev": true,
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-path-inside": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz",
+            "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-plain-object": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+            "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+            "dev": true,
+            "dependencies": {
+                "isobject": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+            "dev": true
+        },
+        "node_modules/isobject": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+            "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/js-yaml": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+            "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+            "dev": true,
+            "dependencies": {
+                "argparse": "^2.0.1"
+            },
+            "bin": {
+                "js-yaml": "bin/js-yaml.js"
+            }
+        },
+        "node_modules/json-buffer": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
+            "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+            "dev": true
+        },
+        "node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+            "dev": true
+        },
+        "node_modules/json-stable-stringify-without-jsonify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+            "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+            "dev": true
+        },
+        "node_modules/json5": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz",
+            "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+            "dev": true,
+            "dependencies": {
+                "minimist": "^1.2.0"
+            },
+            "bin": {
+                "json5": "lib/cli.js"
+            }
+        },
+        "node_modules/jsqr": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmmirror.com/jsqr/-/jsqr-1.4.0.tgz",
+            "integrity": "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A=="
+        },
+        "node_modules/jweixin-module": {
+            "version": "1.6.0",
+            "resolved": "https://registry.npmmirror.com/jweixin-module/-/jweixin-module-1.6.0.tgz",
+            "integrity": "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
+        },
+        "node_modules/keyv": {
+            "version": "4.5.4",
+            "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
+            "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+            "dev": true,
+            "dependencies": {
+                "json-buffer": "3.0.1"
+            }
+        },
+        "node_modules/kind-of": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+            "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/levn": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
+            "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "^1.2.1",
+                "type-check": "~0.4.0"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/loader-utils": {
+            "version": "1.4.2",
+            "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz",
+            "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+            "dev": true,
+            "dependencies": {
+                "big.js": "^5.2.2",
+                "emojis-list": "^3.0.0",
+                "json5": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/locate-path": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+            "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+            "dev": true,
+            "dependencies": {
+                "p-locate": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/lodash": {
+            "version": "4.17.21",
+            "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+            "dev": true
+        },
+        "node_modules/lodash.merge": {
+            "version": "4.6.2",
+            "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+            "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+            "dev": true
+        },
+        "node_modules/loglevel": {
+            "version": "1.9.2",
+            "resolved": "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.2.tgz",
+            "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+            "engines": {
+                "node": ">= 0.6.0"
+            },
+            "funding": {
+                "type": "tidelift",
+                "url": "https://tidelift.com/funding/github/npm/loglevel"
+            }
+        },
+        "node_modules/lru-cache": {
+            "version": "4.1.5",
+            "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz",
+            "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+            "dev": true,
+            "dependencies": {
+                "pseudomap": "^1.0.2",
+                "yallist": "^2.1.2"
+            }
+        },
+        "node_modules/md5": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
+            "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+            "dependencies": {
+                "charenc": "0.0.2",
+                "crypt": "0.0.2",
+                "is-buffer": "~1.1.6"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+            "dev": true,
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+            "dev": true,
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "0.5.6",
+            "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+            "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+            "dev": true,
+            "dependencies": {
+                "minimist": "^1.2.6"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/module-alias": {
+            "version": "2.2.3",
+            "resolved": "https://registry.npmmirror.com/module-alias/-/module-alias-2.2.3.tgz",
+            "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==",
+            "dev": true
+        },
+        "node_modules/ms": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+            "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+            "dev": true
+        },
+        "node_modules/nanoid": {
+            "version": "3.3.11",
+            "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+            "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "bin": {
+                "nanoid": "bin/nanoid.cjs"
+            },
+            "engines": {
+                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+            }
+        },
+        "node_modules/natural-compare": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
+            "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+            "dev": true
+        },
+        "node_modules/neo-async": {
+            "version": "2.6.2",
+            "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+            "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+            "dev": true
+        },
+        "node_modules/next-tick": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+            "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+        },
+        "node_modules/nice-try": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",
+            "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+            "dev": true
+        },
+        "node_modules/node-releases": {
+            "version": "2.0.19",
+            "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
+            "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+            "dev": true
+        },
+        "node_modules/normalize-range": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz",
+            "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+            "dev": true,
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/open-im-sdk": {
+            "version": "3.5.2",
+            "resolved": "https://registry.npmmirror.com/open-im-sdk/-/open-im-sdk-3.5.2.tgz",
+            "integrity": "sha512-gOpi1WrLBXKUu9IVb/VmWGUn3Iaa9qxCzP5w5GkofLFtwooLO7XoC/Rs3EN+m+Zemc7BPTRkvdHQr7khV1iDMQ==",
+            "deprecated": "This package is deprecated. Please use '@openim/client-sdk' instead."
+        },
+        "node_modules/openim-uniapp-polyfill": {
+            "version": "1.4.3",
+            "resolved": "https://registry.npmmirror.com/openim-uniapp-polyfill/-/openim-uniapp-polyfill-1.4.3.tgz",
+            "integrity": "sha512-EXqdsQvgnrcNadIzUhychlWdqPn7zEYfZnMxeO7JOabdBib3DLkz3aL3tHBA8NAZatDmE7LW9DEyN5G1CnePEg==",
+            "peerDependencies": {
+                "@openim/client-sdk": "*"
+            }
+        },
+        "node_modules/optionator": {
+            "version": "0.9.4",
+            "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
+            "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+            "dev": true,
+            "dependencies": {
+                "deep-is": "^0.1.3",
+                "fast-levenshtein": "^2.0.6",
+                "levn": "^0.4.1",
+                "prelude-ls": "^1.2.1",
+                "type-check": "^0.4.0",
+                "word-wrap": "^1.2.5"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+            "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+            "dev": true,
+            "dependencies": {
+                "yocto-queue": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+            "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+            "dev": true,
+            "dependencies": {
+                "p-limit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/parent-module": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+            "dev": true,
+            "dependencies": {
+                "callsites": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz",
+            "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+            "dev": true
+        },
+        "node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "dev": true
+        },
+        "node_modules/pify": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz",
+            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/postcss": {
+            "version": "8.5.6",
+            "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+            "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/postcss"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "nanoid": "^3.3.11",
+                "picocolors": "^1.1.1",
+                "source-map-js": "^1.2.1"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            }
+        },
+        "node_modules/postcss-import": {
+            "version": "12.0.1",
+            "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-12.0.1.tgz",
+            "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==",
+            "dev": true,
+            "dependencies": {
+                "postcss": "^7.0.1",
+                "postcss-value-parser": "^3.2.3",
+                "read-cache": "^1.0.0",
+                "resolve": "^1.1.7"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/postcss-import/node_modules/picocolors": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz",
+            "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+            "dev": true
+        },
+        "node_modules/postcss-import/node_modules/postcss": {
+            "version": "7.0.39",
+            "resolved": "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz",
+            "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+            "dev": true,
+            "dependencies": {
+                "picocolors": "^0.2.1",
+                "source-map": "^0.6.1"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            }
+        },
+        "node_modules/postcss-selector-parser": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+            "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+            "dev": true,
+            "dependencies": {
+                "cssesc": "^2.0.0",
+                "indexes-of": "^1.0.1",
+                "uniq": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-value-parser": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+            "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+            "dev": true
+        },
+        "node_modules/prelude-ls": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
+            "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/pseudomap": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
+            "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+            "dev": true
+        },
+        "node_modules/punycode": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+            "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/queue-microtask": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/rc": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz",
+            "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+            "dev": true,
+            "dependencies": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+            },
+            "bin": {
+                "rc": "cli.js"
+            }
+        },
+        "node_modules/read-cache": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz",
+            "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+            "dev": true,
+            "dependencies": {
+                "pify": "^2.3.0"
+            }
+        },
+        "node_modules/regenerator-runtime": {
+            "version": "0.14.1",
+            "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+            "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+        },
+        "node_modules/registry-auth-token": {
+            "version": "3.3.2",
+            "resolved": "https://registry.npmmirror.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+            "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+            "dev": true,
+            "dependencies": {
+                "rc": "^1.1.6",
+                "safe-buffer": "^5.0.1"
+            }
+        },
+        "node_modules/registry-url": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmmirror.com/registry-url/-/registry-url-3.1.0.tgz",
+            "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==",
+            "dev": true,
+            "dependencies": {
+                "rc": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/resolve": {
+            "version": "1.22.10",
+            "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz",
+            "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+            "dev": true,
+            "dependencies": {
+                "is-core-module": "^2.16.0",
+                "path-parse": "^1.0.7",
+                "supports-preserve-symlinks-flag": "^1.0.0"
+            },
+            "bin": {
+                "resolve": "bin/resolve"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/resolve-from": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/reusify": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+            "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+            "dev": true,
+            "engines": {
+                "iojs": ">=1.0.0",
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/rimraf": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+            "deprecated": "Rimraf versions prior to v4 are no longer supported",
+            "dev": true,
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/run-parallel": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "queue-microtask": "^1.2.2"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/semver": {
+            "version": "5.7.2",
+            "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
+            "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/shallow-clone": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz",
+            "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^6.0.2"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shebang-command": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz",
+            "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+            "dev": true,
+            "dependencies": {
+                "shebang-regex": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+            "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-js": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+            "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/spark-md5": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz",
+            "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
+        },
+        "node_modules/ssf": {
+            "version": "0.11.2",
+            "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+            "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+            "dependencies": {
+                "frac": "~1.1.2"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-json-comments": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+            "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-preserve-symlinks-flag": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/text-table": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
+            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+            "dev": true
+        },
+        "node_modules/type": {
+            "version": "2.7.3",
+            "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
+            "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
+        },
+        "node_modules/type-check": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
+            "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "^1.2.1"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/type-fest": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
+            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/uniq": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmmirror.com/uniq/-/uniq-1.0.1.tgz",
+            "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==",
+            "dev": true
+        },
+        "node_modules/update-browserslist-db": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+            "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/browserslist"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/browserslist"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "escalade": "^3.2.0",
+                "picocolors": "^1.1.1"
+            },
+            "bin": {
+                "update-browserslist-db": "cli.js"
+            },
+            "peerDependencies": {
+                "browserslist": ">= 4.21.0"
+            }
+        },
+        "node_modules/update-browserslist-db/node_modules/picocolors": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+            "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+            "dev": true
+        },
+        "node_modules/update-check": {
+            "version": "1.5.4",
+            "resolved": "https://registry.npmmirror.com/update-check/-/update-check-1.5.4.tgz",
+            "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==",
+            "dev": true,
+            "dependencies": {
+                "registry-auth-token": "3.3.2",
+                "registry-url": "3.1.0"
+            }
+        },
+        "node_modules/uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "dev": true,
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/uuid": {
+            "version": "9.0.1",
+            "resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz",
+            "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+            "funding": [
+                "https://github.com/sponsors/broofa",
+                "https://github.com/sponsors/ctavan"
+            ],
+            "bin": {
+                "uuid": "dist/bin/uuid"
+            }
+        },
+        "node_modules/uview-ui": {
+            "version": "2.0.34",
+            "resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-2.0.34.tgz",
+            "integrity": "sha512-usJHnPCtk45yLTWTXTpLX9Vuqhzjth/+4t/m+S3J5bZuahv49mVQ126rtSnuAWWVkOUtKCX4CU83gFHZj8nP5g==",
+            "engines": {
+                "HBuilderX": "^3.1.0"
+            }
+        },
+        "node_modules/vuex": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz",
+            "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
+            "dependencies": {
+                "@vue/devtools-api": "^6.0.0-beta.11"
+            },
+            "peerDependencies": {
+                "vue": "^3.2.0"
+            }
+        },
+        "node_modules/web-vitals": {
+            "version": "3.5.2",
+            "resolved": "https://registry.npmmirror.com/web-vitals/-/web-vitals-3.5.2.tgz",
+            "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg=="
+        },
+        "node_modules/webpack-merge": {
+            "version": "4.2.2",
+            "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-4.2.2.tgz",
+            "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+            "dev": true,
+            "dependencies": {
+                "lodash": "^4.17.15"
+            }
+        },
+        "node_modules/weixin-js-sdk": {
+            "version": "1.6.5",
+            "resolved": "https://registry.npmmirror.com/weixin-js-sdk/-/weixin-js-sdk-1.6.5.tgz",
+            "integrity": "sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ=="
+        },
+        "node_modules/which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
+            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/wmf": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+            "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/word": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+            "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/word-wrap": {
+            "version": "1.2.5",
+            "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
+            "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-loader": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmmirror.com/wrap-loader/-/wrap-loader-0.2.0.tgz",
+            "integrity": "sha512-Qdhdu7vr2H8dLE2sKySQznOBHXIHbKg7PZ5aqkeBOQHGqxLfcJw/ZlB40j67b1tks9OYqSBCHc+uHtGRCmQYlg==",
+            "dev": true,
+            "dependencies": {
+                "loader-utils": "^1.1.0"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+            "dev": true
+        },
+        "node_modules/xgplayer": {
+            "version": "3.0.21",
+            "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-3.0.21.tgz",
+            "integrity": "sha512-v4O+qzok994AZ2EeU1yFjWhGa6p6V8mdPpWHmfCL7AE3Bqo+MRsYEhWYIhj3FXPK8aUYO6VWyTFc1MThpLYZJA==",
+            "dependencies": {
+                "danmu.js": ">=1.1.6",
+                "delegate": "^3.2.0",
+                "downloadjs": "1.4.7",
+                "eventemitter3": "^4.0.7",
+                "xgplayer-subtitles": "3.0.21"
+            },
+            "peerDependencies": {
+                "core-js": ">=3.12.1"
+            }
+        },
+        "node_modules/xgplayer-subtitles": {
+            "version": "3.0.21",
+            "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-3.0.21.tgz",
+            "integrity": "sha512-Z3EVdFe31c0JUYwuG/C6+T2NKfiGqzzcd0na7FZ9Kx6nIDznGPtLeG6EZOaZXnfW8V35b/WhfsdKSBXYzBOOqw==",
+            "dependencies": {
+                "eventemitter3": "^4.0.7"
+            },
+            "peerDependencies": {
+                "core-js": ">=3.12.1"
+            }
+        },
+        "node_modules/xlsx": {
+            "version": "0.18.5",
+            "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
+            "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
+            "dependencies": {
+                "adler-32": "~1.3.0",
+                "cfb": "~1.2.1",
+                "codepage": "~1.15.0",
+                "crc-32": "~1.2.1",
+                "ssf": "~0.11.2",
+                "wmf": "~1.0.1",
+                "word": "~0.3.0"
+            },
+            "bin": {
+                "xlsx": "bin/xlsx.njs"
+            },
+            "engines": {
+                "node": ">=0.8"
+            }
+        },
+        "node_modules/xregexp": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmmirror.com/xregexp/-/xregexp-4.0.0.tgz",
+            "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
+            "dev": true
+        },
+        "node_modules/yallist": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
+            "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+            "dev": true
+        },
+        "node_modules/yocto-queue": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+            "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        }
+    }
+}

+ 34 - 0
package.json

@@ -0,0 +1,34 @@
+{
+    "id": "elise-audio",
+    "name": "elise-audio-play",
+    "version": "0.0.1",
+    "description": "音频播放器 微信语言聊天UI",
+    "keywords": [
+        "音频播放器",
+        "微信语言聊天UI"
+    ],
+    "dependencies": {
+        "aegis-web-sdk": "^1.39.2",
+        "aegis-weex-sdk": "^1.38.1",
+        "date-fns": "^2.30.0",
+        "dayjs": "^1.11.13",
+        "image-tools": "^1.4.0",
+        "jsqr": "^1.4.0",
+        "jweixin-module": "^1.6.0",
+        "md5": "^2.3.0", 
+        "uview-ui": "^2.0.34",
+        "vuex": "^4.1.0",
+        "weixin-js-sdk": "^1.6.5"
+   
+    },
+    "devDependencies": {
+        "@dcloudio/vue-cli-plugin-uni": "^2.0.2-4010520240507001",
+        "autoprefixer": "^10.4.19",
+        "eslint": "^8.57.1",
+        "postcss": "^8.5.6"
+    },
+    "scripts": {
+        "lint": "eslint 'src/**/*.{js,vue}'",
+        "lint:fix": "eslint 'src/**/*.{js,vue}' --fix"
+    }
+}

+ 361 - 0
pages.json

@@ -0,0 +1,361 @@
+{
+	"easycom": {
+		"^u-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
+		//"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue",
+		"^vue-file-(.*)": "packageName/path/to/vue-file-$1.vue", // 匹配node_modules内的vue文件
+		"^z-(.*)": "@/uni_modules/zebra-swiper/components/z-$1/z-$1.vue"
+	},
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/common/launch",
+			"style": {
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTitleText": ""
+			}
+		},
+		{
+			"path": "pages/index/index",
+			"aliasPath": "/",
+			"name": "home",
+			"style": {
+				"navigationBarBackgroundColor": "#FF5C03",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#f7f7f7",
+				"backgroundColorTop": "#ffffff",
+				"bounce": "none",
+				"titleNView": false,
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/device/tongue/index",
+			"aliasPath": "/",
+			"name": "home",
+			"style": {
+				//"navigationBarBackgroundColor": "#FF5C03",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#f7f7f7",
+				"backgroundColorTop": "#ffffff",
+				"bounce": "none",
+				"titleNView": false,
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/device/tongue/indexOld",
+			"aliasPath": "/",
+			"name": "home",
+			"style": {
+				"navigationBarBackgroundColor": "#FF5C03",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#f7f7f7",
+				"backgroundColorTop": "#ffffff",
+				"bounce": "none",
+				"titleNView": false,
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/device/tongue/facePhoto",
+			"aliasPath": "/",
+			"name": "home",
+			"style": {
+				"navigationBarBackgroundColor": "#FF5C03",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#f7f7f7",
+				"backgroundColorTop": "#ffffff",
+				"bounce": "none",
+				"titleNView": false,
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/device/pulse/index",
+			"aliasPath": "/",
+			"name": "home",
+			"style": {
+				// "navigationBarBackgroundColor": "#FF5C03",
+				"navigationBarTextStyle": "black",
+				// "scrollIndicator": "none",
+				"navigationBarTitleText": "",
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#f7f7f7",
+				"backgroundColorTop": "#ffffff",
+				"bounce": "none",
+				"titleNView": false,
+				"navigationStyle": "custom"
+			}
+		},
+		// {
+		// 	"path": "pages/auth/login",
+		// 	"aliasPath": "/",
+		// 	"name": "login",
+		// 	"meta": {
+		// 		"title": "登录"
+		// 	},
+		// 	"style": {
+		// 		"navigationBarTitleText": "登录",
+		// 		"navigationBarTextStyle": "black",
+		// 		"titleNView": false,
+		// 		"navigationStyle": "custom",
+		// 		"app-plus": {
+		// 			"popGesture": "none", //"close"(启用侧滑返回)、"none"(禁用侧滑返回)
+		// 			"bounce": "none" //页面回弹效果,设置为 "none" 时关闭效果。
+		// 		}
+		// 	}
+		// },
+		{
+			"path": "pages/auth/loginIndex",
+			"style": {
+				"navigationBarTitleText": "登录",
+				"navigationBarTextStyle": "black",
+				"navigationStyle": "custom",
+				"app-plus": {
+					"popGesture": "none",
+					"bounce": "none"
+				}
+			}
+		},
+		{
+			"path": "pages/index/h5",
+			"style": {
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"bounce": "none",
+				"enablePullDownRefresh": false,
+				"backgroundColor": "#f7f7f7",
+				"backgroundColorTop": "#ffffff"
+
+			}
+		},
+		{
+			"path": "pages/user/myUserList",
+			"style": {
+				"navigationBarTitleText": "客户管理",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"app-plus": {
+					"bounce": "none",
+					"popGesture": "none"
+				}
+			}
+		},
+		{
+			"path": "pages/user/userInfo",
+			"style": {
+				"navigationBarTitleText": "个人信息",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"scrollIndicator": "none",
+				"bounce": "none",
+				"navigationBarTextStyle": "black"
+			}
+		},
+		{
+			"path": "pages/user/healthReport",
+			"style": {
+				"navigationBarTitleText": "健康报告",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"scrollIndicator": "none",
+				"bounce": "none",
+				"navigationBarTextStyle": "black"
+			}
+		},
+		// {
+		// 	"path": "pages/auth/h5WxLogin",
+		// 	"style": {
+
+		// 		"navigationBarTitleText": "微信授权登录",
+		// 		"navigationBarTextStyle": "black",
+		// 		"navigationBarBackgroundColor": "#ffffff"
+		// 	}
+		// // },
+		//  {
+		// 	"path": "pages/device/tongue/indexOld",
+		// 	"style": {
+		// 		"navigationBarTitleText": "舌诊",
+		// 		"navigationBarTextStyle": "black",
+		// 		"navigationStyle": "custom",
+		// 		"scrollIndicator": "none",
+		// 		"titleNView": false,
+		// 		"enablePullDownRefresh": false,
+		// 		"app-plus": {
+		// 			"bounce": "none"
+		// 		}
+		// 	}
+		// }, 
+		{
+			"path": "pages/device/tongue/ques",
+			"style": {
+				"navigationBarTitleText": "使用教程",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		}, {
+			"path": "pages/device/tongue/photoPreview",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationBarTextStyle": "black",
+				"navigationStyle": "custom",
+				"scrollIndicator": "none",
+				"titleNView": false,
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		}, {
+			"path": "pages/device/tongue/tongueList",
+			"style": {
+				"navigationBarTitleText": "舌诊记录",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		}, {
+			"path": "pages/device/tongue/report",
+			"style": {
+				"navigationBarTitleText": "舌诊记录",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff",
+				"navigationBarTextStyle": "black",
+				"scrollIndicator": "none",
+				"navigationStyle": "custom",
+				"app-plus": {
+					"bounce": "none"
+				}
+			}
+		}, 
+		{
+			"path": "pages/device/tongue/test",
+			"style": {
+				"navigationBarTitleText": "摄像头",
+				"navigationBarTextStyle": "black"
+			}
+		},
+		{
+			"path": "pages/device/tongue/testCameraAuto",
+			"style": {
+				"navigationBarTitleText": "摄像头自动变焦",
+				"navigationBarTextStyle": "black"
+			}
+		},
+		// {
+		// 	"path": "pages/index/typulse",
+		// 	"style": {
+				
+		// 		"navigationBarTitleText": "脉诊测试",
+		// 		"navigationBarTextStyle": "black",
+		// 		"navigationStyle": "custom",
+		// 		"enablePullDownRefresh": false,
+		// 		"navigationBarBackgroundColor": "#ffffff",
+		// 		"scrollIndicator": "none",
+		// 		"app-plus": {
+		// 			"popGesture": "none",
+		// 			"bounce": "none"
+		// 		}
+		// 	}
+		// },
+		{
+			"path": "pages/index/smdtManager/smdtManager",
+			"style": {
+				"navigationBarTitleText": "smdt平板设备",
+				"navigationBarTextStyle": "black",
+				"enablePullDownRefresh": false,
+				"navigationBarBackgroundColor": "#ffffff"
+				
+			}
+		}
+
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "white",
+		"navigationBarTitleText": "",
+		"navigationBarBackgroundColor": "#ffffff",
+		"backgroundColor": "#f7f7f7",
+		"backgroundColorTop": "#f7f7f7",// iOS APP真机bounce回弹区域默认灰色,建议统一重置为白色
+		"pageOrientation": "auto"
+	},
+	"uniIdRouter": {},
+
+	"subPackages": [
+		{
+			"root": "pages/user/healthRecords",
+			"pages": [{
+					"path": "index",
+					"style": {
+						"navigationBarTitleText": "健康档案",
+						"navigationStyle": "custom",
+						"app-plus": {
+							"bounce": "none"
+						}
+
+					}
+				},
+				{
+					"path": "add",
+					"style": {
+						"navigationBarTitleText": "快速填写健康档案",
+						"navigationBarTextStyle": "black"
+
+					}
+				},
+				{
+					"path": "edit",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationBarTextStyle": "black",
+						"navigationBarBackgroundColor": "#ffffff"
+					}
+				}
+
+			]
+		}
+	],
+	"tabBar": {
+		"color": "#9BA0AA",
+		"selectedColor": "#191A1B",
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"height": "64px",
+		"fontSize": "12px",
+		"iconWidth": "20px",
+		"spacing": "4px",
+		"list": [
+			// {
+			// 	"pagePath": "pages/index/index",
+			// 	"iconPath": "/static/image/tabbar/tab_home_icon.png",
+			// 	"selectedIconPath": "/static/image/tabbar/tab_home_on_iconx.png",
+			// 	"text": "首页"
+			// }
+
+		]
+	}
+
+}

+ 544 - 0
pages/auth/loginIndex.vue

@@ -0,0 +1,544 @@
+<template>
+	<view class="border-box">
+		<view class="content x-c">
+			<!-- <image class="backImg" @tap="goBack()" src="../../static/images/icon_close.png"></image> -->
+			<view class="pageTop x-c">
+				<view class="loginBox">
+					<view class="logo">
+						<image src="/static/logo_icon2.png"></image>
+					</view>
+					<view class="head-title">御君方门店系统</view>
+					<view class="login-item">
+						<view class="input-account" :class="{'input-active': accountActive }">
+							<input v-model="account" placeholder="账号" type="text" @focus="changeText('accountActive',true)"  @blur="changeText('accountActive',false)"/>
+						</view>
+					</view>
+					<view class="login-item">
+						<view class="input-pwd" :class="{'input-active': pwdActive }">
+							<input v-model="password" placeholder="密码" ref="input" type="text" :password="isClose" @focus="changeText('pwdActive',true)" @blur="changeText('pwdActive',false)"/>
+							<view class="close-pwd" @click="closePwd">
+								<image :src="isClose?'/static/image/device/eye_close_icon36.png':'/static/image/device/eye_open_icon36.png'"></image>
+							</view>
+						</view>
+					</view>
+					<view class="login-item flexCenter">
+						<view class="input-code" :class="{ 'input-active': codeActive }">
+							<input v-model="code" placeholder="验证码" type="text" @focus="changeText('codeActive',true)" @blur="changeText('codeActive',false)"/>
+						</view>
+						<view class="input-yzcode">
+							<image :src="codeImg" @click="getCode"></image>
+						</view>
+					</view>
+					<view class="checkbox">
+						<!-- 	<view class="checkbox-icon" @tap="handleAgree">
+							 		<image src="../../static/image/login/radio_default.png" v-show="!agree"></image>
+							 		<image src="../../static/image/login/radio_choose.png" v-show="agree"></image>
+							 	</view>
+							 	<view>记住密码</view> -->
+						<checkbox-group @tap="handlePwd">
+							<label>
+								<checkbox borderColor="#E0E3EE" iconColor="#8F6726" v-model="agree" :checked="agree" />
+								记住密码
+							</label>
+						</checkbox-group>
+					</view>
+
+					<view class="btns">
+						<view class="login-btn" @click="login">登录</view>
+					</view>
+				</view>
+			</view>
+			
+			<!-- <view class="pageBottom" v-if="isApp && isAgreePrivacy">
+					<view class="tips y-f"> — 快捷登录 — </view> 
+					<view class="menu x-ac">
+						 <view v-if="wxIsInstalled" @tap="loginWeixin" ><image src="/static/image/login/weixin.png"></image></view>
+						 <view v-if="isIos" @tap="quickAppleLogin" ><image src="/static/image/login/apple.png"></image></view>
+					<view><image src="/static/image/login/qq.png"></image></view>
+						 <view><image src="/static/image/login/weibo.png"></image></view> 
+				   </view>		
+			</view> -->
+
+			<!-- <view class="checkbox">
+				<view class="checkbox-icon" @tap="handleAgree">
+					<image src="../../static/image/login/radio_default.png" v-show="!agree"></image>
+					<image src="../../static/image/login/radio_choose.png" v-show="agree"></image>
+				</view>
+				<view>我已阅读并同意<text @tap="goToWeb(0)">《用户协议》</text><text @tap="goToWeb(1)">《隐私政策》</text> 并使用本机号码登录</view>
+			</view> -->
+		</view>
+	</view>
+</template>
+
+<script>
+import { login, loginByWeChat, getUserInfo, loginByApple, setPhone, getCode } from '@/api/user';
+export default {
+	data() {
+		return {
+			isClose:true,
+			userName: '测试企业',
+			account: '测试企业',
+			password: 'admin1122..',
+			registrationID: '',
+			unionid: '',
+			userPhone: '',
+			loginType: 0,
+			isApp: false,
+			agree: false,
+			isAgreePrivacy: false,
+			isIos: false,
+			from: '',
+			source: '',
+			appleKey: '',
+			wxIsInstalled: false,
+			code: '',
+			codeImg: '',
+			uuid: '',
+			 // 激活状态变量
+			accountActive: false,
+			pwdActive: false,
+			codeActive: false
+		};
+	},
+	onLoad(option) {
+		var token=uni.getStorageSync('AppToken');
+		if(token){
+			var user=JSON.parse(uni.getStorageSync('userInfo'));
+			this.account=user.userName
+			this.password=uni.getStorageSync('password');
+		}
+		
+		
+	},
+	onShow() {
+		this.getCode();
+		
+	},
+	onUnload() {
+		uni.$off('getRegistrationID');
+
+    },
+    mounted() {
+       
+    },
+    methods: {
+		getCode(){
+			getCode().then(res => {
+				console.log('code')
+					uni.hideLoading();
+					if(res.code==200){
+						// console.log('code',res)
+						this.codeImg='data:image/png;base64,'+res.img
+						this.uuid=res.uuid
+					}
+					else{
+						uni.showToast({title: res.msg,icon: 'none'});
+					}
+				},
+				(rej) => {
+					uni.hideLoading();
+					console.log('qxj rej:' + JSON.stringify(rej));
+				}
+			);
+		},
+		initUniverify() {
+			const callback = (res) => {
+				// 获取一键登录弹框协议勾选状态
+				univerifyManager.getCheckBoxState({
+					success(res) {
+						if (res.state) {
+							// 关闭一键登录弹框
+							univerifyManager.close();
+						}
+					}
+				});
+			};
+			// 订阅自定义按钮点击事件
+			univerifyManager.onButtonsClick(callback);
+			// 取消订阅自定义按钮点击事件
+			univerifyManager.offButtonsClick(callback);
+		},
+		changeText(val,value){
+			this[val]=value
+		},
+		closePwd(){
+			this.isClose=!this.isClose
+		},
+		handlePwd(){
+			this.agree=!this.agree
+		},
+		login() {
+			if (this.$isEmpty(this.account)) {
+				uni.showToast({
+					title: '请输入帐号',
+					icon: 'none'
+				});
+				return;
+			}
+			if (this.$isEmpty(this.password)) {
+				uni.showToast({
+					title: '请输入密码',
+					icon: 'none'
+				});
+				return;
+			}
+			if (this.$isEmpty(this.code)) {
+				uni.showToast({
+					title: '请输入验证码',
+					icon: 'none'
+				});
+				return;
+			}
+			
+			var data = {
+				account: this.account,
+				password: this.password,
+				uuid: this.uuid,
+				code: this.code
+			};
+			var that = this;
+			uni.showLoading({
+				title: '处理中...'
+			});
+
+			login(data).then(
+				(res) => {
+					uni.hideLoading();
+					if (res.code == 200) {
+						uni.setStorageSync('AppToken', res.data.token);
+						uni.setStorageSync('userInfo', JSON.stringify(res.data.user));
+						if (this.agree) {
+							uni.setStorageSync('password', data.password);
+						} else {
+							uni.setStorageSync('password', null);
+						}
+						
+						uni.redirectTo({
+							url: '/pages/index/index'
+						});
+					} else {
+						uni.showToast({ title: res.msg, icon: 'none' });
+						this.code = '';
+						this.getCode();
+					}
+				},
+				(rej) => {
+					uni.hideLoading();
+					console.log('qxj rej:' + JSON.stringify(rej));
+				}
+			);
+		},
+		goToRegister() {
+			this.$navTo('./register');
+		},
+		goToFindPass() {
+			this.$navTo('./findpass');
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+page {
+	background-color: #ffffff;
+}
+
+.border-box {
+	width: 100vw;
+	height: 100vh;
+	background-image: url(/static/image/device/ipad_yjf_boder.png);
+	background-repeat: no-repeat;
+	position: relative;
+	background-size: 100% 100%;
+	box-sizing: border-box;
+	padding: 10px;
+}
+.content {
+	display: flex;
+	width: 100%;
+	height: 100%;
+	background-image: url(/static/image/device/ipad_yjf_bg.png);
+	background-repeat: no-repeat;
+	background-size: 100% 100%;
+	position: relative;
+}
+.backImg {
+	position: absolute;
+	left: 30px;
+	top: 40px;
+	height: 30px;
+	width: 30px;
+}
+
+.pageTop {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+}
+
+.content .head {
+	text-align: center;
+	width: 100%;
+	height: 100px;
+	// background:url(/static/image/login/top_bg.png) no-repeat 0 center;
+	background-size: cover;
+	box-sizing: border-box;
+	font-size: 36px;
+	font-weight: bold;
+	color: #666;
+}
+
+.content .head image {
+	width: 150px;
+	height: 150px;
+	border-radius: 10px;
+	box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.2);
+}
+.title {
+	color: #141414;
+	margin: 50upx 0upx 30upx 0px;
+	font-size: 38px;
+	font-weight: 500;
+}
+.desc {
+	color: #686866;
+	padding: 0 0 30px 0px;
+	font-size: 28px;
+}
+
+.logo {
+	width: 110px;
+	height: 110px;
+	background: #8f6726;
+	border-radius: 150%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	position: absolute;
+	z-index: 10;
+	top: -60px;
+	left: 50%;
+	transform: translateX(-50%);
+	image {
+		width: 74px;
+		height: 74px;
+	}
+}
+.head-title {
+	font-family: Source Han Serif CN, Source Han Serif CN;
+	font-weight: bold;
+	font-size: 36px;
+	color: #222222;
+	text-align: center;
+	font-style: normal;
+	margin-bottom: 30px;
+}
+.flexCenter {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+.loginBox {
+	padding: 67px 44px 44px;
+	// width: calc(60%);
+	background: #fdfdfd;
+	z-index: 10;
+	position: relative;
+	border-radius: 24px;
+	.login-item {}
+	.login-item p {
+		text-align: left;
+	}
+	.line {
+		height: 0.5px;
+		background-color: #efefef;
+		margin-top: 10px;
+	}
+	
+	input {
+		margin-left: 80px;
+		height: 52px;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 18px;
+		color: #a8aaac;
+		text-align: left;
+		line-height: 52px;
+	}
+	
+	.input-account {
+		margin-top: 10px;
+		margin-bottom: 0px;
+		border-radius: 12px;
+		border: 1px solid #e0e3ee;
+		height: 52px;
+		width: 100%;
+		background: url(/static/image/device/user_icon36.png) no-repeat 0 center;
+		background-size: 27px 27px;
+		background-position: 27px;
+		
+		
+	}
+	.input-pwd {
+		margin-top: 20px;
+		// margin-bottom: 20px;
+		border-radius: 12px;
+		border: 1px solid #e0e3ee;
+		height: 52px;
+		width: 100%;
+		background: url(/static/image/device/password_icon36.png) no-repeat 0 center;
+		background-size: 27px 27px;
+		background-position: 27px;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		.close-pwd{
+			margin-right: 40px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			// margin-top: 10px;
+			image{
+				width: 27px;
+				height: 27px;
+			}
+			
+		}
+	}
+	
+	.input-code {
+		margin-top: 20px;
+		margin-right: 20px;
+		margin-bottom: 20px;
+		border-radius: 12px;
+		border: 1px solid #e0e3ee;
+		height: 52px;
+		width: 100%;
+		background: url(/static/image/device/code_icon36.png) no-repeat 0 center;
+		background-size: 27px 27px;
+		background-position: 27px;
+	}
+
+	.input-yzcode {
+		margin-top: 20px;
+		margin-bottom: 20px;
+		width: 200px;
+		height: 52px;
+		image {
+			width: 100%;
+			height: 100%;
+		}
+		
+	}
+	
+	.reg-box {
+		padding-bottom: 20px;
+		margin: 0 10px;
+		.reg-btn {
+			font-size: 16px;
+			color: #ff5c03;
+		}
+	}
+}
+/* 激活状态样式(核心) */
+		.input-active {
+		  border:1px solid #8F6726 !important; /* 激活时边框色(示例:蓝色) */
+		}
+		.input-active input {
+		  caret-color: #8F6726; /* 激活时光标色(与边框色一致) */
+		}
+.btns {
+	margin-top: 30rpx;
+}
+
+.login-btn {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: 65px;
+	background: #8f6726;
+	border-radius: 12px;
+	font-size: 24px;
+	font-family: PingFang SC;
+	font-weight: 500;
+	color: rgba(255, 255, 255, 1);
+}
+
+.pageBottom {
+	height: 220px;
+	width: 75%;
+	display: flex;
+	flex-direction: column;
+	position: absolute;
+	bottom: 100px;
+}
+
+.tips {
+	color: #999;
+	font-size: 32px;
+}
+.menu {
+	margin-top: 30px;
+	image {
+		width: 96px;
+		height: 96px;
+	}
+}
+
+.checkbox {
+	// margin: 20px;
+	margin-top: 20px;
+	display: flex;
+	// flex-direction: row;
+	align-items: center;
+	// justify-content: flex-start;
+	font-family: PingFang SC, PingFang SC;
+	font-weight: 400;
+	font-size: 18px;
+	color: #999999;
+	// line-height: 38px;
+	text-align: left;
+	.uni-label-pointer{
+		display: flex;
+		// flex-direction: row;
+		align-items: center;
+	}
+	text {
+		color: #8f6726;
+	}
+	&-icon {
+		flex-shrink: 0;
+		margin-right: 15px;
+		image {
+			height: 24px;
+			width: 24px;
+		}
+	}
+}
+// 响应式适配 - 针对不同屏幕尺寸调整
+// 小屏手机
+@media (max-width: 412px) {
+	.login-panel {
+		padding: 80px 30px 40px;
+		.head-title {
+			font-size: 40px;
+			margin-bottom: 40px;
+		}
+	}
+
+	$spacing: 20px;
+	$input-height: 80px;
+	
+	
+	.loginBox {
+		padding: 90px 60px 60px;
+		width: calc(80%);
+	}
+	
+}
+
+
+
+</style>

+ 74 - 0
pages/common/launch.vue

@@ -0,0 +1,74 @@
+<template>
+	<view class="content">
+		 
+	</view>
+</template>
+
+<script>
+	import { getDicts } from '@/api/common'
+	export default {
+		data() {
+			return {
+				 
+			};
+		},
+		onShow() {
+			//this.getDicts()
+			this.navigatHandler();
+		},
+		methods: {
+			navigatHandler: function() {
+				if (!this.$isLogin()) {
+						setTimeout(()=>{
+							uni.reLaunch({
+								url: '../auth/loginIndex',
+								//url: '../index/typulse',
+								animationType: 'none',
+								animationDuration: 2000
+							})
+						},200);
+						
+					 // #ifdef APP-PLUS
+						 plus.navigator.closeSplashscreen();
+					// #endif
+						
+				} else {
+					if(uni.getStorageSync("openUrl")) {
+						return
+					}
+					uni.reLaunch({
+						url: '../index/index',
+						// url: '../course/index',
+						//url: '../course/video/living-app',
+						animationType: 'none',
+						animationDuration: 2000
+					})
+			 	}
+			},
+			getDicts:function(){
+				getDicts().then(
+					res => {
+						if(res.code==200){
+							uni.setStorageSync('dicts',JSON.stringify(res.data));
+						}
+					},
+					rej => {}
+				);
+			},
+		},
+		
+	};
+ 
+</script>
+<style>
+	page{
+		background-color: #fff;
+	}
+	.content {
+		background-color: #fff;
+		height: 100%;
+		width: 100%;
+		position: relative;
+		padding-top: 0;
+	}
+</style>

+ 1533 - 0
pages/device/pulse/index.vue

@@ -0,0 +1,1533 @@
+<template>
+	<view class="border-box">
+		<view class="content">
+			<!-- <view style="width:100%;height: 20px;"></view> -->
+			<view class="top-box">
+				<view class="back-box x-f">
+					<image src="/static/image/device/back_icon32.png"></image>
+					<view @click="goBack()">返回</view>
+				</view>
+				<view class="title">
+					体质辨识
+				</view>
+				<view class="select" @click="onOpenList">
+					<view class="date x-bc">
+						<image src="/static/image/device/user_icon32.png"></image>
+						<text class="text">
+							{{selectUser!==null?selectUser.nickName:'选择用户'}}
+						</text>
+						<image src="/static/image/device/arrow_icon16.png"></image>
+					</view>
+				</view>
+			</view>
+			<view class="list">
+				<view class="tab-box">
+					<view class="tabs">
+						<view class="item" @click="navTo('/pages/device/tongue/index')">
+							<image src="/static/image/device/tongue_icon68.png"></image>
+							<view class="title">舌面诊</view>
+						</view>
+						<view class="item active">
+							<image src="/static/image/device/pulse_diagnosis_on_icon68.png"></image>
+							<view class="title">脉诊</view>
+						</view>
+					</view>
+					<view class="test-box">
+						<!-- <view class="note">请选择手腕,再点击开始测量</view> -->
+						<view class="note2">蓝牙版</view>
+						<view class="img-box">
+							<image class="bg-box" src="/static/image/device/pulse_diagnosis_img.png"></image>
+							<!-- 	<view class="left">
+								<view class="bg">
+									<image src="/static/image/device/left_hand_img.png"></image>
+								</view>
+
+								<view class="btn">
+									<view class="checkbox-icon">
+										<image src="/static/image/device/radio_default_icon16.png" v-show="!left">
+										</image>
+										<image src="/static/image/device/radio_choose_icon16.png" v-show="left"></image>
+									</view>
+									<text>左手</text>
+								</view>
+							</view> -->
+							<!-- <view class="right">
+								<view class="bg">
+									<image src="/static/image/device/right_hand_img.png"></image>
+								</view>
+								<view class="btn">
+									<view class="checkbox-icon">
+										<image src="/static/image/device/radio_default_icon16.png" v-show="!right">
+										</image>
+										<image src="/static/image/device/radio_choose_icon16.png" v-show="right">
+										</image>
+									</view>
+									<text>右手</text>
+								</view>
+							</view> -->
+						</view>
+						<view class="btn-box" @click="toConnect">
+							去测脉
+						</view>
+					</view>
+
+				</view>
+			</view>
+			<!-- <u-popup :show="isConnect" @close="close" mode="center" :round="10">
+				<view style="width: 400px;height: 200px;display: flex;align-items: center;justify-content: center;">
+					<u-loading-icon  color="#8F6726"></u-loading-icon>
+					<view style="color: #8F6726;font-size:32px;margin-left: 10px;">设备连接中</view>
+				</view>
+			           
+			</u-popup> -->
+			<!-- <u-popup :show="left" @close="closeLeft" mode="center" :round="10">
+				<view style="width: 400px;height: 200px;display: flex;align-items: center;justify-content: center;">
+					<u-loading-icon color="#8F6726"></u-loading-icon>
+					<view style="color: #8F6726;font-size:32px;margin-left: 10px;">左手测量中</view>
+				</view>
+
+			</u-popup>
+			<u-popup :show="right" @close="closeRight" mode="center" :round="10">
+				<view style="width: 400px;height: 200px;display: flex;align-items: center;justify-content: center;">
+					<u-loading-icon color="#8F6726"></u-loading-icon>
+					<view style="color: #8F6726;font-size:32px;margin-left: 10px;">右手测量中</view>
+				</view>
+
+			</u-popup> -->
+			<view v-if="isResult" class="mask">
+				<view class="popup-container2">
+					<view class="title-t">测量完成</view>
+					<view class="title-r">点击确认查看检测报告</view>
+					<!-- <image style="width: 200px;height: 200px;margin-bottom: 20px;" :src="qUrl"></image> -->
+					<view class="btn-r" @click="closeP">确认</view>
+				</view>
+			</view>
+			
+			<view v-if="showList" class="mask">
+				<!-- 弹窗内容 -->
+				<view class="popup-container">
+					<!-- 弹窗头部 -->
+					<view class="popup-header">
+						<text class="popup-title">选择用户</text>
+						<view class="close-btn" @click="onCloseList">
+							<image src="/static/image/device/close_icon32.png"></image>
+						</view>
+					</view>
+					<!-- 弹窗主体内容 -->
+					<view class="popup-content">
+						<view class="search-cont">
+							<input type="text" v-model="keyword" class="form-input" placeholder="请输入用户姓名或者手机号"
+								placeholder-class="text-input" />
+							<view class="search-btn" @click="doSearch">
+								<image src="/static/image/device/search_icon24.png"></image>
+								<text>搜索</text>
+							</view>
+						</view>
+						<view class="userList-box">
+							<view class="userList" v-if="dataList.length>0">
+								<view class="item" v-for="(item,index) in dataList" :key="index">
+									<view class="title">{{item.nickName||''}}-{{item.phone||''}}</view>
+									<view class="right-box">
+										<view class="rest" @click="onOpenDetail(item)">
+											查看
+										</view>
+										<view class="rest" @click="editDetail(item)">
+											编辑
+										</view>
+										<view :class="item.userId==aIndex?'select active':'select'"
+											@click="select(item)">
+											选择
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+						<view v-if="dataList.length==0" class="isNull">暂无数据</view>
+					</view>
+
+					<!-- 弹窗底部按钮 -->
+					<view class="popup-footer">
+						<view class="btn2 confirm-btn" @click="onOpen">
+							<image src="/static/image/device/add_icon32.png"></image>
+							<text>新建用户</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<user-card :show="show" :initial-form="initData" @close="onClose" @confirm="onConfirm" @update="onEdit"></user-card>
+			<view v-if="showDetail" class="mask">
+				<!-- 弹窗内容 -->
+				<view class="popup-container">
+					<!-- 弹窗头部 -->
+					<view class="popup-header">
+						<view class="goback" @click="onOpenList">返回</view>
+						<text class="popup-title">选择用户</text>
+						<view class="close-btn" @click="onCloseDetail">
+							<image src="/static/image/device/close_icon32.png"></image>
+						</view>
+					</view>
+					<!-- 弹窗主体内容 -->
+					<view class="popup-content">
+						<view class="userDetail">
+							<view class="item">
+								<view class="label">姓名:</view>
+								<text>{{detail.username||'-'}}</text>
+							</view>
+							<view class="item">
+								<view class="label">性别:</view>
+								<text>{{detail.sex==1?"男":"女"}}</text>
+							</view>
+							<view class="item">
+								<view class="label">年龄:</view>
+								<text>{{detail.age||'-'}}岁</text>
+							</view>
+							<view class="item">
+								<view class="label">身高:</view>
+								<text>{{detail.height||'-'}}cm</text>
+							</view>
+							<view class="item">
+								<view class="label">体重:</view>
+								<text>{{detail.weight||'-'}}kg</text>
+							</view>
+							<view class="item">
+								<view class="label">手机号:</view>
+								<text>{{detail.phone||'-'}}</text>
+							</view>
+							<view class="item">
+								<view class="label">既往病史:</view>
+								<text>{{detail.previousMedicalHistory||'-'}}</text>
+							</view>
+							<view class="item">
+								<view class="label">过敏史:</view>
+								<text>{{detail.historyOfAllergies||'-'}}</text>
+							</view>
+							<view v-if="detail.habitList.length>0" class="item" v-for="item in detail.habitList"
+								:key="item.optionId">
+								<view class="label">{{item.typeName ||'-'}}:</view>
+								<text>{{item.optionName||'-'}}</text>
+							</view>
+
+						</view>
+					</view>
+
+					<!-- 弹窗底部按钮 -->
+					<view class="popup-footer">
+						<view class="btn2 confirm-btn" @click="selectBtn(detail)">
+							<text>选择该用户</text>
+						</view>
+					</view>
+				</view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import {
+		selectUsernameOrPhoneOrTime,
+		addUser,
+		selectQueryFsUser,
+		editUser
+	} from '@/api/user.js'
+	import {
+		addPulse
+	} from '@/api/healthTongue.js'
+	import {
+		getDictByKey
+	} from '@/api/common.js'
+	import {
+		tr
+	} from "date-fns/locale";
+	import userCard from "@/components/userCard.vue"
+	export default {
+		components: {
+			userCard
+		},
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				isResult: false,
+				selectedDate: "",
+				selectUser: null,
+				show: false,
+				showList: false,
+				showDetail: false,
+				total: 0,
+				aIndex: '',
+				createTimes: null,
+				keyword: '',
+				type: 0,
+				left: false,
+				right: false,
+				isConnect: false,
+				dataList: [],
+				detail: {},
+				status: 'loading',
+				loadingText: '设备连接中',
+				form: {
+					sex: 0
+				},
+				info: null,
+				// 插件实例
+				tyPulse: null,
+				// 状态
+				initStatus: false,
+				deviceConnected: false,
+				measuring: false,
+				// 设备信息
+				deviceInfo: null,
+				// 测量相关
+				measureProgress: 0,
+				currentStage: '待机',
+				lastResult: null,
+				appId: "nehijR6y",
+				appSecret: "f740435d1b84b9944a52f064dd1ecf6e8a76f546",
+				uid: "userid000067",
+				qUrl: '',
+				initData:{}
+			}
+		},
+		onLoad(options) {
+			this.userId = options.userId
+			this.selectUser = uni.getStorageSync('selectUser') || null;
+			// this.selectUsernameOrPhoneOrTime()
+			this.initPlugin()
+			// var info=uni.getSystemInfoSync()
+			// console.log('info',info)
+			// this.getDictByKey("sys_hospital_level");
+		},
+		methods: {
+			goBack() {
+				uni.navigateBack({
+					delta:1
+				})
+			},
+			// 初始化插件
+			async initPlugin() {
+				try {
+					// this.addLog('开始初始化插件...');
+					// 获取插件实例
+					this.tyPulse = uni.requireNativePlugin('TyPulseManager');
+					if (!this.tyPulse) {
+						throw new Error('无法获取插件实例');
+					}
+					// 初始化
+					await new Promise((resolve, reject) => {
+						this.tyPulse.initSDK(this.appId, this.appSecret, this.uid, (
+							result) => {
+							if (result.success) {
+								resolve();
+							} else {
+								reject(new Error(result.error));
+							}
+						});
+					});
+
+					this.initStatus = true;
+					console.log('插件初始化成功');
+					// uni.showToast({
+					// 	title: '初始化成功',
+					// 	icon: 'success'
+					// });
+
+				} catch (error) {
+					console.log(`初始化失败: ${error.message}`);
+					uni.showToast({
+						title: '初始化失败',
+						icon: 'error'
+					});
+				}
+			},
+			toMeasure() {
+				try {
+					// 设置自动屏幕方向
+					this.tyPulse.toMeasure((result) => {
+						if (result.success) {
+							if (result.cmdType == "pulseResult") {
+								this.info = result;
+								console.log('脉诊回调结果:', result);
+								this.addPulse()
+							}
+							if (result.cmdType == "deviceConnect") {
+								//获取设备信息
+								this.getDeviceInfo();
+							}
+						}
+					});
+				} catch (error) {
+					console.log(`测脉失败: ${error.message}`);
+				}
+			},
+			// 获取设备信息
+			getDeviceInfo() {
+				try {
+					this.tyPulse.getDeviceInfo((result) => {
+						if (result.success && result.data) {
+							this.deviceInfo = result.data;
+							this.deviceConnected = result.data.isConnected;
+							//console.log('设备信息获取成功:' + JSON.stringify(result.data));
+						}
+					});
+				} catch (error) {
+					console.log(`获取设备信息失败: ${error.message}`);
+				}
+			},
+			doSearch() {
+				console.log(this.keyword, '---')
+				// if(this.keyword!==''){
+				this.selectUsernameOrPhoneOrTime()
+				// }
+			},
+			// 选择
+			handleLeft() {
+				this.left = !this.left
+				this.right = !this.left
+			},
+			// 选择
+			handleRight() {
+				this.right = !this.right
+				this.left = !this.right
+			},
+			toConnect() {
+				if (this.$isEmpty(this.selectUser)) {
+					uni.showToast({
+						title: '请先选择就诊人',
+						icon: 'none'
+					});
+					return;
+				}
+				this.isConnect = true
+				this.toMeasure()
+			},
+			addPulse() {
+				if (this.$isEmpty(this.info)) {
+					uni.showToast({
+						title: '测量失败,请重试',
+						icon: 'none'
+					});
+					return;
+				}
+				const data = {
+					userId: this.selectUser.userId,
+					sex: this.selectUser.sex,
+					name: this.selectUser.nickName,
+					pulseEquipmentResult: {
+						reportData: JSON.parse(this.info.reportData),
+						success: this.info.success,
+						measureId: this.info.measureId,
+						pulseUrl: JSON.parse(this.info.pr)
+					}
+				}
+				console.log("qxj addPulse data",data);
+				uni.showLoading({
+					title: "处理中...",
+					mask: true
+				})
+				addPulse(data).then(res => {
+						console.log('zaizz', data, res)
+						if (res.code == 200) {
+							uni.hideLoading();
+							// this.qUrl = res.codeImage
+							this.isConnect = false
+							this.isResult = true
+						} else {
+							uni.hideLoading();
+							this.isConnect = false
+							this.errMsg = res.msg;
+							uni.showToast({
+								icon: 'none',
+								title: res.msg,
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			close() {
+				this.isConnect = false
+			},
+			closeLeft() {
+				this.left = false
+			},
+			closeRight() {
+				this.right = false
+			},
+			select(item) {
+				this.aIndex = item.userId
+				this.selectUser = item
+				uni.setStorageSync("selectUser", item)
+				this.showList = false
+			},
+			selectBtn(item) {
+				if(item.id==null){
+					uni.showToast({
+						title: '请先完善用户基本信息',
+						icon: 'none'
+					});
+					return;
+				}
+				this.selectUser = this.dataList.find(it => it.userId === item.fsUserId);
+				uni.setStorageSync("selectUser", this.selectUser)
+				this.show = false
+				this.showList = false
+				this.showDetail = false
+			},
+			createTimesChange(e) {
+				this.selectedDate = e.detail.value; // 例如:"2025-09-17"
+				this.form.birthday = this.selectedDate.replace(/-/g, ""); // 去除 "-"
+			},
+			genderChange(type) {
+				this.form.sex = type
+			},
+			onOpen() {
+				this.show = true
+				this.showList = false
+			},
+			onOpenList() {
+				this.selectUsernameOrPhoneOrTime()
+				this.showList = true
+				this.showDetail = false
+			},
+			onOpenDetail(item) {
+				this.showDetail = true
+				this.showList = false
+				this.detail={}
+				this.selectQueryFsUser(item.userId)
+			},
+			editDetail(item){
+				this.show = true
+				this.showList = false
+				this.selectQueryFsUser(item.userId,'edit')
+			},
+			// 关闭弹窗
+			onClose() {
+				this.show = false
+			},
+			onCloseList() {
+				this.showList = false
+				this.keyword=''
+			},
+			onCloseDetail() {
+				this.showDetail = false
+			},
+			closeP() {
+				this.isResult = false
+				uni.navigateTo({
+					url: "/pages/user/healthReport?userId="+this.selectUser.userId
+				})
+			
+			},
+			// 点击确认按钮
+			onConfirm(data) {
+				// var data=this.form
+				//var data = this.form
+				uni.showLoading({
+					title: "处理中...",
+					mask: true
+				})
+				addUser(data).then(res => {
+						if (res.code == 200) {
+							setTimeout(() => {
+								uni.showToast({
+									icon: 'success',
+									title: "创建成功",
+								});
+							}, 200)
+							uni.hideLoading();
+							this.show = false
+							this.showList = true
+							this.form = {
+								sex: 1
+							}
+							this.selectUsernameOrPhoneOrTime()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 点击确认按钮
+			onEdit(data) {
+				// var data=this.form
+				//var data = this.form
+				uni.showLoading({
+					title: "处理中...",
+					mask: true
+				})
+				data.userId=this.initData.userId
+				data.fsUserId=this.initData.userId
+				editUser(data).then(res => {
+						if (res.code == 200) {
+							setTimeout(() => {
+								uni.showToast({
+									icon: 'success',
+									title: "修改成功",
+								});
+							}, 200)
+							uni.hideLoading();
+							this.show = false
+							this.showList = true
+							this.form = {
+								sex: 1
+							}
+							this.selectUsernameOrPhoneOrTime()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			selectUsernameOrPhoneOrTime() {
+				var data = {
+					nickName: this.keyword,
+					phone: this.keyword
+				}
+				uni.showLoading({
+					title: "加载中..."
+				})
+				// var user=uni.getStorageSync('userInfo');
+				selectUsernameOrPhoneOrTime(data).then(res => {
+						if (res.code == 200) {
+							uni.hideLoading();
+							this.dataList = res.data
+							this.total = res.data.total || 0
+						} else {
+							uni.hideLoading();
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			selectQueryFsUser(id,val) {
+				selectQueryFsUser({
+					userId: id
+				}).then(res => {
+						if (res.code == 200) {
+							this.detail = res.data
+							if(val=='edit'){
+								this.initData=res.data
+								this.initData.userId=id
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			getDictByKey(key) {
+				var data = {
+					key: key
+				}
+				getDictByKey(data).then(
+					res => {
+						if (res.code == 200) {
+							if (key == "sys_hospital_level") {
+								this.hosLevelOptions = res.data;
+							}
+						}
+					},
+					err => {}
+				);
+
+			},
+			navTo(url) {
+				uni.redirectTo({
+				  url: url + '?userId=' + this.userId
+				})
+
+
+			},
+			// 手机号校验函数
+			checkPhone(val) {
+				const phone = val?.trim(); // 去除首尾空格
+
+				// 1. 非空校验
+				if (!phone) {
+					uni.showToast({
+						title: "手机号不能为空",
+						icon: "none"
+					});
+					return "请输入正确的手机号";
+				}
+
+				// 2. 格式校验(中国大陆手机号规则:11位数字,以1开头)
+				const phoneReg = /^1[3-9]\d{9}$/; // 正则表达式
+				if (!phoneReg.test(phone)) {
+					uni.showToast({
+						title: "请输入正确的手机号",
+						icon: "none"
+					});
+					return "请输入正确的手机号";
+				}
+
+				// 校验通过
+				return '';
+			}
+
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.border-box {
+		width: 100vw;
+		height: 100vh;
+		background-image: url(/static/image/device/ipad_yjf_boder.png);
+		background-repeat: no-repeat;
+		position: relative;
+		background-size: 100% 100%;
+		box-sizing: border-box;
+		padding: 12px;
+	}
+
+	.content {
+		// height: 100%;
+		width: 100%;
+		height: 100%;
+		background-image: url(/static/image/device/inner_page_bg.png);
+		background-repeat: no-repeat;
+		background-size: 100% 100%;
+		position: relative;
+		padding: 30px;
+
+		.top-box {
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-bottom: 30px;
+
+			.title {
+				font-family: Source Han Serif CN, Source Han Serif CN;
+				font-weight: bold;
+				font-size: 30px;
+				color: #8F6726;
+				text-align: center;
+			}
+
+			.back-box {
+				width: 102px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				// padding: 12px 8px;
+				justify-content: center;
+
+				view {
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 18px;
+					color: #8F6726;
+					text-align: center;
+					margin-left: 10px;
+				}
+
+				// position: absolute;
+				// left: 30px;
+				image {
+					width: 24px;
+					height: 24px;
+				}
+			}
+
+			.select {
+				min-width: 160px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				padding: 12px;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				image {
+					width: 24px;
+					height: 24px;
+
+					&:last-child {
+						width: 12px;
+						height: 12px;
+					}
+				}
+
+				.date {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.text {
+					margin-left: 10px;
+					margin-right: 10px;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 18px;
+					color: #8F6726;
+					text-align: center;
+				}
+			}
+		}
+
+		.list {
+			width: 100%;
+			height: calc(100% - 76px);
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		.tab-box {
+			width: 100%;
+			height: 100%;
+			// margin-top: 40px;
+			display: flex;
+			align-items: center;
+
+			// justify-content: center;
+			.tabs {
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: flex-start;
+
+				.item {
+					// padding:40px;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					width: 113px;
+					height: 163px;
+					background: #FBF4EE;
+					border-radius: 18px 0px 0px 18px;
+					border: 2px solid rgba(143, 103, 38, 0.3);
+
+					&:last-child {
+						margin-top: 30px;
+					}
+
+					image {
+						width: 50px;
+						height: 50px;
+						margin-bottom: 12px;
+					}
+
+					.title {
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 600;
+						font-size: 24px;
+						color: #8F6726;
+						text-align: center;
+					}
+
+
+					&.active {
+						background: linear-gradient(180deg, #E3B379 0%, #8F6726 100%);
+						border: 2px solid #8F6726;
+
+						.title {
+							color: #fff;
+						}
+					}
+				}
+			}
+		}
+
+		.test-box {
+			flex: 1;
+			height: 100%;
+			// width: 1460px;
+			// height: 862px;
+			border-radius: 15px;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			padding: 80px 20px;
+			background: #FFFFFF;
+			border: 2px solid #8F6726;
+
+			.note {
+				width: 100%;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 24px;
+				color: #8F6726;
+				text-align: center;
+				margin-bottom: 20px;
+			}
+
+			.note2 {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 21px;
+				color: #A14212;
+				text-align: center;
+				margin-bottom: 40px;
+			}
+
+			.img-box {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.bg-box {
+					width: 396px;
+					height: 370px;
+					background: #FBF4EE;
+					border-radius: 12px 12px 12px 12px;
+					border: 1px solid #8F6726;
+				}
+			}
+
+			.left {
+				width: 320px;
+				height: 400px;
+				background: #FBF4EE;
+				border-radius: 16px;
+				border: 1px solid #8F6726;
+				margin-right: 70px;
+
+				.bg {
+					width: 100%;
+					height: 320px;
+					border-radius: 16px 16px 0 0;
+					background-image: url(/static/image/device/left_hand_img.png);
+					background-repeat: no-repeat;
+					background-size: 100% 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					image {
+						width: 68px;
+						height: 68px;
+					}
+				}
+
+				.btn {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					text-align: center;
+
+					image {
+						width: 24px;
+						height: 24px;
+						margin-right: 10px;
+					}
+
+					text {
+						line-height: 80px;
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 500;
+						font-size: 24px;
+						color: #8F6726;
+					}
+				}
+			}
+
+			.right {
+				width: 320px;
+				height: 400px;
+				background: #FBF4EE;
+				border-radius: 16px;
+				border: 1px solid #8F6726;
+
+				.bg {
+					width: 100%;
+					height: 320px;
+					border-radius: 16px 16px 0 0;
+					background-image: url(/static/image/device/right_hand_img.png);
+					background-repeat: no-repeat;
+					background-size: 100% 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					image {
+						width: 68px;
+						height: 68px;
+					}
+				}
+
+				.btn {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					text-align: center;
+
+					image {
+						width: 24px;
+						height: 24px;
+						margin-right: 10px;
+					}
+
+					text {
+						line-height: 80px;
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 500;
+						font-size: 24px;
+						color: #8F6726;
+					}
+				}
+			}
+
+			.btn-box {
+				margin-top: 40px;
+				width: 196px;
+				height: 53px;
+				line-height: 53px;
+				border-radius: 12px 12px 12px 12px;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				background: #8F6726;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 21px;
+				color: #FFFFFF;
+				text-align: center;
+			}
+		}
+	}
+
+	.connect-box {}
+
+	/* 遮罩层样式 */
+	.mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 999;
+		animation: fadeIn 0.3s ease;
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container2 {
+		//width: 50%;
+		min-height: 250px;
+		background: #FBF4EE;
+		border-radius: 12px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: space-between;
+		padding: 30px 50px;
+
+		.title-t {
+			font-size: 24px;
+			font-weight: bold;
+			color: #8F6726;
+			text-align: center;
+			margin-bottom: 10px;
+		}
+
+		.title-r {
+			font-size: 20px;
+			color: #8F6726;
+			text-align: center;
+			padding: 20px 0;
+		}
+
+		.btn-r {
+			text-align: center;
+			background: #8F6726;
+			font-size: 20px;
+			color: #FBF4EE;
+			border-radius: 12px;
+			width: 100%;
+			height: 50px;
+			line-height: 50px;
+			margin-top: 10px;
+		}
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container {
+		width: 80%;
+		//min-width: 840px;
+		background: #FBF4EE;
+		border-radius: 12px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+	}
+
+	/* 弹窗头部样式 */
+	.popup-header {
+		padding: 20px;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		background: #E9DDCD;
+
+		.goback {
+			background: #FFFFFF;
+			border-radius: 4px;
+			border: 1px solid #8F6726;
+			padding: 8px 16px;
+			font-size: 16px;
+			color: #8F6726;
+			text-align: center;
+		}
+	}
+
+	.popup-title {
+		flex: 1;
+		font-family: Source Han Serif CN, Source Han Serif CN;
+		font-weight: bold;
+		font-size: 24px;
+		color: #8F6726;
+		text-align: center;
+	}
+
+	.close-btn {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		transition: all 0.2s ease;
+
+		image {
+			width: 24px;
+			height: 24px;
+		}
+	}
+
+	/* 弹窗内容样式 */
+	.popup-content {
+		width: 90%;
+		padding: 40px 30px;
+		font-size: 20px;
+		color: #666;
+		line-height: 1.6;
+		background: #FBF4EE;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin: auto;
+
+		.form-item {
+			display: flex;
+			align-items: center;
+			margin-bottom: 20px;
+
+			.label {
+				width: 100px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20px;
+				color: #8F6726;
+				text-align: right;
+			}
+
+			.form-input {
+				width: 400px;
+				height: 47px;
+				box-sizing: border-box;
+				background: #FFFFFF;
+				border-radius: 6px;
+				border: 1px solid #8F6726;
+				padding: 15px 26px;
+			}
+
+			.text-input {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #9B9B9B;
+				text-align: left;
+			}
+
+			.r-box {
+				width: 400px;
+				height: 47px;
+			}
+
+			.picker-box {
+
+				// width: 540px;
+				// height: 64px;
+				// box-sizing: border-box;
+				// background: #FFFFFF;
+				// border-radius: 8px;
+				// border: 2px solid #8F6726;
+				// padding: 15px 26px;
+				.date {
+					image {
+						width: 32px;
+						height: 32px;
+					}
+				}
+
+			}
+
+			&:last-child {
+				margin-bottom: 0;
+			}
+
+		}
+
+		.form-item2 {
+			display: flex;
+			align-items: center;
+			margin-bottom: 20px;
+
+			.label {
+				width: 120px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20px;
+				color: #8F6726;
+				text-align: right;
+			}
+
+			.form-input {
+				width: 150px;
+				height: 47px;
+				box-sizing: border-box;
+				background: #FFFFFF;
+				border-radius: 6px;
+				border: 1px solid #8F6726;
+				padding: 15px 26px;
+			}
+
+			.text-input {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #9B9B9B;
+				text-align: left;
+			}
+
+			.r-box {
+				width: 400px;
+				height: 47px;
+			}
+
+			.picker-box {
+
+				// width: 540px;
+				// height: 64px;
+				// box-sizing: border-box;
+				// background: #FFFFFF;
+				// border-radius: 8px;
+				// border: 2px solid #8F6726;
+				// padding: 15px 26px;
+				.date {
+					image {
+						width: 32px;
+						height: 32px;
+					}
+				}
+
+			}
+
+		}
+	}
+
+	.search-cont {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+
+		.form-input {
+			flex: 1;
+			height: 47px;
+			margin-right: 15px;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 8px;
+			border: 1px solid #8F6726;
+			padding: 11px 20px;
+		}
+
+		.text-input {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 18px;
+			color: #9B9B9B;
+			text-align: left;
+		}
+
+		.search-btn {
+			width: 108px;
+			height: 47px;
+			background: #8F6726;
+			border-radius: 6px 6px 6px 6px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+
+			image {
+				width: 18px;
+				height: 18px;
+				margin-right: 5px;
+			}
+
+			text {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #FFFFFF;
+				text-align: center;
+			}
+		}
+	}
+
+	.isNull {
+		text-align: center;
+		color: #8F6726;
+	}
+
+	.userList-box {
+		margin-top: 30px;
+		width: 100%;
+		background: #FFFFFF;
+		border-radius: 12px;
+		overflow: hidden;
+	}
+
+	.userList {
+		width: 100%;
+		height: 330px;
+		overflow-y: auto;
+
+		&::-webkit-scrollbar {
+			display: block !important;
+			width: 10px !important;
+			/* 滚动条宽度 */
+		}
+
+		&::-webkit-scrollbar-thumb {
+			background: #8F6726 !important;
+			/* 滚动条滑块颜色 */
+			border-radius: 5px !important;
+			/* 滑块圆角 */
+		}
+
+		.item {
+			width: 100%;
+			padding: 17px 22px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			.title {
+				flex: 1;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #8F6726;
+				text-align: left;
+			}
+
+			.right-box {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				.rest {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 59px;
+					height: 33px;
+					border-radius: 6px 6px 6px 6px;
+					border: 1px solid #8F6726;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 16px;
+					color: #8F6726;
+					margin-right: 16px;
+				}
+
+				.select {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 59px;
+					height: 33px;
+					border-radius: 6px 6px 6px 6px;
+					border: 1px solid #8F6726;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 16px;
+					color: #8F6726;
+
+					&.active {
+						background: #8F6726;
+						color: #fff;
+					}
+				}
+			}
+		}
+	}
+
+	.userDetail {
+		// margin-top: 30px;
+		width: 100%;
+		background: #FFFFFF;
+		border-radius: 12px;
+		padding: 0 30px;
+		height: 50vh;
+		overflow-y: auto;
+
+		&::-webkit-scrollbar {
+			display: block !important;
+			width: 10px !important;
+			/* 滚动条宽度 */
+		}
+
+		&::-webkit-scrollbar-thumb {
+			background: #8F6726 !important;
+			/* 滚动条滑块颜色 */
+			border-radius: 5px !important;
+			/* 滑块圆角 */
+		}
+
+		.item {
+			width: 100%;
+			padding: 15px 0px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 20px;
+			color: #8F6726;
+			border-bottom: 1px dashed #8F6726;
+
+			text {
+				flex: 1
+			}
+
+			&:last-child {
+				border: 0;
+			}
+		}
+	}
+
+	/* 弹窗底部样式 */
+	.popup-footer {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-bottom: 30px;
+		// background: #FBF4EE;
+		// border-top: 1px solid #eee;
+	}
+
+	.btn2 {
+		// flex: 1;
+		padding: 26px 0;
+		text-align: center;
+		font-size: 20px;
+		transition: all 0.2s ease;
+	}
+
+	.confirm-btn {
+		width: 185px;
+		height: 53px;
+		background: #8F6726;
+		border-radius: 12px 12px 12px 12px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		text {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 20px;
+			color: #FFFFFF;
+			text-align: center;
+		}
+
+		image {
+			width: 24px;
+			height: 24px;
+			margin-right: 10px;
+		}
+	}
+
+	.confirm-btn2 {
+		width: 113px;
+		height: 53px;
+		background: #8F6726;
+		border-radius: 12px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		text {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 20px;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+
+	/* 动画效果 */
+	@keyframes fadeIn {
+		from {
+			opacity: 0;
+		}
+
+		to {
+			opacity: 1;
+		}
+	}
+
+	@keyframes scaleIn {
+		from {
+			transform: scale(0.9);
+			opacity: 0;
+		}
+
+		to {
+			transform: scale(1);
+			opacity: 1;
+		}
+	}
+</style>

BIN
pages/device/tongue.zip


+ 502 - 0
pages/device/tongue/facePhoto.nvue

@@ -0,0 +1,502 @@
+<template>
+	<view class="live-pusher-box" :style="{width: width + 'px',height: height + 'px'}"> 
+		
+		<Ba-CameraView ref="cameraView" :load="loadData" :style="{flex: 1,width: width + 'px', height: cameraHeight + 'px',display:'none'}" ></Ba-CameraView>
+		
+		<cover-view class="cover-view" :style="{width: width + 'px',height: height + 'px'}">
+			<cover-view class="uni-nav-bar" :style="{width: width + 'px'}">
+				<cover-view :style="{height: statusBarHeight,width: width + 'px'}"></cover-view>
+					<cover-view class="uni-nav-barbox">
+						<cover-view class="flex-center boder-box" @click="back">
+							<cover-image class="uni-nav-back" src="@/static/image/device/back_icon33.png" mode="aspectFill"></cover-image>
+							<text class="uni-nav-title-t">返回</text>
+						</cover-view>
+					</cover-view>
+			</cover-view>
+			<cover-view class="title-box" :style="{width: width + 'px'}">
+				<cover-view :style="{height: statusBarHeight,width: width + 'px'}"></cover-view>
+				<text class="title">请拍摄面部</text>
+				<text class="tips">面部保持在中间,无遮挡,平视摄像头</text>
+			</cover-view>
+			<!-- <cover-view class="box" :style="{width:width + 'px',height: height + 'px'}">
+					<cover-view class="imagebox" :style="{width:width + 'px'}">
+						<cover-image class="face" :style="{width:width + 'px'}" src="@/static/image/device/facial_photography_mask_bg.png" mode="aspectFill"></cover-image>
+					</cover-view>
+			</cover-view> -->
+		</cover-view>
+	
+		<view class="camera-footer" id="camera-footer" :style="{width: width + 'px'}">
+			<view class="camera-options" :style="{width: width + 'px'}">
+				<view class="camera-options-left camera-item" @click="handleAlbum">
+					<image src="@/static/image/device/album_icon24.png" mode="scaleToFill" style="width: 34rpx;height:34rpx;margin-bottom: 5rpx;"></image>
+					<text class="camera-item-t">相册上传</text>
+				</view>
+				<view class="camera-options-center camera-item" @click="handleShutter">
+					<view class="photograph-btn"></view>
+				</view>
+				<view class="camera-options-ritht camera-item" @click="handleReversal">
+					<image src="@/static/image/device/switch_camera_icon24.png" mode="scaleToFill" style="width: 34rpx;height:34rpx;margin-bottom: 5rpx;"></image>
+					<text class="camera-item-t">切换摄像头</text>
+				</view>
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import { isAgreePrivacy } from '@/utils/common.js'
+	import shareBox from "@/components/share-box/share-boxN.vue"
+	import {getCount} from '@/api/healthTongue.js'
+	import { premissionCheck } from "@/js_sdk/wa-permission/permission.js"
+	// 这个组件仅限APP使用!!!
+	export default {
+		components: {
+			shareBox
+		},
+		data() {
+			// 在data初始化时就进行设备检测
+			const systemInfo = uni.getSystemInfoSync();
+			console.log('设备信息:', systemInfo);
+			// // 判断是否为平板设备
+			// const isTabletBySize = systemInfo.screenWidth > 800 && systemInfo.screenHeight > 1200;
+			const isTabletByModel = systemInfo.brand && (
+				//systemInfo.model.toLowerCase().includes('tablet') ||
+				//systemInfo.model.toLowerCase().includes('pad') ||
+				systemInfo.brand.toLowerCase().includes('shimeta')
+			);
+			
+			const isTablet = isTabletByModel;
+			const defaultCameraFacing = isTablet ? false : true; // 平板默认后置,手机默认前置
+			console.log('设备检测结果:', {
+				isTablet,
+				defaultCameraFacing: defaultCameraFacing ? '前置' : '后置',
+				screenSize: `${systemInfo.screenWidth}x${systemInfo.screenHeight}`,
+				model: systemInfo.model
+			});
+			
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				height: uni.getSystemInfoSync().screenHeight,
+				width: uni.getSystemInfoSync().screenWidth,
+				cameraHeight: uni.getSystemInfoSync().screenHeight - uni.getSystemInfoSync().statusBarHeight - 100,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				livePusher: null,
+				ready: true,
+				cameraHeight: '', //相机画面宽度
+				coverImage: null,
+				counts: 0,
+				marginTop: uni.getSystemInfoSync().statusBarHeight + uni.upx2px(130),
+				device: 'back',
+				cameraContext: null,
+				shutterShow: false,
+				menuLeft: '100%',
+				// 设备类型检测
+				isTablet: isTablet,
+				isShimeta: isTablet,
+				loadData: { //配置
+				    isToast: false,
+					isShowVibrate:false,
+					isFacingFront: defaultCameraFacing, // 根据设备类型设置默认摄像头
+					captureQuality:"HIGH", //摄像头清晰度 **HIGH**: 1920x1080 (高清)  **MEDIUM**: 1280x720 (中等) **LOW**: 640x480 (低清)
+					autoZoomEnabled: true,     // 启用自动变焦
+					autoZoomMode: "FACE",       // 变焦模式:FACE(面部) 或 TONGUE(舌诊)
+					isTablet: isTablet // 设备类型配置
+				},
+				currentQuality:0,
+				currentZoomMode:"FACE", // 默认使用舌诊模式
+				statusMessage:"",
+				windowResizeCallback:null
+			}
+		},
+		created(){
+			let that=this;
+			uni.$on('navigateBack', function(data) {
+				that.handleReversal();
+			});
+		},
+		onLoad() {
+			//this.getCount();
+			this.setListener();
+		},
+		mounted() {
+			// 强制应用配置,确保平板设备使用后置摄像头
+			this.$nextTick(() => {
+				this.forceApplyConfig();
+			});
+		},
+		onShow() {
+			this.windowResizeCallback = (res) => {
+				// 重新获取屏幕尺寸
+				this.getScreenSize(res.size);
+			}
+			uni.onWindowResize(this.windowResizeCallback);
+		},
+		onReady() {
+			setTimeout(()=>{
+				this.switchZoomMode(this.loadData.autoZoomMode);
+			},200);
+		},
+		onUnload() {
+			 if (this.windowResizeCallback) {
+			      uni.offWindowResize(this.windowResizeCallback);
+			      this.windowResizeCallback = null;
+			    }
+			uni.$off('navigateBack');
+		},
+		
+		methods: {
+			getScreenSize(res) {
+				this.width = res.windowWidth
+			    this.height = res.windowHeight
+				if (this.$refs.cameraView) { 
+				      this.switchZoomMode(this.loadData.autoZoomMode);
+				    } else {
+				        
+				    }
+			},
+			switchZoomMode(currentMode) {
+				//启动舌诊模式自动变焦
+				this.$refs.cameraView.setAutoZoom((result) => {
+					if (result.ok) {
+						console.log('自动变焦设置成功:', this.loadData.autoZoomMode);
+					} else {
+						console.error('自动变焦模式:', result.msg);
+					}
+				}, {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: currentMode
+				});
+			},
+			
+			getCount(){
+				getCount().then(
+					res => {
+						if(res.code==200){
+							this.counts=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+		
+			// 快门
+			handleShutter() {
+				if (this.ready) {
+					this.ready = false;
+					let options={scaleW:403,scaleH:620,isCrop:false};
+					this.$refs.cameraView.takePicture((res) => {
+						  this.ready = true;
+						  const filePath=res.data.path;
+						  console.log("qxj takePicture",res);
+						  plus.io.resolveLocalFileSystemURL(filePath, (entry) => {
+								 let url= entry.toLocalURL();
+								 uni.redirectTo({
+								 	url:"/pages/device/tongue/index?rightUrl="+url
+								 })
+						   }, (error) => {
+								console.error('Failed to resolve file system URL:', error);
+						   });
+					  },options);
+					
+				}
+			},
+			// 相册
+			async handleAlbum() {
+				// #ifdef APP-PLUS
+				 uni.chooseImage({
+						count: 1, //默认9
+						sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+						sourceType: ['album'], //从相册选择
+						success: (res) => {
+							uni.setStorageSync("tongueUrl",res.tempFilePaths[0])
+							let url= res.tempFilePaths[0]
+							uni.redirectTo({
+								url:"/pages/device/tongue/index?rightUrl="+url
+							})
+						}
+				 });
+				// #endif
+			},
+			// 反转摄像头
+			handleReversal() {
+				if(this.isShimeta){
+					uni.showToast({
+						title:"该设备不支持切换摄像头",
+						icon:"none"
+					});
+					return;
+				}
+				this.switchZoomMode(this.loadData.autoZoomMode)
+				this.$refs.cameraView.switchCamera((result) => {
+				    if (result.ok) {
+						this.loadData.isFacingFront = !this.loadData.isFacingFront;
+						this.statusMessage = `已切换到${this.loadData.isFacingFront ? '前置' : '后置'}摄像头`;
+				        uni.showToast({
+				            title: "切换成功",
+				            icon: 'none'
+				        });
+				    } else {
+						this.statusMessage = '切换摄像头失败: ' + result.msg;
+				    }
+				});
+			},
+			// 强制应用当前配置(确保平板设备配置生效)
+			forceApplyConfig() {
+				console.log('强制应用配置:', this.loadData);
+				// 如果是平板设备,确保使用后置摄像头
+				if (this.isTablet && this.loadData.isFacingFront) {
+					console.log('检测到平板设备使用前置摄像头,强制切换到后置');
+					this.loadData.isFacingFront = false;
+					this.statusMessage = '平板设备强制使用后置摄像头';
+					// 调用底层API确保配置生效
+					this.setRearCamera();
+					
+					// 平板设备切换摄像头后,重新应用自动变焦设置
+					if (this.loadData.autoZoomEnabled) {
+						setTimeout(() => {
+							this.reapplyAutoZoom();
+						}, 1000); // 等待摄像头切换完成
+					}
+				}
+				// 更新状态显示
+				this.statusMessage = this.isTablet ? 
+					'平板设备 - 后置摄像头' : 
+					(this.loadData.isFacingFront ? '手机设备 - 前置摄像头' : '手机设备 - 后置摄像头');
+			},
+			
+			// 重新应用自动变焦设置
+			reapplyAutoZoom() {
+				console.log('重新应用自动变焦设置:', {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: this.currentZoomMode
+				});
+				this.$refs.cameraView.setAutoZoom((result) => {
+					if (result.ok) {
+						this.statusMessage = `平板设备 - 自动变焦已重新应用 (${this.currentZoomMode}模式)`;
+						console.log('平板设备自动变焦重新应用成功');
+					} else {
+						this.statusMessage = '重新应用自动变焦失败: ' + result.msg;
+						console.error('Failed to reapply auto zoom:', result.msg);
+					}
+				}, {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: this.currentZoomMode
+				});
+			},
+			// 舌诊记录
+			handleReportlist() {
+				uni.navigateTo({
+					url: "/pages/user/tongue/tongueList"
+				})
+			},
+			setListener() {
+				this.$refs.cameraView.setListener((res) => {
+					console.log("qxj setListener",res);
+					if (res.action == "error") {
+						this.showToast(res.msg)
+					}
+				});
+			},
+			showToast(msg) {
+				uni.showToast({
+					title: msg,
+					icon: 'none'
+				});
+			},
+			navTo() {
+				uni.navigateTo({
+					url: "/pages/device/tongue/ques"
+				})
+			},
+			// 返回
+			back(){
+				uni.navigateBack();
+			},
+		
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.flex-center {
+		@include u-flex(row, center, center);
+	}
+	.live-pusher-box {
+		@include u-flex(column, center, center);
+	}
+	.imagebox {
+		top:0;
+		left: 0;
+		right: 0; // 新增:让容器铺满屏幕宽度,确保文本居中生效
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+	.face {
+	 width: 100%;
+	}
+	.cover-view {
+		width: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+		@include u-flex(column, center, center);
+	}
+	.box {
+		
+	}
+	.title-box{
+		 position: fixed;
+		  top: 0;
+		  left: 0;
+		  right: 0; // 新增:让容器铺满屏幕宽度,确保文本居中生效
+		  z-index: 998; // 低于导航栏 z-index:999,避免遮挡导航栏
+		  width: 100%;
+	}
+	.title {
+		// margin-top: calc(var(--status-bar-height) + 130rpx);
+		font-family: SourceHanSansCN-Medium;
+		font-weight: 500;
+		font-size: 18rpx;
+		color: #fff;
+		text-align: center;
+	}
+	.tips {
+		margin-top: 10rpx;
+		// margin-bottom: 60rpx;
+		font-family: SourceHanSansSC-Regular;
+		font-weight: 400;
+		font-size: 14rpx;
+		color: #fff;
+		text-align: center;
+	}
+	.boder-box{
+		width: 66rpx;
+		height: 32rpx;
+		background: rgba(255,255,255,0.2);
+		border-radius: 8rpx;
+		border: 1px solid #FFFFFF;
+	}
+	.uni-nav-bar {
+		position: fixed;
+		top: 0;
+		left: 0;
+		width: 100%;
+		z-index: 999;
+		overflow: hidden;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		color: #fff;
+		// background-color: #000;
+		.uni-nav-barbox {
+			// width: 100%;
+			// height: 88rpx;
+			padding: 0 24rpx;
+			// box-sizing: border-box;
+		// @include u-flex(row, center,space-between);
+			// position: relative;
+			font-size: 24rpx;
+		}
+		.uni-nav-title-t {
+			font-family: SourceHanSansSC;
+			font-weight: 400;
+			margin-left: 5rpx;
+			color: #fff;
+			/* #ifdef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+			/* #ifndef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+		}
+		.uni-nav-title {
+			// flex-shrink: 0;
+			font-family: SourceHanSansSC;
+			font-weight: 400;
+			color: #fff;
+			/* #ifdef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+			/* #ifndef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+			@include u-flex(row, center, flex-start);
+			.ques {
+				// flex-shrink: 0;
+				width: 33rpx;
+				height: 33rpx;
+				margin-left: 9rpx;
+			}
+		}
+		.uni-nav-back {
+			width: 16rpx;
+			height: 16rpx;
+		}
+	}
+	.camera-footer {
+		background-color: #000;
+		overflow: hidden;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+	}
+	.usenum {
+		text-align: center;
+		@include u-flex(row, center, center);
+		.usenum-t {
+			font-family: SourceHanSansCN;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			padding: 14rpx;
+		}
+	}
+	.camera-options {
+		width: 100%;
+		padding-top: 15rpx;
+		padding-bottom: 15rpx;
+		// box-sizing: border-box;
+		@include u-flex(row, center, space-around);
+	}
+	.camera-item {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+	.camera-item-t {
+		font-family: SourceHanSansCN;
+		font-weight: 400;
+		font-size: 16rpx;
+		color: #FFFFFF;
+	}
+	.camera-options-center {
+		width: 52rpx;
+		height: 52rpx;
+		border-radius: 50%;
+		border-radius: 50%;
+		border: 3px solid #FFFFFF;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	.photograph-btn {
+		width: 45rpx;
+		height: 45rpx;
+		background: #8F6726;
+		border-radius: 50%;
+	}
+</style>

+ 1588 - 0
pages/device/tongue/index.vue

@@ -0,0 +1,1588 @@
+<template>
+	<view class="border-box">
+		<view class="content">
+			<view class="top-box">
+				<view class="back-box x-f">
+					<image src="/static/image/device/back_icon32.png"></image>
+					<view @click="goBack()">返回</view>
+				</view>
+				<view class="title">体质辨识</view>
+				<view class="select" @click="onOpenList">
+					<view class="date x-bc">
+						<image src="/static/image/device/user_icon32.png"></image>
+						<text class="text">
+							{{selectUser!==null?selectUser.nickName:'选择用户'}}
+						</text>
+						<image src="/static/image/device/arrow_icon16.png"></image>
+					</view>
+				</view>  
+			</view>
+			
+			<view class="list">
+				<view class="tab-box">
+					<view class="tabs">
+						<view class="item active">
+							<image src="/static/image/device/tongue_on_icon68.png"></image>
+							<view class="title">舌面诊</view>
+						</view>
+						<view class="item" @click="navTo('/pages/device/pulse/index')">
+							<image src="/static/image/device/pulse_diagnosis_icon68.png"></image>
+							<view class="title">脉诊</view>
+						</view>
+					</view>
+					<view class="test-box">
+						<view class="note">请按照图片指识,点击上传相应的清晰照片为获取准确的结果</view>
+						<view class="note1">请您在光线充足环境下测试,尽量拉近面部与屏幕距离</view>
+						<view class="img-box" :class="{ 'flex-box': width < height }">
+							<view class="left" @click="goCamera">
+								<view class="bg"
+									:style="{backgroundImage:leftImg==null?'url(/static/image/device/tongue_photo_img.png)':''}">
+									<image v-if="leftImg==null" src="/static/image/device/add_icon68.png"></image>
+								</view>
+								<view v-if="leftImg!==null" class="delImg" @click.stop="delImg('left')">
+									<image src="/static/image/device/close_icon33.png"></image>
+								</view>
+								<view v-if="leftImg!==null" class="upImg">
+									<image :src='leftImg' mode="aspectFill"></image>
+								</view>
+								<view v-if="leftImg==null" class="btn">
+									添加舌面照
+								</view>
+							</view>
+							<view class="right" @click="goCameraFace">
+								<view class="bg"
+									:style="{backgroundImage:rightImg==null?'url(/static/image/device/facial_photo_img.png)':''}">
+									<image v-if="rightImg==null" src="/static/image/device/add_icon68.png"></image>
+								</view>
+								<view v-if="rightImg!==null" class="delImg" @click.stop="delImg('right')">
+									<image src="/static/image/device/close_icon33.png"></image>
+								</view>
+								<view v-if="rightImg!==null" class="upImg">
+									<image :src='rightImg' mode="aspectFill"></image>
+								</view>
+								<view v-if="rightImg==null" class="btn">
+									添加面部照
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view v-if="isResult" class="mask">
+				<view class="popup-container2">
+					<view class="title-t">上传成功</view>
+					<view v-if="isIndex==0" class="title-r">请继续进行面诊检测</view>
+					<view v-if="isIndex==1" class="title-r">请继续进行脉诊检测</view>
+					<!-- <view class="title-r">{{isIndex==0?'舌诊':'面诊'}}结果请下载芳华未来APP查看</view> -->
+					<view class="btn-r" @click="closeP">确认</view>
+				</view>
+			</view>
+			<view v-if="showList" class="mask">
+				<!-- 弹窗内容 -->
+				<view class="popup-container">
+					<!-- 弹窗头部 -->
+					<view class="popup-header">
+						<text class="popup-title">选择用户</text>
+						<view class="close-btn" @click="onCloseList">
+							<image src="/static/image/device/close_icon32.png"></image>
+						</view>
+					</view>
+					<!-- 弹窗主体内容 -->
+					<view class="popup-content">
+						<view class="search-cont">
+							<input type="text" v-model="keyword" class="form-input" placeholder="请输入用户姓名或者手机号"
+								placeholder-class="text-input" />
+							<view class="search-btn" @click="doSearch">
+								<image src="/static/image/device/search_icon24.png"></image>
+								<text>搜索</text>
+							</view>
+						</view>
+						<view class="userList-box">
+						<view class="userList" v-if="dataList.length>0">
+							<view class="item" v-for="(item,index) in dataList" :key="index">
+								<view class="title">{{item.nickName||''}}-{{item.phone||''}}</view>
+								<view class="right-box">
+									<view class="rest" @click="onOpenDetail(item)">
+										查看
+									</view>
+									<view class="rest" @click="editDetail(item)">
+										编辑
+									</view>
+									<view :class="item.userId==aIndex?'select active':'select'" @click="select(item)">
+										选择
+									</view>
+								</view>
+							</view>
+						</view>
+						</view>
+						<view v-if="dataList.length==0" class="isNull">暂无数据</view>
+					</view>
+
+					<!-- 弹窗底部按钮 -->
+					<view class="popup-footer">
+						<view class="btn2 confirm-btn" @click="onOpen">
+							<image src="/static/image/device/add_icon32.png"></image>
+							<text>新建用户</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<user-card :show="show" :initial-form="initData" @close="onClose" @confirm="onConfirm" @update="onEdit"></user-card>
+			<view v-if="showDetail" class="mask">
+				<!-- 弹窗内容 -->
+				<view class="popup-container">
+					<!-- 弹窗头部 -->
+					<view class="popup-header">
+						<view class="goback" @click="onOpenList">返回</view>
+						<text class="popup-title">选择用户</text>
+						<view class="close-btn" @click="onCloseDetail">
+							<image src="/static/image/device/close_icon32.png"></image>
+						</view>
+					</view>
+					<!-- 弹窗主体内容 -->
+					<view class="popup-content">
+						<view class="userDetail">
+							<view class="item">
+								<view class="label">姓名:</view>
+								<text>{{detail.username||'-'}}</text>
+							</view>
+							<view class="item">
+								<view class="label">手机号:</view>
+								<text>{{detail.phone||'-'}}</text>
+							</view>
+							<view class="item">
+								<view class="label">性别:</view>
+								<text>{{detail.sex==1?"男":"女"}}</text>
+							</view>
+							<view class="item">
+								<view class="label">年龄:</view>
+								<text>{{detail.age||'-'}}岁</text>
+							</view>
+							<view class="item">
+								<view class="label">身高:</view>
+								<text>{{detail.height||'-'}}cm</text>
+							</view>
+							<view class="item">
+								<view class="label">体重:</view>
+								<text>{{detail.weight||'-'}}kg</text>
+							</view>
+							
+							<view class="item" >
+								<view class="label">既往病史:</view>
+								<text>{{detail.previousMedicalHistory||'-'}}</text>
+						    </view>
+						<view class="item" >
+							<view class="label">过敏史:</view>
+							<text>{{detail.historyOfAllergies||'-'}}</text>
+						</view>
+						<view v-if="detail.habitList.length>0" class="item" v-for="item in detail.habitList" :key="item.optionId">
+							<view class="label">{{item.typeName ||'-'}}:</view>
+							<text>{{item.optionName||'-'}}</text>
+						</view>
+						</view>
+					</view>
+
+					<!-- 弹窗底部按钮 -->
+					<view class="popup-footer">
+						<view class="btn2 confirm-btn" @click="selectBtn(detail)">
+							<text>选择该用户</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		selectUsernameOrPhoneOrTime,
+		addUser,
+		editUser,
+		selectQueryFsUser
+	} from '@/api/user.js'
+	import {getCount,add,addFace} from '@/api/healthTongue.js'
+	import {
+		getDictByKey
+	} from '@/api/common.js'
+	import {
+		el,
+		tr
+	} from "date-fns/locale";
+	import userCard from "@/components/userCard.vue"
+	export default {
+		components: {
+			userCard
+		},
+		data() {
+			return {
+				height: uni.getSystemInfoSync().screenHeight,
+				width: uni.getSystemInfoSync().screenWidth,
+				isIndex:0,
+				isResult:false,
+				msgType: 'success',
+				selectedDate: "",
+				selectUser: null,
+				show: false,
+				showList: false,
+				showDetail: false,
+				total: 0,
+				aIndex: '',
+				createTimes: null,
+				keyword: '',
+				type: 0,
+				leftImg: null,
+				rightImg: null,
+				dataList: [],
+				detail: {},
+				agree: false,
+				flag:true,
+				errMsg:"",
+				form: {
+					sex: 1
+				},
+				initData:{}
+			}
+		},
+		onLoad(options) {
+			this.userId = options.userId
+			this.selectUser=uni.getStorageSync('selectUser')||null;
+			this.leftImg=null
+			this.rightImg=null
+			let left=options.leftUrl
+			let right=options.rightUrl
+			console.log('===',options.leftUrl,options.rightUrl)
+			if(left){
+				this.leftImg=left
+				this.startDetection()
+			}
+			if(right){
+				this.rightImg=right
+				this.startDetectionFace()
+			}
+			
+		},
+		onShow(){
+			//this.leftImg=null;
+			//this.rightImg=null;
+		},
+		methods: {
+			goBack() {
+				uni.navigateBack({
+				  delta:1
+				})
+			},
+			doSearch() {
+				console.log(this.keyword, '---')
+				// if(this.keyword!==''){
+				this.selectUsernameOrPhoneOrTime()
+				// }
+			},
+			select(item) {
+				this.aIndex = item.userId
+				this.selectUser = item
+				uni.setStorageSync("selectUser",item)
+				this.showList = false
+			},
+			selectBtn(item) {
+				if(item.id==null){
+					uni.showToast({
+						title: '请先完善用户基本信息',
+						icon: 'none'
+					});
+					return;
+				}
+				this.selectUser = this.dataList.find(it => it.userId === item.fsUserId);
+				uni.setStorageSync("selectUser", this.selectUser)
+				this.show = false
+				this.showList = false
+				this.showDetail = false
+			},
+			createTimesChange(e) {
+				this.selectedDate = e.detail.value; // 例如:"2025-09-17"
+				this.form.birthday = this.selectedDate.replace(/-/g, ""); // 去除 "-"
+			},
+			genderChange(type) {
+				this.form.sex = type
+			},
+			onOpen() {
+				this.show = true
+				this.showList = false
+			},
+			onOpenList() {
+				this.selectUsernameOrPhoneOrTime()
+				this.showList = true
+				this.showDetail = false
+			},
+			onOpenDetail(item) {
+				this.showDetail = true
+				this.showList = false
+				this.detail={}
+				this.selectQueryFsUser(item.userId)
+			},
+			editDetail(item){
+				this.show = true
+				this.showList = false
+				this.selectQueryFsUser(item.userId,'edit')
+			},
+			// 关闭弹窗
+			onClose() {
+				this.show = false
+			},
+			onCloseList() {
+				this.showList = false
+				this.keyword=''
+			},
+			onCloseDetail() {
+				this.showDetail = false
+			},
+			closeP(){
+				this.isResult=false
+				this.leftImg=null
+				this.rightImg=null
+				this.flag = true
+			},
+			// 点击确认按钮
+			onConfirm(data) {
+				// var data = form
+				uni.showLoading({
+					title:"处理中...",
+					mask:true
+				})
+				addUser(data).then(res => {
+						if (res.code == 200) {
+							setTimeout(()=>{
+								uni.showToast({
+									icon: 'success',
+									title: "创建成功",
+								});
+							},200)
+							uni.hideLoading();
+							this.show = false
+							this.showList=true
+							this.form = {
+								sex: 0
+							}
+							this.selectUsernameOrPhoneOrTime()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			// 点击确认按钮
+			onEdit(data) {
+				// var data=this.form
+				//var data = this.form
+				uni.showLoading({
+					title: "处理中...",
+					mask: true
+				})
+				data.userId=this.initData.userId
+				data.fsUserId=this.initData.userId
+				editUser(data).then(res => {
+						if (res.code == 200) {
+							setTimeout(() => {
+								uni.showToast({
+									icon: 'success',
+									title: "修改成功",
+								});
+							}, 200)
+							uni.hideLoading();
+							this.show = false
+							this.showList = true
+							this.form = {
+								sex: 1
+							}
+							this.selectUsernameOrPhoneOrTime()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			selectUsernameOrPhoneOrTime() {
+				var data = {
+					nickName: this.keyword,
+					phone: this.keyword
+				}
+				uni.showLoading({
+					title:"加载中..."
+				})
+				// var user=uni.getStorageSync('userInfo');
+				selectUsernameOrPhoneOrTime(data).then(res => {
+						if (res.code == 200) {
+							uni.hideLoading();
+							this.dataList = res.data
+							this.total = res.data.total || 0
+						} else {
+							uni.hideLoading();
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			selectQueryFsUser(id,val) {
+				selectQueryFsUser({
+					userId: id
+				}).then(res => {
+						if (res.code == 200) {
+							this.detail = res.data
+							if(val=='edit'){
+								this.initData=res.data
+								this.initData.userId=id
+							}
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			goCamera(){
+				var that = this;
+				if(this.$isEmpty(this.selectUser)){
+					uni.showToast({
+						title: '请先选择就诊人',
+						icon: 'none'
+					});
+					return;
+				}
+				uni.navigateTo({
+					url:"/pages/device/tongue/indexOld"
+				});
+				
+			},
+			goCameraFace(){
+				var that = this;
+				if(this.$isEmpty(this.selectUser)){
+					uni.showToast({
+						title: '请先选择就诊人',
+						icon: 'none'
+					});
+					return;
+				}
+				uni.navigateTo({
+					url:"/pages/device/tongue/facePhoto"
+				})
+				
+			},
+			// 选择上传的图片
+			chooseImage(val) {
+				// console.log('图片')
+				var that = this;
+				if(this.selectUser==null||this.selectUser==''){
+					uni.showToast({
+						icon:'none',
+						title: "请选择就诊人",
+					});
+					return;
+				}
+				uni.showActionSheet({
+					itemList: ['相册', '拍照'],
+					success: function(res) {
+						if (res.tapIndex == 0) {
+							//从相册选择
+							that.chooseImageFunction('album', val)
+							
+						} else if (res.tapIndex == 1) {
+							//拍照
+							that.chooseImageFunction('camera', val)
+							// uni.navigateTo({
+							// 	url:"/pages/device/tongue/indexOld"
+							// });
+						}
+					},
+					fail: function(res) {
+
+					}
+				});
+			},
+			chooseImageFunction: function(type, val) {
+				var that = this;
+				uni.chooseImage({
+					count: 1, // 默认9
+					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+					sourceType: [type],
+					success: (res) => {
+						uni.showLoading({
+							title: '图片上传中'
+						})
+						uni.uploadFile({
+							url: uni.getStorageSync('requestPath') +
+							'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+							filePath: res.tempFilePaths[0],
+							name: 'file',
+							formData: {
+								'user': 'test' // 上传附带参数
+							},
+							success: (uploadFileRes) => {
+								uni.hideLoading();
+								console.log('图片',uploadFileRes)
+								// if (val == 1) {
+								// 	// uni.setStorageSync("tongueUrl",res.tempFilePaths[0])
+								// 	this.leftImg = res.tempFilePaths[0]
+								// 	//JSON.parse(uploadFileRes.data).url
+								// 	this.startDetection()
+								// } else {
+								    this.rightImg = res.tempFilePaths[0]
+									this.startDetectionFace()
+								// }
+							},
+							fail: (err) => {
+								uni.hideLoading();
+								uni.showToast({
+									title: '上传失败,请重试',
+									icon: 'none'
+								});
+								console.error('上传失败:', err);
+							}
+						});
+
+					}
+				});
+			},
+			// 查看图片
+			viewImage(e) {
+				uni.previewImage({
+					urls: this.imgList,
+					current: e.currentTarget.dataset.url
+				});
+			},
+			// 删除上传的图片
+			delImg(e) {
+				if (e == 'left') {
+					this.leftImg = null
+				} else if (e == 'right') {
+					this.rightImg = null
+				}
+
+				// var that = this;
+				// uni.showModal({
+				// 	title: '提示',
+				// 	content: '确定要删除照片吗?',
+				// 	cancelText: '取消',
+				// 	confirmText: '确定',
+				// 	success: res => {
+				// 		if (res.confirm) {
+				// 			that.imgList.splice(e.currentTarget.dataset.index, 1)
+				// 			this.photos.splice(e.currentTarget.dataset.index, 1);
+				// 		}
+				// 	},
+				// })
+			},
+			//舌诊
+			startDetection(){
+				this.isIndex=0
+				if(!this.flag){
+					if(!this.$isEmpty(this.errMsg)){
+						uni.showToast({icon:'none',title: this.errMsg});
+					}
+					return;
+				}
+				this.flag=false;
+				
+				uni.uploadFile({
+					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+					filePath: this.leftImg,
+					name: 'file',
+					formData: {
+						'user': 'test'  // 上传附带参数
+					},
+					success: (uploadFileRes) => {
+						console.log('---',uploadFileRes)
+						// console.log('---',JSON.parse(uploadFileRes.data).url)
+						var data={
+							userId:this.selectUser.userId,
+							patientId:this.selectUser.userId,
+							sex:this.selectUser.sex,
+							name:this.selectUser.nickName,
+							tongueUrl:JSON.parse(uploadFileRes.data).url,
+						}
+						uni.showLoading({
+							title:"处理中...",
+							mask:true
+						})
+						add(data).then(res => {
+							console.log('zaizz',data,res)
+								if(res.code==200){
+									uni.hideLoading();
+									// uni.setStorageSync("tongueResult",JSON.stringify(res.data))
+								    this.isResult=true
+								}else{
+									uni.hideLoading();
+									this.errMsg= res.msg;
+									// this.leftImg=null;
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							},
+							rej => {}
+						);
+					},fail: (err) => {
+								uni.showToast({
+									title: '上传失败,请重试',
+									icon: 'none'
+								});
+								uni.hideLoading();
+								console.error('上传失败:', err);
+							}
+				});
+			},
+			//面诊
+			startDetectionFace(){
+				this.isIndex=1
+				console.log('333')
+				if(!this.flag){
+					if(!this.$isEmpty(this.errMsg)){
+						uni.showToast({icon:'none',title: this.errMsg});
+					}
+					return;
+				}
+				if(this.selectUser==null||this.selectUser==''){
+					uni.showToast({
+						icon:'none',
+						title: "请选择就诊人",
+					});
+					return;
+				}
+				this.flag=false;
+				uni.uploadFile({
+					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+					filePath: this.rightImg,
+					name: 'file',
+					formData: {
+						'user': 'test'  // 上传附带参数
+					},
+					success: (uploadFileRes) => {
+						console.log('---',uploadFileRes)
+						// console.log('---',JSON.parse(uploadFileRes.data).url)
+						var data={
+							userId:this.selectUser.userId,
+							sex:this.selectUser.sex,
+							name:this.selectUser.nickName,
+							surfaceUrl:JSON.parse(uploadFileRes.data).url,
+						}
+						uni.showLoading({
+							title:"处理中...",
+							mask:true
+						})
+						addFace(data).then(res => {
+							    console.log('zaiFC',data,res)
+								if(res.code==200){
+									uni.hideLoading();
+									// uni.setStorageSync("tongueResult",JSON.stringify(res.data))
+								    this.isResult=true
+									// uni.redirectTo({
+									// 	url:"/pages/device/tongue/report?id="+res.data.id
+									// });
+								}else{
+									uni.hideLoading();
+									this.errMsg= res.msg;
+									// this.rightImg=null;
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							},
+							rej => {}
+						);
+					},fail: (err) => {
+								uni.hideLoading();
+								uni.showToast({
+									title: '上传失败,请重试',
+									icon: 'none'
+								});
+								console.error('上传失败:', err);
+							}
+				});
+			},
+			getDictByKey(key) {
+				var data = {
+					key: key
+				}
+				getDictByKey(data).then(
+					res => {
+						if (res.code == 200) {
+							if (key == "sys_hospital_level") {
+								this.hosLevelOptions = res.data;
+							}
+						}
+					},
+					err => {}
+				);
+
+			},
+			navTo(url) {
+				uni.redirectTo({
+				  url: url + '?userId=' + this.userId
+				})
+			},
+			
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	page {
+
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.border-box {
+		width: 100vw;
+		height: 100vh;
+		background-image: url(/static/image/device/ipad_yjf_boder.png);
+		background-repeat: no-repeat;
+		position: relative;
+		background-size: 100% 100%;
+		box-sizing: border-box;
+		padding: 12px;
+	}
+
+	.content {
+		// height: 100%;
+		width: 100%;
+		height: 100%;
+		background-image: url(/static/image/device/inner_page_bg.png);
+		background-repeat: no-repeat;
+		background-size: 100% 100%;
+		position: relative;
+		padding: 30px;
+		.top-box {
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-bottom: 30px;
+			.title {
+				font-family: Source Han Serif CN, Source Han Serif CN;
+				font-weight: bold;
+				font-size:30px;
+				color: #8F6726;
+				text-align: center;
+			}
+
+			.back-box {
+				width: 102px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				// padding: 12px 8px;
+				justify-content: center;
+				view {
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 18px;
+					color: #8F6726;
+					text-align: center;
+					margin-left: 10px;
+				}
+				// position: absolute;
+				// left: 30px;
+				image {
+					width: 24px;
+					height: 24px;
+				}
+			}
+
+			.select {
+				min-width: 160px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				padding: 12px;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				image {
+					width: 24px;
+					height: 24px;
+					&:last-child {
+						width: 12px;
+						height:12px;
+					}
+				}
+				
+				.date {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.text {
+					margin-left: 10px;
+					margin-right: 10px;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 18px;
+					color: #8F6726;
+					text-align: center;
+				}
+			}
+		}
+
+		.list {
+			width: 100%;
+			height: calc(100% - 76px);
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+
+		.tab-box {
+			width: 100%;
+			height: 100%;
+			// margin-top: 40px;
+			display: flex;
+			align-items: center;
+			// justify-content: center;
+			.tabs {
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: flex-start;
+
+				.item {
+					// padding:40px;
+					display: flex;
+					flex-direction: column;
+					align-items: center;
+					justify-content: center;
+					width: 113px;
+					height: 163px;
+					background: #FBF4EE;
+					border-radius: 18px 0px 0px 18px;
+					border: 2px solid rgba(143, 103, 38, 0.3);
+
+					&:last-child {
+						margin-top: 30px;
+					}
+
+					image {
+						width: 50px;
+						height: 50px;
+						margin-bottom: 12px;
+					}
+
+					.title {
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 600;
+						font-size: 24px;
+						color: #8F6726;
+						text-align: center;
+					}
+
+					&.active {
+						background: linear-gradient(180deg, #E3B379 0%, #8F6726 100%);
+						border: 2px solid #8F6726;
+
+						.title {
+							color: #fff;
+						}
+					}
+				}
+			}
+		}
+
+		.test-box {
+			flex: 1;
+			height: 100%;
+			// width: 1460px;
+			// height: 862px;
+			border-radius: 15px;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			padding: 80px 20px;
+			background: #FFFFFF;
+			border: 2px solid #8F6726;
+			.note,.note1 {
+				width: 100%;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 18px;
+				color: #8F6726;
+				text-align: center;
+				margin-bottom: 10px;
+			}
+			
+			.note1 {
+				margin-bottom: 40px;
+			}
+
+			.img-box {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				&.flex-box{
+					flex-direction: column;
+					.left{
+						margin-right: 0;
+						margin-bottom: 44rpx;
+					}
+				}
+			}
+
+			.left {
+				width: 237px;
+				height: 296px;
+				background: #FBF4EE;
+				border-radius: 16px;
+				border: 1px solid #8F6726;
+				// overflow: hidden;
+				margin-right: 44px;
+				position: relative;
+				.delImg {
+					top: -30px;
+					right: -20px;
+					position: absolute;
+					z-index: 999;
+					width: 40px;
+					height: 40px;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					background: #8F6726;
+					border-radius: 50%;
+					image{
+						width: 24px;
+						height: 24px;
+						transform: rotate(90deg);
+					}
+				}
+
+				.upImg {
+					top: 0;
+					left: 0;
+					position: absolute;
+					z-index: 99;
+					width: 100%;
+					height: 100%;
+                    border-radius: 12px;
+					overflow: hidden;
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+
+				.bg {
+					width: 100%;
+					height: 237px;
+					border-radius: 12px 12px 0 0;
+					// background-image: url(/static/image/device/tongue_photo_img.png);
+					background-repeat: no-repeat;
+					background-size: 100% 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					image {
+						width: 50px;
+						height: 50px;
+					}
+				}
+
+				.btn {
+					width: 100%;
+					line-height: 60px;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 500;
+					font-size: 18px;
+					color: #8F6726;
+					text-align: center;
+				}
+			}
+
+			.right {
+				width: 237px;
+				height: 296px;
+				background: #FBF4EE;
+				border-radius: 16px;
+				// overflow: hidden;
+				border: 1px solid #8F6726;
+				position: relative;
+				.delImg {
+					top: -30px;
+					right: -20px;
+					position: absolute;
+					z-index: 999;
+					width: 40px;
+					height: 40px;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					background: #8F6726;
+					border-radius: 50%;
+					image{
+						width: 24px;
+						height: 24px;
+						transform: rotate(90deg);
+					}
+				}
+
+				.upImg {
+					top: 0;
+					left: 0;
+					position: absolute;
+					z-index: 99;
+					width: 100%;
+					height: 100%;
+					overflow: hidden;
+                    border-radius: 12px;
+					image {
+						width: 100%;
+						height: 100%;
+					}
+				}
+
+				.bg {
+					width: 100%;
+					height: 237px;
+					border-radius: 12px 12px 0 0;
+					// background-image: url(/static/image/device/facial_photo_img.png);
+					background-repeat: no-repeat;
+					background-size: 100% 100%;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+
+					image {
+						width: 50px;
+						height: 50px;
+					}
+				}
+
+				.btn {
+					line-height: 60px;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 500;
+					font-size: 18px;
+					color: #8F6726;
+					text-align: center;
+				}
+			}
+		}
+	}
+
+
+	/* 遮罩层样式 */
+	.mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 999;
+		animation: fadeIn 0.3s ease;
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container2 {
+		//width: 50%;
+		height: 250px;
+		background: #FBF4EE;
+		border-radius: 12px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: space-between;
+		padding: 30px 50px;
+
+		.title-t {
+			font-size: 24px;
+			font-weight: bold;
+			color: #8F6726;
+			text-align: center;
+		}
+
+		.title-r {
+			font-size: 20px;
+			color: #8F6726;
+			text-align: center;
+		}
+
+		.btn-r {
+			text-align: center;
+			background: #8F6726;
+			font-size: 20px;
+			color: #FBF4EE;
+			border-radius: 12px;
+			width: 60%;
+			height: 50px;
+			line-height: 50px;
+		}
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container {
+		width: 80%;
+		// min-width: 840px;
+		background: #FBF4EE;
+		border-radius: 12px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+	}
+
+	/* 弹窗头部样式 */
+	.popup-header {
+		padding: 20px;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		background: #E9DDCD;
+
+		.goback {
+			background: #FFFFFF;
+			border-radius: 4px;
+			border: 1px solid #8F6726;
+			padding: 8px 16px;
+			font-size: 16px;
+			color: #8F6726;
+			text-align: center;
+		}
+	}
+
+	.popup-title {
+		flex: 1;
+		font-family: Source Han Serif CN, Source Han Serif CN;
+		font-weight: bold;
+		font-size: 24px;
+		color: #8F6726;
+		text-align: center;
+	}
+
+	.close-btn {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		transition: all 0.2s ease;
+
+		image {
+			width: 24px;
+			height: 24px;
+		}
+	}
+
+	/* 弹窗内容样式 */
+	.popup-content {
+		width: 90%;
+		padding: 40px 30px;
+		font-size: 20px;
+		color: #666;
+		line-height: 1.6;
+		background: #FBF4EE;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin: auto;
+
+		.form-item {
+			display: flex;
+			align-items: center;
+			margin-bottom: 20px;
+
+			.label {
+				width: 100px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20px;
+				color: #8F6726;
+				text-align: right;
+			}
+
+			.form-input {
+				width: 400px;
+				height: 47px;
+				box-sizing: border-box;
+				background: #FFFFFF;
+				border-radius: 6px;
+				border: 1px solid #8F6726;
+				padding: 15px 26px;
+			}
+
+			.text-input {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #9B9B9B;
+				text-align: left;
+			}
+
+			.r-box {
+				width: 400px;
+				height: 47px;
+			}
+
+			.picker-box {
+
+				// width: 540px;
+				// height: 64px;
+				// box-sizing: border-box;
+				// background: #FFFFFF;
+				// border-radius: 8px;
+				// border: 2px solid #8F6726;
+				// padding: 15px 26px;
+				.date {
+					image {
+						width: 32px;
+						height: 32px;
+					}
+				}
+
+			}
+&:last-child{
+				margin-bottom: 0;
+			}
+		}
+		.form-item2 {
+			display: flex;
+			align-items: center;
+			margin-bottom: 20px;
+			
+			.label {
+			width: 120px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 20px;
+				color: #8F6726;
+				text-align: right;
+			}
+		
+			.form-input {
+				width: 150px;
+				height: 47px;
+				box-sizing: border-box;
+				background: #FFFFFF;
+				border-radius: 6px;
+				border: 1px solid #8F6726;
+				padding: 15px 26px;
+			}
+		
+			.text-input {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #9B9B9B;
+				text-align: left;
+			}
+		
+			.r-box {
+				width: 400px;
+				height: 47px;
+			}
+		
+			.picker-box {
+		
+				// width: 540px;
+				// height: 64px;
+				// box-sizing: border-box;
+				// background: #FFFFFF;
+				// border-radius: 8px;
+				// border: 2px solid #8F6726;
+				// padding: 15px 26px;
+				.date {
+					image {
+						width: 32px;
+						height: 32px;
+					}
+				}
+		
+			}
+		
+		}
+	}
+
+	.search-cont {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+
+		.form-input {
+			flex: 1;
+			height: 47px;
+			margin-right: 15px;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 8px;
+			border: 1px solid #8F6726;
+			padding: 11px 20px;
+		}
+
+		.text-input {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 18px;
+			color: #9B9B9B;
+			text-align: left;
+		}
+
+		.search-btn {
+			width: 108px;
+			height: 47px;
+			background: #8F6726;
+			border-radius: 6px 6px 6px 6px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+
+			image {
+				width: 18px;
+				height: 18px;
+				margin-right: 5px;
+			}
+
+			text {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #FFFFFF;
+				text-align: center;
+			}
+		}
+	}
+.isNull {
+		text-align: center;
+		color: #8F6726;
+	}
+	.userList-box {
+		margin-top: 30px;
+		width: 100%;
+		background: #FFFFFF;
+		border-radius: 12px;
+		overflow: hidden;
+	}
+
+	.userList {
+		width: 100%;
+		height: 330px;
+		overflow-y: auto;
+
+		&::-webkit-scrollbar {
+			display: block !important;
+			width: 10px !important;
+			/* 滚动条宽度 */
+		}
+
+		&::-webkit-scrollbar-thumb {
+			background: #8F6726 !important;
+			/* 滚动条滑块颜色 */
+			border-radius: 5px !important;
+			/* 滑块圆角 */
+		}
+
+		.item {
+			width: 100%;
+			padding: 17px 22px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			.title {
+				flex: 1;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #8F6726;
+				text-align: left;
+			}
+
+			.right-box {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				.rest {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 59px;
+					height: 33px;
+					border-radius: 6px 6px 6px 6px;
+					border: 1px solid #8F6726;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 16px;
+					color: #8F6726;
+					margin-right: 16px;
+				}
+
+				.select {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 59px;
+					height: 33px;
+					border-radius: 6px 6px 6px 6px;
+					border: 1px solid #8F6726;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 16px;
+					color: #8F6726;
+
+					&.active {
+						background: #8F6726;
+						color: #fff;
+					}
+				}
+			}
+		}
+	}
+
+	.userDetail {
+		// margin-top: 30px;
+		width: 100%;
+		background: #FFFFFF;
+		border-radius: 12px;
+		padding: 0 30px;
+		height: 50vh;
+		overflow-y: auto;
+
+		&::-webkit-scrollbar {
+			display: block !important;
+			width: 10px !important;
+			/* 滚动条宽度 */
+		}
+
+		&::-webkit-scrollbar-thumb {
+			background: #8F6726 !important;
+			/* 滚动条滑块颜色 */
+			border-radius: 5px !important;
+			/* 滑块圆角 */
+		}
+		.item {
+			width: 100%;
+			padding: 15px 0px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 20px;
+			color: #8F6726;
+			border-bottom: 1px dashed #8F6726;
+            text{
+            	flex:1
+            }
+			&:last-child {
+				border: 0;
+			}
+		}
+	}
+
+	/* 弹窗底部样式 */
+	.popup-footer {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-bottom: 30px;
+		// background: #FBF4EE;
+		// border-top: 1px solid #eee;
+	}
+
+	.btn2 {
+		// flex: 1;
+		padding: 26px 0;
+		text-align: center;
+		font-size: 20px;
+		transition: all 0.2s ease;
+	}
+
+	.confirm-btn {
+		width: 185px;
+		height: 53px;
+		background: #8F6726;
+		border-radius: 12px 12px 12px 12px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		text {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 20px;
+			color: #FFFFFF;
+			text-align: center;
+		}
+
+		image {
+			width: 24px;
+			height: 24px;
+			margin-right: 10px;
+		}
+	}
+
+	.confirm-btn2 {
+		width: 113px;
+		height: 53px;
+		background: #8F6726;
+		border-radius: 12px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		text {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 20px;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+
+	/* 动画效果 */
+	@keyframes fadeIn {
+		from {
+			opacity: 0;
+		}
+		to {
+			opacity: 1;
+		}
+	}
+	@keyframes scaleIn {
+		from {
+			transform: scale(0.9);
+			opacity: 0;
+		}
+
+		to {
+			transform: scale(1);
+			opacity: 1;
+		}
+	}
+</style>

+ 559 - 0
pages/device/tongue/indexOld.nvue

@@ -0,0 +1,559 @@
+
+<template>
+	<view class="live-pusher-box" :style="{width: width + 'px',height: height + 'px'}"> 
+		<Ba-CameraView ref="cameraView" :load="loadData" :style="{flex: 1,width: width + 'px',display:'none'}" ></Ba-CameraView>
+		<cover-view class="cover-view" :style="{width: width + 'px',height: height + 'px'}">
+			<cover-view class="uni-nav-bar" :style="{width: width + 'px'}">
+				<cover-view :style="{height: statusBarHeight,width: width + 'px'}"></cover-view>
+					<cover-view class="uni-nav-barbox">
+						<cover-view class="flex-center boder-box" @click="back">
+							<cover-image class="uni-nav-back" src="@/static/image/device/back_icon33.png" mode="aspectFill"></cover-image>
+							<text class="uni-nav-title-t">返回</text>
+						</cover-view>
+					</cover-view>
+			</cover-view>
+			<cover-view class="title-box" :style="{width: width + 'px'}">
+				<cover-view :style="{height: statusBarHeight,width: width + 'px'}"></cover-view>
+				<text class="title">请拍摄舌面</text>
+				<text class="tips">舌尖放松,舌面平展,舌尖略向下,口张大不要太用力</text>
+			</cover-view>
+				  
+		    <cover-view class="imagebox" :style="{width:width + 'px',height: height + 'px'}">
+					<!-- <view v-if="width<height" :style="{width:width + 'px',height: height/4+ 'px'}" style="background:#262523 ;"></view> -->
+					<!-- <image v-if="width>height" class="tongue" :style="{width: width  + 'px',height: height + 'px'}" src="@/static/image/device/lingual_surface_mask.png" mode="aspectFill"></image>
+					<image v-if="width<height" class="tongue" :style="{width: width  + 'px',height: height/1.5 + 'px'}" src="@/static/image/device/lingual_surface_mask.png" mode="aspectFill"></image> -->
+			
+		      </cover-view>
+					
+			</cover-view>
+		</cover-view>
+	
+	
+		<view class="camera-footer" id="camera-footer" :style="{width: width + 'px'}">
+			<view class="camera-options" :style="{width: width + 'px'}">
+				<view class="camera-options-left camera-item" @click="handleAlbum">
+					<image src="@/static/image/device/album_icon24.png" mode="scaleToFill" style="width: 34rpx;height:34rpx;margin-bottom: 5rpx;"></image>
+					<text class="camera-item-t">相册上传</text>
+				</view>
+				<view class="camera-options-center camera-item" @click="handleShutter">
+					<view class="photograph-btn"></view>
+				</view>
+				<view class="camera-options-ritht camera-item" @click="handleReversal">
+					<image src="@/static/image/device/switch_camera_icon24.png" mode="scaleToFill" style="width: 34rpx;height:34rpx;margin-bottom: 5rpx;"></image>
+					<text class="camera-item-t">切换摄像头</text>
+				</view>
+			</view>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	import { isAgreePrivacy } from '@/utils/common.js'
+	import shareBox from "@/components/share-box/share-boxN.vue"
+	import {getCount} from '@/api/healthTongue.js'
+	import { premissionCheck } from "@/js_sdk/wa-permission/permission.js"
+	// 这个组件仅限APP使用!!!
+	export default {
+		components: {
+			shareBox
+		},
+		data() {
+			
+			// 在data初始化时就进行设备检测
+			const systemInfo = uni.getSystemInfoSync();
+			console.log('设备信息:', systemInfo);
+			// // 判断是否为平板设备
+			// const isTabletBySize = systemInfo.screenWidth > 800 && systemInfo.screenHeight > 1200;
+			const isTabletByModel = systemInfo.brand && (
+				//systemInfo.model.toLowerCase().includes('tablet') ||
+				//systemInfo.model.toLowerCase().includes('pad') ||
+				systemInfo.brand.toLowerCase().includes('shimeta')
+			);
+			
+			const isTablet = isTabletByModel;
+			const defaultCameraFacing = isTablet ? false : true; // 平板默认后置,手机默认前置
+			console.log('设备检测结果:', {
+				isTablet,
+				defaultCameraFacing: defaultCameraFacing ? '前置' : '后置',
+				screenSize: `${systemInfo.screenWidth}x${systemInfo.screenHeight}`,
+				model: systemInfo.model
+			});
+			
+			return {
+				baseUrl:uni.getStorageSync('requestPath'),
+				height: uni.getSystemInfoSync().screenHeight,
+				width: uni.getSystemInfoSync().screenWidth,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				livePusher: null,
+				ready: true,
+				cameraHeight: '', //相机画面宽度
+				coverImage: null,
+				counts: 0,
+				marginTop: uni.getSystemInfoSync().statusBarHeight + uni.upx2px(130),
+				device: 'back',
+				cameraContext: null,
+				shutterShow: false,
+				menuLeft: '100%',
+				// 设备类型检测
+				isTablet: isTablet,
+				isShimeta: isTablet,
+				loadData: { //配置
+				    isToast: false,
+					isShowVibrate:false,
+					isFacingFront: defaultCameraFacing, // 根据设备类型设置默认摄像头
+					captureQuality:"HIGH", //摄像头清晰度 **HIGH**: 1920x1080 (高清)  **MEDIUM**: 1280x720 (中等) **LOW**: 640x480 (低清)
+					autoZoomEnabled: true,     // 启用自动变焦
+					autoZoomMode: "TONGUE",       // 变焦模式:FACE(面部) 或 TONGUE(舌诊)
+					isTablet: isTablet // 设备类型配置
+				},
+				currentQuality:0,
+				currentZoomMode:"TONGUE", // 默认使用舌诊模式
+				isShowCamera:false,
+				statusMessage:"",
+				windowResizeCallback:null
+			}
+		},
+		created(){
+			let that=this;
+			uni.$on('navigateBack', function(data) {
+				that.handleReversal();
+			});
+		},
+		onLoad() {
+			//this.setListener();
+			console.log('onLoad - 当前配置:', {
+				isTablet: this.isTablet,
+				isFacingFront: this.loadData.isFacingFront,
+				statusMessage: this.statusMessage
+			});
+		},
+		mounted() {
+			// 强制应用配置,确保平板设备使用后置摄像头
+			this.$nextTick(() => {
+				//this.forceApplyConfig();
+			});
+		},
+		onShow() {
+			this.windowResizeCallback = (res) => {
+				// 重新获取屏幕尺寸
+				this.getScreenSize(res.size);
+		     }
+			uni.onWindowResize(this.windowResizeCallback);
+		},
+		
+		onUnload() {
+			 if (this.windowResizeCallback) {
+			      uni.offWindowResize(this.windowResizeCallback);
+			      this.windowResizeCallback = null;
+			    }
+			uni.$off('navigateBack');
+		},
+		
+		methods: {
+			getScreenSize(res) {
+			   this.width = res.windowWidth
+			   this.height = res.windowHeight
+			   if (this.$refs.cameraView) { 
+			         this.switchZoomMode(this.loadData.autoZoomMode);
+			       } else {
+			         console.warn("Ba-CameraView 组件尚未初始化,暂不执行 setAutoZoom");
+			       }
+			},
+			switchZoomMode1(currentMode) {
+				//启动舌诊模式自动变焦
+				this.$refs.cameraView.setAutoZoom((result) => {
+					if (result.ok) {
+						console.log('自动变焦设置成功:', this.loadData.autoZoomMode);
+					} else {
+						console.error('自动变焦模式:', result.msg);
+					}
+				}, {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: currentMode
+				});
+			},
+			switchZoomMode() {
+				// 在 FACE、TONGUE、DEFAULT 之间切换
+				const modes = ['FACE', 'TONGUE', 'DEFAULT'];
+				const currentIndex = modes.indexOf(this.currentZoomMode);
+				this.currentZoomMode = modes[(currentIndex + 1) % modes.length];
+				if (this.loadData.autoZoomEnabled) {
+					this.$refs.cameraView.setAutoZoom((result) => {
+						if (result.ok) {
+							this.statusMessage = `变焦模式已切换到: ${this.currentZoomMode}`;
+							console.log('Zoom mode switched to:', this.currentZoomMode);
+						} else {
+							this.statusMessage = '切换变焦模式失败: ' + result.msg;
+							console.error('Failed to switch zoom mode:', result.msg);
+						}
+					}, {
+						enabled: this.loadData.autoZoomEnabled,
+						mode: this.currentZoomMode
+					});
+				} else {
+					this.statusMessage = `变焦模式已设置为: ${this.currentZoomMode} (需开启自动变焦)`;
+					this.showToast(this.statusMessage);
+				}
+			},
+			
+			getCount(){
+				getCount().then(
+					res => {
+						if(res.code==200){
+							this.counts=res.data;
+						}else{
+							uni.showToast({
+								icon:'none',
+								title: "请求失败",
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+		
+			// 快门
+			handleShutter() {
+				if (this.ready) {
+					this.ready = false;
+					let options={scaleW:620,scaleH:800,isCrop:false};
+					this.$refs.cameraView.takePicture((res) => {
+						  this.ready = true;
+						  const filePath=res.data.path;
+						  console.log("qxj takePicture",res);
+						  plus.io.resolveLocalFileSystemURL(filePath, (entry) => {
+								 let url= entry.toLocalURL();
+								 uni.redirectTo({
+								 	url:"/pages/device/tongue/index?leftUrl="+url
+								 })
+						   }, (error) => {
+								console.error('Failed to resolve file system URL:', error);
+						   });
+					  },options);
+					
+				}
+			},
+			// 相册
+			async handleAlbum() {
+				// #ifdef APP-PLUS
+				 uni.chooseImage({
+						count: 1, //默认9
+						sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+						sourceType: ['album'], //从相册选择
+						success: (res) => {
+							uni.setStorageSync("tongueUrl",res.tempFilePaths[0])
+							let url= res.tempFilePaths[0]
+							uni.redirectTo({
+								url:"/pages/device/tongue/index?leftUrl="+url
+							})
+						}
+				 });
+				// #endif
+			},
+			// 反转摄像头
+			handleReversal() {
+				if(this.isShimeta){
+					uni.showToast({
+						title:"该设备不支持切换摄像头",
+						icon:"none"
+					});
+					return;
+				}
+				this.switchZoomMode(this.loadData.autoZoomMode);
+				this.$refs.cameraView.switchCamera((result) => {
+				    if (result.ok) {
+						this.loadData.isFacingFront = !this.loadData.isFacingFront;
+						this.statusMessage = `已切换到${this.loadData.isFacingFront ? '前置' : '后置'}摄像头`;
+				        uni.showToast({
+				            title: "切换成功",
+				            icon: 'none'
+				        });
+				    } else {
+						this.statusMessage = '切换摄像头失败: ' + result.msg;
+				        console.error('操作失败', result.msg);
+				    }
+				});
+			},
+			// 设置为后置摄像头
+			setRearCamera() {
+				this.$refs.cameraView.setCameraFacing((result) => {
+					if (result.ok) {
+						this.loadData.isFacingFront = false;
+						this.statusMessage = '已设置为后置摄像头';
+						uni.showToast({
+							title: "已设置为后置摄像头",
+							icon: 'none'
+						});
+					} else {
+						this.statusMessage = '设置后置摄像头失败: ' + result.msg;
+						uni.showToast({
+							title: "设置失败: " + result.msg,
+							icon: 'none'
+						});
+					}
+				}, {
+					useFrontCamera: false
+				}); 
+			},
+			
+			// 强制应用当前配置(确保平板设备配置生效)
+			forceApplyConfig() {
+				console.log('强制应用配置:', this.loadData);
+				// 如果是平板设备,确保使用后置摄像头
+				if (this.isTablet && this.loadData.isFacingFront) {
+					console.log('检测到平板设备使用前置摄像头,强制切换到后置');
+					this.loadData.isFacingFront = false;
+					this.statusMessage = '平板设备强制使用后置摄像头';
+					// 调用底层API确保配置生效
+					this.setRearCamera();
+					// 平板设备切换摄像头后,重新应用自动变焦设置
+					if (this.loadData.autoZoomEnabled) {
+						setTimeout(() => {
+							this.reapplyAutoZoom();
+						}, 1000); // 等待摄像头切换完成
+					}
+				}
+				// 更新状态显示
+				this.statusMessage = this.isTablet ? 
+					'平板设备 - 后置摄像头' : 
+					(this.loadData.isFacingFront ? '手机设备 - 前置摄像头' : '手机设备 - 后置摄像头');
+			},
+			
+			// 重新应用自动变焦设置
+			reapplyAutoZoom() {
+				console.log('重新应用自动变焦设置:', {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: this.currentZoomMode
+				});
+				this.$refs.cameraView.setAutoZoom((result) => {
+					if (result.ok) {
+						this.statusMessage = `平板设备 - 自动变焦已重新应用 (${this.currentZoomMode}模式)`;
+						console.log('平板设备自动变焦重新应用成功');
+					} else {
+						this.statusMessage = '重新应用自动变焦失败: ' + result.msg;
+						console.error('Failed to reapply auto zoom:', result.msg);
+					}
+				}, {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: this.currentZoomMode
+				});
+			},
+			
+			
+			// 舌诊记录
+			handleReportlist() {
+				uni.navigateTo({
+					url: "/pages/user/tongue/tongueList"
+				})
+			},
+			setListener() {
+				this.$refs.cameraView.setListener((res) => {
+					if (res.action == "error") {
+						this.showToast(res.msg)
+					}
+				});
+			},
+			showToast(msg) {
+				uni.showToast({
+					title: msg,
+					icon: 'none'
+				});
+			},
+			navTo() {
+				uni.navigateTo({
+					url: "/pages/device/tongue/ques"
+				})
+			},
+			// 返回
+			back(){
+				uni.navigateBack();
+			},
+		
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.flex-center {
+		@include u-flex(row, center, center);
+	}
+	.live-pusher-box {
+		@include u-flex(column, center, center);
+	}
+	.imagebox {
+		top:0;
+		left: 0;
+		right: 0; // 新增:让容器铺满屏幕宽度,确保文本居中生效
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		padding-bottom: 100rpx;
+	}
+	.tongue {
+		width: 100%;
+		 
+	}
+	.cover-view {
+		width: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+	   @include u-flex(column, center, center);
+	}
+	.title-box{
+		 position: fixed;
+		  top: 20px;
+		  left: 0;
+		  right: 0; // 新增:让容器铺满屏幕宽度,确保文本居中生效
+		  z-index: 998; // 低于导航栏 z-index:999,避免遮挡导航栏
+		  width: 100%;
+	}
+	.title {
+		// margin-top: calc(var(--status-bar-height) + 130rpx);
+		font-family: SourceHanSansCN-Medium;
+		font-weight: 500;
+		font-size: 18rpx;
+		color: #fff;
+		text-align: center;
+	}
+	.tips {
+		margin-top: 20rpx;
+		// margin-bottom: 60rpx;
+		font-family: SourceHanSansSC-Regular;
+		font-weight: 400;
+		font-size: 16rpx;
+		color: #fff;
+		text-align: center;
+	}
+	.boder-box{
+		width: 66rpx;
+		height: 32rpx;
+		background: rgba(255,255,255,0.2);
+		border-radius: 8rpx;
+		border: 1px solid #FFFFFF;
+	}
+	.uni-nav-bar {
+		position: fixed;
+		 top: 20px;
+		left: 0;
+		width: 100%;
+		z-index: 999;
+		overflow: hidden;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		color: #fff;
+		// background-color: #000;
+		.uni-nav-barbox {
+			// width: 100%;
+			// height: 88rpx;
+			padding: 0 24rpx;
+			// box-sizing: border-box;
+		// @include u-flex(row, center,space-between);
+			// position: relative;
+			font-size: 24rpx;
+		}
+		.uni-nav-title-t {
+			font-family: SourceHanSansSC;
+			font-weight: 400;
+			margin-left: 5rpx;
+			color: #fff;
+			/* #ifdef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+			/* #ifndef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+		}
+		.uni-nav-title {
+			// flex-shrink: 0;
+			font-family: SourceHanSansSC;
+			font-weight: 400;
+			color: #fff;
+			/* #ifdef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+			/* #ifndef APP-PLUS */
+			font-size: 14rpx;
+			/* #endif */
+			@include u-flex(row, center, flex-start);
+			.ques {
+				// flex-shrink: 0;
+				width: 33rpx;
+				height: 33rpx;
+				margin-left: 9rpx;
+			}
+		}
+		.uni-nav-back {
+			width: 16rpx;
+			height: 16rpx;
+		}
+	}
+	// .center-box{
+	// 	width: 100%;
+	// 	display: flex;
+	// 	align-items: center;
+	// 	justify-content: space-around;
+	// }
+	.camera-footer {
+		background-color: #000;
+		overflow: hidden;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+	}
+	.usenum {
+		text-align: center;
+		@include u-flex(row, center, center);
+		.usenum-t {
+			font-family: SourceHanSansCN;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			padding: 14rpx;
+		}
+	}
+	.camera-options {
+		width: 100%;
+		padding-top: 15rpx;
+		padding-bottom: 15rpx;
+		// box-sizing: border-box;
+		@include u-flex(row, center, space-around);
+	}
+	.camera-item {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+	.camera-item-t {
+		font-family: SourceHanSansCN;
+		font-weight: 400;
+		font-size: 16rpx;
+		color: #FFFFFF;
+	}
+	.camera-options-center {
+		width: 52rpx;
+		height: 52rpx;
+		border-radius: 50%;
+		border-radius: 50%;
+		border: 3px solid #FFFFFF;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+	.photograph-btn {
+		width: 45rpx;
+		height: 45rpx;
+		background: #8F6726;
+		border-radius: 50%;
+	}
+
+</style>

+ 62 - 0
pages/device/tongue/indexOld2.vue

@@ -0,0 +1,62 @@
+<template>
+	<view>
+		<CustomCamera ref="CustomCamera" @takePhoto="takePhoto"   @getImage="getImage" />
+	</view>
+</template>
+
+<script>
+	// #ifdef MP-WEIXIN
+	import CustomCamera from "@/components/CustomCamera/WeChat/index.vue"
+	// #endif
+	export default {
+		components: {
+			CustomCamera
+		},
+		data() {
+			return {
+				coverImageType: 'side'
+			}
+		},
+		onLoad(options) {
+			this.coverImageType = options.coverImageType
+		},
+		onShareAppMessage(res) {
+			return {
+				title: "AI舌诊",
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: "AI舌诊",
+			}
+			
+		},
+		methods: {
+			back() {
+				uni.switchTab({
+					url:"/pages/index/index"
+				})
+			},
+			takePhoto(){
+				var url=uni.getStorageSync("tongueUrl")
+				console.log(url)
+				uni.navigateTo({
+					url:"/pages_user/tongue/photoPreview?url="+url
+				})
+			},
+			getImage(res) {
+				var url=uni.getStorageSync("tongueUrl")
+				console.log(url)
+				uni.navigateTo({
+					url:"/pages_user/tongue/photoPreview?url="+url
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 299 - 0
pages/device/tongue/photoPreview.vue

@@ -0,0 +1,299 @@
+<template>
+	<view class="container">
+		
+	<!-- 	<cover-image class="uni-nav-back" src="@/static/image/ai_right_icon.png" mode="aspectFill" @click="back"></cover-image> -->
+		
+		<view class="photo-box" :style="{height: height + 'px'}" >
+			<image class="tongue" v-if="url!=null" :src="url"></image>
+		</view>
+		
+		<view class="font-cont">
+			<view class="chose-patient">
+				<view class="title-box" @click="addPatient()" v-if="patient==null">
+					<text class="title">选择就诊人</text>
+					<view class="right" >
+						<text class="value">请点击添加</text>
+						<image src="/static/images/arrow_gray.png" mode=""></image>
+					</view>
+				</view>
+				<view class="patient" @click="addPatient()" v-if="patient!=null">
+					<view  class="left">
+						<view class="name">{{patient.patientName}}</view>
+						<view class="info">
+							<text class="text" v-if="patient.sex==1">男</text>
+							<text class="text" v-if="patient.sex==2">女</text>
+							<text class="text">{{$getAge(patient.birthday)}}岁</text>
+							<text class="text">{{$parseIdCard(patient.idCard)}}</text>
+						</view>
+					</view>
+					<view class="right" >
+						<image src="/static/images/arrow_gray.png" mode=""></image>
+					</view>
+				</view>
+			</view>
+			<view class="footer-btn" id="photo-footer-btn">
+				<view class="footer-btn-left" @click="back">重新拍照</view>
+				<button class="footer-btn-right" @click="submit()">开始检测</button>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	
+	import {getCount,add} from '@/api/healthTongue.js'
+	export default {
+		data() {
+			return {
+				patient:null,
+				height: 0,
+				url:"",
+				flag:true,
+				errMsg:"",
+				cropperWidth: 806, // 裁剪区域宽度
+			    ropperHeight: 1240, // 裁剪区域高度
+				croppedImagePath:""
+			}
+		},
+		onLoad(options) {
+			this.url=options.url;
+			let that=this;
+			setTimeout(e => {
+				uni.createSelectorQuery().select("#photo-footer-btn").boundingClientRect(rect => {
+					 console.log("qxj checkTextLines height:"+JSON.stringify(rect));
+					 that.height = uni.getSystemInfoSync().screenHeight - rect.height-uni.upx2px(100);
+				}).exec();
+			}, 50);
+			uni.$on('refreshOrderPatient', (res) => {
+				that.patient=res;
+			});
+		},
+		methods: {
+			addPatient(){
+				uni.navigateTo({
+					url: '/pages/user/patient'
+				});
+			},
+			back() {
+				uni.navigateBack();
+				uni.$emit("navigateBack",{});
+			},
+			submit(){
+				if(!this.flag){
+					if(!this.$isEmpty(this.errMsg)){
+						uni.showToast({icon:'none',title: this.errMsg});
+					}
+					return;
+				}
+				if(this.patient==null){
+					uni.showToast({
+						icon:'none',
+						title: "请选择就诊人",
+					});
+					return;
+				}
+				this.flag=false;
+				uni.showLoading({
+					title:"处理中..."
+				})
+				uni.uploadFile({
+					url: uni.getStorageSync('requestPath')+'/app/common/uploadOSS', //仅为示例,非真实的接口地址
+					filePath: this.url,
+					name: 'file',
+					formData: {
+						'user': 'test'  // 上传附带参数
+					},
+					success: (uploadFileRes) => {
+						console.log(JSON.parse(uploadFileRes.data).url)
+						var data={
+							patientId:this.patient.patientId,
+							sex:this.patient.sex,
+							name:this.patient.name,
+							age:this.$getAge(this.patient.birthday),
+							tongueUrl:JSON.parse(uploadFileRes.data).url,
+						}
+						add(data).then(res => {
+								if(res.code==200){
+									uni.setStorageSync("tongueResult",JSON.stringify(res.data))
+									uni.redirectTo({
+										url:"/pages/user/tongue/report?id="+res.data.id
+									});
+								}else{
+									this.errMsg= res.msg;
+									uni.showToast({
+										icon:'none',
+										title: res.msg,
+									});
+								}
+							},
+							rej => {}
+						);
+					}
+				});
+			},
+			next(){
+				uni.redirectTo({
+					url:"/pages/user/tongue/report"
+				})
+			},
+			
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	
+	.container {
+		height: 100vh;
+		background-color: rgba(66, 66, 66, 1);
+		position: relative;
+		.uni-nav-back {
+			height: 32rpx;
+			width: 32rpx;
+			position: absolute;
+			top:var(--status-bar-height);
+			margin-top:10rpx;
+			left: 20rpx;;
+		}
+		
+		.photo-box {
+			width: 100%;
+			padding-top:20rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			border:0px solid red;
+			.tongue{
+				width: 80%;
+				height:60%;
+				index:1;
+				border-radius: 10rpx;
+			}
+		}
+		
+		.font-cont{
+			width: 100%;
+			position: fixed;
+			left: 0;
+			bottom: calc(var(--window-bottom) + 50rpx);
+			.chose-patient{
+				position: relative;
+				margin: 30rpx 60rpx;
+				padding: 30rpx;
+				box-shadow: 0px 0px 5px 2px rgba(0,0,0,0.05);
+				background-color: #fff;
+				border-radius: 15rpx;
+				.title-box{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.title{
+						font-size: 32upx;
+						font-family: PingFang SC;
+						font-weight: bold;
+						color: #111111;
+					}
+					.right{
+						height: 100%;
+						display: flex;
+						align-items: center;
+						justify-content: center;
+						.value{
+							font-size: 28upx;
+							font-family: PingFang SC;
+							color: #999;
+							margin-right: 10rpx;
+						}
+						image{
+							width: 15upx;
+							height: 30upx;
+						}
+						 
+					}
+				}
+				.patient{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					height: 110upx;
+					.left{
+						.name{
+							font-size: 30upx;
+							line-height: 1;
+							font-family: PingFang SC;
+							font-weight: bold;
+							color: #111111;
+						}
+						.info{
+							margin-top: 30rpx;
+							display: flex;
+							align-items: center;
+							.text{
+								font-size: 26upx;
+								font-family: PingFang SC;
+								line-height: 1;
+								font-weight: 500;
+								color: #999;
+								margin-right: 19upx;
+							}
+							 
+						}
+					}
+					.right{
+						display: flex;
+						align-items: center;
+						image{
+							width: 15upx;
+							height: 30upx;
+						}
+					}
+				}
+			}
+			.footer-btn {
+				width: 100%;
+				padding-top: 30rpx;
+				z-index: 99;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-family: SourceHanSansCN-Normal;
+				font-weight: 400;
+				font-size: 34rpx;
+				color: #FFFFFF;
+			
+				&-left {
+					width: 278rpx;
+					height: 97rpx;
+					box-sizing: border-box;
+					border-radius: 48rpx;
+					border: 2px solid #FFFFFF;
+					line-height: 93rpx;
+					text-align: center;
+				}
+			
+				&-right {
+					margin: 0;
+					font-family: SourceHanSansCN-Normal;
+					font-weight: 400;
+					font-size: 34rpx;
+					color: #FFFFFF;
+					width: 276rpx;
+					height: 95rpx;
+					background: #F54D04;
+					border-radius: 48rpx;
+					line-height: 95rpx;
+					margin-left: 61rpx;
+			
+					&::after {
+						border: none;
+					}
+				}
+			}
+		}
+
+		
+	}
+	
+</style>

+ 18 - 0
pages/device/tongue/ques.vue

@@ -0,0 +1,18 @@
+<template>
+	<view>
+		<image src="/static/images/tongue_img1.png" mode="widthFix"></image>
+		<image src="/static/images/tongue_img2.png" mode="widthFix"></image>
+		<image src="/static/images/tongue_img3.png" mode="widthFix"></image>
+	</view>
+</template>
+
+<script>
+</script>
+
+<style scoped lang="scss">
+	image {
+		width: 100%;
+		height: auto;
+		display: block;
+	}
+</style>

+ 589 - 0
pages/device/tongue/report.vue

@@ -0,0 +1,589 @@
+<template>
+	<view class="ai-container">
+		<view class="ai-content">
+			<view class="top-box">
+				<view class="back-box x-f">
+					<image src="/static/image/device/back_icon32.png"></image>
+					<view @click="back()">返回</view>
+				</view>
+				<view class="title">
+					舌诊体质辨识报告
+				</view>
+				<view></view>
+			</view>
+		<!-- <cover-view class="uni-nav-barbox" :style="{height:height+'px',backgroundColor:headerBG,backgroundImage: baseUrl+'/images/ai_top_bg.png'}">
+			<cover-view class="uni-nav" :style="{height:height+'px',paddingTop: statusBarHeight+ 'px'}">
+				<cover-view class="uni-nav-back" @click="back()">返回</cover-view>
+				<cover-view class="uni-nav-title">舌诊体质辨识报告</cover-view>
+				<cover-view style="min-width: 104rpx;"></cover-view>
+			</cover-view>
+		</cover-view> -->
+		<image class="jkda_top_bg" :src="baseUrl+'/images/ai_top_bg.png'" mode="widthFix"></image>
+		<image class="ai_bottom_bg" :src="baseUrl+'/images/ai_bottom_bg.png'" mode="widthFix"></image>
+		<view class="ai-container-body" v-if="item!=null">
+			<view class="report-avatar">
+				<image :src="item.avatar" mode="aspectFill" style="width: 100%;height: 100%;"></image>
+			</view>
+			<view class="report-user">
+				<text>{{item.name}}</text>
+				<text style="padding: 0 18rpx 0 10rpx;">{{item.sex==1?"男":"女"}}</text>
+				<text>{{item.age}}岁</text>
+			</view>
+			<view class="report-infobox">
+				<image class="ai_sz_img" :src="baseUrl+'/images/ai_sz_img.png'" mode="widthFix"></image>
+				<view class="report-info-border">
+					<view class="report-info">
+						<view class="report-time">检测时间 {{item.createTime}}</view>
+						<view class="report-info-restit">您属于{{item.typeName}}</view>
+						<view class="report-info-res">{{item.typeName}}</view>
+						<!-- 视频 -->
+						<view class="videobox" v-if="videoUrl">
+							<video class="myVideo" :src="videoUrl" :poster="imageUrl" :autoplay='true'></video>
+						</view>
+						<!-- 舌苔特征 -->
+						<view class="report-title bold">舌苔特征</view>
+						<view class="report-info-item">
+							<view class="item-round"></view>
+							<view>
+								<text class="item-title">{{item.taiseName}}:</text>
+								<text>{{item.taiseDesc}}</text>
+							</view>
+						</view>
+						<view class="report-info-item">
+							<view class="item-round"></view>
+							<view>
+								<text class="item-title">{{item.shemianName}}:</text>
+								<text>{{item.shemianDesc}}</text>
+							</view>
+						</view>
+						<view class="report-info-item">
+							<view class="item-round"></view>
+							<view>
+								<text class="item-title">{{item.botai==1?"有剥苔":"未见剥苔"}}:</text>
+								<text>{{item.botaiDesc}}</text>
+							</view>
+						</view>
+						<view class="report-info-item">
+							<view class="item-round"></view>
+							<view>
+								<text class="item-title">{{item.liewen==1?"有裂纹":"未见裂纹"}}:</text>
+								<text>{{item.liewenDesc}}</text>
+							</view>
+						</view>
+						<view class="report-info-item">
+							<view class="item-round"></view>
+							<view>
+								<text class="item-title">{{item.chihen==1?"有齿痕":"未见齿痕"}}:</text>
+								<text>{{item.chihenDesc}}</text>
+							</view>
+						</view>
+						<!-- 体质解析 -->
+						<view class="report-title bold" >体质解析</view>
+						<view class="report-info-item" v-for="(item) in typeList">
+							<view class="item-round"></view>
+							<view>
+								<text class="item-title">{{item.name}}:</text>
+								<text>{{item.value}}</text>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- 解锁 -->
+			<view class="lockbox">
+				<image class="mask x-c" src="/static/images/other/bg_bar.png"></image>
+				<view class="lockbox-con y-f">
+					<view class="lockbox-con-tip">联系伴学助手,查看全部内容</view>
+					<!-- <image src="@/static/bxzs.jpg" mode="widthFix"></image> -->
+					<view>注:报告内容参考王琦教授《九种体质使用手册》</view>
+				</view>
+			</view>
+			<!-- 分享弹窗 -->
+			<u-popup :show="showShare" @close="showShare = false" >
+				<share-box :shareItem="shareItem" :showCopy="false" @closeShare='showShare = false' ></share-box>
+			</u-popup>
+			<view class="footer-btnbox">
+				<!-- <view class="border-btn">
+					<button class="footer-btn footer-btn-left">保存本图</button>
+				</view> -->
+				<view class="border-btn">
+					<!-- #ifdef APP-PLUS -->
+					<view class="footer-btn" v-if="isShare==null" @click="doShare()">分享好友</view>
+					<!-- #endif -->
+					<!-- #ifndef APP-PLUS -->
+					<view class="footer-btn" v-if="isShare==null">
+						分享好友
+						<button class="contact-btn"   data-name="shareBtn" open-type="share">分享</button>
+					</view>
+					<!-- #endif -->
+					<!-- #ifdef H5 -->
+					<view class="footer-btn" v-if="isShare!=null&&isShare==1" @click="doTongue()">
+						开始检测
+					</view>
+					<!-- #endif -->
+				</view>
+			</view>
+			<!-- <view class="banner-box">
+				<image src="@/static/images/banner.png" mode="widthFix"></image>
+			</view> -->
+		</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getHealthTongueById} from '@/api/healthTongue.js'
+	
+	export default {
+		data() {
+			return {
+				type:null,
+				id:null,
+				isShare:null,
+				avatar:null,
+				item:null,
+				typeList:[],
+				baseUrl:uni.getStorageSync('requestPath'),
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				defaultHeadimg: "/static/images/my_heads_icon.png",
+				showShare:false,
+				shareItem:{ imageUrl:"",title:"",path:"",isMini:true },
+				isLock: true,
+				videoUrl: '',
+				imageUrl: '',
+				headerBG:"transparent",
+				height: 44
+			}
+		},
+		onLoad(options) {
+			this.type=options.type;
+			this.isShare=options.isShare;
+			this.id=options.id;
+			this.height = this.statusBarHeight + 44
+			// var json=uni.getStorageSync("tongueResult")
+			// this.item=JSON.parse(json);
+			// this.typeList=JSON.parse(this.item.typeJson)
+			this.getHealthTongueById()
+		},
+		onShow() {
+			if(!this.$isLogin()) {
+				this.$showLoginPage()
+			}
+		},
+		//发送给朋友
+		onShareAppMessage(res) {
+			return {
+				title: "舌苔检测报告",
+				path:"/pages_user/tongue/report?isShare=1&id="+this.id
+			}
+			
+		},
+		//分享到朋友圈
+		onShareTimeline(res) {
+			return {
+				title: "舌苔检测报告",
+				path:"/pages_user/tongue/report?isShare=1&id="+this.id
+			}
+			
+		},
+		onPageScroll(e) {
+			if(e.scrollTop > 44) {
+				this.headerBG = '#FF8A00'
+			} else {
+				this.headerBG = "transparent"
+			}
+		},
+		methods: {
+			doTongue(){
+				uni.redirectTo({
+					url:"/pages/user/tongue/index"
+				})
+			},
+			getHealthTongueById(){
+				getHealthTongueById(this.id).then(
+					res => {
+						if(res.code==200){
+							this.isLock = res.isAddQw == 1 ? true : false
+							this.videoUrl = res.url || ''
+							this.imageUrl = res.imageUrl || ''
+							this.item=res.data;
+							const jsoninfo = JSON.parse(this.item.typeJson)
+							let index = jsoninfo.findIndex(item => item.name === '用药调治');
+							if(index > -1) {
+								this.typeList=jsoninfo.splice(0,index)
+							} else {
+								this.typeList=jsoninfo
+							}
+						}else{
+							 
+						}
+					},
+					rej => {}
+				);
+			},
+			back() {
+				if(this.type!=null&&this.type=="back"){
+					uni.navigateBack()
+				}
+				else{
+					uni.redirectTo({
+						url:"/pages/index/index"
+					})
+				}
+				
+			},
+			doShare(){
+				//#ifdef APP-PLUS
+				this.shareItem.title= "舌苔检测报告";
+				this.shareItem.imageUrl="https://cos.his.cdwjyyh.com/fs/20250730/186f5f22c89f46d29882227f199ab673.png"; // logo
+				this.shareItem.isMini=true;
+				this.shareItem.path="/pages_user/tongue/report?isShare=1&id="+this.id
+				let cdn=uni.getStorageSync('h5Path');
+				this.shareItem.url=cdn+"/pages/user/tongue/report?isShare=1&id="+this.id
+				this.showShare=true;
+				//#endif 
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.pb50 {
+		padding-bottom: calc(var(--window-bottom) + 50rpx);
+	}
+	.lockbox {
+		margin-top: -200rpx;
+		position: relative;
+		z-index: 9;
+		.mask{
+			width: 100%;
+			height:160rpx;
+			margin-bottom: -2px;
+		}
+		&-con-tip {
+			padding: 16rpx 24rpx 30rpx 24rpx;
+			box-sizing: border-box;
+			color: #8F6726;
+			font-size: 32rpx;
+			font-weight: bold;
+		}
+		&-con {
+			padding: 0 24rpx 40rpx 24rpx;
+			box-sizing: border-box;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #999999;
+			background-color: #fff;
+			image {
+				width: 702rpx;
+				height: auto;
+				border-radius: 16rpx;
+				overflow: hidden;
+				margin-bottom: 40rpx;
+			}
+		}
+	}
+	.footer-btnbox {
+		width: 100%;
+		padding-bottom: 44rpx;
+		@include u-flex(row, center, center);
+		background-color: #fff;
+		.border-btn {
+			width: 400rpx;
+			height: 78rpx;
+			padding: 4rpx;
+			box-sizing: border-box;
+			background: linear-gradient(0deg, #8F6726, #FBF4EE);
+			box-shadow: 0rpx 9rpx 17rpx 0rpx #FBF4EE;
+			border-radius: 78rpx;
+			
+			
+		}
+		.footer-btn {
+			width: 100%;
+			height: 100%;
+			background: #8F6726;
+			border-radius: 78rpx;
+			font-family: SourceHanSansCN-Bold;
+			font-weight: bold;
+			font-size: 40rpx;
+			color: #FFFFFF;
+			line-height: 69rpx;
+			border-radius: 33rpx;
+			border: 3rpx solid #FBF4EE;
+			text-align: center;
+			&::after {
+				border: none;
+			}
+			position: relative;
+			.contact-btn{
+				display: inline-block;
+				position: absolute;
+				top: 0;
+				left: 0;
+				width: 100%;
+				height: 100%;
+				opacity: 0;
+				z-index: 9999;
+			}
+			
+		}
+	}
+	.uni-nav-bar_bg {
+		width: 100%;
+		height: 782rpx;
+	}
+	.uni-nav-barbox {
+		position: fixed;
+		top: 0;
+		left: 0;
+		width: 100%;
+		z-index: 998;
+		overflow: hidden;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		color: #FFFFFF;
+		font-size: 32rpx;
+		background-repeat: no-repeat;
+		background-size: 100% auto;
+		.uni-nav {
+			width: 100%;
+			padding-left: 20rpx;
+			box-sizing: border-box;
+			@include u-flex(row, center, space-between);
+		}
+		.uni-nav-back {
+			width: 110rpx;
+			box-sizing: border-box;
+			@include u-flex(row, center, center);
+			text-align: center;
+		}
+	}
+	.videobox {
+		width: 568rpx;
+		height: 320rpx;
+		margin-top: 40rpx;
+		position: relative;
+		.myVideo {
+			width: 568rpx;
+			height: 320rpx;
+		}
+	}
+	.ai-container {
+		width: 100vw;
+		min-height: 100vh;
+		background-image: url(/static/image/device/ipad_yjf_boder.png);
+		background-repeat: no-repeat;
+		position: relative;
+		background-size: 100% 100%;
+		box-sizing: border-box;
+		padding: 20rpx;
+		.ai-content {
+			// height: 100%;
+			width: 100%;
+			height: 100%;
+			background-image: url(/static/image/device/inner_page_bg.png);
+			background-repeat: no-repeat;
+			background-size: 100% 100%;
+			position: relative;
+			padding: 30rpx;
+			.top-box {
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				margin-bottom: 60rpx;
+			
+				.title {
+					font-family: PingFang SC, PingFang SC;
+					font-weight: bold;
+					font-size: 40rpx;
+					color: #8F6726;
+					text-align: center;
+				}
+			
+				.back-box {
+					width: 138rpx;
+					height: 64rpx;
+					background: #FFFFFF;
+					border-radius: 8rpx;
+					border: 2rpx solid #8F6726;
+					padding: 24rpx 16rpx;
+					justify-content: center;
+			
+					view {
+						font-family: PingFang SC, PingFang SC;
+						font-weight: 400;
+						font-size: 24rpx;
+						color: #8F6726;
+						text-align: center;
+						margin-left: 10rpx;
+					}
+			
+					// position: absolute;
+					// left: 30rpx;
+					image {
+						width: 32rpx;
+						height: 32rpx;
+					}
+				}
+			}
+			}
+		// background: #FF8A00;
+		.jkda_top_bg {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: auto;		
+		}
+		.ai_bottom_bg {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			width: 100%;
+			height: auto;		
+		}
+		&-body {
+			position: relative;
+			// padding-top: calc(var(--status-bar-height) + 132rpx);
+		}
+	}
+
+	.bold {
+		height: 42rpx;
+		font-size: 44rpx !important;
+		color: #8F6726 !important;
+		border-left: 10rpx solid #8F6726;
+		line-height: 42rpx;
+		margin: 54rpx 0 40rpx 0;
+	}
+
+	.ai_sz_img {
+		width: 100%;
+		height: auto;
+		position: absolute;
+		top: 0;
+		left: 16rpx;
+		z-index: 1;
+	}
+
+	.item-round {
+		flex-shrink: 0;
+		width: 23rpx;
+		height: 23rpx;
+		margin-right: 12rpx;
+		background: #8F6726;
+		border-radius: 50%;
+	}
+
+	.report {
+		&-avatar {
+			width: 171rpx;
+			height: 171rpx;
+			padding: 3rpx;
+			margin: 0 auto;
+			border-radius: 50%;
+			overflow: hidden;
+			box-sizing: border-box;
+			background: linear-gradient(0deg, #8F6726, #FBF4EE);
+		}
+
+		&-user {
+			font-family: SourceHanSansCN;
+			font-weight: bold;
+			font-size: 40rpx;
+			color: #FFFFFF;
+			line-height: 91rpx;
+			text-shadow: 2rpx 2rpx 3rpx #8F6726;
+			text-align: center;
+		}
+
+		&-infobox {
+			padding: 36rpx 47rpx 0 47rpx;
+			// padding-top: 184rpx;
+			position: relative;
+		}
+
+		&-info-border {
+			padding: 4rpx;
+			border-radius: 45rpx;
+			box-sizing: border-box;
+			background: linear-gradient(0deg, #8F6726, #FBF4EE);
+			box-shadow: 8rpx 11rpx 14rpx 0rpx #8F6726;
+			position: relative;
+			z-index: 2;
+		}
+
+		&-info {
+			padding: 34rpx 40rpx;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 45rpx;
+			font-family: SourceHanSansCN-Regular;
+			font-weight: 400;
+			color: #4D4D4D;
+			
+
+			&-restit {
+				margin: 27rpx 0 33rpx 0;
+				font-family: SourceHanSansCN-Bold;
+				font-weight: bold;
+				font-size: 33rpx;
+				color: #4D4D4D;
+				text-align: center;
+			}
+
+			&-res {
+				font-weight: 800;
+				font-size: 54rpx;
+				color: #8F6726;
+				text-align: center;
+			}
+
+			&-item {
+				margin-bottom: 30rpx;
+				display: flex;
+				align-items: baseline;
+				font-family: SourceHanSansCN-Regular;
+				font-size: 27rpx;
+				color: #414141;
+				line-height: 36rpx;
+				word-break: break-all;
+
+				.item-title {
+					font-family: SourceHanSansCN-Bold;
+					font-weight: bold;
+					font-size: 27rpx;
+					color: #414141;
+				}
+			}
+		}
+
+		&-time {
+			font-size: 24rpx;
+			text-align: center;
+		}
+
+		&-title {
+			padding-left: 10rpx;
+			font-family: SourceHanSansCN-Bold;
+			font-weight: bold;
+			color: #414141;
+		}
+	}
+	.banner-box {
+		padding: 48rpx 34rpx 0 34rpx;
+		image {
+			width: 100%;
+			height: auto;
+		}
+	}
+</style>

+ 459 - 0
pages/device/tongue/test.nvue

@@ -0,0 +1,459 @@
+<template>
+    <view class="content">
+		
+        <view class="show-view">
+             <Ba-CameraView ref="cameraView" class="camera-view" :load="loadData"></Ba-CameraView>
+        </view>
+		
+		<view class="es x-bc es-mt-4 es-mb-4 btnBox">
+			<button class="btn1"  @click="takePhoto" :sizeLimit="100">拍照</button>
+			<button class="btn1" @click="changeCamera" v-if="!isTablet">切换摄像头</button>
+			<button class="btn1" @click="setFrontCamera" v-if="!isTablet">前置摄像头</button>
+			<button class="btn1" @click="setRearCamera">后置摄像头</button>
+		</view>
+        
+		<!-- <view class="es x-bc es-mt-20">
+			<view class="title">自动变焦</view>ca
+			<switch :checked="loadData.autoZoomEnabled" color="#FF5C03" @change="toggleAutoZoom"  style="transform:scale(0.7)"/>
+		</view> -->
+		
+		<!-- 控制按钮 -->
+		<view class="controls">
+			<button class="btn" @click="toggleAutoZoom">
+				{{ loadData.autoZoomEnabled ? '关闭自动变焦' : '开启自动变焦' }}
+			</button>
+			<button class="btn" @click="switchZoomMode">
+				切换模式: {{ currentZoomMode }}
+			</button>
+			<button class="btn" @click="manualZoom">手动变焦</button>
+		</view>
+		
+		<view class="es x-bc" style="display:flex;flex:1;">
+			<view class="label">选择清晰度</view>
+			<view class="right x-end"  style="height: 40px; margin-right: 10px;">
+				<picker style="width: 100%;text-align: right;" @change="pickerQuality" :value="currentQuality" :range="qualityPicker">
+					<view class="picker">
+						{{loadData.captureQuality}}
+					</view>
+				</picker>
+			</view>
+		</view>
+		
+		<!-- 状态显示 -->
+		<div class="status">
+			<text class="status-text">设备类型: {{ isTablet ? '平板设备(Shimeta)' : '普通设备' }}</text>
+			<text class="status-text">当前摄像头: {{ loadData.isFacingFront ? '前置摄像头' : '后置摄像头' }}</text>
+			<text class="status-text">分辨率质量: {{ loadData.captureQuality }} (动态适配)</text>
+			<text class="status-text">自动变焦: {{ loadData.autoZoomEnabled ? '开启' : '关闭' }}</text>
+			<text class="status-text">变焦模式: {{ currentZoomMode }}</text>
+			<text class="status-text">状态信息: {{ statusMessage }}</text>
+		</div>
+		
+		<!-- 配置检查按钮 -->
+		<view class="btn-container">
+			<button class="btn" @click="forceApplyConfig">检查并应用配置</button>
+		</view>
+	
+    </view>
+</template>
+
+<script>
+
+export default {
+    data() {
+		// 在data初始化时就进行设备检测
+		const systemInfo = uni.getSystemInfoSync();
+		console.log('设备信息:', systemInfo);
+		// // 判断是否为平板设备
+		// const isTabletBySize = systemInfo.screenWidth > 800 && systemInfo.screenHeight > 1200;
+		const isTabletByModel = systemInfo.brand && (
+			//systemInfo.model.toLowerCase().includes('tablet') ||
+			//systemInfo.model.toLowerCase().includes('pad') ||
+			systemInfo.brand.toLowerCase().includes('shimeta')
+		);
+
+		const isTablet = isTabletByModel;
+		const defaultCameraFacing = isTablet ? false : true; // 平板默认后置,手机默认前置
+		console.log('设备检测结果:', {
+			isTablet,
+			defaultCameraFacing: defaultCameraFacing ? '前置' : '后置',
+			screenSize: `${systemInfo.screenWidth}x${systemInfo.screenHeight}`,
+			model: systemInfo.model
+		});
+		
+        return {
+            obj: {
+                src: null,
+                text: null,
+                vSrc: null
+            },
+			// 设备类型检测
+			isTablet: isTablet,
+			isShimeta: isTablet,
+			loadData: { //配置
+			    isToast: true,
+				isShowVibrate:false,
+				isFacingFront: defaultCameraFacing, // 根据设备类型设置默认摄像头
+				captureQuality:"HIGH", //摄像头清晰度 **HIGH**: 动态适配高清  **MEDIUM**: 动态适配中等 **LOW**: 动态适配低清
+				autoZoomEnabled: true,     // 启用舌诊自动变焦
+				autoZoomMode: "TONGUE",       // 变焦模式:FACE(面部) 或 TONGUE(舌诊)
+				isTablet: isTablet // 设备类型配置
+			},
+			qualityPicker: ['HIGH', 'MEDIUM','LOW'],
+			currentQuality:0,
+			currentZoomMode:"TONGUE", // 默认使用舌诊模式
+			statusMessage: isTablet ? "检测到平板设备,默认使用后置摄像头" : "检测到手机设备,默认使用前置摄像头"
+        }
+    },
+    onLoad() {
+        this.setListener(); //设置监听
+		console.log('onLoad - 当前配置:', {
+			isTablet: this.isTablet,
+			isFacingFront: this.loadData.isFacingFront,
+			statusMessage: this.statusMessage
+		});
+    },
+	mounted() {
+		// 强制应用配置,确保平板设备使用后置摄像头
+		// this.$nextTick(() => {
+		// 	this.forceApplyConfig();
+		// });
+	},
+    methods: {
+		takePhoto() {
+            this.$refs.cameraView.takePicture((res) => {
+               this.showToast(res.msg)
+            });
+        },
+        //切换摄像头
+        changeCamera() {
+			// 检查是否为平板设备
+			if (this.isTablet) {
+				this.statusMessage = '平板设备只有后置摄像头,无法切换';
+				uni.showToast({
+					title: "平板设备只有后置摄像头",
+					icon: 'none'
+				});
+				return;
+			}
+            this.$refs.cameraView.switchCamera((result) => {
+                if (result.ok) {
+					this.loadData.isFacingFront = !this.loadData.isFacingFront;
+					this.statusMessage = `已切换到${this.loadData.isFacingFront ? '前置' : '后置'}摄像头`;
+                    uni.showToast({
+                        title: "切换成功",
+                        icon: 'none'
+                    });
+                } else {
+					this.statusMessage = '切换摄像头失败: ' + result.msg;
+                    console.error('操作失败', result.msg);
+                }
+            });
+        },
+		
+		// 设置为前置摄像头
+		setFrontCamera() {
+			if (this.isTablet) {
+				this.statusMessage = '平板设备只有后置摄像头,无法使用前置摄像头';
+				uni.showToast({
+					title: "平板设备只有后置摄像头",
+					icon: 'none'
+				});
+				return;
+			}
+			
+			this.$refs.cameraView.setCameraFacing((result) => {
+				if (result.ok) {
+					this.loadData.isFacingFront = true;
+					this.statusMessage = '已设置为前置摄像头';
+					uni.showToast({
+						title: "已设置为前置摄像头",
+						icon: 'none'
+					});
+				} else {
+					this.statusMessage = '设置前置摄像头失败: ' + result.msg;
+					console.error('设置前置摄像头失败', result.msg);
+				}
+			}, {
+				useFrontCamera: true
+			});
+		},
+		
+		// 设置为后置摄像头
+		setRearCamera() {
+			this.$refs.cameraView.setCameraFacing((result) => {
+				if (result.ok) {
+					this.loadData.isFacingFront = false;
+					this.statusMessage = '已设置为后置摄像头';
+					uni.showToast({
+						title: "已设置为后置摄像头",
+						icon: 'none'
+					});
+				} else {
+					this.statusMessage = '设置后置摄像头失败: ' + result.msg;
+					uni.showToast({
+						title: "设置失败: " + result.msg,
+						icon: 'none'
+					});
+				}
+			}, {
+				useFrontCamera: false
+			}); 
+		},
+		
+		// 强制应用当前配置(确保平板设备配置生效)
+		forceApplyConfig() {
+			console.log('强制应用配置:', this.loadData);
+			// 如果是平板设备,确保使用后置摄像头
+			if (this.isTablet && this.loadData.isFacingFront) {
+				console.log('检测到平板设备使用前置摄像头,强制切换到后置');
+				this.loadData.isFacingFront = false;
+				this.statusMessage = '平板设备强制使用后置摄像头';
+				// 调用底层API确保配置生效
+				this.setRearCamera();
+				
+				// 平板设备切换摄像头后,重新应用自动变焦设置
+				if (this.loadData.autoZoomEnabled) {
+					setTimeout(() => {
+						this.reapplyAutoZoom();
+					}, 1000); // 等待摄像头切换完成
+				}
+			}
+			// 更新状态显示
+			this.statusMessage = this.isTablet ? 
+				'平板设备 - 后置摄像头' : 
+				(this.loadData.isFacingFront ? '手机设备 - 前置摄像头' : '手机设备 - 后置摄像头');
+		},
+		
+		// 重新应用自动变焦设置
+		reapplyAutoZoom() {
+			console.log('重新应用自动变焦设置:', {
+				enabled: this.loadData.autoZoomEnabled,
+				mode: this.currentZoomMode
+			});
+			this.$refs.cameraView.setAutoZoom((result) => {
+				if (result.ok) {
+					this.statusMessage = `平板设备 - 自动变焦已重新应用 (${this.currentZoomMode}模式)`;
+					console.log('平板设备自动变焦重新应用成功');
+				} else {
+					this.statusMessage = '重新应用自动变焦失败: ' + result.msg;
+					console.error('Failed to reapply auto zoom:', result.msg);
+				}
+			}, {
+				enabled: this.loadData.autoZoomEnabled,
+				mode: this.currentZoomMode
+			});
+		},
+		setListener() {
+			this.$refs.cameraView.setListener((res) => {
+				if (res.action == "error") {
+					this.showToast(res.msg)
+				}
+			});
+		 },
+		showToast(msg) {
+			uni.showToast({
+				title: msg,
+				icon: 'none'
+			});
+		},
+		toggleAutoZoom(){
+			this.loadData.autoZoomEnabled = !this.loadData.autoZoomEnabled;
+			// 更新loadData中的配置
+			this.loadData.autoZoomMode = this.currentZoomMode;
+			
+			this.$refs.cameraView.setAutoZoom((result) => {
+				if (result.ok) {
+					this.statusMessage = this.loadData.autoZoomEnabled ? 
+						`自动变焦已开启 (${this.currentZoomMode}模式)` : '自动变焦已关闭';
+					this.showToast(this.statusMessage);
+					console.log('变焦切换:', {
+						enabled: this.loadData.autoZoomEnabled,
+						mode: this.currentZoomMode
+					});
+				} else {
+					this.statusMessage = '设置自动变焦失败: ' + result.msg;
+					console.error('Failed to toggle auto zoom:', result.msg);
+					this.showToast(this.statusMessage);
+				}
+			}, {
+				enabled: this.loadData.autoZoomEnabled,
+				mode: this.currentZoomMode
+			});
+		},
+		switchZoomMode() {
+			// 在 FACE、TONGUE、DEFAULT 之间切换
+			const modes = ['FACE', 'TONGUE', 'DEFAULT'];
+			const currentIndex = modes.indexOf(this.currentZoomMode);
+			this.currentZoomMode = modes[(currentIndex + 1) % modes.length];
+			
+			// 更新loadData中的配置
+			this.loadData.autoZoomMode = this.currentZoomMode;
+			
+			// 显示切换状态
+			const zoomLevels = {
+				'FACE': this.isTablet ? '2.0倍' : '1.8倍',
+				'TONGUE': this.isTablet ? '3.0倍' : '2.8倍', 
+				'DEFAULT': this.isTablet ? '1.8倍' : '1.5倍'
+			};
+			
+			if (this.loadData.autoZoomEnabled) {
+				// 如果自动变焦已开启,重新设置以应用新模式
+				this.$refs.cameraView.setAutoZoom((result) => {
+					if (result.ok) {
+						this.statusMessage = `变焦模式已切换到: ${this.currentZoomMode} (${zoomLevels[this.currentZoomMode]})`;
+						console.log('Zoom mode switched to:', this.currentZoomMode, 'with zoom level:', zoomLevels[this.currentZoomMode]);
+						this.showToast(this.statusMessage);
+						
+						// 减少延时并立即执行变焦以显示效果
+						setTimeout(() => {
+							this.manualZoom();
+							// 为了确保变焦效果明显,再次执行
+							setTimeout(() => {
+								this.manualZoom();
+							}, 100);
+						}, 200);
+					} else {
+						this.statusMessage = '切换变焦模式失败: ' + result.msg;
+						console.error('Failed to switch zoom mode:', result.msg);
+						this.showToast(this.statusMessage);
+					}
+				}, {
+					enabled: this.loadData.autoZoomEnabled,
+					mode: this.currentZoomMode
+				});
+			} else {
+				this.statusMessage = `变焦模式已设置为: ${this.currentZoomMode} (${zoomLevels[this.currentZoomMode]}) - 需开启自动变焦`;
+				this.showToast(this.statusMessage);
+			}
+		},
+		
+		manualZoom() {
+			this.$refs.cameraView.performAutoZoom((result) => {
+				if (result.ok) {
+					this.statusMessage = '手动变焦执行成功';
+					console.log('Manual zoom performed successfully');
+				} else {
+					this.statusMessage = '手动变焦失败: ' + result.msg;
+					console.error('Manual zoom failed:', result.msg);
+				}
+				//this.showToast(this.statusMessage);
+			});
+		},
+		pickerQuality(e){
+			console.log("qxj detailValue",e);
+			this.currentQuality=e.detail.value;
+			const newQuality = this.qualityPicker[this.currentQuality];
+			
+			// 显示加载状态
+			this.statusMessage = `正在切换到${newQuality}分辨率...`;
+			uni.showLoading({
+				title: '切换分辨率中...'
+			});
+			
+			this.loadData.captureQuality = newQuality;
+			this.$refs.cameraView.setCaptureQuality((result) => {
+				uni.hideLoading();
+				if (result.ok) {
+					this.statusMessage = `分辨率已切换到: ${newQuality}`;
+					uni.showToast({
+						title: `已切换到${newQuality}分辨率`,
+						icon: 'success'
+					});
+					
+					// 分辨率切换后,如果自动变焦开启,重新应用设置
+					if (this.loadData.autoZoomEnabled) {
+						setTimeout(() => {
+							this.$refs.cameraView.setAutoZoom((autoZoomResult) => {
+								if (autoZoomResult.ok) {
+									console.log('分辨率切换后自动变焦重新应用成功');
+								}
+							}, {
+								enabled: this.loadData.autoZoomEnabled,
+								mode: this.currentZoomMode
+							});
+						}, 1000); // 等待摄像头重新初始化完成
+					}
+				} else {
+					this.statusMessage = `分辨率切换失败: ${result.msg}`;
+					console.error('分辨率切换失败', result.msg);
+					uni.showToast({
+						title: `切换失败: ${result.msg}`,
+						icon: 'error'
+					});
+					// 恢复之前的设置
+					this.currentQuality = this.qualityPicker.indexOf(this.loadData.captureQuality);
+				}
+			}, {
+				quality: newQuality
+			});
+		}
+    }
+}
+</script>
+
+<style>
+    .show-view {
+        flex-direction: row;
+    }
+    .camera-view {
+		display: flex;
+        flex: 1;
+        height: 800rpx;
+        background-color: #333333;
+    }
+	
+	.controls {
+		flex-direction: column;
+		align-items: center;
+	}
+	
+	.btnBox{
+		display: flex;
+		flex: 1;
+		margin-left: 10rpx;
+	}
+	
+	.btn1{
+		display: flex;
+		flex: 1;
+		margin-right: 10rpx;
+	}
+
+	.btn {
+		width: 750rpx;
+		height: 50px;
+		background-color: #007AFF;
+		color: #fff;
+		border-radius: 10rpx;
+		margin-bottom: 10rpx;
+		font-size: 16px;
+		text-align: center;
+		line-height: 50px;
+	}
+	
+    .r-flex {
+        margin-top: 40rpx;
+        margin-bottom: 40rpx;
+        flex-wrap: wrap;
+        flex-direction: row;
+    }
+
+	
+	.status {
+		flex-direction: column;
+		align-items: center;
+		padding: 15px;
+		background-color: #fff;
+		border-radius: 10px;
+		border: 1px solid #ddd;
+	}
+	
+	.status-text {
+		font-size: 14px;
+		color: #666;
+		margin-bottom: 5px;
+		text-align: center;
+	}
+	
+</style>

+ 204 - 0
pages/device/tongue/testCameraAuto.nvue

@@ -0,0 +1,204 @@
+<template>
+	<div class="container">
+		<view class="show-view">
+		     <!-- Camera 组件 -->
+		     <Ba-CameraView ref="cameraView" class="camera-view" :load="cameraOptions" @load="onCameraLoad"></Ba-CameraView>
+		 </view>
+		<!-- 控制按钮 -->
+		<div class="controls">
+			<button class="btn" @click="toggleAutoZoom">
+				{{ autoZoomEnabled ? '关闭自动变焦' : '开启自动变焦' }}
+			</button>
+			<button class="btn" @click="switchZoomMode">
+				切换模式: {{ currentMode }}
+			</button>
+			<button class="btn" @click="manualZoom">手动变焦</button>
+			<button class="btn" @click="takePicture">拍照</button>
+		</div>
+		
+		<!-- 状态显示 -->
+		<div class="status">
+			<text class="status-text">自动变焦: {{ autoZoomEnabled ? '开启' : '关闭' }}</text>
+			<text class="status-text">变焦模式: {{ currentMode }}</text>
+			<text class="status-text">{{ statusMessage }}</text>
+		</div>
+		
+	</div>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			autoZoomEnabled: true,
+			currentMode: 'FACE',
+			statusMessage: '相机初始化中...',
+			cameraOptions: {
+				isToast: true,
+				isShowVibrate: true,
+				isShowBeep: true,
+				zoom: true,
+				captureQuality: 'HIGH',
+				autoZoomEnabled: true,
+				autoZoomMode: 'FACE'
+			}
+		}
+	},
+	methods: {
+		onReady() {
+			
+		    this.setListener(); //设置监听
+			
+			//this.$refs.cameraView.setCaptureQuality("MEDIUM"); 动态设置清晰度
+			//this.$refs.cameraView.setAutoZoom(true, "TONGUE"); // 启用自动变焦
+			//this.$refs.cameraView.performAutoZoom(); // 手动触发变焦
+			//this.$refs.cameraView.setAutoZoom(false); // 禁用自动变焦
+		},
+		onCameraLoad() {
+			this.statusMessage = '相机加载完成,自动变焦已启用';
+			console.log('Camera loaded with auto zoom enabled');
+		},
+		toggleAutoZoom() {
+			this.autoZoomEnabled = !this.autoZoomEnabled;
+			this.$refs.cameraView.setAutoZoom((result) => {
+				if (result.ok) {
+					this.statusMessage = this.autoZoomEnabled ? '自动变焦已开启' : '自动变焦已关闭';
+					console.log('Auto zoom toggled:', this.autoZoomEnabled);
+				} else {
+					this.statusMessage = '设置自动变焦失败: ' + result.msg;
+					console.error('Failed to toggle auto zoom:', result.msg);
+				}
+			}, {
+				enabled: this.autoZoomEnabled,
+				mode: this.currentMode
+			});
+		},
+		
+		switchZoomMode() {
+			// 在 FACE、TONGUE、DEFAULT 之间切换
+			const modes = ['FACE', 'TONGUE', 'DEFAULT'];
+			const currentIndex = modes.indexOf(this.currentMode);
+			this.currentMode = modes[(currentIndex + 1) % modes.length];
+			
+			if (this.autoZoomEnabled) {
+				this.$refs.cameraView.setAutoZoom((result) => {
+					if (result.ok) {
+						this.statusMessage = `变焦模式已切换到: ${this.currentMode}`;
+						console.log('Zoom mode switched to:', this.currentMode);
+					} else {
+						this.statusMessage = '切换变焦模式失败: ' + result.msg;
+						console.error('Failed to switch zoom mode:', result.msg);
+					}
+				}, {
+					enabled: this.autoZoomEnabled,
+					mode: this.currentMode
+				});
+			} else {
+				this.statusMessage = `变焦模式已设置为: ${this.currentMode} (需开启自动变焦)`;
+			}
+		},
+		
+		manualZoom() {
+			this.$refs.cameraView.performAutoZoom((result) => {
+				if (result.ok) {
+					this.statusMessage = '手动变焦执行成功';
+					console.log('Manual zoom performed successfully');
+				} else {
+					this.statusMessage = '手动变焦失败: ' + result.msg;
+					console.error('Manual zoom failed:', result.msg);
+				}
+			});
+		},
+		
+		takePicture() {
+			const timestamp = new Date().getTime();
+			const fileName = `camera_test_${timestamp}.jpg`;
+			
+			this.$refs.cameraView.takePicture((result) => {
+				if (result.ok) {
+					this.statusMessage = `拍照成功: ${fileName}`;
+					console.log('Picture taken successfully:', fileName);
+				} else {
+					this.statusMessage = '拍照失败: ' + result.msg;
+					console.error('Failed to take picture:', result.msg);
+				}
+			}, {
+				path: fileName,
+				isFull: true
+			});
+		},
+		setListener() {
+			this.$refs.cameraView.setListener((res) => {
+				if (res.action == "error") {
+					this.showToast(res.msg)
+				}
+			});
+		 },
+	}
+}
+</script>
+
+<style>
+	
+.container {
+	flex: 1;
+	background-color: #f5f5f5;
+	padding: 20px;
+}
+
+.title {
+	font-size: 24px;
+	font-weight: bold;
+	text-align: center;
+	margin-bottom: 20px;
+	color: #333;
+}
+
+.show-view {
+   flex-direction: row;
+}
+
+.camera-view {
+     width: 750rpx;
+     height: 800rpx;
+     background-color: #333333;
+ }
+
+.controls {
+	flex-direction: column;
+	align-items: center;
+	margin-bottom: 20px;
+}
+
+.btn {
+	width: 200px;
+	height: 50px;
+	background-color: #007AFF;
+	color: #fff;
+	border-radius: 25px;
+	margin-bottom: 10px;
+	font-size: 16px;
+	text-align: center;
+	line-height: 50px;
+}
+
+.btn:active {
+	background-color: #0056CC;
+}
+
+.status {
+	flex-direction: column;
+	align-items: center;
+	padding: 15px;
+	background-color: #fff;
+	border-radius: 10px;
+	border: 1px solid #ddd;
+}
+
+.status-text {
+	font-size: 14px;
+	color: #666;
+	margin-bottom: 5px;
+	text-align: center;
+}
+</style>

+ 132 - 0
pages/device/tongue/tongueList.vue

@@ -0,0 +1,132 @@
+<template>
+	<view class="content">
+		 
+		<mescroll-body top="0rpx" bottom="0" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption">
+		<view class="tongue-list">
+			<view v-for="(item,index) in dataList" :key="index" class="item" @click="navTo('/pages/user/tongue/report?type=back&id='+item.id)">
+					<view class="ask-text"  >舌苔特征:{{item.taiseName}}</view>
+					<view class="ask-text"  >舌苔描述:{{item.taiseDesc}}</view>
+					<view class="ask-text">所属体质:{{item.typeName}}</view>
+					<view class="patient-text">患者:{{item.name}} {{item.age}}岁 {{item.sex==1?'男':'女'}} </view>
+					<view class="ask-time" v-if="item.createTime!=null">检测时间:{{item.createTime}}</view>
+				</view>
+		</view>
+		</mescroll-body>
+	</view>
+</template>
+
+<script>
+	import {getHealthTongueList} from '@/api/healthTongue.js'
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin], 
+		data() {
+			return {
+				mescroll:null,
+				// 上拉加载的配置
+				upOption: {
+					onScroll:false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore:"已经到底了",
+					empty: {
+						icon:'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				// 列表数据
+				dataList: []
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			navTo(url){
+				uni.navigateTo({
+					url: url
+				})
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback(mescroll) {
+				mescroll.resetUpScroll()
+			},
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getHealthTongueList(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">
+	.content{
+		 
+		.tongue-list{
+			padding: 20upx;
+			.item{
+				background: #FFFFFF;
+				border-radius: 16upx;
+				padding: 30upx;
+				position: relative;
+				margin-bottom: 20upx;
+				 
+				
+				.ask-text{
+					margin: 24rpx 0rpx;
+					font-size: 30upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #111111;
+					line-height: 42upx;
+				}
+				.patient-text{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+					margin-bottom: 15upx;
+				}
+				.ask-time{
+					font-size: 24upx;
+					font-family: PingFang SC;
+					font-weight: 500;
+					color: #999999;
+				}
+				 
+			}
+		}
+	}
+	 
+</style>

+ 111 - 0
pages/index/appDownload.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="container">
+		<view class="appname" :style="{paddingTop: paddingTop}">国健通</view>
+		<image class="appdownload-txt" src="@/static/appdownload-txt.png" mode="heightFix"></image>
+		<view class="downbtn" @click="downApp()">打开应用市场</view>
+		<view class="downbtn" @click="downApp('down')">直接下载APP</view>
+	</view>
+</template>
+
+<script>
+	import { getAppVersion } from '@/api/common'
+	export default {
+		data() {
+			return {
+				paddingTop: 0,
+			}
+		},
+		onLoad() {
+			const top = uni.getSystemInfoSync().windowHeight
+			this.paddingTop = top < 568 ? '700rpx' : '770rpx'
+		},
+		methods: {
+			downApp(type) {
+				if(type=='down') {
+					const isWechat = String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"
+					if(isWechat) {
+						uni.showToast({
+							title: '点击右上角按钮,选择在浏览器中打开',
+							icon: "error",
+							duration: 3000
+						})
+						return
+					}
+					let platform = uni.getSystemInfoSync().platform;
+					let isAndroid=platform=="android";
+					let type=isAndroid?1:2;
+					getAppVersion(type).then(srcData => {
+							if(srcData.code==200){
+								let data = srcData.data;
+								if(data&&data.url) {
+									window.location.href=data.url//升级包地址;
+								} else {
+									uni.showToast({
+										title: '暂无下载地址',
+										icon: "none"
+									})
+								}
+							} else {
+								uni.showToast({
+									title: '获取下载地址失败',
+									icon: "none"
+								})
+							}								
+						},
+						rej => {}
+					).catch(()=>{
+						//联网失败, 结束加载
+						uni.showToast({
+							title: '获取下载地址失败',
+							icon: "none"
+						})
+					});
+				} else {
+					window.location.href="https://a.app.qq.com/o/simple.jsp?pkgname=com.mytek.rtlive";
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		height: 100vh;
+		width: 100%;
+		background: url("@/static/appdownload.png") no-repeat 50%;
+		background-size: cover;
+		background-color: linear-gradient( 180deg, #E93C21 0%, #FF5600 100%);;
+		// overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 600;
+		font-size: 40rpx;
+		color: #FFFFFF;
+		.appname {
+			padding-top: 700rpx;
+			margin-bottom: 14rpx;
+		}
+		.appdownload-txt {
+			height: 32rpx;
+			width: 378rpx;
+			margin-bottom: 94rpx;
+		}
+		.downbtn {
+			width: 528rpx;
+			min-height: 96rpx;
+			background: linear-gradient( 180deg, #FFFFFD 0%, #FEE7CC 100%);
+			border-radius: 48rpx 48rpx 48rpx 48rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #EE4219;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			margin-bottom: 24rpx;
+		}
+	}
+</style>

+ 33 - 0
pages/index/download.vue

@@ -0,0 +1,33 @@
+<template>
+	<view>
+		
+	</view>
+	
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad(options) {
+            // #ifdef H5
+			   window.location.href="https://a.app.qq.com/o/simple.jsp?pkgname=com.mytek.rtlive";
+            // #endif
+		},
+		onPageScroll: function(e) {
+			
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+
+<style>
+	
+	
+</style>

+ 42 - 0
pages/index/h5.vue

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

+ 528 - 0
pages/index/index.vue

@@ -0,0 +1,528 @@
+<template>
+	<!-- <page-meta :page-font-size="`${this.scaleFontSize}px`"  :root-font-size="`${this.scaleFontSize}px`"></page-meta> -->
+	<view class="border-box">
+	<view class="content y-bc">
+		<view style="width: 100%;">
+			<view class="logo">
+				<image src='/static/image/device/title.png'></image>
+			</view>
+			
+			<view class="btn-box x-f">
+				<!-- <view class="item-box x-c">
+					<image src="/static/image/device/code_icon32.png"></image>
+					<view>邀请二维码</view>
+				</view>
+				<view class="item-box x-c">
+					<image src="/static/image/device/company_manage_icon32.png"></image>
+					<view>公司管理</view>
+				</view> -->
+				<view class="item-box x-c" @click="logout">
+					<image src="/static/image/device/exit_icon32.png"></image>
+					<view>退出登录</view>
+				</view>
+			</view>
+		</view>
+		<view class="center-box" :class="{ 'flex-box': width < height }">
+			<view class="bg-item y-start" @click="goTest()">
+				<view class="title">体质辨识</view>
+				<view class="more">
+					<text>点击了解</text>
+				</view>
+			</view>
+			<view class="bg-item y-start" @click="goUser()">
+				<view class="title">客户管理</view>
+				<view class="more">
+					<text>点击了解</text>
+				</view>
+			</view>
+		</view>
+		<view class="footer">
+			<view>登录账号:{{info.userName||'-'}}</view>
+			<view>姓名:{{info.nickName||'-'}}</view>
+		</view>
+	</view>
+	</view>
+</template>
+
+<script>
+	import store from '@/store';
+	import {selectUserInfo} from '@/api/user.js';
+	export default {
+		components: {
+			
+		},
+		data() {
+			return {
+				height: uni.getSystemInfoSync().screenHeight,
+				width: uni.getSystemInfoSync().screenWidth,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				option: '',
+				top: 0,
+				statusBarBG: 'none',
+				headerHeight: 44,
+				// locCity: '国健通',
+				scaleFontSize: uni.getStorageSync('fontSize'),
+				info:{},
+				user:{}
+			
+			};
+		},
+		onPageScroll(e) {
+			if (this.template == 'homeIndex') {
+				this.top = e.scrollTop;
+			}
+		},
+		computed: {
+			// 计算属性的 getter
+			headerBG() {
+				if (this.template == 'homeIndex') {
+					var top = this.top / 88;
+					return 'rgba(255,92,3, ' + top + ')';
+				}
+			}
+		},
+		onLoad(option) {
+			
+			const systemInfo = uni.getSystemInfoSync();
+			console.log("qxj screenWidth:"+systemInfo.screenWidth);
+			console.log("qxj screenHeight:"+systemInfo.screenHeight);  //定制设备平板 800x1232   平板设备1280x785
+              
+			let that = this;
+			uni.setNavigationBarTitle({
+				title: that.$qconfig.appName
+			});
+			uni.setStorageSync('indexTemplate', 0);
+			this.option = option;
+			this.user=JSON.parse(uni.getStorageSync('userInfo'));
+			this.selectUserInfo();
+			//this.scaleFontSize = store.state.timStore.fontSize;
+			// this.$nextTick(()=>{
+			// 	  this.$refs[this.template].initLoad(this.option)
+			// })
+		},
+		onReady() {
+			// this.$refs.indexSubsection.selectorQuery();
+			// this.$refs[this.template].initReady();
+		},
+		onShow() {
+			if (!this.$isLogin()) {
+				uni.navigateTo({
+					url: '/pages/auth/loginIndex'
+				});
+			} else {
+				// this.$updateMsgDot();
+			}
+		},
+		methods: {
+			selectUserInfo(){
+				selectUserInfo().then(res => {
+						if(res.code==200){
+							console.log('res',res)
+							  this.info=res.user
+						}
+						else{
+							uni.showToast({title: res.msg,icon: 'none'});
+						}
+					},
+					rej => {}
+				);
+			},
+			logout(){
+			 	uni.showModal({
+			 		title:"提示",
+			 		content:"确认退出登录吗?",
+			 		showCancel:true,
+			 		cancelText:'取消',
+			 		confirmText:'确定',
+			 		success:res=>{
+			 			if(res.confirm){
+							// this.$logout();
+			 				uni.removeStorageSync('AppToken');
+							uni.removeStorageSync('selectUser');
+							uni.$emit('loginOut');
+								 uni.reLaunch({
+									url: '/pages/auth/loginIndex'
+								});				
+			 			}else{
+							
+			 			}
+			 		}
+			 	})
+			 },
+			 goUser(){
+				 // uni.redirectTo({
+				 // 	url: '/pages/user/myUserList?userId='+this.user.userId
+				 // });
+				 uni.navigateTo({
+				  url: '/pages/user/myUserList?userId='+this.user.userId
+				 })
+			 },
+			 goTest(){
+			 		// uni.redirectTo({
+			 		// 	url: '/pages/device/tongue/index?userId='+this.user.userId
+			 		// });	
+						uni.navigateTo({
+						 url:'/pages/device/tongue/index?userId='+this.user.userId
+						})
+			 },
+			changeTemplate(e) {
+				const tem = e == 1 ? 'watchIndex' : 'homeIndex';
+				if (this.template == tem) return;
+				this.template = tem;
+				uni.pageScrollTo({
+					scrollTop: 0,
+					duration: 100
+				});
+				this.$nextTick(() => {
+					//this.$refs[this.template].initLoad(this.option)
+					this.$refs[this.template].initReady();
+					// this.$refs[this.template].initShow();
+				});
+			},
+			registerIdCode() {
+				//注册,先注册再获取,注意APP合规性,若最终用户未同意隐私政策则不要调用
+				idCode.register((res) => {
+					console.log(res);
+				});
+			},
+			async getLocation() {
+				let status;
+				// #ifdef APP-PLUS
+				status = await this.checkPermission();
+				if (status !== 1) {
+					return;
+				}
+				// #endif
+				// #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ
+				status = await this.getSetting();
+				if (status === 2) {
+					this.showConfirm();
+					return;
+				}
+				// #endif
+				this.doGetLocation();
+			},
+			doGetLocation() {
+				getLocation().then((res) => {
+					this.locCity = res.city.replace(/市|区/g, '');
+				});
+			},
+			getSetting: function() {
+				return new Promise((resolve, reject) => {
+					uni.getSetting({
+						success: (res) => {
+							if (res.authSetting['scope.userLocation'] === undefined) {
+								resolve(0);
+								return;
+							}
+							if (res.authSetting['scope.userLocation']) {
+								resolve(1);
+							} else {
+								resolve(2);
+							}
+						}
+					});
+				});
+			},
+			openSetting: function() {
+				this.hideConfirm();
+				uni.openSetting({
+					success: (res) => {
+						if (res.authSetting && res.authSetting['scope.userLocation']) {
+							this.doGetLocation();
+						}
+					},
+					fail: (err) => {}
+				});
+			},
+			async checkPermission() {
+				let status = permision1.isIOS ? await permision1.requestIOS('location') : await permision1
+					.requestAndroid('android.permission.ACCESS_FINE_LOCATION');
+				if (status === null || status === 1) {
+					status = 1;
+				} else if (status === 2) {
+					uni.showModal({
+						content: '系统定位已关闭',
+						confirmText: '确定',
+						showCancel: false,
+						success: function(res) {}
+					});
+				} else if (status.code) {
+					uni.showModal({
+						content: status.message
+					});
+				} else {
+					uni.showModal({
+						content: '需要定位权限',
+						confirmText: '设置',
+						success: function(res) {
+							if (res.confirm) {
+								permision1.gotoAppSetting();
+							}
+						}
+					});
+				}
+				return status;
+			},
+
+			showQidai() {
+				uni.showToast({
+					title: '功能完善中,敬请期待...',
+					icon: 'none'
+				});
+			},
+			goToMsg() {
+				uni.switchTab({
+					url: '/pages_im/pages/conversation/conversationList/index'
+				});
+			},
+			async goToWXMsg() {
+				const url = getApp().globalData.kfurl; //企业微信客服链接
+				const corpId = getApp().globalData.corpId; //企业id
+				// #ifdef H5
+				window.location.href = url;
+				// #endif
+				// #ifdef MP-WEIXIN
+				wx.openCustomerServiceChat({
+					extInfo: {
+						url
+					},
+					corpId,
+					success(res) {
+						console.log('成功');
+					},
+					fail(err) {
+						console.log(err, '报错');
+					}
+				});
+				// #endif
+
+				// #ifdef APP-PLUS
+				let shares = await this.getAppShare().catch((err) => {
+					throw Error(err);
+				});
+				shares['weixin'].openCustomerServiceChat({
+						corpid: corpId,
+						url
+					},
+					(suc) => {
+						console.log('客服打开成功', JSON.stringify(res));
+					},
+					(err) => {
+						console.log('error', JSON.stringify(err));
+					}
+				);
+				// #endif
+			},
+			getAppShare() {
+				// #ifdef APP-PLUS
+				return new Promise((re, rj) => {
+					let shares = null;
+					var pusher = plus.share.getServices(
+						function(s) {
+							shares = {};
+							s.forEach((e) => (shares[e.id] = e));
+							re(shares);
+						},
+						function(e) {
+							rj(e);
+						}
+					);
+				});
+				// #endif
+			},
+		
+			getIdCodes() {
+				//获取设备的各种标识码
+				idCode.getIdCodes((res) => {
+					if (res.data) {
+						//this.msgList.unshift(JSON.stringify(res.data));
+						let ua = plus.navigator.getUserAgent();
+						console.log('qxj ua:' + ua);
+						console.log('qxj getIdCodes:' + JSON.stringify(res.data));
+					}
+				});
+			},
+			
+			scanQRCode() {
+				const that = this;
+				uni.scanCode({
+					success(res) {
+						if (res.result) {
+							// 扫描成功,处理二维码内容
+							console.log('扫描结果:', res.result);
+							const scanInfo = res.result;
+							if (scanInfo && scanInfo.indexOf('https://userapp.his.cdwjyyh.com/bindcompanyuser') > -
+								1) {
+								const companyUserId = this.getUrlParam(scanInfo).companyUserId;
+								console.log('扫描结果公司码:', companyUserId);
+								this.$handleBindCompanyFsUser(companyUserId);
+							}
+						} else {
+							// 扫描失败
+							uni.showToast({
+								title: '扫描失败',
+								icon: 'none'
+							});
+						}
+					},
+					fail() {}
+				});
+			},
+			getUrlParam(url) {
+				const queryStr = url.split('?')[1];
+				if (!queryStr) {
+					return {};
+				}
+				const params = queryStr.split('&');
+				const queryParams = {};
+				params.forEach((param) => {
+					const [key, value] = param.split('=');
+					queryParams[key] = value;
+				});
+				return queryParams;
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	// @mixin u-flex($flexD, $alignI, $justifyC) {
+	// 	display: flex;
+	// 	flex-direction: $flexD;
+	// 	align-items: $alignI;
+	// 	justify-content: $justifyC;
+	// }
+ .border-box{
+	width: 100vw;
+	height: 100vh;
+	background-image:url(/static/image/device/ipad_yjf_boder.png);
+	background-repeat: no-repeat;
+	position: relative;
+	background-size: 100% 100%;
+	box-sizing: border-box;
+	padding: 10px;
+ }
+ .content{
+ 	 // display: flex;
+	 width: 100%;
+	 height: 100%;
+	 background-image:url(/static/image/device/ipad_home_bg.png);
+	 background-repeat: no-repeat;
+	 background-size: 100% 100%;
+	 position: relative;
+	 padding-top: 20px;
+	 .logo{
+		 width: 100%;
+		 display: flex;
+		 justify-content: center;
+		 image{
+			 width:593px;
+			 height: 148px;
+		 }
+	 }
+	 .btn-box{
+		 width: 100%;
+		 text-align: right;
+		 justify-content: right;
+		 margin-top: 50px;
+		 padding-right: 37px;
+		 .item-box{
+			width: 167px;
+			height: 47px;
+			background: #8F6726;
+			border-radius: 9px 9px 9px 9px;
+			 margin-left: 16px;
+			 font-family: Microsoft YaHei, Microsoft YaHei;
+			 font-weight: 400;
+			 font-size: 18px;
+			 color: #FFFFFF;
+			 text-align: center;
+			 image{
+				 width: 24px;
+				 height: 24px;
+				 margin-right:10px ;
+			 }
+		 }
+	 }
+	 .center-box{
+		 width: 100%;
+		 display: flex;
+		 align-items: center;
+		 justify-content: center;
+		 &.flex-box{
+			flex-direction: column;
+			.bg-item:last-child{
+				 margin-left: 0px;
+				 margin-top: 40px;
+			 }
+		 }
+		 .bg-item{
+			width: 504px;
+			height: 267px;
+			 padding: 41px;
+			 border-radius: 16px;
+			 background-image:url(/static/image/device/tzbs_bg.png);
+			 background-repeat: no-repeat;
+			 background-size: 100% 100%;
+			 &:last-child{
+				 margin-left: 40px;
+				  background-image:url(/static/image/device/khgl_bg.png);
+			 }
+			 .title{
+				 font-family: Source Han Serif CN, Source Han Serif CN;
+				 font-weight: bold;
+				 font-size: 39px;
+				 color: #FFFFFF;
+				 text-align: left;
+			 }
+			 .more{
+				 margin-top: 15px;
+				width: 89px;
+				height: 30px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				 display: flex;
+				 align-items: center;
+				 justify-content: center;
+				 background: #FFFFFF;
+				 text-align: center;
+				 text{
+					 font-family: PingFang SC, PingFang SC;
+					 font-weight: 400;
+					 font-size: 16px;
+					 color: #A14212;
+				 }
+			 }
+		 }
+		 
+	 }
+	 .footer{
+		 width: 100%;
+		 display: flex;
+		 align-items: center;
+		 justify-content: center;
+		 // position: absolute;
+		 padding-bottom:50px;
+		 view{
+			 font-family: PingFang SC, PingFang SC;
+			 font-weight: 400;
+			 font-size: 20px;
+			 color: #8F6726;
+			 text-align: center;
+			 &:last-child{
+				 margin-left: 40px;
+			 }
+		 }
+	 }
+ }
+// @media screen and (max-width: 1149px) and (min-aspect-ratio: 1/1) {
+//   .bg-item{
+// 	  margin-left: 0 !important;
+// 	  transform: scale(0.85);
+//   }
+//   .content .logo{
+// 	  transform: scale(0.9);
+//   }
+// }
+</style>

+ 1160 - 0
pages/index/indexOld.vue

@@ -0,0 +1,1160 @@
+<template>
+	<!-- <page-meta :page-font-size="`${this.$store.getters.scaleFontSize}px`"  :root-font-size="`${this.$store.getters.scaleFontSize}px`"></page-meta> -->
+	<view class="content" >
+		<mescroll-body ref="mescrollRef"  style="background-color: #FAFAFA;" @init="mescrollInit" top="0" bottom="20" :down="downOption" :up="upOption" @down="downCallback" @up="upCallback">
+			<!-- <image class="bg-img" src="/static/image/home1/home_top_bg.png"></image> -->
+				<view class="bgConent"></view>
+				<view class="nav-bar">
+						<view class="grace-page-header" :style="{ background:headerBG }">
+							<!-- 沉浸式状态栏 -->
+							<view class="grace-page-status-bar" :style="{background:statusBarBG}"></view>
+							<view class="content-header"  id="gracePageHeader" :style="{minHeight:headerHeight+'px', height:headerHeight+'px', overflow:'hidden'}">
+								<view class="content-header-l">
+									<!-- <image class="address" src="@/static/image/home1/address_icon.png" mode="aspectFill"></image> -->
+									<text>{{locCity}}</text>
+									<!-- <image class="arrow_down" src="@/static/image/home1/arrow_down_icon.png" mode="aspectFill"></image> -->
+								</view>
+								<view class="content-header-r">
+								<!-- 	<view @click="showQidai()">
+										<image src="@/static/image/home1/weixin_icon.png" mode="aspectFill"></image>
+										<text>分享</text>
+									</view> -->
+									<view @click="goToMsg()">
+										<image src="@/static/image/home1/new_icon.png" mode="aspectFill"></image>
+										<text>消息</text>
+									</view>
+								</view>
+							</view>
+						</view>
+						<view class="nav_box">
+							<view class="status_bar"></view>
+							<view class="nav_bar"></view>
+						</view>
+				</view>
+		
+				<!-- 搜索 -->
+				<view class="search-box" v-if="false">
+						<view class="left">
+							<image src="@/static/image/home1/search_icon.png" mode=""></image>
+							<input class="input-text" disabled="true" type="text" placeholder-class="place-hold" value="输入疾病 | 科室 | 医生 | 知识" placeholder=""/>
+						</view>
+						<view class="right">
+							<button  class="button" @click="showQidai()">搜索</button>
+						</view>
+				</view>
+			
+                <!-- banner -->
+                <view class="swiper-box">
+					<swiper class="swiper" style="height: 233rpx;" circular :indicator-dots="true" :autoplay="false" :interval="3000"
+						:duration="1000">
+						<swiper-item  v-for="(url,index) in advImgs" :key="index"  class="swiper-item" @click="handleAdvClick(index)"> 
+							<image style="width: 100%;height: 100%;" :src="url" mode="aspectFill"></image>
+						</swiper-item>
+					</swiper>
+                </view>
+								
+				 <view class="nav" id="indexguide1">
+				 	<view class="grid-item" v-for="(item ,index) in navList" :key="index">
+						<view class="grid-item-box"  @tap="topNavTo(item.pageUrl,index)">
+							<image class="image" :src="item.img" mode="aspectFill" />
+							<text class="text">{{item.name}}</text>
+						</view>
+				 	</view>
+				 </view>
+				
+				  <!-- 中医瘦身 -->
+				 <scroll-view scroll-x="true" class="scroll-X">
+				 	<view class="scroll-item zyss_bg" v-for="(item,index) in midAdvs" :key="index"  @tap="midAvTap(item,index)">
+				 		<image class="bg_img" :src="item.imageUrl" mode="widthFix"></image>
+				 	</view>
+				 </scroll-view>
+				
+				 <!-- 快速问诊 -->
+				 <view class="banner-nav" id="indexguide2">
+						<view class="banner-nav-item kswz-bg" @tap="loginNavTo('/pages/doctor/doctorList')">
+							<view class="title">快速问诊</view>
+							<view>专业医师快速</view>
+						</view>
+						<view class="banner-nav-item jkhz-bg" @tap="loginNavTo('/pages/store/inquirySelectType?isShare=1')">
+							<view class="title">健康会诊</view>
+							<view>权威专家为您</view>
+							<view class="jkhz">答疑解惑</view>
+						</view>
+						<view class="banner-nav-item yyzx-bg" @click="loginNavTo('/pages/store/inquirySelect?inquiryType=3&isShare=1')">
+							<view class="title">用药咨询</view>
+							<view>执业药师提供</view>
+							<view class="yyzx">用药指导</view>
+						</view>
+						<view class="banner-nav-item zjyz-bg" @tap="loginNavTo('/pages/doctor/doctorList')">
+							<view class="title">专家约诊</view>
+							<view>在线预约专家</view>
+							<view class="zjyz">诊疗服务</view>
+						</view>
+				 </view>
+				 
+				 <!-- 健康自测 -->
+				 <view id="indexguide3">
+				 <view class="box-nav">
+						<view class="title">健康自测</view>
+						<view class="box-nav-right" @click="navTo('/pages/article/testList')">
+							<text>更多自测</text>
+							<image class="right-arrow" src="@/static/image/home1/my_right_arrow.png" mode="aspectFill"></image>
+						</view>
+				 </view>
+				 
+				 <view class="selfrated-health">
+						<view class="selfrated-health-item" @click="navTo('/pages/article/testDetails?tempId=5')">
+							<image src="@/static/image/home1/icon/zytz_icon.png" mode="aspectFill"></image>
+							<view>中医体质</view>
+						</view>
+						<view class="selfrated-health-item" @click="navTo('/pages/article/testDetails?tempId=8')">
+							<image src="@/static/image/home1/icon/xnxg_icon.png" mode="aspectFill"></image>
+							<view>心脑血管</view>
+						</view>
+						<view class="selfrated-health-item" @click="navTo('/pages/article/testDetails?tempId=14')">
+							<image src="@/static/image/home1/icon/nxjk_icon.png" mode="aspectFill"></image>
+							<view>男性健康</view>
+						</view>
+						<view class="selfrated-health-item" @click="navTo('/pages/article/testDetails?tempId=18')">
+							<image src="@/static/image/home1/icon/nvxjk_icon.png" mode="aspectFill"></image>
+							<view>女性健康</view>
+						</view>
+				 </view>
+				 </view>
+				 <!-- 推荐医生 -->
+				 <view class="box-nav">
+						<view class="title">推荐医生</view>
+						<view class="box-nav-right"  @tap="navTo('/pages/doctor/doctorList')">
+							<text>更多医生</text>
+							<image class="right-arrow" src="@/static/image/home1/my_right_arrow.png" mode="aspectFill"></image>
+						</view>
+				 </view>
+				 
+				
+				<scroll-view class="scroll-container " scroll-x="true" scroll-with-animation="true" overflow-anchor="none">
+					<view class="box-doctor" v-for="(item,index) in doctors"  :key="index">
+						  <docterItem class="gapitem"  :item="item" @click="navTo('/pages/doctor/doctorDetails?doctorId='+item.doctorId)"></docterItem>
+					</view>
+				</scroll-view>
+				 
+				 <!-- 健康疗法 -->
+				 <view class="box-nav" id="indexguide4">
+						 <view class="title">健康疗法</view>
+						 <view class="box-nav-right" @click="navTo('/pages/store/packageList')">
+							<text>更多疗法</text>
+							<image class="right-arrow" src="@/static/image/home1/my_right_arrow.png" mode="aspectFill"></image>
+						</view>
+				 </view>
+				 <view class="box-goods">
+					 <goodsItem v-if="packages.length>0" class="gapitem indexguide4-child" v-for="(item,index) in packages" :key="index"  :item=item  @click="navTo('/pages/store/packageDetails?packageId='+item.packageId)" ></goodsItem>		
+					 <view v-else class="es  x-c es-h-200 indexguide4-child" style="width: 100%;">
+							 <view class="y-bc flex">
+								 <image src="../../static/image/nodata.png" class="es-w-148 es-h-96 es-mt-20"></image>
+								 <view class="es-c-33 es-fs-26 x-c es-mt-20 es-mb-40">暂无疗法</view>
+							 </view>			 
+					 </view>
+				 </view>
+				 
+				 <!-- 签到弹窗 -->
+				 <signPop ref="signPop" :userSign="userSign" />
+				 
+				 <!-- 新手指引 -->
+				 <myGuide ref="myGuide" :step="step"></myGuide>
+				
+		 </mescroll-body>
+		 
+	</view>
+</template>
+
+<script>
+	import {getDoctorList} from '@/api/doctor.js'
+	import {getPackageList} from '@/api/package.js'
+	
+	import docterItem from "./components/docterItem.vue";
+	import goodsItem from "./components/goodsItem.vue"
+	
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import mescrollBody from "@/uni_modules/mescroll-uni/components/mescroll-body/mescroll-body.vue";
+	// import permision from "@/js_sdk/wa-permission/permission.js" 
+	import { getAdvList,getAppAdvList} from '@/api/adv.js'
+	import { getNewcomerBenefits,getUserSign} from '@/api/integral';
+	import { getLocation } from '@/api/index.js'
+	// #ifdef APP-PLUS
+	import permision1 from "@/utils/permission.js"
+	// #endif
+	const idCode = uni.requireNativePlugin('Ba-IdCode')
+	export default {
+		mixins: [MescrollMixin], // 使用mixin
+		components: { 
+		    mescrollBody,
+			docterItem,
+			goodsItem
+	     },
+		data() {
+			return {
+				keyword:"",
+				advImgs:[],
+				advs:[],
+				midAdvs:[],
+				doctors:[],
+				packages:[],
+				headerHeight:44,
+				//headerBG:"#FF5C03",
+				statusBarBG:"none",
+				company:null,
+				newCustomerCounts:0,
+				fullCustomerCounts:0,
+				myCustomerCounts:0,
+				dayOrderCounts:0,
+				doBuyOrderCounts:0,
+				downOption: {   //下拉刷新
+				 	auto: true // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {   //上拉加载
+				 	auto: false, // 不自动加载
+				 	page: {
+				 		num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+				 		size: 10 // 每页数据的数量
+				 	},
+				 	noMoreSize: 5, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
+				 	empty: {
+				 		tip: '~ 暂无疗法 ~' // 提示
+				 		// btnText: '去看看'
+				 	},
+					use:false
+				},
+				locCity:"国健通",
+				tdlist: [],
+				show:false,
+				user:{
+				 	avatar:"",
+				 	userName:this.$qconfig.appName,
+				 	mobile:""
+				},
+				 userScrollTop: 0,
+				 fixedTop: false, // 是否固定头部
+				 connectStatus: '未链接',
+				 deviceToken: '',
+				 udid: '',
+				 registrationID: '',
+				 appkey: '',
+				 imageList:["../../static/image/home/banner.png"],
+				 top:0,
+				 userBenefits:{},
+				 userSign:{},
+				 navList: [
+						 {
+							img: "../../static/image/home1/icon/aiTongue.png",
+							name: "AI舌诊",
+							pageUrl:"/pages/user/tongue/index"
+						 },
+						 {
+							img: "../../static/image/home1/icon/yssl_icon.png",
+							name: "药膳食疗",
+							pageUrl:"/pages/article/medicatedFoodList"
+						},
+						{
+							img: "../../static/image/home1/icon/jlxw_icon.png",
+							name: "经络穴位",
+							pageUrl:"/pages/article/vesselList"
+						}, {
+							img: "../../static/image/home1/icon/wdzq_icon.png",
+							name: "问答专区",
+							pageUrl:"/pages/article/questionsList"
+						}, {
+							img: "../../static/image/home1/icon/jb_icon.png",
+							name: "疾病",
+							pageUrl:"/pages/article/diseaseList"
+						}, {
+							img: "../../static/image/home1/icon/zytj_icon.png",
+							name: "中药图解",
+							pageUrl:"/pages/article/chineseMedicineList"
+						},
+						{
+							img: "../../static/image/home1/icon/mfjy_icon.png",
+							name: "名方今用",
+							pageUrl:"/pages/article/famousPrescribeList"
+						}, {
+							img: "../../static/image/home1/icon/yssp_icon.png",
+							name: "养生讲堂",
+							pageUrl:"/pages/doctor/doctorArticleList"
+						}
+						// , {
+						// 	img:"../../static/image/home1/icon/ys_icon.png",
+						// 	name: "医书",
+						// 	pageUrl:"/pages/doctor/doctorArticleList"
+						// }
+				 ],
+			     step: {
+						name: 'indexguide',
+						guideList: [{
+							el: '',
+							tips: '上下滑动,了解国健通',
+							next: '',
+						},{
+							el: '#indexguide1',
+							tips: '药膳、经络、疾病医学百科知识快速查询',
+							next: '下一步',
+						},{
+							el: '#indexguide2',
+							tips: '权威医生、药师实时在线咨询',
+							next: '下一步',
+						},{
+							el: '#indexguide3',
+							tips: '免费健康自测,了解自身健康情况',
+							next: '下一步',
+						},{
+							el: '#indexguide4',
+							childEl: ".indexguide4-child",
+							tips: '购买健康疗法享健康',
+							next: '完成',
+						}]
+			     },
+			     guideIndex:null,	
+			     myGuide:null,
+			
+			}
+		},
+		onShow() {
+			this.getAdvList();
+			this.getAppAdvList();
+			this.getDoctorList();
+			this.getPackageList(1);
+		},
+		onLoad() {
+			 // #ifdef APP-PLUS
+			   if(plus.runtime.isAgreePrivacy()) {
+					// 用户同意隐私政策,可以调用限制API
+					//this.doGetLocation();
+					//uni.showToast({icon:'none',title: "已同意隐私政策"});
+					this.registerIdCode();
+					
+			   }else{
+			        //uni.showToast({icon:'none',title: "未同意隐私政策"});
+			   }
+			// #endif
+			
+			let that=this;
+			uni.setNavigationBarTitle({
+				title: that.$qconfig.appName
+			});
+			this.guideIndex=uni.getStorageSync("indexguide");
+			this.myGuide=this.$refs["myGuide"];
+			if(this.$isLogin()){
+				this.getUserSign();
+			}else{
+				let signStr="[{\"signNum\":10,\"sort\":1,\"day\":\"第1天\"},{\"signNum\":20,\"sort\":2,\"day\":\"第2天\"},{\"signNum\":30,\"sort\":3,\"day\":\"第3天\"},{\"signNum\":40,\"sort\":4,\"day\":\"第4天\"},{\"signNum\":50,\"sort\":5,\"day\":\"第5天\"},{\"signNum\":50,\"sort\":6,\"day\":\"第6天\"},{\"signNum\":50,\"sort\":7,\"day\":\"第7天\"}]";
+				this.$nextTick(()=>{
+					this.userSign={"signNum":0,"isDaySign":0,"integral":0,"sign":JSON.parse(signStr)  };
+					if(this.guideIndex){
+						this.$refs.signPop.open();
+					}
+				});
+			}
+		},
+		onPageScroll(e) {
+			this.top=e.scrollTop;
+		},
+		computed: {
+			// 计算属性的 getter
+			headerBG:function() {
+				var top=this.top/88;
+				return 'rgba(255,92,3, ' + top + ')';
+			},
+		},
+		methods: {
+			getAdvList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					advType:1
+				};
+				getAdvList(data).then(res => {
+					if(res.code==200){
+						that.advImgs=[];
+						that.advs=[];
+						res.data.forEach(function(element) {
+							if(element.imageUrl!=null&&element.imageUrl!=""){
+								that.advs.push(element);
+								that.advImgs.push(element.imageUrl);
+							}
+						});
+						
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getAppAdvList() {
+				getAppAdvList().then(res => {
+					if(res.code==200){
+						this.midAdvs=res.data;
+						
+					}else{
+						uni.showToast({icon:'none',title: "请求失败"});
+					}
+				});
+			},
+			getDoctorList() {
+				//联网加载数据
+				var that = this;
+				var data = {
+					isTui:1,
+					pageNum:1,
+					pageSize:10,
+				};
+				getDoctorList(data).then(res => {
+					if(res.code==200){
+						this.doctors=res.data.list;
+						this.doctors.forEach(function(value,index,array){
+							value.prices=JSON.parse(value.priceJson)
+						});
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败",
+						});
+					}
+				});
+			},
+			getPackageList(pageNum){
+				//联网加载数据
+				var that = this;
+				var data = {
+					isShow:1,
+					pageNum:pageNum,
+					pageSize:10
+				};
+				getPackageList(data).then(res => {
+					if(res.code==200){
+						this.packages=res.data.list;
+					}else{
+						uni.showToast({
+							icon:'none',
+							title: "请求失败"
+						});
+					}
+				});
+			},
+			getUserSign(){
+				getUserSign().then(res => {
+						if(res.code==200){
+							this.userSign={"signNum":res.signNum,"isDaySign":res.isDaySign,"integral":res.integral,"sign":JSON.parse(res.sign)};
+						    this.$nextTick(()=>{
+								if(this.guideIndex && !res.isDaySign){
+									this.$refs.signPop.open();
+								}
+						    });
+						}else{
+							
+						}
+					},
+					rej => {}
+				);
+			},
+			midAvTap(item,index){
+				if(index==0){
+					this.navToMinProgram();
+					return;
+				}
+				if(!this.$isEmpty(item.advUrl)){
+					this.navTo(item.advUrl);
+				}
+			},
+			// 页面跳转
+			navTo(url) {
+				uni.navigateTo({
+					url: url
+				})
+			},
+			loginNavTo(url){
+				if(!this.$isLogin()){
+					this.$showLoginPage();
+					return;
+				}
+				uni.navigateTo({
+					url: url
+				});
+			},
+			navVideo(){
+				console.log("navVideo");
+				uni.navigateTo({
+					url: "/pages/course/video/living-app"
+				});
+			},
+		    showQidai(){
+				//uni.showToast({title: "功能完善中,敬请期待...",icon:"none"});
+			},
+			handleAdvClick(index){
+				var ad=this.advs[index];
+				console.log(ad.appAdvUrl);
+				if(ad.showType==1){
+					uni.setStorageSync('url',ad.appAdvUrl);
+					uni.navigateTo({
+						url:"h5"
+					})
+				}
+				else if(ad.showType==3){
+					 uni.setStorageSync('content',ad.content);
+					 uni.navigateTo({
+					 	url:"content"
+					 })
+				}
+				else{
+					uni.navigateTo({
+						url:ad.appAdvUrl
+					})
+				}
+			},
+			async getLocation() {
+				   let status;
+			    // #ifdef APP-PLUS
+					status = await this.checkPermission();
+					if (status !== 1) {
+						return;
+					}
+			    // #endif
+			    // #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ
+				    status = await this.getSetting();
+					if (status === 2) {
+						this.showConfirm();
+						return;
+					}
+			    // #endif
+			    this.doGetLocation();
+			},
+			search() {
+			
+			},
+			doGetLocation() {
+				getLocation().then(res => {
+					this.locCity  =  res.city.replace(/市|区/g,  '');
+				});		
+			},
+			getSetting: function() {
+			    return new Promise((resolve, reject) => {
+			        uni.getSetting({
+			            success: (res) => {
+			                if (res.authSetting['scope.userLocation'] === undefined) {
+			                    resolve(0);
+			                    return;
+			                }
+			                if (res.authSetting['scope.userLocation']) {
+			                    resolve(1);
+			                } else {
+			                    resolve(2);
+			                }
+			            }
+			        });
+			    });
+			},
+			openSetting: function() {
+			    this.hideConfirm();
+			    uni.openSetting({
+			        success: (res) => {
+			            if (res.authSetting && res.authSetting['scope.userLocation']) {
+			                this.doGetLocation();
+			            }
+			        },
+			        fail: (err) => {}
+			    })
+			},
+			async checkPermission() {
+			    let status = permision1.isIOS ? await permision1.requestIOS('location') :
+			        await permision1.requestAndroid('android.permission.ACCESS_FINE_LOCATION');
+			    if (status === null || status === 1) {
+			        status = 1;
+			    } else if (status === 2) {
+			        uni.showModal({
+			            content: "系统定位已关闭",
+			            confirmText: "确定",
+			            showCancel: false,
+			            success: function(res) {
+			            }
+			        })
+			    } else if (status.code) {
+			        uni.showModal({
+			            content: status.message
+			        })
+			    } else {
+			        uni.showModal({
+			            content: "需要定位权限",
+			            confirmText: "设置",
+			            success: function(res) {
+			                if (res.confirm) {
+			                    permision1.gotoAppSetting();
+			                }
+			            }
+			        })
+			    }
+			    return status;
+			},
+			clear: function() {
+			    //this.hasLocation = false
+			},
+			goToMsg(){
+				 
+				 // #ifdef APP-PLUS
+				       this.getIdCodes();
+				 	   this.getOAID();
+					   let devinfo=uni.getDeviceInfo();
+					   console.log("qxj devInfo:"+JSON.stringify(devinfo));
+				  //#endif  
+				 
+				 return;
+				  uni.switchTab({
+					  url: '/pages/TUIKit/TUIPages/TUIConversation/index' 
+				  });
+			},
+			topNavTo(url,index){
+				if(index==0){
+					//this.navTo(url);
+					this.loginNavTo(url);
+				}else{
+					this.navTo(url);
+				}
+			},
+			navToMinProgram(){
+				 plus.share.getServices(res => {
+				      let sweixin = null;
+				      sweixin = res.find(i => i.id === 'weixin')
+				      if (sweixin) {
+				         // 分享跳转到微信小程序
+						 sweixin.launchMiniProgram({
+								 id: "gh_ed2db1ca5891",//零利润药房小程序原生id
+								 path:"pages/common/launch", //    打开小程序的页面路径,不传默认跳转首页
+								 type: 0 //     微信小程序版本类型,可取值: 0-正式版; 1-测试版; 2-体验版。 默认值为0。
+						  });
+				      } 
+					  else {
+				          uni.showToast({title: '请安装微信',icon: 'none'})
+				      }
+				   }, err => {
+				      console.log("分享失败"); // 获取分享服务列表失败
+				   });
+
+			},
+			registerIdCode() { //注册,先注册再获取,注意APP合规性,若最终用户未同意隐私政策则不要调用
+				idCode.register(res => {
+					console.log(res);
+						
+				});
+			},
+			getIdCodes() { //获取设备的各种标识码
+				idCode.getIdCodes(res => {
+					if (res.data) {
+						//this.msgList.unshift(JSON.stringify(res.data));
+						let ua=plus.navigator.getUserAgent();
+						console.log("qxj ua:"+ua);
+						console.log("qxj getIdCodes:"+JSON.stringify(res.data));
+					}
+					
+				});
+			 },
+			 getOAID() { //异步获取 OAID
+				idCode.getOAID(res => {
+					if (res.data) {
+						//this.msgList.unshift(JSON.stringify(res.data));
+						console.log("qxj getOAID:"+JSON.stringify(res.data));
+					}
+					
+				});
+			},
+			
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	
+	.bg-img{
+	    position: fixed;
+	    width: 100%;
+		height: 524rpx;
+	    top: 0;
+	    left: 0;
+	 	right: 0;
+		bottom: 0;
+		z-index: 0;
+	}
+	
+	.bgConent{
+		background-image: url("@/static/image/home1/home_top_bg.png");
+		background-repeat: no-repeat;
+		background-size: 100%;
+		background-color: #F4F7FA;
+		position: absolute;
+		width: 100%;
+		height: 524rpx;
+		top: 0;
+		left: 0;
+		right: 0;
+	    bottom: 0;
+		z-index: 0;
+	}
+	
+	.grace-page-header {
+		position: fixed;
+		width: 100%;
+		left: 0;
+		top: 0;
+		z-index: 98;
+		border-bottom: 0px solid #FFFFFF;
+		.grace-page-status-bar {
+			width: 100%;
+			height: var(--status-bar-height);
+		}
+		.grace-page-header-nav {
+			width: 100%;
+			display: flex;
+			flex-direction: row;
+			flex-wrap: nowrap;
+			align-items: center;
+			justify-content: space-between;
+		}
+	}
+	
+	.nav_box{
+		width: 100%;
+		.status_bar {
+			height: var(--status-bar-height);
+			width: 100%;
+		}
+		.nav_bar {
+			height: 44px;
+			width: 100%;
+		}
+	}
+	
+	.title {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #222222;
+		line-height: 44rpx;
+	}
+
+	.content {
+		width: 100%;
+		box-sizing: border-box;
+		// overflow: hidden;
+		// margin-top: var(--status-bar-height);
+		// padding-top: 24rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #999999;
+		// background-image: url("@/static/image/home1/home_top_bg.png");
+		background-repeat: no-repeat;
+		background-size: 100%;
+		
+		// box-sizing: border-box;
+		// padding-top: calc(var(--status-bar-height) + 24rpx);
+		// padding-bottom: var(--window-bottom);
+		// font-family: PingFang SC, PingFang SC;
+		// font-weight: 400;
+		// font-size: 24rpx;
+		// color: #999999;
+		position: relative;
+		z-index: 2;
+	}
+	
+	.content-header {
+		height: 80rpx;
+		padding: 0 24rpx;
+		@include u-flex(row, center, space-between);
+		&-l {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 26rpx;
+			color: #FFFFFF;
+			line-height: 28rpx;
+			@include u-flex(row, center, flex-start);
+			.address {
+				width: 38rpx;
+				height: 38rpx;
+				margin-right: 6rpx;
+			}
+			.arrow_down {
+				width: 24rpx;
+				height: 24rpx;
+				margin-left: 8rpx;
+			}
+		}
+		&-r {
+			@include u-flex(row, center, flex-start);
+			view {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 22rpx;
+				color: #FFFFFF;
+				line-height: 24rpx;
+				@include u-flex(column, center, space-between);
+				width: 80rpx;
+				height: 80rpx;
+				padding-top:2rpx;
+				padding-bottom: 6rpx;
+				
+			}
+			image {
+				width: 40rpx;
+				height: 40rpx;
+			}
+		}
+	}
+	
+	.search-box {
+			width: calc(100% - 60rpx);
+			height: 70rpx;
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			justify-content: space-between;
+			background: rgba(255, 255, 255, 0.3);
+			border-radius: 34rpx;
+			border: 2rpx solid #FFFFFF;
+			border-right: none;
+			margin:30rpx;
+			margin-top: 10rpx;
+			margin-bottom: 10rpx;	        
+			padding-left: 30rpx;
+			position: relative;
+			z-index: 10;
+			.left{
+				display: flex;
+				flex-direction: row;
+				align-items: center;
+				justify-content: flex-start;
+				flex: 1;
+			}
+			image{
+				width: 28upx;
+				height: 28upx;
+				margin-right: 16upx;
+			}
+			.input-text{
+				color: #fff;
+				font-size: 24rpx;
+				height: 70rpx;
+				line-height:70rpx ;
+				width: 100%;
+			}
+			.button{
+				background: #FF5C03;
+				border-radius: 29rpx;
+				width: 108rpx;
+				height: 54rpx;
+				line-height: 54rpx;
+				color: #fff;
+				font-size: 26rpx;
+				margin-right: 10rpx;
+			}
+	}
+	
+	
+	::v-deep .uni-searchbar__text-placeholder, .uni-input-placeholder{
+		color: #fff;
+		font-weight: 400;
+		font-size: 24rpx;
+	}
+	
+	.place-hold{
+		color: #ffffff;
+		font-weight: 400;
+		font-size: 24rpx;
+	}
+	  
+
+	.search-box1 {
+		height: 68rpx;
+		margin: 26rpx 24rpx 10rpx 24rpx;
+		background: rgba(255, 255, 255, 0.3);
+		border-radius: 34rpx;
+		border: 2rpx solid #FFFFFF;
+		border-right: none;
+		background-color: blue;
+		overflow: hidden;
+		@include u-flex(row, center, space-between); 
+		.search {
+			flex: 1;
+			padding: 0 0 0 12rpx;
+			background-color: transparent;
+			font-weight: 400;
+			font-size: 24rpx;
+		}
+		image {
+			width: 24rpx;
+			height: 24rpx;
+		}
+		::v-deep .uni-searchbar__text-placeholder, .uni-input-placeholder{
+			color: #fff;
+			font-weight: 400;
+			font-size: 24rpx;
+		}
+		.search-text {
+			flex-shrink: 0;
+			width: 144rpx;
+			height: 68rpx;
+			background: #FFFFFF;
+			border-radius: 34rpx 34rpx 34rpx 34rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 24rpx;
+			color: #FF5C03;
+			line-height: 68rpx;
+			text-align: center;
+		}
+	}
+	
+
+	.swiper-box {
+		padding: 22rpx 0;
+		padding-bottom: 0;
+		.swiper {
+			width: 702rpx;
+			height: 228rpx;
+			margin: 0 auto;
+			background: #E75848;
+			border-radius: 20rpx;
+			.swiper-item {
+				width: 702rpx;
+				height: 228rpx;
+				image{
+					border-radius: 20rpx;
+				}
+			}
+		}
+		::v-deep {
+			.uni-swiper-dot {
+				width: 10rpx;
+				height: 10rpx;
+				background: rgba(255,255,255,0.5);
+			}
+			.uni-swiper-dot-active {
+				width: 24rpx;
+				height: 10rpx;
+				background-color: #FFFFFF;
+				border-radius: 5rpx 5rpx 5rpx 5rpx;
+			}
+		}
+	}
+
+	.nav {
+		background: #FFFFFF;
+		border-radius: 20rpx 20rpx 20rpx 20rpx;
+		padding-top: 24rpx;
+		margin: 24rpx 24rpx 0 24rpx;
+		position: relative;
+		z-index: 2;
+		@include u-flex(row, center, flex-start);
+		flex-wrap: wrap;
+		.grid-item {
+			width: 25%;
+		}
+		.grid-item-box {
+			@include u-flex(column, center, flex-start);
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #222222;
+			line-height: 28rpx;
+			margin-bottom: 24rpx;
+			.image {
+				height: 104rpx;
+				width: 104rpx;
+			}
+			.image1 {
+				height: 85rpx;
+				width: 85rpx;
+				margin-top: 6rpx;
+				margin-bottom: 12rpx;
+			}
+		}
+	}
+
+	.scroll-X {
+		white-space: nowrap;
+		width: 100%;
+		padding-left: 24rpx;
+		box-sizing: border-box;
+		margin-top: 24rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #757575;
+		line-height: 28rpx;
+		.scroll-item {
+			display: inline-block;
+			width: 216rpx;
+			height: 132rpx;
+			padding: 20rpx 24rpx 20rpx 20rpx;
+			box-sizing: border-box;
+			margin-right: 16rpx;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			border: 2rpx solid #FFFFFF;
+			position: relative;
+			.bg_img{
+				position: absolute;
+				width: calc(100% - 2rpx);
+				height: 132rpx;
+				left:0;
+				right: 0;
+				top:0;
+				bottom:0;
+				z-index: 0;
+			}			
+			&-title {
+				margin-bottom: 6rpx;
+			}
+			&-desc {
+				width: 100%;
+				@include u-flex(row, center, space-between)
+			}
+			.arrow_icon {
+				height: 24rpx;
+				width: 24rpx;
+			}
+		}
+
+		.zyss_bg {
+			background: url("@/static/image/home1/index_zyss_bg.png") no-repeat right top / 132rpx 132rpx,linear-gradient( 270deg, #FFF9F8 0%, #FFF3EF 100%);
+		}
+		.gjmz_bg {
+			background: url("@/static/image/home1/index_gjmz_bg.png") no-repeat right top / 132rpx 132rpx,linear-gradient( 270deg, #FFFCF3 0%, #FFF9E8 100%);
+		}
+		.pfgl_bg {
+			background: url("@/static/image/home1/index_pfgl_bg.png") no-repeat right top / 132rpx 132rpx,linear-gradient( 270deg, #F0F7FF 0%, #E0EEFF 100%);
+		}
+		.zytl_bg {
+			background: url("@/static/image/home1/index_zytl_bg.png") no-repeat right top / 132rpx 132rpx,linear-gradient( 270deg, #EFFAF9 0%, #E7FFFD 100%);
+		}
+	}
+
+	.banner-nav {
+		padding: 20rpx 24rpx;
+		display: flex;
+		flex-wrap: wrap;
+		margin-right: -16rpx;
+		margin-bottom: -16rpx;
+		&-item {
+			width: 343rpx;
+			height: 200rpx;
+			box-sizing: border-box;
+			background: #fff;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			padding: 26rpx 0 0 24rpx;
+			margin-right: 16rpx;
+			margin-bottom: 16rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #757575;
+			line-height: 32rpx;
+			background-repeat: no-repeat;
+			background-size: 208rpx 148rpx;
+			background-position: right bottom;
+			.kswz {
+				color: #4FA59C;
+			}
+			.jkhz {
+				color: #FF5C03;
+			}
+			.yyzx {
+				color: #E69A22;
+			}
+			.zjyz {
+				color: #3A76D0;
+			}
+		}
+
+		.kswz-bg {
+			background-image: url("@/static/image/home1/index_kswz_bg.png");
+		}
+		.jkhz-bg {
+			background-image: url("@/static/image/home1/index_jkhz_bg.png");
+		}
+		.yyzx-bg {
+			background-image: url("@/static/image/home1/index_yyzx_bg.png");
+		}
+		.zjyz-bg {
+			background-image: url("@/static/image/home1/index_zjyz_bg.png");
+		}
+	}
+	.box-nav {
+		width: 100%;
+		padding: 16rpx 24rpx;
+		box-sizing: border-box;
+		display: flex;
+		justify-content: space-between;
+
+		&-right {
+			@include u-flex(row, center, flex-start);
+		}
+
+		.right-arrow {
+			height: 48rpx;
+			width: 48rpx;
+		}
+	}
+	
+	.selfrated-health {
+		@include u-flex(row, center, space-around);
+		padding: 34rpx 0;
+		background-color: #fff;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		margin: 0 24rpx 20rpx 24rpx;
+		&-item {
+			width: 144rpx;
+			height: 144rpx;
+			@include u-flex(column, center, center); 
+			flex-wrap: wrap;
+			image {
+				width: 72rpx;
+				height: 72rpx;
+				margin-bottom: 28rpx;
+			}
+		}
+	}
+	
+	
+	.scroll-container {
+	   white-space: nowrap; /* 确保子元素不换行 */
+	   display: flex; /* 使用flex布局 */
+	   padding-left: 24rpx;
+	}
+	
+	.box-goods {
+		@include u-flex(row, center, flex-start);
+		flex-wrap: wrap;
+		margin-right: -18rpx;
+		margin-bottom: -18rpx;
+		padding: 8rpx 24rpx 20rpx 24rpx;
+	}
+
+	.box-doctor {
+		@include u-flex(row, center, flex-start);
+		flex-wrap: wrap;
+		margin-right: -18rpx;
+		margin-bottom: -18rpx;
+		padding: 8rpx 24rpx 20rpx 0rpx;
+		display: inline-flex; /* 确保子元素水平排列 */
+	}
+	
+
+	
+	.gapitem {
+		margin: 0 18rpx 18rpx 0;
+		
+	}
+</style>
+

+ 389 - 0
pages/index/smdtManager/smdtManager.js

@@ -0,0 +1,389 @@
+// SMDT设备管理插件 JavaScript 使用示例
+
+// 获取插件实例
+const smdtManager = uni.requireNativePlugin('SmdtManager');
+
+// 检查插件是否加载成功
+if (!smdtManager) {
+  console.error('SMDT Manager插件加载失败');
+}
+
+// 插件初始化检查和重试机制
+export const PluginManager = {
+  // 检查插件是否已初始化
+  async checkInitialization() {
+    return new Promise((resolve) => {
+	  console.log("qxj smdtManager",smdtManager);
+      smdtManager.isInitialized((res) => {
+		console.log("qxj isInitialized",res);
+        resolve(res.initialized || false);
+      });
+    });
+  },
+
+  // 重新初始化插件
+  async initialize() {
+    return new Promise((resolve, reject) => {
+      smdtManager.initialize((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res);
+        }
+      });
+    });
+  },
+
+  // 确保插件已初始化(带重试机制)
+  async ensureInitialized(maxRetries = 3) {
+    for (let i = 0; i < maxRetries; i++) {
+      const isInitialized = await this.checkInitialization();
+      if (isInitialized) {
+        return true;
+      }
+      
+      console.log(`插件未初始化,尝试重新初始化 (${i + 1}/${maxRetries})`);
+      try {
+        await this.reinitialize();
+        // 等待一段时间后再检查
+        await new Promise(resolve => setTimeout(resolve, 500));
+      } catch (error) {
+        console.error(`重新初始化失败:`, error);
+        if (i === maxRetries - 1) {
+          throw new Error('插件初始化失败,请检查设备兼容性');
+        }
+      }
+    }
+    return false;
+  }
+};
+
+// 系统功能示例
+export const SystemAPI = {
+  // 获取系统字体大小
+  async getSystemFontSize() {
+    try {
+      // 确保插件已初始化
+      await PluginManager.ensureInitialized();
+      
+      return new Promise((resolve, reject) => {
+        smdtManager.getSystemFontSize((res) => {
+          if (res.error) {
+            reject(res.error);
+          } else {
+            resolve(res.fontSize);
+          }
+        });
+      });
+    } catch (error) {
+      throw new Error(`获取系统字体大小失败: ${error.message}`);
+    }
+  },
+
+  // 设置系统字体大小
+  setSystemFontSize(fontSize) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setSystemFontSize({ fontSize }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  },
+
+  // 获取时间格式
+  getTimeFormat() {
+    return new Promise((resolve, reject) => {
+      smdtManager.getTimeFormat((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.timeFormat);
+        }
+      });
+    });
+  },
+
+  // 设置时间格式 (1: 24小时制, 0: 12小时制)
+  setTimeFormat(timeFormat) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setTimeFormat({ timeFormat }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  },
+
+  // 设置音量 (0-100)
+  setVolume(volume) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setVolume({ volume }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  },
+
+  // 设置ADB调试
+  setAdbDebug(enable) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setAdbDebug({ enable }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  }
+};
+
+// 网络功能示例
+export const NetworkAPI = {
+  // 获取WiFi信号强度
+  getWifiRssi() {
+    return new Promise((resolve, reject) => {
+      smdtManager.getWifiRssi((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.rssi);
+        }
+      });
+    });
+  },
+
+  // 获取MAC地址
+  getMacAddress() {
+    return new Promise((resolve, reject) => {
+      smdtManager.getMacAddress((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.macAddress);
+        }
+      });
+    });
+  },
+
+  // 获取IMEI号
+  getImeiNumber() {
+    return new Promise((resolve, reject) => {
+      smdtManager.getImeiNumber((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.imei);
+        }
+      });
+    });
+  },
+
+  // 设置WiFi热点
+  setWifiAp(ssid, password) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setWifiAp({ ssid, password }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  }
+};
+
+// 显示功能示例
+export const DisplayAPI = {
+  // 设置LCD背光亮度 (0-255)
+  setLcdBackLight(brightness) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setLcdBackLight({ brightness }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  },
+
+  // 设置显示密度
+  setDisplayDensity(density) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setDisplayDensity({ density }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  }
+};
+
+// 硬件功能示例
+export const HardwareAPI = {
+  // 设置LED灯状态
+  setLedLighted(ledId, enable) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setLedLighted({ ledId, enable }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  },
+
+  // 获取LED状态
+  getLedState(ledId) {
+    return new Promise((resolve, reject) => {
+      smdtManager.getLedState({ ledId }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.state);
+        }
+      });
+    });
+  },
+
+  // 获取SD卡路径
+  getSDcardPath() {
+    return new Promise((resolve, reject) => {
+      smdtManager.getSDcardPath((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.path);
+        }
+      });
+    });
+  },
+
+  // 获取U盘路径
+  getUdiskPath() {
+    return new Promise((resolve, reject) => {
+      smdtManager.getUdiskPath((res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.path);
+        }
+      });
+    });
+  },
+
+  // 设置USB电源
+  setUsbPower(enable) {
+    return new Promise((resolve, reject) => {
+      smdtManager.setUsbPower({ enable }, (res) => {
+        if (res.error) {
+          reject(res.error);
+        } else {
+          resolve(res.result);
+        }
+      });
+    });
+  }
+};
+
+// 使用示例
+export const UsageExamples = {
+  // 系统设置示例
+  async systemExample() {
+    try {
+      // 获取当前字体大小
+      const fontSize = await SystemAPI.getSystemFontSize();
+      console.log('当前字体大小:', fontSize);
+
+      // 设置字体大小
+      const result = await SystemAPI.setSystemFontSize(18);
+      console.log('设置字体大小结果:', result);
+
+      // 设置为24小时制
+      await SystemAPI.setTimeFormat(1);
+      console.log('时间格式设置为24小时制');
+
+      // 设置音量为50%
+      await SystemAPI.setVolume(50);
+      console.log('音量设置为50%');
+
+    } catch (error) {
+      console.error('系统设置错误:', error);
+    }
+  },
+
+  // 网络功能示例
+  async networkExample() {
+    try {
+      // 获取WiFi信号强度
+      const rssi = await NetworkAPI.getWifiRssi();
+      console.log('WiFi信号强度:', rssi, 'dBm');
+
+      // 获取MAC地址
+      const macAddress = await NetworkAPI.getMacAddress();
+      console.log('MAC地址:', macAddress);
+
+      // 设置WiFi热点
+      await NetworkAPI.setWifiAp('MyHotspot', '12345678');
+      console.log('WiFi热点设置成功');
+
+    } catch (error) {
+      console.error('网络功能错误:', error);
+    }
+  },
+
+  // 显示控制示例
+  async displayExample() {
+    try {
+      // 设置屏幕亮度为50%
+      await DisplayAPI.setLcdBackLight(128);
+      console.log('屏幕亮度设置为50%');
+
+      // 设置显示密度
+      await DisplayAPI.setDisplayDensity(320);
+      console.log('显示密度设置为320 DPI');
+
+    } catch (error) {
+      console.error('显示控制错误:', error);
+    }
+  },
+
+  // 硬件控制示例
+  async hardwareExample() {
+    try {
+      // 打开LED灯
+      await HardwareAPI.setLedLighted(1, true);
+      console.log('LED灯已打开');
+
+      // 获取LED状态
+      const ledState = await HardwareAPI.getLedState(1);
+      console.log('LED状态:', ledState ? '开启' : '关闭');
+
+      // 获取存储路径
+      const sdPath = await HardwareAPI.getSDcardPath();
+      console.log('SD卡路径:', sdPath);
+
+      // 启用USB电源
+      await HardwareAPI.setUsbPower(true);
+      console.log('USB电源已启用');
+
+    } catch (error) {
+      console.error('硬件控制错误:', error);
+    }
+  }
+};
+
+// 导出插件实例供直接使用
+export default smdtManager;

+ 505 - 0
pages/index/smdtManager/smdtManager.vue

@@ -0,0 +1,505 @@
+<template>
+  <view class="container">
+    <view class="header">
+      <text class="title">SMDT设备管理插件示例</text>
+      <view class="status-indicator">
+        <text class="status-text" :class="{ 'status-ready': isPluginReady, 'status-error': !isPluginReady }">
+          {{ isPluginReady ? '✅ 插件已就绪' : '❌ 插件未就绪' }}
+        </text>
+      </view>
+    </view>
+    
+    <!-- 系统功能 -->
+    <view class="section">
+      <text class="section-title">系统功能</text>
+      
+      <view class="button-group">
+        <button @click="getSystemFontSize" class="btn">获取系统字体大小</button>
+        <button @click="setSystemFontSize" class="btn">设置系统字体大小</button>
+        <button @click="getTimeFormat" class="btn">获取时间格式</button>
+        <button @click="setTimeFormat" class="btn">设置时间格式</button>
+        <button @click="setVolume" class="btn">设置音量</button>
+        <button @click="setAdbDebug" class="btn">设置ADB调试</button>
+      </view>
+    </view>
+    
+    <!-- 网络功能 -->
+    <view class="section">
+      <text class="section-title">网络功能</text>
+      
+      <view class="button-group">
+        <button @click="getWifiRssi" class="btn">获取WiFi信号强度</button>
+        <button @click="getMacAddress" class="btn">获取MAC地址</button>
+        <button @click="getImeiNumber" class="btn">获取IMEI号</button>
+        <button @click="setWifiAp" class="btn">设置WiFi热点</button>
+      </view>
+    </view>
+    
+    <!-- 显示功能 -->
+    <view class="section">
+      <text class="section-title">显示功能</text>
+      
+      <view class="button-group">
+        <button @click="setLcdBackLight" class="btn">设置屏幕亮度</button>
+        <button @click="setDisplayDensity" class="btn">设置显示密度</button>
+      </view>
+    </view>
+    
+    <!-- 硬件功能 -->
+    <view class="section">
+      <text class="section-title">硬件功能</text>
+      
+      <view class="button-group">
+        <button @click="setLedLighted" class="btn">控制LED灯</button>
+        <button @click="getLedState" class="btn">获取LED状态</button>
+        <button @click="getSDcardPath" class="btn">获取SD卡路径</button>
+        <button @click="getUdiskPath" class="btn">获取U盘路径</button>
+        <button @click="setUsbPower" class="btn">控制USB电源</button>
+      </view>
+    </view>
+    
+    <!-- 结果显示 -->
+    <view class="result-section">
+      <text class="result-title">操作结果:</text>
+      <text class="result-text">{{ result }}</text>
+    </view>
+  </view>
+</template>
+
+<script>
+// 导入插件管理器和API
+import { PluginManager, SystemAPI, NetworkAPI, DisplayAPI, HardwareAPI } from './smdtManager.js';
+
+export default {
+  data() {
+    return {
+       result: '等待操作...',
+       isPluginReady: false,
+	   smdtManager:null
+    }
+  },
+  
+  async onLoad() {
+    this.result = '正在初始化插件...';
+    try {
+		
+			this.smdtManager = uni.requireNativePlugin('SmdtManager');
+			this.smdtManager.initialize((res) => {
+				  if(res.success){
+					  this.isPluginReady = true;
+					  this.result = '插件初始化成功,可以开始使用功能';
+					  uni.showToast({
+						title: '插件初始化成功',
+						icon: 'success'
+					  });
+				  }
+			});	
+			
+	         // await PluginManager.initialize();
+	         // this.isPluginReady = true;
+	         // this.result = '插件初始化成功,可以开始使用功能';
+	  
+    } catch (error) {
+		  this.isPluginReady = false;
+		  this.result = `插件初始化失败: ${error.message}`;
+		  // 显示用户友好的错误提示
+		  uni.showModal({
+			 title: '插件初始化失败',
+			 content: '设备功能暂不可用,请检查设备兼容性或联系技术支持',
+			 showCancel: false
+		  });
+    }
+  },
+  
+  methods: {
+    // 通用错误处理方法
+    handleError(error, operation) {
+      console.error(`${operation}失败:`, error);
+      this.result = `${operation}失败: ${error.message}`;
+      
+      if (error.message.includes('初始化失败')) {
+        uni.showModal({
+          title: '设备兼容性问题',
+          content: '当前设备可能不支持此功能,请联系技术支持',
+          showCancel: false
+        });
+      }
+    },
+
+    // 系统功能方法
+    async getSystemFontSize() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const fontSize = await SystemAPI.getSystemFontSize();
+        this.result = `系统字体大小: ${fontSize}`;
+      } catch (error) {
+        this.handleError(error, '获取系统字体大小');
+      }
+    },
+    
+    async setSystemFontSize() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await SystemAPI.setSystemFontSize(1.2);
+        this.result = `设置字体大小结果: ${result}`;
+        uni.showToast({
+          title: '字体大小设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置系统字体大小');
+      }
+    },
+    
+    async getTimeFormat() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const timeFormat = await SystemAPI.getTimeFormat();
+        this.result = `时间格式: ${timeFormat === 1 ? '24小时制' : '12小时制'}`;
+      } catch (error) {
+        this.handleError(error, '获取时间格式');
+      }
+    },
+    
+    async setTimeFormat() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await SystemAPI.setTimeFormat(1); // 1为24小时制,0为12小时制
+        this.result = `设置时间格式结果: ${result}`;
+        uni.showToast({
+          title: '时间格式设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置时间格式');
+      }
+    },
+    
+    async setVolume() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await SystemAPI.setVolume(50); // 音量范围通常是0-100
+        this.result = `设置音量结果: ${result}`;
+        uni.showToast({
+          title: '音量设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置音量');
+      }
+    },
+    
+    async setAdbDebug() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await SystemAPI.setAdbDebug(true);
+        this.result = `设置ADB调试结果: ${result}`;
+        uni.showToast({
+          title: 'ADB调试设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置ADB调试');
+      }
+    },
+    
+    // 网络功能方法
+    async getWifiRssi() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const rssi = await NetworkAPI.getWifiRssi();
+        this.result = `WiFi信号强度: ${rssi} dBm`;
+      } catch (error) {
+        this.handleError(error, '获取WiFi信号强度');
+      }
+    },
+    
+    async getMacAddress() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const macAddress = await NetworkAPI.getMacAddress();
+        this.result = `MAC地址: ${macAddress}`;
+      } catch (error) {
+        this.handleError(error, '获取MAC地址');
+      }
+    },
+    
+    async getImeiNumber() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const imei = await NetworkAPI.getImeiNumber();
+        this.result = `IMEI号: ${imei}`;
+      } catch (error) {
+        this.handleError(error, '获取IMEI号');
+      }
+    },
+    
+    async setWifiAp() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await NetworkAPI.setWifiAp('SMDT_AP', '12345678');
+        this.result = `设置WiFi热点结果: ${result}`;
+        uni.showToast({
+          title: 'WiFi热点设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置WiFi热点');
+      }
+    },
+    
+    // 显示功能方法
+    async setLcdBackLight() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await DisplayAPI.setLcdBackLight(128); // 亮度范围通常是0-255
+        this.result = `设置屏幕亮度结果: ${result}`;
+        uni.showToast({
+          title: '屏幕亮度设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置屏幕亮度');
+      }
+    },
+    
+    async setDisplayDensity() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await DisplayAPI.setDisplayDensity(320); // DPI值
+        this.result = `设置显示密度结果: ${result}`;
+        uni.showToast({
+          title: '显示密度设置成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '设置显示密度');
+      }
+    },
+    
+    // 硬件功能方法
+    async setLedLighted() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await HardwareAPI.setLedLighted(1, true);
+        this.result = `控制LED灯结果: ${result}`;
+        uni.showToast({
+          title: 'LED灯控制成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '控制LED灯');
+      }
+    },
+    
+    async getLedState() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const state = await HardwareAPI.getLedState(1);
+        this.result = `LED状态: ${state ? '开启' : '关闭'}`;
+      } catch (error) {
+        this.handleError(error, '获取LED状态');
+      }
+    },
+    
+    async getSDcardPath() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const path = await HardwareAPI.getSDcardPath();
+        this.result = `SD卡路径: ${path}`;
+      } catch (error) {
+        this.handleError(error, '获取SD卡路径');
+      }
+    },
+    
+    async getUdiskPath() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const path = await HardwareAPI.getUdiskPath();
+        this.result = `U盘路径: ${path}`;
+      } catch (error) {
+        this.handleError(error, '获取U盘路径');
+      }
+    },
+    
+    async setUsbPower() {
+      if (!this.isPluginReady) {
+        this.result = '插件未就绪,请等待初始化完成';
+        return;
+      }
+      
+      try {
+        const result = await HardwareAPI.setUsbPower(true);
+        this.result = `控制USB电源结果: ${result}`;
+        uni.showToast({
+          title: 'USB电源控制成功',
+          icon: 'success'
+        });
+      } catch (error) {
+        this.handleError(error, '控制USB电源');
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.container {
+  padding: 20px;
+  background-color: #f5f5f5;
+}
+
+.header {
+  text-align: center;
+  margin-bottom: 30px;
+}
+
+.title {
+  font-size: 24px;
+  font-weight: bold;
+  color: #333;
+}
+
+.status-indicator {
+  margin-top: 10px;
+}
+
+.status-text {
+  font-size: 14px;
+  padding: 5px 10px;
+  border-radius: 15px;
+  background-color: #f0f0f0;
+}
+
+.status-ready {
+  color: #27ae60;
+  background-color: #d5f4e6;
+}
+
+.status-error {
+  color: #e74c3c;
+  background-color: #fdeaea;
+}
+
+.section {
+  margin-bottom: 30px;
+  background-color: white;
+  border-radius: 10px;
+  padding: 20px;
+  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
+
+.section-title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #2c3e50;
+  margin-bottom: 15px;
+  display: block;
+}
+
+.button-group {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.btn {
+  background-color: #3498db;
+  color: white;
+  border: none;
+  border-radius: 5px;
+  padding: 12px 20px;
+  font-size: 16px;
+  margin: 5px 0;
+}
+
+.btn:active {
+  background-color: #2980b9;
+}
+
+.result-section {
+  background-color: white;
+  border-radius: 10px;
+  padding: 20px;
+  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
+
+.result-title {
+  font-size: 16px;
+  font-weight: bold;
+  color: #2c3e50;
+  display: block;
+  margin-bottom: 10px;
+}
+
+.result-text {
+  font-size: 14px;
+  color: #34495e;
+  line-height: 1.5;
+  word-wrap: break-word;
+}
+</style>

+ 1209 - 0
pages/index/typulse.vue

@@ -0,0 +1,1209 @@
+<template>
+	<view class="container">
+		<!-- 标题 -->
+		<view class="header" :style="{height:(44+statusBarHeight)+'px',paddingTop: statusBarHeight+ 'px'}">
+			<text class="title">TyPulse 简单示例</text>
+		</view>
+
+		<!-- 状态显示 -->
+		<view class="status-section">
+			<view class="status-item">
+				<text class="status-label">插件状态:</text>
+				<text
+					:class="['status-value', initStatus ? 'success' : 'error']">{{ initStatus ? '已初始化' : '未初始化' }}</text>
+			</view>
+			<view class="status-item">
+				<text class="status-label">设备状态:</text>
+				<text
+					:class="['status-value', deviceConnected ? 'success' : 'error']">{{ deviceConnected ? '已连接' : '未连接' }}</text>
+			</view>
+			<view class="status-item">
+				<text class="status-label">测量状态:</text>
+				<text :class="['status-value', measuring ? 'warning' : 'normal']">{{ measuring ? '测量中' : '待机' }}</text>
+			</view>
+		</view>
+
+		<!-- 连接状态指示器 -->
+		<view class="connection-status" v-if="deviceInfo">
+			<view class="status-indicator connected"></view>
+			<text class="status-text">设备已连接</text>
+		</view>
+		
+		<!-- 设备信息 -->
+		<view v-if="deviceInfo" class="device-section">
+			<text class="section-title">设备信息</text>
+			<text class="device-battery">设备id: {{ deviceInfo.deviceId }}</text>
+			<text class="device-name">设备名称:{{ deviceInfo.deviceName }}</text>
+			<text class="device-battery">电量: {{ deviceInfo.battery }}%</text>
+		</view>
+
+		</view>
+
+		<!-- 操作按钮 -->
+		<view class="action-section">
+			<view @click="toMeasure" class="btn btn-primary">
+				{{ deviceInfo ? '继续测脉' : '去测脉' }}
+			</view>
+			<view v-if="deviceInfo" @click="disconnectDevice" class="btn btn-secondary">断开设备</view>
+			<view @click="toMeasurePortrait" class="btn btn-secondary">去测脉(强制竖屏)</view>
+			<view @click="toMeasureLandscape" class="btn btn-secondary">去测脉(强制横屏)</view>
+			<view @click="toMeasureAuto" class="btn btn-secondary">去测脉(自动方向)</view>
+			<view @click="toTongue" class="btn btn-primary">舌诊示例</view>
+			<view @click="toCamera" class="btn btn-primary">摄像头调试</view>
+			<view @click="toSmdtDevice" class="btn btn-primary">平板设备</view>
+
+			<!-- <view @click="toCamera1" class="btn btn-primary">摄像头自动变焦</view> -->
+			<!-- <view @click="startMeasure" :disabled="!deviceConnected || measuring" class="btn btn-success">开始测量</view>
+      <view @click="stopMeasure" :disabled="!measuring" class="btn btn-danger">停止测量</view> -->
+		</view>
+
+		<!-- 测量进度 -->
+		<view v-if="measuring" class="progress-section">
+			<text class="progress-text">测量进度: {{ measureProgress }}%</text>
+			<view class="progress-bar">
+				<view class="progress-fill" :style="{ width: measureProgress + '%' }"></view>
+			</view>
+			<text class="stage-text">{{ currentStage }}</text>
+		</view>
+
+		<!-- 测量结果 -->
+		<view v-if="lastResult" class="result-section">
+			<text class="section-title">最新测量结果</text>
+			<view class="result-item">
+				<text class="result-label">心率:</text>
+				<text class="result-value">{{ lastResult.heartRate }} bpm</text>
+			</view>
+			<view class="result-item">
+				<text class="result-label">血压:</text>
+				<text class="result-value">{{ lastResult.bloodPressure.systolic }}/{{ lastResult.bloodPressure.diastolic }}
+					mmHg</text>
+			</view>
+			<view class="result-item">
+				<text class="result-label">测量时间:</text>
+				<text class="result-value">{{ lastResult.measureTime }}</text>
+			</view>
+		</view>
+
+		<!-- 简单日志 -->
+		<view class="log-section">
+			<text class="section-title">操作日志</text>
+			<scroll-view class="log-list" scroll-y="true">
+				<view v-for="(log, index) in logs" :key="index" class="log-item">
+					<text class="log-text">{{ log }}</text>
+				</view>
+			</scroll-view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 插件实例
+				tyPulse: null,
+				// 状态
+				initStatus: false,
+				deviceConnected: false,
+				isConnecting: false, // 防止重复连接的标志
+				measuring: false,
+				// 设备信息
+				deviceInfo: null,
+				// 测量相关
+				measureProgress: 0,
+				currentStage: '待机',
+				lastResult: null,
+				appId: "nehijR6y",
+				appSecret: "f740435d1b84b9944a52f064dd1ecf6e8a76f546",
+				uid: "userid000067",
+				// 日志
+				logs: [],
+				devices: [],
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				// 重连相关
+				reconnectAttempts: 0,
+				// 连接状态检查标志(防止重复执行和白屏)
+				isCheckingConnection: false,
+			}
+		},
+		onLoad() {
+			this.addLog('页面加载完成');
+			this.initPlugin();
+		},
+		onShow() {
+			this.addLog('页面显示');
+			// 页面显示时检查连接状态
+			if (this.tyPulse && this.initStatus) {
+				this.checkAndRestoreConnection();
+			}
+		},
+		onHide() {
+			this.addLog('页面隐藏,保持连接状态');
+			// 页面隐藏时不主动断开连接,只记录状态
+			// 这样可以在页面重新显示时恢复连接
+		},
+		onUnload() {
+			this.addLog('页面卸载,清理连接状态');
+			// 页面卸载时清理连接状态
+			if (this.tyPulse) {
+				// 不再主动断开连接,保持蓝牙连接状态
+				this.addLog('页面卸载,保持蓝牙连接');
+			}
+		},
+		methods: {
+					// 添加日志
+					addLog(message) {
+						const time = new Date().toLocaleTimeString();
+						this.logs.unshift(`[${time}] ${message}`);
+						if (this.logs.length > 20) {
+							this.logs.pop();
+						}
+					},
+
+					// 检查并恢复连接状态(合并后的优化版本)
+					checkAndRestoreConnection() {
+						// 添加状态检查,防止重复执行
+						if (this.isCheckingConnection) {
+							this.addLog('连接状态检查正在进行中,跳过重复检查');
+							return;
+						}
+						
+						this.isCheckingConnection = true;
+						this.addLog('开始检查连接状态...');
+						
+						// 延迟执行,避免页面切换时的竞争条件
+						setTimeout(() => {
+							this.performConnectionCheck();
+						}, 500);
+					},
+					
+					// 执行连接检查的核心逻辑
+					async performConnectionCheck() {
+						try {
+							if (!this.tyPulse || !this.initStatus) {
+								this.addLog('插件未初始化,跳过连接检查');
+								return;
+							}
+							
+							// 设置超时保护,防止长时间阻塞
+							const timeoutPromise = new Promise((resolve) => {
+								setTimeout(() => {
+									resolve({ success: false, error: '连接状态检查超时' });
+								}, 5000); // 5秒超时
+							});
+							
+							// 优先使用智能连接
+							if (this.tyPulse.smartConnect) {
+								const smartPromise = new Promise((resolve) => {
+									this.tyPulse.smartConnect(resolve);
+								});
+								
+								const result = await Promise.race([smartPromise, timeoutPromise]);
+								
+								this.addLog('智能连接结果: ' + JSON.stringify(result));
+								
+								if (result.success) {
+									if (result.isAlreadyConnected) {
+										this.addLog('设备已连接');
+										this.deviceConnected = true;
+										// 异步获取设备信息
+										setTimeout(() => {
+											this.getDeviceInfo();
+										}, 50);
+										return;
+									} else if (result.isAutoReconnected) {
+										this.addLog('自动重连成功');
+										this.deviceConnected = true;
+										uni.showToast({
+											title: '自动重连成功',
+											icon: 'success'
+										});
+										return;
+									}
+								} else {
+									if (result.needScan) {
+										this.addLog('需要重新扫描连接,请手动点击连接按钮');
+									} else {
+										this.addLog('智能连接失败: ' + (result.error || '未知错误'));
+									}
+								}
+							}
+							
+							// 如果没有智能连接方法,使用原有的检查方法
+							if (this.tyPulse.checkConnectionStatus) {
+								const statusPromise = new Promise((resolve) => {
+									this.tyPulse.checkConnectionStatus(resolve);
+								});
+								
+								const result = await Promise.race([statusPromise, timeoutPromise]);
+								
+								this.addLog('连接状态检查结果: ' + JSON.stringify(result));
+								
+								if (result.success && result.data) {
+									if (result.data.isConnected) {
+										// 当前已连接
+										this.deviceConnected = true;
+										this.addLog('检测到已有蓝牙连接,状态已恢复');
+										// 异步获取设备信息,不阻塞UI
+										setTimeout(() => {
+											this.getDeviceInfo();
+										}, 50);
+									} else {
+										this.addLog('当前没有蓝牙连接');
+									}
+								} else {
+									this.addLog('连接状态检查失败: ' + (result.error || '未知错误'));
+								}
+							} else {
+								// 如果没有专门的连接状态检查方法,尝试获取设备信息
+								this.addLog('使用设备信息检查连接状态...');
+								this.getDeviceInfo();
+							}
+						} catch (error) {
+							this.addLog('连接状态检查异常: ' + error.message);
+						} finally {
+							this.isCheckingConnection = false;
+							this.addLog('连接状态检查完成');
+						}
+					},
+
+					// 初始化插件
+					async initPlugin() {
+							try {
+								this.addLog('开始初始化插件...');
+								// 获取插件实例
+								this.tyPulse = uni.requireNativePlugin('TyPulseManager');
+								if (!this.tyPulse) {
+									throw new Error('无法获取插件实例');
+								}
+
+
+								// 初始化
+								await new Promise((resolve, reject) => {
+									this.tyPulse.initSDK(this.appId, this.appSecret, this.uid, (
+										result) => {
+										if (result.success) {
+											resolve();
+										} else {
+											reject(new Error(result.error));
+										}
+									});
+								});
+
+								this.initStatus = true;
+								this.addLog('插件初始化成功');
+								uni.showToast({
+									title: '插件初始化成功',
+									icon: 'success'
+								});
+
+								// 延迟检查连接状态,确保插件完全初始化
+								setTimeout(() => {
+									this.checkAndRestoreConnection();
+								}, 500);
+							} catch (error) {
+								this.addLog(`初始化失败: ${error.message}`);
+								uni.showToast({
+									title: '初始化失败',
+									icon: 'error'
+								});
+							}
+					},
+
+					toMeasure() {
+						if (!this.initStatus || !this.tyPulse) {
+							this.addLog('插件未初始化,无法进行测量');
+							uni.showToast({
+								title: '插件未初始化',
+								icon: 'error'
+							});
+							return;
+						}
+						this.addLog('调用原生 toMeasure...');
+						this.tyPulse.toMeasure(result => {
+							this.addLog('toMeasure 回调: ' + JSON.stringify(result));
+							if (result.success) {
+								if (result.cmdType == "pulseResult") {
+									this.addLog('测量结果:' + JSON.stringify(result));
+								}
+								if (result.cmdType == "deviceConnect") {
+									//获取设备信息
+									this.getDeviceInfo();
+									this.addLog('回调结果:' + JSON.stringify(result));
+								}
+							} else {
+								this.addLog('测脉操作失败: ' + (result.error || '未知错误'));
+							}
+						});
+					},
+
+					// 设置回调
+					setupCallbacks() {
+						this.tyPulse.setDeviceCallback((result) => {
+							this.addLog('设备状态变更: ' + JSON.stringify(result));
+							
+							switch (result.status) {
+								case 'connected':
+									this.deviceConnected = true;
+									this.deviceInfo = result.deviceInfo || {};
+									this.reconnectAttempts = 0; // 重置重连次数
+									uni.showToast({
+										title: '设备已连接',
+										icon: 'success'
+									});
+									break;
+								case 'disconnected':
+									this.deviceConnected = false;
+									this.deviceInfo = {};
+									uni.showToast({
+										title: '设备已断开',
+										icon: 'none'
+									});
+									// 如果是意外断开,可以尝试自动重连
+									if (result.isUnexpected) {
+										this.addLog('设备意外断开,尝试自动重连...');
+										setTimeout(() => {
+											this.checkAndRestoreConnection();
+										}, 1000);
+									}
+									break;
+								case 'connection_failed':
+									this.deviceConnected = false;
+									this.deviceInfo = {};
+									uni.showToast({
+										title: '连接失败',
+										icon: 'error'
+									});
+									break;
+							}
+						});
+
+						// 测量进度回调
+						this.tyPulse.setProgressCallback((progress) => {
+							this.measureProgress = progress.percentage;
+							this.currentStage = this.getStageText(progress.stage);
+						});
+
+						// 测量结果回调
+						this.tyPulse.setMeasureCallback((result) => {
+							this.measuring = false;
+							this.measureProgress = 0;
+							this.currentStage = '待机';
+
+							if (result.success) {
+								this.lastResult = result.data;
+								this.addLog(`测量完成 - 心率: ${result.data.heartRate} bpm`);
+								uni.showToast({
+									title: '测量完成',
+									icon: 'success'
+								});
+							} else {
+								this.addLog(`测量失败: ${result.error}`);
+								uni.showToast({
+									title: '测量失败',
+									icon: 'error'
+								});
+							}
+						});
+					},
+
+					// 获取阶段文本
+					getStageText(stage) {
+							const stageMap = {
+								'preparing': '准备中',
+								'calibrating': '校准中',
+								'measuring': '测量中',
+								'analyzing': '分析中',
+								'completed': '完成'
+							};
+							return stageMap[stage] || '未知阶段';
+					},
+
+					// 获取设备信息
+					getDeviceInfo() {
+						if (!this.tyPulse || !this.initStatus) {
+							this.addLog('插件未初始化,无法获取设备信息');
+							return;
+						}
+						
+						try {
+							this.tyPulse.getDeviceInfo((result) => {
+								if (result.success) {
+									this.deviceInfo = result.data;
+									this.deviceConnected = true; // 更新设备连接状态
+									this.addLog(`设备信息: ${JSON.stringify(result.data)}`);
+									uni.showToast({
+										title: '设备已连接',
+										icon: 'success'
+									});
+								} else {
+									this.addLog(`获取设备信息失败: ${result.error}`);
+									this.deviceInfo = null;
+									this.deviceConnected = false; // 更新设备连接状态
+								}
+							});
+						} catch (error) {
+							this.addLog(`获取设备信息异常: ${error.message}`);
+							this.deviceInfo = null;
+						}
+					},
+
+					// 断开设备连接
+					disconnectDevice() {
+						if (!this.tyPulse || !this.initStatus) {
+							this.addLog('插件未初始化,无法断开设备');
+							return;
+						}
+						
+						try {
+							this.tyPulse.disconnectDevice((result) => {
+								if (result.success) {
+									this.deviceInfo = null;
+									this.deviceConnected = false; // 更新设备连接状态
+									this.addLog('设备已断开连接');
+									uni.showToast({
+										title: '设备已断开',
+										icon: 'success'
+									});
+								} else {
+									this.addLog(`断开设备失败: ${result.error}`);
+								}
+							});
+						} catch (error) {
+							this.addLog(`断开设备异常: ${error.message}`);
+						}
+					},
+
+					// 安全的连接状态检查方法(防止白屏)
+					async checkAndRestoreConnectionSafely() {
+						try {
+							// 添加状态检查,防止重复执行
+							if (this.isCheckingConnection) {
+								this.addLog('连接状态检查正在进行中,跳过重复检查');
+								return;
+							}
+							
+							this.isCheckingConnection = true;
+							this.addLog('安全检查蓝牙连接状态...');
+							
+							// 设置超时保护,防止长时间阻塞
+							const timeoutPromise = new Promise((resolve) => {
+								setTimeout(() => {
+									resolve({ success: false, error: '连接状态检查超时' });
+								}, 5000); // 5秒超时
+							});
+							
+							// 使用新的智能连接方法
+							if (this.tyPulse.smartConnect) {
+								const smartPromise = new Promise((resolve) => {
+									this.tyPulse.smartConnect(resolve);
+								});
+								
+								const result = await Promise.race([smartPromise, timeoutPromise]);
+								
+								this.addLog('智能连接结果: ' + JSON.stringify(result));
+								
+								if (result.success) {
+									if (result.isAlreadyConnected) {
+										this.addLog('设备已连接');
+										this.deviceConnected = true;
+										// 异步获取设备信息
+										setTimeout(() => {
+											this.getDeviceInfo();
+										}, 50);
+									} else if (result.isAutoReconnected) {
+										this.addLog('自动重连成功');
+										this.deviceConnected = true;
+										uni.showToast({
+											title: '自动重连成功',
+											icon: 'success'
+										});
+									}
+								} else {
+									if (result.needScan) {
+										this.addLog('需要重新扫描连接,请手动点击连接按钮');
+										// 不自动触发任何连接操作,完全由用户手动控制
+									} else {
+										this.addLog('智能连接失败: ' + (result.error || '未知错误'));
+									}
+								}
+							} else {
+								// 如果没有智能连接方法,使用原有的检查方法
+								if (this.tyPulse.checkConnectionStatus) {
+									const statusPromise = new Promise((resolve) => {
+										this.tyPulse.checkConnectionStatus(resolve);
+									});
+									
+									const result = await Promise.race([statusPromise, timeoutPromise]);
+									
+									this.addLog('连接状态检查结果: ' + JSON.stringify(result));
+									
+									if (result.success && result.data) {
+										if (result.data.isConnected) {
+											// 当前已连接
+											this.deviceConnected = true;
+											this.addLog('检测到已有蓝牙连接,状态已恢复');
+											// 异步获取设备信息,不阻塞UI
+											setTimeout(() => {
+												this.getDeviceInfo();
+											}, 50);
+										} else {
+											// 没有连接,不做任何自动操作
+											this.addLog('当前没有蓝牙连接,请手动点击连接按钮');
+										}
+									} else {
+										this.addLog('连接状态检查失败: ' + (result.error || '未知错误'));
+									}
+								} else {
+									this.addLog('没有可用的连接状态检查方法');
+								}
+							}
+						} catch (error) {
+							this.addLog('连接状态检查异常: ' + error.message);
+						} finally {
+							this.isCheckingConnection = false;
+						}
+					},
+
+
+
+					// 自动重连
+					async autoReconnect() {
+						try {
+							this.addLog('开始自动重连...');
+							
+							// 优先使用智能连接
+							if (this.tyPulse.smartConnect) {
+								const result = await new Promise((resolve) => {
+									this.tyPulse.smartConnect(resolve);
+								});
+								
+								this.addLog('智能连接结果: ' + JSON.stringify(result));
+								
+								if (result.success) {
+									if (result.isAlreadyConnected) {
+										this.deviceConnected = true;
+										this.addLog('设备已连接');
+										this.getDeviceInfo();
+									} else if (result.isAutoReconnected) {
+										this.deviceConnected = true;
+										this.addLog('自动重连成功');
+										uni.showToast({
+											title: '自动重连成功',
+											icon: 'success'
+										});
+										this.getDeviceInfo();
+									}
+									return;
+								}
+							}
+							
+							// 如果智能连接失败,尝试连接已保存的设备
+							if (this.tyPulse.connectToSavedDevice) {
+								const savedResult = await new Promise((resolve) => {
+									this.tyPulse.connectToSavedDevice(resolve);
+								});
+								
+								this.addLog('连接已保存设备结果: ' + JSON.stringify(savedResult));
+								
+								if (savedResult.success) {
+									this.deviceConnected = true;
+									this.addLog('连接已保存设备成功');
+									uni.showToast({
+										title: '连接已保存设备成功',
+										icon: 'success'
+									});
+									this.getDeviceInfo();
+								} else {
+									this.addLog('连接已保存设备失败: ' + (savedResult.error || '未知错误'));
+								}
+							}
+						} catch (error) {
+							this.addLog(`自动重连失败: ${error.message}`);
+						}
+					},
+
+						// 连接设备
+					async connectDevice() {
+						try {
+							// 防止重复连接
+							if (this.isConnecting) {
+								this.addLog('连接正在进行中,请稍候...');
+								return;
+							}
+							
+							// 先尝试智能连接
+							if (this.tyPulse.smartConnect) {
+								this.isConnecting = true;
+								this.addLog('尝试智能连接...');
+								
+								uni.showLoading({
+									title: '连接中...'
+								});
+								
+								const smartResult = await new Promise((resolve) => {
+									this.tyPulse.smartConnect(resolve);
+								});
+								
+								uni.hideLoading();
+								
+								if (smartResult.success) {
+									if (smartResult.isAlreadyConnected) {
+										this.deviceConnected = true;
+										this.addLog('设备已连接');
+										uni.showToast({
+											title: '设备已连接',
+											icon: 'success'
+										});
+										this.getDeviceInfo();
+										return;
+									} else if (smartResult.isAutoReconnected) {
+										this.deviceConnected = true;
+										this.addLog('自动重连成功');
+										uni.showToast({
+											title: '自动重连成功',
+											icon: 'success'
+										});
+										this.getDeviceInfo();
+										return;
+									}
+								}
+							}
+							
+							// 如果智能连接失败或不可用,使用普通连接
+							this.isConnecting = true;
+							this.addLog('开始连接设备...');
+							
+							uni.showLoading({
+								title: '连接中...'
+							});
+
+							// 直接弹出设备选择窗口,让用户选择设备
+							this.addLog('弹出设备选择窗口...');
+							const scanResult = await new Promise((resolve) => {
+								this.tyPulse.scanAndConnect(resolve);
+							});
+
+							uni.hideLoading();
+
+							if (scanResult.success) {
+								this.addLog('设备选择窗口已启动,等待用户选择设备...');
+								// 注意:实际的连接成功会通过setDeviceCallback中的'connected'事件通知
+								// 这里不需要设置deviceConnected = true,等待回调处理
+							} else {
+								this.addLog(`连接失败: ${scanResult.error}`);
+								uni.showToast({
+									title: '连接失败',
+									icon: 'error'
+								});
+							}
+						} catch (error) {
+							uni.hideLoading();
+							this.addLog(`连接异常: ${error.message}`);
+							uni.showToast({
+								title: '连接异常',
+								icon: 'error'
+							});
+						} finally {
+							this.isConnecting = false;
+						}
+					},
+
+					// 开始测量
+					async startMeasure() {
+							try {
+								this.measuring = true;
+								this.measureProgress = 0;
+								this.currentStage = '开始测量';
+								this.addLog('开始测量...');
+								this.tyPulse.startMeasure((result) => {
+									if (result.success) {
+										this.addLog('测量启动成功');
+									} else {
+										this.measuring = false;
+										this.addLog(`测量失败: ${result.error}`);
+									}
+								});
+
+							} catch (error) {
+								this.measuring = false;
+								this.addLog(`开始测量失败: ${error.message}`);
+							}
+					},
+
+					// 停止测量
+					async stopMeasure() {
+							try {
+								this.addLog('停止测量...');
+								this.tyPulse.stopMeasure((result) => {
+									this.measuring = false;
+									this.measureProgress = 0;
+									this.currentStage = '待机';
+									if (result.success) {
+										this.addLog('测量已停止');
+									} else {
+										this.addLog(`停止测量失败: ${result.error}`);
+									}
+								});
+							} catch (error) {
+								this.measuring = false;
+								this.addLog(`停止测量失败: ${error.message}`);
+							}
+					},
+					toSmdtDevice(){
+						uni.navigateTo({
+							url:"/pages/index/smdtManager/smdtManager"
+						})
+					},
+					toCamera(){
+						uni.navigateTo({
+							url:"/pages/device/tongue/test"
+						})
+					},
+					toCamera1(){
+						console.log("qxj toCamera1");
+						uni.navigateTo({
+							url:"/pages/device/tongue/testCameraAuto"
+						})
+					},
+					toTongue(){
+						uni.navigateTo({
+							url:"/pages/device/tongue/indexOld"
+						})
+					},
+					
+					// 强制竖屏测脉
+					toMeasurePortrait() {
+						try {
+							// 设置强制竖屏
+							this.tyPulse.setOrientationConfig({
+								autoOrientationEnabled: false,
+								forcedOrientation: 1 // ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+							});
+							this.addLog('设置强制竖屏模式');
+							
+							this.tyPulse.toMeasure((result) => {
+								setTimeout(() => {
+									uni.showToast({
+										title: '竖屏模式: ' + JSON.stringify(result),
+										icon: 'none'
+									});
+								}, 2000);
+								if (result.success) {
+									if (result.cmdType == "pulseResult") {
+										this.addLog('测量结果(竖屏):' + JSON.stringify(result));
+									}
+									if (result.cmdType == "deviceConnect") {
+										this.getDeviceInfo();
+										this.addLog('回调结果(竖屏):' + JSON.stringify(result));
+									}
+								}
+							});
+						} catch (error) {
+							this.addLog(`竖屏测脉失败: ${error.message}`);
+						}
+					},
+					
+					// 强制横屏测脉
+					toMeasureLandscape() {
+						try {
+							// 设置强制横屏
+							this.tyPulse.setOrientationConfig({
+								autoOrientationEnabled: false,
+								forcedOrientation: 0 // ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+							});
+							this.addLog('设置强制横屏模式');
+							
+							this.tyPulse.toMeasure((result) => {
+								setTimeout(() => {
+									uni.showToast({
+										title: '横屏模式: ' + JSON.stringify(result),
+										icon: 'none'
+									});
+								}, 2000);
+								if (result.success) {
+									if (result.cmdType == "pulseResult") {
+										this.addLog('测量结果(横屏):' + JSON.stringify(result));
+									}
+									if (result.cmdType == "deviceConnect") {
+										this.getDeviceInfo();
+										this.addLog('回调结果(横屏):' + JSON.stringify(result));
+									}
+								}
+							});
+						} catch (error) {
+							this.addLog(`横屏测脉失败: ${error.message}`);
+						}
+					},
+					
+					// 自动屏幕方向测脉
+					toMeasureAuto() {
+						try {
+							// 设置自动屏幕方向
+							this.tyPulse.setOrientationConfig({
+								autoOrientationEnabled: true,
+								forcedOrientation: -1 // ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
+							});
+							this.addLog('设置自动屏幕方向模式');
+							
+							this.tyPulse.toMeasure((result) => {
+								setTimeout(() => {
+									uni.showToast({
+										title: '自动方向: ' + JSON.stringify(result),
+										icon: 'none'
+									});
+								}, 2000);
+								if (result.success) {
+									if (result.cmdType == "pulseResult") {
+										this.addLog('测量结果(自动):' + JSON.stringify(result));
+									}
+									if (result.cmdType == "deviceConnect") {
+										this.getDeviceInfo();
+										this.addLog('回调结果(自动):' + JSON.stringify(result));
+									}
+								}
+							});
+						} catch (error) {
+							this.addLog(`自动方向测脉失败: ${error.message}`);
+						}
+				},
+
+				// 尝试自动连接(不显示设备选择弹框)
+					async tryAutoConnect() {
+						try {
+							this.addLog('开始尝试自动连接...');
+							
+							// 优先使用智能连接
+							if (this.tyPulse.smartConnect) {
+								const smartResult = await new Promise((resolve) => {
+									this.tyPulse.smartConnect(resolve);
+								});
+								
+								this.addLog('智能连接结果: ' + JSON.stringify(smartResult));
+								
+								if (smartResult.success) {
+									if (smartResult.isAlreadyConnected) {
+										this.deviceConnected = true;
+										this.addLog('设备已连接');
+										this.getDeviceInfo();
+										return true;
+									} else if (smartResult.isAutoReconnected) {
+										this.deviceConnected = true;
+										this.addLog('自动重连成功');
+										this.getDeviceInfo();
+										return true;
+									}
+								}
+							}
+							
+							// 如果智能连接失败,尝试连接已保存的设备
+							if (this.tyPulse.connectToSavedDevice) {
+								const savedResult = await new Promise((resolve) => {
+									this.tyPulse.connectToSavedDevice(resolve);
+								});
+								
+								this.addLog('连接已保存设备结果: ' + JSON.stringify(savedResult));
+								
+								if (savedResult.success) {
+									this.deviceConnected = true;
+									this.addLog('连接已保存设备成功');
+									this.getDeviceInfo();
+									return true;
+								}
+							}
+							
+							this.addLog('自动连接失败,无法连接到设备');
+							return false;
+							
+						} catch (error) {
+							this.addLog(`自动连接异常: ${error.message}`);
+							return false;
+						}
+					},
+
+					// 断开蓝牙连接
+					disconnectDevice() {
+						if (this.tyPulse) {
+							this.tyPulse.disconnectDevice((result) => {
+								console.log('断开连接结果:', result);
+								if (result.success) {
+									this.addLog('蓝牙连接已断开');
+									this.deviceConnected = false;
+									this.reconnectAttempts = 0; // 重置重连次数
+								} else {
+									this.addLog('断开连接失败: ' + (result.error || '未知错误'));
+								}
+							});
+						} else {
+							this.addLog('插件未初始化,无法断开连接');
+						}
+					}
+			}
+		}
+</script>
+
+<style scoped lang="scss">
+	.container {
+		padding: 20rpx;
+		background-color: #f8f9fa;
+		min-height: 100vh;
+	}
+
+	.header {
+		text-align: center;
+		padding: 30rpx;
+		background-color: #007AFF;
+		border-radius: 10rpx;
+		margin-bottom: 20rpx;
+	}
+
+	.title {
+		color: white;
+
+		font-weight: bold;
+	}
+
+	.status-section {
+		background-color: white;
+		border-radius: 10rpx;
+		padding: 20rpx;
+		margin-bottom: 20rpx;
+
+	}
+
+	.status-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 15rpx 0;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+
+	.status-item:last-child {
+		border-bottom: none;
+	}
+
+	.status-label {
+
+		color: #666;
+	}
+
+	.status-value {
+		font-weight: bold;
+	}
+
+	.status-value.success {
+		color: #52c41a;
+	}
+
+	.status-value.error {
+		color: #ff4d4f;
+	}
+
+	.status-value.warning {
+		color: #faad14;
+	}
+
+	.status-value.normal {
+		color: #666;
+	}
+
+	/* 连接状态指示器样式 */
+	.connection-status {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background-color: white;
+		border-radius: 10rpx;
+		padding: 20rpx;
+		margin-bottom: 20rpx;
+	}
+
+	.status-indicator {
+		width: 20rpx;
+		height: 20rpx;
+		border-radius: 50%;
+		margin-right: 15rpx;
+		animation: pulse 2s infinite;
+	}
+
+	.status-indicator.connected {
+		background-color: #52c41a;
+	}
+
+	.status-text {
+		color: #52c41a;
+		font-weight: bold;
+	}
+
+	@keyframes pulse {
+		0% {
+			opacity: 1;
+			transform: scale(1);
+		}
+		50% {
+			opacity: 0.7;
+			transform: scale(1.1);
+		}
+		100% {
+			opacity: 1;
+			transform: scale(1);
+		}
+	}
+
+	.device-section,
+	.result-section,
+	.log-section {
+		background-color: white;
+		border-radius: 10rpx;
+		padding: 20rpx;
+		margin-bottom: 20rpx;
+	}
+
+	.section-title {
+		font-weight: bold;
+		color: #333;
+		margin-bottom: 15rpx;
+		display: block;
+	}
+
+	.device-name {
+
+		color: #333;
+		margin-bottom: 10rpx;
+		display: block;
+	}
+
+	.device-battery {
+
+		color: #666;
+		display: block;
+	}
+
+	.action-section {
+		background-color: white;
+		border-radius: 10rpx;
+		padding: 20rpx;
+		margin-bottom: 20rpx;
+		display: flex;
+		flex-direction: column;
+		gap: 15rpx;
+	}
+
+	.btn {
+		padding: 5px;
+		border-radius: 8rpx;
+		border: none;
+		text-align: center;
+		width: 100%;
+		margin: 6rpx;
+		//font-size: 14px;
+	}
+
+	.btn-primary {
+		background-color: #007AFF;
+		color: white;
+	}
+
+	.btn-secondary {
+		background-color: #6c757d;
+		color: white;
+	}
+
+	.btn-success {
+		background-color: #28a745;
+		color: white;
+	}
+
+	.btn-danger {
+		background-color: #dc3545;
+		color: white;
+	}
+
+	.btn:disabled {
+		opacity: 0.5;
+		background-color: #ccc;
+	}
+
+	.progress-section {
+		background-color: white;
+		border-radius: 10rpx;
+		padding: 20rpx;
+		margin-bottom: 20rpx;
+	}
+
+	.progress-text {
+
+		color: #333;
+		margin-bottom: 15rpx;
+		display: block;
+	}
+
+	.progress-bar {
+		width: 100%;
+		height: 20rpx;
+		background-color: #f0f0f0;
+		border-radius: 10rpx;
+		overflow: hidden;
+		margin-bottom: 15rpx;
+	}
+
+	.progress-fill {
+		height: 100%;
+		background-color: #007AFF;
+		transition: width 0.3s ease;
+	}
+
+	.stage-text {
+
+		color: #666;
+		text-align: center;
+		display: block;
+	}
+
+	.result-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 12rpx 0;
+		border-bottom: 1rpx solid #f0f0f0;
+	}
+
+	.result-item:last-child {
+		border-bottom: none;
+	}
+
+	.result-label {
+
+		color: #666;
+	}
+
+	.result-value {
+
+		color: #333;
+		font-weight: bold;
+	}
+
+	.log-list {
+		height: 700rpx;
+		border: 1rpx solid #e8e8e8;
+		border-radius: 8rpx;
+		padding: 10rpx;
+	}
+
+	.log-item {
+		padding: 8rpx 0;
+		border-bottom: 1rpx solid #f5f5f5;
+	}
+
+	.log-item:last-child {
+		border-bottom: none;
+	}
+
+	.log-text {
+
+		color: #666;
+		line-height: 1.4;
+	}
+</style>

+ 1372 - 0
pages/user/healthRecords/add.vue

@@ -0,0 +1,1372 @@
+<template>
+	<view class="container">
+		<image 
+			class="jkda_top_bg" 
+			src="@/static/image/healthRecords/integral_top_bg@2x.png" 
+			mode="widthFix"
+			v-if="this.formType!='dietList' && this.formType!='sleepList'&&this.formType!='sportList' && this.formType!='healthLife'"
+		></image>
+		<view class="container-body">
+			<!-- 就诊人信息 -->
+			<view class="userbox" v-if="this.formType!='dietList' && this.formType!='sleepList'&&this.formType!='sportList'&& this.formType!='healthLife'">
+				<view class="userbox-left" style="opacity: 0.65;" @click="addPatient()" v-if="patient!=null">
+					<view class="userbox-headimg">
+						<image :src="defaultHeadimg" mode="aspectFill" style="width: 100%;height: 100%"></image>
+					</view>
+					<view class="userbox-info">
+						<view class="userbox-name">
+							<text>{{patient.patientName}}</text>
+							<text class="userbox-idcard">{{$parseIdCard(patient.idCard)}}</text>
+						</view>
+						<view class="userbox-info-tag">
+							<view v-if="patient.sex==1">男</view>
+							<view v-if="patient.sex==2">女</view>
+							<view>{{$getAge(patient.birthday)}}岁</view>
+						</view>
+					</view>
+				</view>
+				<view class="userbind" @click="addPatient()" v-if="patient==null">
+					<image src="@/static/image/healthRecords/upload_id_card_icon.png" mode="aspectFill"></image>
+					<text>绑定就诊人</text>
+				</view>
+			</view>
+			<!-- 问卷 -->
+			<view class="listbox multiplebox" v-for="(item,index) in list" :key="index">
+				<view class="listbox-titlebox">
+					<text>{{index + 1}}.</text>
+					<view class="listbox-titletag" v-if="item.type == 2">多选</view>
+					<text class="listbox-title">{{item.name}}</text>
+				</view>
+				<!-- 多选 -->
+				<view class="listbox-option" v-if="item.type == 2">
+					<view v-for="(option,i) in item.question" :key="i" class="listbox-option-flex">
+						<view
+							@click="handleMultiple(item,index,option)"
+							:class="item.value.indexOf(option.name) === -1 ? 'listbox-option-item' : 'listbox-option-item option-active'">
+							{{option.name}}
+						</view>
+						<view class="otherinput" v-if="option.isWrite == 1 && item.value.indexOf(option.name) !== -1" @click="handleEdit(index,i)">
+							{{option.writeVal || '请输入相关描述'}}
+						</view>
+					</view>
+				</view>
+				<!-- 单选 -->
+				<view style="margin-top: 20rpx;" v-if="item.type == 1">
+					<view class="listbox-choose" v-for="(option,i) in item.question" :key="i" @click="handleChoose(item,option)">
+						<image class="choose-icon" v-if="item.value == option.name" src="@/static/image/healthRecords/choose_icon.png" mode="aspectFill"></image>
+						<image class="choose-icon" v-if="item.value != option.name" src="@/static/image/healthRecords/choose_no_icon.png" mode="aspectFill"></image>
+						<text style="flex-shrink: 0;">{{option.name}}</text>
+						<view class="choose-input" v-if="option.isWrite == 1 && item.value == option.name" @click.stop="handleEdit(index,i)">
+							{{option.writeVal || '请输入相关描述'}}
+						</view>
+					</view>
+				</view>
+				<!-- 饮食调查 -->
+				<view class="dietary-survey" v-if="item.type == 3">
+					<view class="dietary-survey-item" v-for="(option,i) in item.question" :key="i"
+						@click="handleChoose(item,option)">
+						<view class="dietary-survey-iteml" v-if="option.name !== '每周多少次'">
+							<view :class="item.value == option.name ? 'dietary-survey-active':''">{{i+1}}</view>
+							<text>{{option.name}}</text>
+						</view>
+						<view class="dietary-survey-input" v-if="item.name == '平时应酬' && option.name === '每周多少次'">
+							<text>每周</text>
+							<input class="uni-input" type="number" maxlength="2"
+								:value="option.writeVal" @input="clearInput($event,option)" />
+							<text>次</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<uni-popup ref="popup">
+			<view class="popbox">
+				<view class="popbox-title" v-if="list&&list.length>0">{{chooseIndex+1}}.{{list[chooseIndex].name}}</view>
+				<view class="popbox-desc" v-if="list&&list.length>0">选项:{{list[chooseIndex].question[chooseItemIdx].name}}</view>
+				<view class="uni-textarea-wrapper">
+					<textarea class="textarea" placeholder-style="font-size: 28rpx;" :focus="focus" placeholder="请输入相关描述" :value="writeVal" @input="handleinput"/>
+					<view class="popbox-confirm-btn" @click="popSubmit">确认</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- footer -->
+		<view class="footer">
+			<button class="footer-btn" :loading="btnLoading" :disabled="btnLoading" @click="handelSubmit">
+				{{this.formType=='dietList' || this.formType=='sleepList'||this.formType=='sportList' || this.formType=='healthLife' ? '提交':'提交健康档案'}}
+			</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		healthHistoryTempList,
+		addRecord,
+		addFsHealthLife,
+		HealthLife,
+	} from "@/api/healthRecords.js"
+	export default {
+		data() {
+			return {
+				patient:null,
+				focus: false,
+				chooseIndex: 0,
+				chooseItemIdx: 0,
+				writeVal: "",
+				inputValue: "",
+				btnLoading: false,
+				formType: "",
+				defaultHeadimg: "../../static/image/healthRecords/my_heads_icon.png",
+				title: "快速填写健康档案",
+				user: {},
+				defaultList: [
+					{
+						name: "目前是否有以下不适?",
+						questionType: "symptomHistory",
+						type: 2,
+						value: "",
+						required: true,
+						question: [
+							{
+								name: "无",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},
+							{
+								name: "头晕",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},
+							{
+								name: "头痛",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "容易疲劳",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "记忆力下降",
+								value: 5,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "咳嗽",
+								value: 6,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "咳痰",
+								value: 7,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "呼吸困难",
+								value: 8,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "胸痛",
+								value: 9,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "心悸",
+								value: 10,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "腹痛",
+								value: 11,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "腹胀",
+								value: 12,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "便秘",
+								value: 13,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "腹泻",
+								value: 14,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "食欲差",
+								value: 15,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "骨痛",
+								value: 16,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "尿频、尿急、尿不尽",
+								value: 17,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "其它",
+								value: 18,
+								isWrite: 1,
+								writeVal: ""
+							},
+						]
+					},{
+						name: "您父母或直系亲属是否有以下疾病?",
+						questionType: "familyHistory",
+						type: 2,
+						value: "",
+						required: true,
+						question: [
+							{
+								name: "无",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "糖尿病",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "高血压",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "心脑血管病",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "高脂血症",
+								value: 5,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "肥胖",
+								value: 6,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "其它",
+								value: 7,
+								isWrite: 1,
+								writeVal: ""
+							},
+						],
+					},
+					{
+						name: "目前是否在用其它疾病的药品?",
+						questionType: "drugHistory",
+						type: 1,
+						value: "",
+						required: false,
+						question: [
+							{
+								name: "无",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "有",
+								value: 2,
+								isWrite: 1,
+								writeVal: ""
+							},
+						],
+					},{
+						name: "用药是否出现了不良反应?",
+						questionType: "drugHistory",
+						type: 1,
+						value: "",
+						required: false,
+						question: [
+							{
+								name: "无",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "有",
+								value: 2,
+								isWrite: 1,
+								writeVal: ""
+							},
+						],
+					},{
+						name: "是否对药物或某些物质过敏?",
+						questionType: "allergyHistory",
+						type: 1,
+						value: "",
+						required: false,
+						question: [
+							{
+								name: "无",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "有",
+								value: 2,
+								isWrite: 1,
+								writeVal: ""
+							},
+						],
+					}
+				],
+				list: [],
+				// 饮食调查
+				dietList: [
+					{
+						name: "三餐规律",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "非常规律",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "比较规律",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "没有规律",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "就餐习惯",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "暴饮暴食",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "压力大经常进食",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "就外就餐多",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "夜宵",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "不吃早餐",
+								value: 5,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "进食速度",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "大约20-30分钟",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大约10-20分钟",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大约5-10分钟",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "酒类",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "从不喝酒",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "每天",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大于3次/周",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "小于3次/周",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "平时应酬",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "多",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "一般",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "少",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "每周多少次",
+								value: 3,
+								isWrite: 1,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "喝水量",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "低于1000ml",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "1000ml-1500ml",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "1500ml-1700ml",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "1700ml以上",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "您每天吃的食物种类多吗?",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "种类非常多,12种以上",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "一般6-10种",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "种类较少3-5种",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "种类比较固定",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "您是否有抽烟习惯?",
+						type: 3,
+						value: "",
+						questionType: "dietList",
+						question: [
+							{
+								name: "是",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "无",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},
+				],
+				sleepList: [
+					{
+						name: "睡眠状况",
+						type: 3,
+						value: "",
+						questionType: "sleepList",
+						question: [
+							{
+								name: "很差",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "差",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "一般",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "良好",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "睡眠时间",
+						type: 3,
+						value: "",
+						questionType: "sleepList",
+						question: [
+							{
+								name: "<6小时",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "6-8小时",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "9-10小时",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: ">10小时",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "经常熬夜吗?",
+						type: 3,
+						value: "",
+						questionType: "sleepList",
+						question: [
+							{
+								name: "经常",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "偶尔",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "很少",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "无",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},
+				],
+				sportList: [
+						{
+							name: "日常运动量",
+							type: 3,
+							value: "",
+							questionType: "sportList",
+							question: [
+								{
+									name: "久坐不动",
+									value: 1,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "轻度运动(3000-6000步)",
+									value: 2,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "中度运动(6000-10000步)",
+									value: 3,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "大量运动(一万步以上)",
+									value: 4,
+									isWrite: 0,
+									writeVal: ""
+								}
+							],
+						},{
+							name: "日常是否有运动?",
+							type: 2,
+							value: "",
+							questionType: "sportList",
+							question: [
+								{
+									name: "无",
+									value: 1,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "散步",
+									value: 2,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "跑步",
+									value: 3,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "自行车",
+									value: 4,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "舞蹈或太极拳",
+									value: 5,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "上下楼梯",
+									value: 6,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "球类",
+									value: 7,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "游泳",
+									value: 8,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "其他",
+									value: 9,
+									isWrite: 1,
+									writeVal: ""
+								}
+							],
+						},{
+							name: "您平均每周锻炼次数?",
+							type: 3,
+							value: "",
+							questionType: "sportList",
+							question: [
+								{
+									name: "≤2次",
+									value: 1,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "3-5次",
+									value: 2,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "≥5次",
+									value: 3,
+									isWrite: 0,
+									writeVal: ""
+								}
+							],
+						},{
+							name: "平均每次锻炼时间是多少分钟?",
+							type: 3,
+							value: "",
+							questionType: "sportList",
+							question: [
+								{
+									name: "≤20",
+									value: 1,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "20-40",
+									value: 2,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: "41-60",
+									value: 3,
+									isWrite: 0,
+									writeVal: ""
+								},{
+									name: ">60",
+									value: 3,
+									isWrite: 0,
+									writeVal: ""
+								}
+							],
+						}
+					]
+			}
+		},
+		
+		onLoad(option) {
+			this.formType = option.formType
+			if(this.formType=="dietList") {
+				this.list = this.dietList
+			}else if(this.formType=="sleepList") {
+				this.list = this.sleepList
+			}else if(this.formType=="sportList") {
+				this.list = this.sportList
+			}else if(this.formType=="healthLife") {
+				this.list = [...this.dietList,...this.sleepList,...this.sportList]
+			}else {
+				this.list = this.defaultList
+			}
+			const formTypeOption = {
+				"healthHistory": "填写疾病史",
+				"symptomHistory": "填写症状史",
+				"familyHistory": "填写家族史",
+				"drugHistory": "填写用药史",
+				"allergyHistory": "填写过敏史",
+				"dietList": "饮食",
+				"sleepList": "睡眠情况",
+				"sportList": "运动",
+				"healthLife": "生活习惯", // 包括 饮食、睡眠情况、运动
+			}
+			this.title = formTypeOption[this.formType] || ""
+			uni.setNavigationBarTitle({
+				title: this.title || "",
+			});
+			uni.$on('refreshOrderPatient', (res) => {
+				this.patient=res
+			})
+		},
+		onShow() {
+			this.user = {}
+			if (!this.$isLogin()) {
+				this.$showLoginPage();
+			} else {
+				this.user = this.$getUserInfo();
+				if(this.formType!="dietList" && this.formType!="sleepList"&&this.formType!="sportList"&& this.formType!='healthLife') {
+					this.getHealthHistoryTempList()
+				} else {
+					this.getHealthLife()
+				}
+			}
+		},
+		methods: {
+			addPatient(){
+				uni.navigateTo({
+					url: '/pages/user/patient'
+				})
+			},
+			handleEdit(index,i) {
+				this.chooseIndex = index
+				this.chooseItemIdx = i
+				this.focus = true
+				this.writeVal = this.list[index].question[i].writeVal
+				this.$refs.popup.open("bottom")
+			},
+			close() {
+				this.focus = false
+				this.$refs.popup.close()
+			},
+			// 输入
+			handleinput(e) {
+				this.writeVal = e.detail.value
+			},
+			popSubmit() {
+				this.list[this.chooseIndex].question[this.chooseItemIdx].writeVal = this.writeVal
+				this.close()
+			},
+			// 每周喝多少次
+			clearInput(event,option) {
+				// this.inputValue = event.detail.value;
+				option.writeVal = event.detail.value
+			},
+			// 健康生活
+			getHealthLife() {
+				const param = {
+					userId: this.user.userId
+				}
+				HealthLife(param).then(res => {
+						if (res.code == 200 && res.data) {
+							this.dietList = res.data.eat ? JSON.parse(res.data.eat) : this.dietList
+							this.sleepList = res.data.sleep ? JSON.parse(res.data.sleep) : this.sleepList
+							this.sportList = res.data.sport ? JSON.parse(res.data.sport) : this.sportList
+							
+							if (this.formType == "healthLife") {
+								this.list = [...this.dietList,...this.sleepList,...this.sportList]
+							} else {
+								this.list = this.formType == "dietList" ? this.dietList : this.formType == "sleepList" ? this.sleepList : this.formType == "sportList" ? this.sportList : []
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			
+			getHealthHistoryTempList() {
+				healthHistoryTempList().then(res => {
+						let list = []
+						if (res.code == 200 && res.data && res.data.length > 0) {
+							list = res.data.map(item => ({
+							    ...item,
+							    value: item.value || "",
+								required: true,
+							    question: JSON.parse(item.question).map((it, i) => ({
+							        ...it,
+							        writeVal: ""
+							    }))
+							}));
+						}
+						this.list = list.concat(this.defaultList)
+					},
+					rej => {}
+				);
+			},
+			// 单选
+			handleChoose(item,option) {
+				if(this.patient==null&&this.formType!="dietList" && this.formType!="sleepList"&&this.formType!="sportList"&& this.formType!='healthLife'){
+					uni.showToast({
+						icon:'none',
+						title: "请选择就诊人",
+					});
+					return;
+				}
+				if(item.name == '平时应酬' && option.name === '每周多少次') return
+				item.value = option.name
+			},
+			// 多选
+			handleMultiple(item,index,option) {
+				if(this.patient==null&&this.formType!="dietList" && this.formType!="sleepList"&&this.formType!="sportList"&& this.formType!='healthLife'){
+					uni.showToast({
+						icon:'none',
+						title: "请选择就诊人",
+					});
+					return;
+				}
+				const arry = item.value ? item.value.split(',') : []
+				if(arry.indexOf(option.name) === -1) {
+					arry.push(option.name)
+					item.value = arry.join(',')
+				} else {
+					arry.splice(arry.indexOf(option.name),1)
+					item.value = arry.join(',')
+				}
+			},
+			// 提交健康档案
+			handelSubmit() {
+				if(this.patient==null && this.formType!="dietList" && this.formType!="sleepList"&&this.formType!="sportList"&& this.formType!='healthLife'){
+					uni.showToast({
+						icon:'none',
+						title: "请选择就诊人",
+					});
+					return;
+				}
+				for (let i = 0; i < this.list.length; i++) {
+				// 检查当前项的字段是否有值
+				if (!this.list[i].value) {
+					uni.showToast({
+						title: "请检查健康档案是否填写完整",
+						icon: "none"
+					})
+				  return
+				}
+			  }
+			  const arry = this.list.map((item, index) => ({
+			    id: index + 1,
+			    name: item.name,
+			    sort: item.sort,
+			    type: item.type,
+			    value: item.value,
+			    questionType: item.questionType,
+				question: item.question.map(it=>({
+						...it,
+						writeVal: item.value.indexOf(it.name) == -1 && item.name != '平时应酬' && it.name != '每周多少次' ? '' : it.writeVal    // 清空没有选中的选项输入的文字,(除了应酬次数)
+					}))
+			  }));
+
+			  if(this.formType=="dietList" || this.formType=="sleepList" || this.formType=="sportList" || this.formType=='healthLife') {
+			  	this.submitHealthLife(arry)
+			  } else {
+			  	this.addHealthForm(arry)
+			  } 
+			},
+			
+			// 新增修改生活习惯
+			submitHealthLife(arry) {
+				// 判断字符串为正整数
+				const reg = /^[1-9]\d*$/
+				if(this.inputValue && !reg.test(this.inputValue)) {
+					uni.showToast({
+						title: "请输入正确的平时应酬次数",
+						icon: "none"
+					})
+					return
+				}
+				const filterByQuestionType = (questionType) => arry.filter(item => item.questionType && item.questionType === questionType);
+				
+				const eat = filterByQuestionType("dietList");
+				const sleep = filterByQuestionType("sleepList");
+				const sport = filterByQuestionType("sportList");
+				
+				const param = {
+					eat: eat && eat.length > 0 ? JSON.stringify(eat) : JSON.stringify(this.dietList),
+					sleep: sleep && sleep.length > 0 ? JSON.stringify(sleep) : JSON.stringify(this.sleepList),
+					sport: sport && sport.length > 0 ? JSON.stringify(sport) : JSON.stringify(this.sportList),
+				}
+				addFsHealthLife(param).then(res => {
+					this.btnLoading = false
+						if (res.code == 200) {
+							uni.showToast({
+								title: "保存成功",
+								icon: 'none',
+								duration: 1000,
+							});
+							var timer = setTimeout(function() {
+								uni.redirectTo({
+									url: "./index"
+								});
+								clearTimeout('timer')
+							}, 1000)
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none"
+							})
+						}
+					},
+					rej => {
+						this.btnLoading = false
+					}
+				).catch(()=>{
+					this.btnLoading = false
+				});
+			},
+			// 新增健康史
+			addHealthForm(arry) {
+				const filterByQuestionType = (questionType) => arry.filter(item => item.questionType && item.questionType === questionType);
+				
+				const symptomHistory = filterByQuestionType("symptomHistory");
+				const drugHistory = filterByQuestionType("drugHistory");
+				const allergyHistory = filterByQuestionType("allergyHistory");
+				const familyHistory = filterByQuestionType("familyHistory");
+				const healthHistory = arry.filter(item => !item.questionType);
+				
+				const param = {
+				  name: this.patient.patientName,
+				  sex: this.patient.sex, // this.patient.sex1男2女
+			      age: this.$getAge(this.patient.birthday),
+				  weight: undefined,
+				  height: undefined,
+				  bmi: undefined,
+				  symptomHistory: JSON.stringify(symptomHistory), // 症状史
+				  healthHistory: JSON.stringify(healthHistory), // 健康史
+				  drugHistory: JSON.stringify(drugHistory), // 用药史
+				  allergyHistory: JSON.stringify(allergyHistory), // 过敏史 
+				  familyHistory: JSON.stringify(familyHistory) // 家族史
+				};
+				
+				this.btnLoading = true
+				addRecord(param).then(res => {
+				   this.btnLoading = false
+						if(res.code == 200) {
+							uni.showToast({
+								title: "提交健康档案成功",
+								icon: 'none',
+								duration: 1000,
+							});
+							var timer = setTimeout(function() {
+								uni.redirectTo({
+									url: "/pages/healthRecords/index"
+								});
+								clearTimeout('timer')
+							}, 1000)
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none"
+							})
+						}
+					},
+					rej => {this.btnLoading = false}
+				).catch(()=>{
+					this.btnLoading = false
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.container {
+		position: relative;
+		font-family: PingFang SC, PingFang SC;
+		.jkda_top_bg {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: auto;
+		}
+		&-body {
+			position: relative;
+			padding: 32rpx 24rpx;
+			padding-bottom: calc(var(--window-bottom) + 152rpx);
+		}
+	}
+	.userbox {
+		padding: 32rpx;
+		margin-bottom: 20rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		@include u-flex(row, center,space-between);
+		overflow: hidden;
+		.userbind {
+			width: 100%;
+			padding: 8rpx 0;
+			font-weight: 400;
+			font-size: 34rpx;
+			color: #FF5C03;
+			@include u-flex(row, center,center);
+			image {
+				width: 48rpx;
+				height: 48rpx;
+				margin-right: 16rpx;
+			}
+		}
+		&-headimg {
+			flex-shrink: 0;
+			width: 140rpx;
+			height: 140rpx;
+		}
+		&-left {
+			flex-shrink: 0;
+			flex: 1;
+			@include u-flex(row, center,flex-start);
+		}
+		&-name {
+			@include u-flex(row, center,flex-start);
+			flex-wrap: wrap;
+			gap: 0 30rpx;
+		}
+		&-idcard {
+			font-weight: 500;
+			font-size: 28rpx;
+		}
+		&-info {
+			margin-left: 24rpx;
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			&-tag {
+				margin-top: 30rpx;
+				font-weight: 400;
+				font-size: 22rpx;
+				color: #FF5C03;
+				@include u-flex(row, center,flex-start);
+				view {
+					min-width: 62rpx;
+					height: 42rpx;
+					padding: 0 20rpx;
+					box-sizing: border-box;
+					background: #FCF0E7;
+					border-radius: 24rpx 24rpx 24rpx 24rpx;
+					text-align: center;
+					line-height: 42rpx;
+					margin-right: 14rpx;
+				}
+			}
+		}
+	}
+	.listbox {
+		padding: 32rpx 24rpx;
+		margin-bottom: 20rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222222;
+		&-titlebox {
+			font-weight: 600;
+			font-size: 34rpx;
+			white-space: normal;
+		}
+		&-titletag {
+			min-width: 80rpx;
+			height: 40rpx;
+			padding: 0 16rpx;
+			margin: 0 12rpx;
+			flex-shrink: 0;
+			box-sizing: border-box;
+			line-height: 40rpx;
+			text-align: center;
+			background: #FF5C03;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			display: inline-block;
+		}
+		&-option {
+			margin-top: 34rpx;
+			@include u-flex(row, center, flex-start);
+			flex-wrap: wrap;
+			gap: 18rpx;
+			&-flex {
+				@include u-flex(row, center, flex-start);
+				gap: 18rpx;
+			}
+			&-item {
+				display: inline-flex;
+				min-width: 206rpx;
+				min-height: 72rpx;
+				padding: 16rpx;
+				box-sizing: border-box;
+				border-radius: 16rpx 16rpx 16rpx 16rpx;
+				border: 2rpx solid #ECECEC;
+				align-items: center;
+				justify-content: center;
+			}
+		}
+		.otherinput {
+			width: 430rpx;
+			height: 72rpx;
+			overflow: hidden;
+			padding: 16rpx 24rpx;
+			box-sizing: border-box;
+			background: #F5F7FA;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #999999;
+			justify-content: flex-start;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+		.option-active{
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FF5C03;
+			background: #FCF0E7;
+			border: 2rpx solid #FF5C03;
+		}
+		&-choose {
+			@include u-flex(row, center, flex-start);
+			min-height: 86rpx;
+			image {
+				flex-shrink: 0;
+				width: 36rpx;
+				height: 36rpx;
+				margin-right: 18rpx;
+			}
+		}
+		.choose-input {
+			width: 430rpx;
+			height: 72rpx;
+			padding: 16rpx 24rpx;
+			box-sizing: border-box;
+			margin-left: 42rpx;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			border: 2rpx solid #ECECEC;
+			display: inline-flex;
+			align-items: center;
+			justify-content: flex-start;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #999999;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+		.dietary-survey {
+			@include u-flex(row, flex-start, flex-start);
+			flex-wrap: wrap;
+			gap: 18rpx;
+			margin-top: 36rpx;
+		}
+		.dietary-survey-iteml {
+			width: 206rpx;
+			display: inline-flex;
+			flex-direction: column;
+			align-items: center;
+			font-weight: 400;
+			font-size: 32rpx;
+			view {
+				width: 206rpx;
+				height: 90rpx;
+				background: #F5F7FA;
+				border-radius: 8rpx 8rpx 8rpx 8rpx;
+				border: 2rpx solid #ECECEC;
+				box-sizing: border-box;
+				margin-bottom: 20rpx;
+				text-align: center;
+				line-height: 90rpx;
+			}
+			
+			text {
+				font-size: 24rpx;
+				color: #757575;
+			}
+		}
+		.dietary-survey-item {
+			display: inline-flex;
+		}
+		.dietary-survey-input {
+			height: 90rpx;
+			@include u-flex(row, center, flex-start);
+			display: inline-flex;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #757575;
+			.uni-input {
+				width: 100rpx;
+				height: 72rpx;
+				padding: 0 10rpx;
+				text-align: center;
+				box-sizing: border-box;
+				margin: 0 10rpx;
+				background: #FFFFFF;
+				border-radius: 16rpx 16rpx 16rpx 16rpx;
+				border: 2rpx solid #ECECEC;
+			}
+		}
+		.dietary-survey-active {
+			color: #fff !important;
+			background: #FF5C03 !important;
+			border: 2rpx solid #FF5C03 !important;
+		}
+	}
+	.footer {
+		width: 100%;
+		height: 152rpx;
+		padding: 20rpx 24rpx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		box-shadow: 0rpx -6rpx 8rpx 0rpx rgba(114,114,114,0.1);
+		position: fixed;
+		bottom: var(--window-bottom);
+		left: 0;
+		&-btn {
+			height: 112rpx;
+			background: #FF5C03;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			font-weight: 600;
+			font-size: 34rpx;
+			color: #FFFFFF;
+			line-height: 112rpx;
+			text-align: center;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	.popbox {
+		background: #fff;
+		padding: 20rpx;
+		font-family: PingFang SC, PingFang SC;
+		color: #222222;
+		font-weight: 400;
+		font-size: 28rpx;
+		&-title {
+			font-weight: 600;
+			font-size: 34rpx;
+		}
+		&-desc {
+			margin: 20rpx 0;
+		}
+		.uni-textarea-wrapper {
+			@include u-flex(row, flex-end, space-between);
+		}
+		.textarea {
+			flex: 1;
+			max-height: 146rpx;
+			padding: 15rpx 24rpx;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			line-height: 36rpx;
+			border: 2rpx solid #ECECEC;
+			color: #222222;
+			font-weight: 400;
+			font-size: 28rpx;
+		}
+		.popbox-confirm-btn {
+			flex-shrink: 0;
+			width: 140rpx;
+			height: 70rpx;
+			margin-left: 10rpx;
+			background: #FF5C03;
+			border-radius: 16rpx;
+			color: #fff;
+			text-align: center;
+			line-height: 70rpx;
+		}
+	}
+</style>

+ 1004 - 0
pages/user/healthRecords/edit.vue

@@ -0,0 +1,1004 @@
+<template>
+	<view class="container">
+		<view class="container-body">
+			<!-- 问卷 -->
+			<view class="listbox multiplebox" v-for="(item,index) in list" :key="index">
+				<view class="listbox-titlebox">
+					<text>{{index + 1}}.</text>
+					<view class="listbox-titletag" v-if="item.type == 2">多选</view>
+					<text class="listbox-title">{{item.name}}</text>
+				</view>
+				<!-- 多选 -->
+				<view class="listbox-option" v-if="item.type == 2">
+					<view v-for="(option,i) in item.question" :key="i" class="listbox-option-flex">
+						<view
+							@click="handleMultiple(item,index,option)"
+							:class="item.value.indexOf(option.name) === -1 ? 'listbox-option-item' : 'listbox-option-item option-active'">
+							{{option.name}}
+						</view>
+						<view class="otherinput" v-if="option.isWrite == 1 && item.value.indexOf(option.name) !== -1" @click="handleEdit(index,i)">
+							{{option.writeVal || '请输入相关描述'}}
+						</view>
+					</view>
+				</view>
+				<!-- 单选 -->
+				<view style="margin-top: 20rpx;" v-if="item.type == 1">
+					<view class="listbox-choose" v-for="(option,i) in item.question" :key="i" @click="handleChoose(item,option)" >
+						<image class="choose-icon" v-if="item.value == option.name"
+							src="@/static/image/healthRecords/choose_icon.png" mode="aspectFill"></image>
+						<image class="choose-icon" v-if="item.value != option.name"
+							src="@/static/image/healthRecords/choose_no_icon.png" mode="aspectFill"></image>
+						<text style="flex-shrink: 0;">{{option.name}}</text>
+						<view class="choose-input" v-if="option.isWrite == 1 && item.value == option.name" @click.stop="handleEdit(index,i)">
+							{{option.writeVal || '请输入相关描述'}}
+						</view>
+					</view>
+				</view>
+				<!-- 饮食调查 -->
+				<view class="dietary-survey" v-if="item.type == 3">
+					<view class="dietary-survey-item" v-for="(option,i) in item.question" :key="i"
+						@click="handleChoose(item,option)">
+						<view class="dietary-survey-iteml" v-if="option.name !== '每周多少次'">
+							<view :class="item.value == option.name ? 'dietary-survey-active':''">{{i+1}}</view>
+							<text>{{option.name}}</text>
+						</view>
+						<view class="dietary-survey-input" v-if="item.name == '平时应酬' && option.name === '每周多少次' && option.writeVal">
+							每周{{option.writeVal || '--'}}次
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<uni-popup ref="popup">
+			<view class="popbox">
+				<view class="popbox-title" v-if="list&&list.length>0">{{chooseIndex+1}}.{{list[chooseIndex].name}}</view>
+				<view class="popbox-desc" v-if="list&&list.length>0">选项:{{list[chooseIndex].question[chooseItemIdx].name}}</view>
+				<view class="uni-textarea-wrapper">
+					<textarea class="textarea" placeholder-style="font-size: 28rpx;" :focus="focus" placeholder="请输入相关描述" :value="writeVal" @input="handleinput"/>
+					<view class="popbox-confirm-btn" v-if="this.formType!='dietList' && this.formType!='sleepList'&&this.formType!='sportList'" @click="popSubmit">确认</view>
+				</view>
+			</view>
+		</uni-popup>
+		<!-- footer -->
+		<view class="footer" v-if="this.formType!='dietList' && this.formType!='sleepList'&&this.formType!='sportList'">
+			<button class="footer-btn" :loading="btnLoading" :disabled="btnLoading" @click="handelSubmit">确认</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		HealthData,
+		healthHistoryTempList,
+		editRecord,
+		myRecord,
+		HealthLife
+	} from "@/api/healthRecords.js"
+	export default {
+		data() {
+			return {
+				focus: false,
+				chooseIndex: 0,
+				chooseItemIdx: 0,
+				writeVal: "",
+				btnLoading: false,
+				id: undefined,
+				formType: "",
+				title: "",
+				user: {},
+				list: [],
+				// 饮食调查
+				dietList: [
+					{
+						name: "三餐规律",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "非常规律",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "比较规律",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "没有规律",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "就餐习惯",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "暴饮暴食",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "压力大经常进食",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "就外就餐多",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "夜宵",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "不吃早餐",
+								value: 5,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "进食速度",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "大约20-30分钟",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大约10-20分钟",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大约5-10分钟",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "酒类",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "从不喝酒",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "每天",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大于3次/周",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "小于3次/周",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "平时应酬",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "多",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "一般",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "少",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "每周多少次",
+								value: 3,
+								isWrite: 1,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "喝水量",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "低于1000ml",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "1000ml-1500ml",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "1500ml-1700ml",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "1700ml以上",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "您每天吃的食物种类多吗?",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "种类非常多,12种以上",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "一般6-10种",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "种类较少3-5种",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "种类比较固定",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "您是否有抽烟习惯?",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "是",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "无",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},
+				],
+				sleepList: [
+					{
+						name: "睡眠状况",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "很差",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "差",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "一般",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "良好",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "睡眠时间",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "<6小时",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "6-8小时",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "9-10小时",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: ">10小时",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "经常熬夜吗?",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "经常",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "偶尔",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "很少",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "无",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},
+				],
+				sportList: [
+					{
+						name: "日常运动量",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "久坐不动",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "轻度运动(3000-6000步)",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "中度运动(6000-10000步)",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "大量运动(一万步以上)",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "日常是否有运动?",
+						type: 2,
+						value: "",
+						question: [
+							{
+								name: "无",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "散步",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "跑步",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "自行车",
+								value: 4,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "舞蹈或太极拳",
+								value: 5,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "上下楼梯",
+								value: 6,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "球类",
+								value: 7,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "游泳",
+								value: 8,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "其他",
+								value: 9,
+								isWrite: 1,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "您平均每周锻炼次数?",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "≤2次",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "3-5次",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "≥5次",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					},{
+						name: "平均每次锻炼时间是多少分钟?",
+						type: 3,
+						value: "",
+						question: [
+							{
+								name: "≤20",
+								value: 1,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "20-40",
+								value: 2,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: "41-60",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							},{
+								name: ">60",
+								value: 3,
+								isWrite: 0,
+								writeVal: ""
+							}
+						],
+					}
+				]
+			}
+		},
+		onLoad(option) {
+			this.id = option.id
+			this.formType = option.formType
+			const formTypeOption = {
+				"healthHistory": "填写疾病史",
+				"symptomHistory": "填写症状史",
+				"familyHistory": "填写家族史",
+				"drugHistory": "填写用药史",
+				"allergyHistory": "填写过敏史",
+				"dietList": "饮食",
+				"sleepList": "睡眠情况",
+				"sportList": "运动",
+			}
+			this.title = formTypeOption[this.formType] || ""
+			uni.setNavigationBarTitle({
+				title: this.title || "",
+			});
+		},
+		onShow() {
+			this.user = {}
+			if (!this.$isLogin()) {
+				this.$showLoginPage();
+			} else {
+				this.user = this.$getUserInfo();
+				if(this.formType=="dietList" || this.formType=="sleepList"||this.formType=="sportList") {
+					//this.getHealthLife()
+				} else {
+					this.getMyRecord()
+				}
+			}
+		},
+		methods: {
+			handleEdit(index,i) {
+				this.chooseIndex = index
+				this.chooseItemIdx = i
+				this.focus = true
+				this.writeVal = this.list[index].question[i].writeVal
+				this.$refs.popup.open("bottom")
+			},
+			close() {
+				this.focus = false
+				this.$refs.popup.close()
+			},
+			// 输入
+			handleinput(e) {
+				this.writeVal = e.detail.value
+			},
+			popSubmit() {
+				this.list[this.chooseIndex].question[this.chooseItemIdx].writeVal = this.writeVal
+				this.close()
+			},
+			// 健康生活回显
+			getHealthLife() {
+				const param = {
+					type: this.formType=="dietList" ? 1 : this.formType=="sleepList" ? 2 :this.formType=="sportList" ? 3 : undefined,
+					userId: this.user.userId
+				}
+				HealthLife(param).then(res => {
+						if (res.code == 200 && res.data) {
+							this.list = JSON.parse(res.data.formJson)
+						}
+					},
+					rej => {}
+				)
+			},
+			// 健康档案回显
+			getMyRecord() {
+				myRecord().then(res => {
+						if (res.code == 200 && res.data) {
+							if(this.formType) {
+								this.list = res.data[this.formType] ? JSON.parse(res.data[this.formType]) : []
+							}
+						}
+					},
+					rej => {}
+				)
+			},
+			// 单选
+			handleChoose(item,option) {
+				if(this.formType=="dietList" || this.formType=="sleepList"||this.formType=="sportList") return
+				if(item.name == '平时应酬' && option.name === '每周多少次') return
+				item.value = option.name
+			},
+			// 多选
+			handleMultiple(item, index, option) {
+				if(this.formType=="dietList" || this.formType=="sleepList"||this.formType=="sportList") return
+				const arry = item.value ? item.value.split(',') : []
+				if (arry.indexOf(option.name) === -1) {
+					arry.push(option.name)
+					item.value = arry.join(',')
+				} else {
+					arry.splice(arry.indexOf(option.name), 1)
+					item.value = arry.join(',')
+				}
+			},
+			// 提交健康档案
+			handelSubmit() {
+				for (let i = 0; i < this.list.length; i++) {
+					// 检查当前项的字段是否有值
+					if (!this.list[i].value) {
+						uni.showToast({
+							title: "请检查健康档案是否填写完整",
+							icon: "none"
+						})
+						return
+					}
+				}
+				const arry = this.list.map((item, index) => ({
+					id: index + 1,
+					name: item.name,
+					sort: item.sort,
+					type: item.type,
+					value: item.value,
+					questionType: item.questionType,
+					question: item.question.map(it=>({
+						...it,
+						writeVal: item.value.indexOf(it.name) == -1 ? '' : it.writeVal    // 清空没有选中的选项输入的文字
+					}))
+				}));
+				if(this.formType!="dietList" && this.formType!="sleepList" && this.formType!="sportList") {
+					this.editHealthForm(arry)
+				}
+			},
+			// 修改健康史
+			editHealthForm(arry) {			
+				const filterByQuestionType = (questionType) => arry.filter(item => item.questionType && item
+					.questionType === questionType);
+				
+				const symptomHistory = filterByQuestionType("symptomHistory");
+				const drugHistory = filterByQuestionType("drugHistory");
+				const allergyHistory = filterByQuestionType("allergyHistory");
+				const familyHistory = filterByQuestionType("familyHistory");
+				const healthHistory = arry.filter(item => !item.questionType);
+				
+				const param = {
+					id: Number(this.id || 0),
+					symptomHistory: this.formType == "symptomHistory" ? JSON.stringify(symptomHistory) : undefined, // 症状史
+					healthHistory: this.formType == "healthHistory" ? JSON.stringify(healthHistory) : undefined, // 健康史
+					drugHistory: this.formType == "drugHistory" ? JSON.stringify(drugHistory) : undefined, // 用药史
+					allergyHistory: this.formType == "allergyHistory" ? JSON.stringify(allergyHistory) : undefined, // 过敏史 
+					familyHistory: this.formType == "familyHistory" ? JSON.stringify(familyHistory) : undefined // 家族史
+				};
+				this.btnLoading = true
+				editRecord(param).then(res => {
+					this.btnLoading = false
+						if (res.code == 200) {
+							uni.showToast({
+								title: "修改成功",
+								icon: 'none',
+								duration: 1000,
+							});
+							var timer = setTimeout(function() {
+								uni.redirectTo({
+									url: "/pages/healthRecords/index"
+								});
+								clearTimeout('timer')
+							}, 1000)
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none"
+							})
+						}
+					},
+					rej => {
+						this.btnLoading = false
+					}
+				).catch(()=>{
+					this.btnLoading = false
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.container {
+		position: relative;
+		font-family: PingFang SC, PingFang SC;
+
+		&-body {
+			position: relative;
+			padding: 32rpx 24rpx;
+			padding-bottom: calc(var(--window-bottom) + 152rpx);
+		}
+	}
+
+	.userbox {
+		padding: 32rpx;
+		margin-bottom: 20rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		@include u-flex(row, center, space-between);
+		overflow: hidden;
+
+		.userbind {
+			width: 100%;
+			padding: 8rpx 0;
+			font-weight: 400;
+			font-size: 34rpx;
+			color: #FF5C03;
+			@include u-flex(row, center, center);
+
+			image {
+				width: 48rpx;
+				height: 48rpx;
+				margin-right: 16rpx;
+			}
+		}
+
+		&-headimg {
+			flex-shrink: 0;
+			width: 140rpx;
+			height: 140rpx;
+		}
+
+		&-left {
+			flex-shrink: 0;
+			flex: 1;
+			@include u-flex(row, center, flex-start);
+		}
+
+		&-name {
+			@include u-flex(row, center, flex-start);
+			flex-wrap: wrap;
+			gap: 0 30rpx;
+		}
+
+		&-idcard {
+			font-weight: 500;
+			font-size: 28rpx;
+		}
+
+		&-info {
+			margin-left: 24rpx;
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+
+			&-tag {
+				margin-top: 30rpx;
+				font-weight: 400;
+				font-size: 22rpx;
+				color: #FF5C03;
+				@include u-flex(row, center, flex-start);
+
+				view {
+					min-width: 62rpx;
+					height: 42rpx;
+					padding: 0 20rpx;
+					box-sizing: border-box;
+					background: #FCF0E7;
+					border-radius: 24rpx 24rpx 24rpx 24rpx;
+					text-align: center;
+					line-height: 42rpx;
+					margin-right: 14rpx;
+				}
+			}
+		}
+	}
+
+	.listbox {
+		padding: 32rpx 24rpx;
+		margin-bottom: 20rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #222222;
+
+		&-titlebox {
+			font-weight: 600;
+			font-size: 34rpx;
+			white-space: normal;
+		}
+
+		&-titletag {
+			min-width: 80rpx;
+			height: 40rpx;
+			padding: 0 16rpx;
+			margin: 0 12rpx;
+			flex-shrink: 0;
+			box-sizing: border-box;
+			line-height: 40rpx;
+			text-align: center;
+			background: #FF5C03;
+			border-radius: 8rpx 8rpx 8rpx 8rpx;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #FFFFFF;
+			display: inline-block;
+		}
+
+		&-option {
+			margin-top: 34rpx;
+			@include u-flex(row, center, flex-start);
+			flex-wrap: wrap;
+			gap: 18rpx;
+
+			&-flex {
+				@include u-flex(row, center, flex-start);
+				gap: 18rpx;
+			}
+
+			&-item {
+				display: inline-flex;
+				min-width: 206rpx;
+				min-height: 72rpx;
+				padding: 16rpx;
+				box-sizing: border-box;
+				border-radius: 16rpx 16rpx 16rpx 16rpx;
+				border: 2rpx solid #ECECEC;
+				align-items: center;
+				justify-content: center;
+			}
+		}
+
+		.otherinput {
+			width: 430rpx;
+			height: 72rpx;
+			overflow: hidden;
+			padding: 16rpx 24rpx;
+			box-sizing: border-box;
+			background: #F5F7FA;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #999999;
+			justify-content: flex-start;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+
+		.option-active {
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #FF5C03;
+			background: #FCF0E7;
+			border: 2rpx solid #FF5C03;
+		}
+
+		&-choose {
+			@include u-flex(row, center, flex-start);
+			min-height: 86rpx;
+
+			image {
+				flex-shrink: 0;
+				width: 36rpx;
+				height: 36rpx;
+				margin-right: 18rpx;
+			}
+		}
+
+		.choose-input {
+			width: 430rpx;
+			height: 72rpx;
+			padding: 16rpx 24rpx;
+			box-sizing: border-box;
+			margin-left: 42rpx;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			border: 2rpx solid #ECECEC;
+			display: inline-flex;
+			align-items: center;
+			justify-content: flex-start;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #999999;
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		}
+
+		.dietary-survey {
+			@include u-flex(row, flex-start, flex-start);
+			flex-wrap: wrap;
+			gap: 18rpx;
+			margin-top: 36rpx;
+		}
+		.dietary-survey-iteml {
+			width: 206rpx;
+			display: inline-flex;
+			flex-direction: column;
+			align-items: center;
+			font-weight: 400;
+			font-size: 32rpx;
+			view {
+				width: 206rpx;
+				height: 90rpx;
+				background: #F5F7FA;
+				border-radius: 8rpx 8rpx 8rpx 8rpx;
+				border: 2rpx solid #ECECEC;
+				box-sizing: border-box;
+				margin-bottom: 20rpx;
+				text-align: center;
+				line-height: 90rpx;
+			}
+			
+			text {
+				font-size: 24rpx;
+				color: #757575;
+			}
+		}
+		.dietary-survey-item {
+			display: inline-flex;
+		}
+		.dietary-survey-input {
+			width: 206rpx;
+			height: 90rpx;
+		}
+		.dietary-survey-active {
+			color: #fff !important;
+			background: #FF5C03 !important;
+			border: 2rpx solid #FF5C03 !important;
+		}
+	}
+
+	.footer {
+		width: 100%;
+		height: 152rpx;
+		padding: 20rpx 24rpx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		box-shadow: 0rpx -6rpx 8rpx 0rpx rgba(114, 114, 114, 0.1);
+		position: fixed;
+		bottom: var(--window-bottom);
+		left: 0;
+
+		&-btn {
+			height: 112rpx;
+			background: #FF5C03;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			font-weight: 600;
+			font-size: 34rpx;
+			color: #FFFFFF;
+			line-height: 112rpx;
+			text-align: center;
+			&::after {
+				border: none;
+			}
+		}
+	}
+	.popbox {
+		background: #fff;
+		padding: 20rpx;
+		font-family: PingFang SC, PingFang SC;
+		color: #222222;
+		font-weight: 400;
+		font-size: 28rpx;
+		&-title {
+			font-weight: 600;
+			font-size: 34rpx;
+		}
+		&-desc {
+			margin: 20rpx 0;
+		}
+		.uni-textarea-wrapper {
+			@include u-flex(row, flex-end, space-between);
+		}
+		.textarea {
+			flex: 1;
+			max-height: 146rpx;
+			padding: 15rpx 24rpx;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			line-height: 36rpx;
+			border: 2rpx solid #ECECEC;
+			color: #222222;
+			font-weight: 400;
+			font-size: 28rpx;
+		}
+		.popbox-confirm-btn {
+			flex-shrink: 0;
+			width: 140rpx;
+			height: 70rpx;
+			margin-left: 10rpx;
+			background: #FF5C03;
+			border-radius: 16rpx;
+			color: #fff;
+			text-align: center;
+			line-height: 70rpx;
+		}
+	}
+</style>

+ 930 - 0
pages/user/healthRecords/index.vue

@@ -0,0 +1,930 @@
+<template>
+	<view class="container">
+
+		<view class="nav-bar">
+				<view class="grace-page-header" :style="{ background:headerBG }">
+					<!-- 沉浸式状态栏 -->
+					<view class="grace-page-status-bar" :style="{background:statusBarBG}"></view>
+					<view class="content-header"  id="gracePageHeader" :style="{minHeight:headerHeight+'px', height:headerHeight+'px', overflow:'hidden'}">
+						<view class="content-header-l">
+							<!-- <image class="address" src="@/static/image/back.png" mode="aspectFill" @click="$navBack()"></image> -->
+						</view>
+						<view class="content-header-title">健康档案</view>
+						<!-- <image class="shareicon" src="@/static/images/white-share.png" mode="aspectFill" @click="doShare"></image> -->
+					</view>
+				</view>
+				<view class="nav_box">
+					<view class="status_bar"></view>
+					<view class="nav_bar"></view>
+				</view>
+		</view>
+		
+		<image class="jkda_top_bg" src="@/static/image/healthRecords/jkda_top_bg.png" mode="widthFix"></image>
+		
+		<view class="container-body">
+			<view class="userbox">
+				<view class="userbox-left">
+					<view class="userbox-headimg">
+						<image :src="defaultHeadimg" mode="aspectFill" style="width: 100%;height: 100%"></image>
+					</view>
+					<view class="userbox-info">
+						<view>{{recordInfo.name || ""}}</view>
+						<view class="userbox-info-tag">
+							<view>{{recordInfo.sex == 1 ? '男':recordInfo.sex == 2 ? '女':'未知' }}</view>
+							<view>{{recordInfo.age || "--"}}岁</view>
+						</view>
+					</view>
+				</view>
+				<!-- <view class="userbox-right">
+					<image src="@/static/image/healthRecords/right_arrow_right_icon.png" mode="aspectFill"></image>
+				</view> -->
+			</view>
+			
+			<view class="box-title">
+				<text>健康数据</text>
+				<!-- <view class="box-title-right">
+					<image src="@/static/image/healthRecords/edit_add_orange_icon.png" mode="aspectFill"></image>
+					<text>绑定智能设备</text>
+				</view> -->
+			</view>
+			
+			<view class="cardbox">
+				<view class="cardbox-item bmibox" style="height:auto">
+					<view class="cardbox-title">
+						<view>
+							<view class="cardbox-maintitle">BMI {{recordInfo.bmi || "--"}}</view>
+							<view class="bmibox-tagbox"><view class="bmibox-tag" v-if="recordInfo.bmi">{{fat}}</view></view>
+						</view>
+						<image src="@/static/image/healthRecords/BMI_icon.png" mode="aspectFill"></image>
+					</view>
+					<!-- <view class="bmibox-info" style="margin-top: 46rpx;">
+						<text class="bmibox-infolabel">身高</text>
+						<view class="bmibox-infoval">{{recordInfo.height || "--"}}cm</view>
+						<image class="bmibox-edit" src="@/static/image/healthRecords/services_edit_icon.png"
+							@click="handleEdit('height')"></image>
+					</view>
+					<view class="bmibox-info" style="margin-top: 12rpx;">
+						<text class="bmibox-infolabel">体重</text>
+						<view class="bmibox-infoval">{{recordInfo.weight || "--"}}kg</view>
+						<image class="bmibox-edit" src="@/static/image/healthRecords/services_edit_icon.png"
+							@click="handleEdit('weight')"></image>
+					</view> -->
+				</view>
+				<view class="cardbox-item bmibox" style="height:auto">
+					<!-- <view class="cardbox-title">
+						<view>
+							<view class="cardbox-maintitle">BMI {{recordInfo.bmi || "--"}}</view>
+							<view class="bmibox-tagbox"><view class="bmibox-tag" v-if="recordInfo.bmi">{{fat}}</view></view>
+						</view>
+						<image src="@/static/image/healthRecords/BMI_icon.png" mode="aspectFill"></image>
+					</view> -->
+					<view class="bmibox-info">
+						<text class="bmibox-infolabel">身高</text>
+						<view class="bmibox-infoval">{{recordInfo.height || "--"}}cm</view>
+						<image class="bmibox-edit" src="@/static/image/healthRecords/services_edit_icon.png"
+							@click="handleEdit('height')"></image>
+					</view>
+					<view class="bmibox-info" style="margin-top: 12rpx;">
+						<text class="bmibox-infolabel">体重</text>
+						<view class="bmibox-infoval">{{recordInfo.weight || "--"}}kg</view>
+						<image class="bmibox-edit" src="@/static/image/healthRecords/services_edit_icon.png"
+							@click="handleEdit('weight')"></image>
+					</view>
+				</view>
+				<!-- <view class="cardbox-item" v-for="(item,index) in healthData" :key="index">
+					<view class="cardbox-title">
+						<view>
+							<view class="cardbox-maintitle">{{item.title}}</view>
+							<view>{{item.desc}}</view>
+						</view>
+						<image :src="item.icon" mode="aspectFill"></image>
+					</view>
+					<view class="cardbox-res resnum">{{item.data || '--'}}</view>
+					<view class="cardbox-time">{{item.date && item.date.substring(5,16)}}</view>
+				</view> -->
+			</view>
+			
+			<!-- 健康史 -->
+			<view class="box-title">
+				<text>健康史</text>
+			</view>
+			<view class="cardbox">
+				<view class="health-item" v-for="(item,index) in healthRecordsList" :key="index" @click="handleEditHealth(item,1)">
+					<image class="health-bgicon" :src="item.bgicon"></image>
+					<view class="health-item-info">
+						<view class="cardbox-maintitle" style="margin-bottom: 0;">{{item.title}}</view>
+						<view class="text-overflow" style="margin-top: 20rpx;">{{item.desc || "尚未记录"}}</view>
+					</view>
+				</view>
+			</view>
+			
+			<!-- 生活习惯 -->
+			<view class="box-title">
+				<text>生活习惯</text>
+			</view>
+			<view class="cardbox">
+				<view class="health-item" v-for="(item,index) in livingHabits" :key="index" @click="handleEditHealth(item,2)">
+					<image class="health-bgicon" :src="item.bgicon"></image>
+					<view class="health-item-info">
+						<view class="cardbox-maintitle" style="margin-bottom: 0;">{{item.title}}</view>
+						<view class="text-overflow" style="margin-top: 20rpx;">{{item.desc || "尚未记录"}}</view>
+					</view>
+				</view>
+			</view>
+			
+		</view>
+		
+		<!-- 修改身高体重弹窗 -->
+		<uni-popup ref="popup" :mask-click="false">
+			<view class="popbox">
+				<view class="popbox-title">{{title}}</view>
+				<view class="uni-input-wrapper">
+					<input class="uni-input" type="number" focus :placeholder="placeholder" maxlength="5"
+						:value="inputValue" @input="clearInput" />
+					<image class="uni-icon" src="@/static/image/healthRecords/input_close_icon.png" v-if="showClearIcon"
+						@click="clearIcon"></image>
+					<text>{{title =="身高"?'cm':title =="体重"?'kg':''}}</text>
+				</view>
+				<view class="popbox-footer">
+					<button class="popbox-footer-btn cancel" @click="close">取消</button>
+					<button class="popbox-footer-btn confirm" :loading="btnLoading" :disabled="btnLoading"
+						@click="handleSubmit">确认</button>
+				</view>
+			</view>
+		</uni-popup>
+		
+		<!-- footer -->
+		<!-- 填写生活习惯的 -->
+		<view class="footer" >
+			<view class="footer-btn" @click="editHealthRecordLife">填写个人健康专属档案</view>
+		</view>
+		<!-- 分享弹窗 -->
+		<u-popup :show="showShare" @close="showShare = false" >
+			<share-box :shareItem="shareItem" :showCopy="false" @closeShare='showShare = false' ></share-box>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import {
+		myRecord,
+		HealthDataList,
+		HealthLife,
+		editRecord 
+	} from '@/api/healthRecords.js'
+	export default {
+		data() {
+			return {
+				opacity: 1,
+				hasRecord: true, //是否填过档案
+				user: {},
+				fat: "",
+				recordInfo: {},
+				title: "身高",
+				placeholder: "请输入身高",
+				showClearIcon: false,
+				inputValue: '',
+				btnLoading: false,
+				headerHeight:44,
+				statusBarBG:"none",
+				top:0,
+				defaultHeadimg:"../../../static/image/healthRecords/my_heads_icon.png",
+				healthData: [{
+					title: '血糖',
+					desc: '血糖健康监测',
+					data: '',
+					date: '',
+					icon: "../../../static/image/healthRecords/blood_sugar_icon.png",
+				}],
+				healthRecordsList: [
+					{
+						title: '疾病史',
+						type: "healthHistory",
+						desc: '',
+						bgicon: "../../../static/image/healthRecords/jbs_icon.png",
+					}, {
+						title: '症状史',
+						type: "symptomHistory",
+						desc: '',
+						bgicon: "../../../static/image/healthRecords/zzs_icon.png",
+					}, {
+						title: '家族史',
+						type: "familyHistory",
+						desc: '',
+						bgicon: "../../../static/image/healthRecords/jzs_icon.png",
+					}, {
+						title: '用药史',
+						type: "drugHistory",
+						desc: '',
+						bgicon: "../../../static/image/healthRecords/yys_icon.png",
+					}, {
+						title: '过敏史',
+						type: "allergyHistory",
+						desc: '',
+						bgicon: "../../../static/image/healthRecords/gms_icon.png",
+					}
+				],
+				livingHabits: [
+					{
+						title: '饮食',
+						desc: '',
+						type: "dietList",
+						bgicon: "../../../static/image/healthRecords/ys_icon.png",
+					}, {
+						title: '睡眠情况',
+						desc: '',
+						type: "sleepList",
+						bgicon: "../../../static/image/healthRecords/smqk_icon.png",
+					}, {
+						title: '运动',
+						desc: '',
+						type: "sportList",
+						bgicon: "../../../static/image/healthRecords/yd_icon.png",
+					}
+				],
+				showShare:false,
+				shareItem:{ imageUrl:"",title:"",path:"",isMini:true },
+			}
+		},
+		onShow() {
+			this.user = {}
+			if (!this.$isLogin()) {
+				this.$showLoginPage();
+			} else {
+				this.user = this.$getUserInfo();
+				this.getMyRecord()
+				// this.getHealthDataList()
+				this.getHealthLife()
+			}
+		},
+		onPageScroll(e) {
+			this.top=e.scrollTop;
+		},
+		computed: {
+			// 计算属性的 getter
+			headerBG:function() {
+				var top=this.top/88;
+				return 'rgba(255,92,3, ' + top + ')';
+			},
+		},
+		methods: {
+			getBmi() {
+				let fat = ""
+				if(this.recordInfo && JSON.stringify(this.recordInfo) != "{}") {
+					if(!this.$isEmpty(this.recordInfo.weight) && !this.$isEmpty(this.recordInfo.weight)) {
+						// 计算BMI值
+						this.recordInfo.bmi = Math.round(this.recordInfo.weight / Math.pow(this.recordInfo.height / 100, 2));
+						// 判断体重状态
+						if (this.recordInfo.bmi < 18.5) {
+						    fat = "偏瘦";
+						} else if (this.recordInfo.bmi < 24) {
+						    fat = "正常";
+						} else if (this.recordInfo.bmi < 28) {
+						    fat = "超重";
+						} else {
+						    fat = "肥胖";
+						}
+						
+						// 添加推荐体重
+						// let lowerBound = 18.5 * Math.pow(this.recordInfo.weight / 100, 2);
+						// let upperBound = 24 * Math.pow(this.recordInfo.weight / 100, 2); 
+					}
+				} else {
+					this.recordInfo.bmi = ""
+				}
+				this.fat = fat
+			},
+		    // 查询今日健康生活
+		    getHealthLife() {
+		    	const param = {
+		    		userId: this.user.userId
+		    	}
+		    	HealthLife(param).then(res => {
+		    			if (res.code == 200 && res.data) {
+		    				this.livingHabits[0].desc = res.data && res.data.eat ? this.resetData(JSON.parse(res.data.eat)) : ''
+		    				this.livingHabits[1].desc = res.data && res.data.sleep ? this.resetData(JSON.parse(res.data.sleep)) : ''
+		    				this.livingHabits[2].desc = res.data && res.data.sport ? this.resetData(JSON.parse(res.data.sport)) : ''
+		    			}
+		    		},
+		    		rej => {}
+		    	)
+		    },
+			// 填写生活习惯(每次都是新增)
+			editHealthRecordLife() {
+				uni.navigateTo({
+					url: "./add?formType=healthLife"
+				})
+			},
+			// 健康档案
+			getMyRecord() {
+				myRecord().then(res => {
+						if (res.code == 200) {
+							if(res.data) {
+								this.hasRecord = true
+								this.recordInfo = res.data
+								this.healthRecordsList[0].desc = res.data.healthHistory ? this.resetData(JSON.parse(res.data.healthHistory)) : ""
+								this.healthRecordsList[1].desc = res.data.symptomHistory ? this.resetData(JSON.parse(res.data.symptomHistory)) : ""
+								this.healthRecordsList[2].desc = res.data.familyHistory ? this.resetData(JSON.parse(res.data.familyHistory)) : ""
+								this.healthRecordsList[3].desc = res.data.drugHistory ? this.resetData(JSON.parse(res.data.drugHistory)) : ""
+								this.healthRecordsList[4].desc = res.data.allergyHistory ? this.resetData(JSON.parse(res.data.allergyHistory)) : ""
+							} else {
+								this.hasRecord = false
+								this.handelHealthRecord(1)
+							}
+						} else {
+							uni.showToast({
+								icon:'none',
+								title: res.msg,
+							});
+						}
+						this.getBmi()
+					},
+					rej => {}
+				)
+			},
+			resetData(data) {
+				let set = new Set();
+				data.forEach(item => {
+				  item.question.forEach(it => {
+				    if (item.value.includes(it.name)) {
+				      if (it.isWrite == 1 && it.writeVal) {
+				        const str = it.name + "(" + it.writeVal + ")";
+				        set.add(str);
+				      } else {
+				        set.add(it.name);
+				      }
+				    } else if(item.name == '平时应酬' && it.name === '每周多少次'){
+						if (it.writeVal) {
+						  const str = "每周" + it.writeVal + "次";
+						  set.add(str);
+						}
+					}
+				  });
+				});
+				return Array.from(set).join(",");
+			},
+			// 健康数据列表
+			getHealthDataList() {
+				const param = {
+					pageNum: 1,
+					pageSize: 10,
+					userId: this.user.userId
+				}
+				HealthDataList(param).then(res => {
+						if (res.code == 200 && res.data && res.data.length > 0) {
+							this.healthData[0].data = res.data[0].bloodSugar
+							this.healthData[0].date = res.data[0].creatTime
+						} else {
+							this.healthData[0].data = ""
+							this.healthData[0].date = ""
+						}
+					},
+					rej => {}
+				);
+			},
+			handelHealthRecord(type) {
+				if (type == 1) {
+					uni.redirectTo({
+						url: "./add"
+					})
+				} else {
+					uni.navigateTo({
+						url: "./add"
+					})
+				}
+			},
+			handleEditHealth(item,type) {
+				// type 1:修改健康史相关 2:修改生活习惯
+				if(type == 2) {
+					uni.navigateTo({
+						url: "./add?formType="+item.type
+					})
+				} else {
+					uni.navigateTo({
+						url: "./edit?id="+this.recordInfo.id + "&formType="+item.type
+					})
+				}
+			},
+			handleEdit(type) {
+				if (type == "height") {
+					this.title = "身高"
+					this.placeholder = "请输入身高"
+					this.inputValue = this.recordInfo.height || undefined
+				} else if (type == "weight") {
+					this.title = "体重"
+					this.placeholder = "请输入体重"
+					this.inputValue = this.recordInfo.weight || undefined
+				}
+				this.$refs.popup.open("center")
+			},
+			close() {
+				this.$refs.popup.close()
+			},
+			// 修改身高/体重
+			handleSubmit() {
+				if(this.title == "身高") {
+					// 判断字符串为正整数
+					const reg = /^[1-9]\d*$/
+					if(!reg.test(this.inputValue)) {
+						uni.showToast({
+							title: "请输入正确的身高",
+							icon: "none"
+						})
+						return
+					}
+				}
+				if(this.title == "体重") {
+					// 判断字符串为数字且保留一位小数
+					const reg = /^\d+(\.\d{1})?$/
+					if(!reg.test(this.inputValue) || this.inputValue == 0) {
+						uni.showToast({
+							title: "请输入正确的体重",
+							icon: "none"
+						})
+						return
+					}
+				}
+				const param = {
+					id: Number(this.recordInfo.id || 0),
+					weight: this.title == "体重" ? this.inputValue : undefined, 
+					height: this.title == "身高" ? this.inputValue : undefined,
+				};
+				
+				editRecord(param).then(res => {
+					this.btnLoading = false
+						if (res.code == 200) {
+							this.recordInfo.weight = this.title == "体重" ? this.inputValue : this.recordInfo.weight
+							this.recordInfo.height = this.title == "身高" ? this.inputValue : this.recordInfo.height
+							this.getBmi()
+							this.close()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: "none"
+							})
+						}
+					},
+					rej => {}
+				)
+			},
+			clearInput(event) {
+				this.inputValue = event.detail.value;
+				if (event.detail.value.length > 0) {
+					this.showClearIcon = true;
+				} else {
+					this.showClearIcon = false;
+				}
+			},
+			clearIcon() {
+				this.inputValue = '';
+				this.showClearIcon = false;
+			},
+			doShare() {
+				this.shareItem.title= "健康档案";
+				this.shareItem.imageUrl='https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230106/6b459adfb1004c1a96219bcdf07e337c.png';
+				this.shareItem.compressImage = 1
+				this.shareItem.isMini=true;
+				this.shareItem.path='/pages_user/healthRecords/index'
+				let cdn=uni.getStorageSync('h5Path');
+				this.shareItem.url=cdn+'/pages/user/healthRecords/index'
+				this.showShare=true;
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@mixin u-flex($flexD, $alignI, $justifyC) {
+		display: flex;
+		flex-direction: $flexD;
+		align-items: $alignI;
+		justify-content: $justifyC;
+	}
+	.shareicon {
+		height: 40rpx;
+		width: 40rpx;
+	}
+	.uni-nav-bar {
+		position: fixed;
+		top: 0;
+		left: 0;
+		width: 100%;
+		z-index: 999;
+		overflow: hidden;
+		.uni-nav-bar_bg {
+			width: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+	}
+	
+	.nav-bar{
+		.grace-page-header {
+			position: fixed;
+			width: 100%;
+			left: 0;
+			top: 0;
+			z-index: 98;
+			border-bottom: 0px solid #FFFFFF;
+			.grace-page-status-bar {
+				width: 100%;
+				height: var(--status-bar-height);
+			}
+			.grace-page-header-nav {
+				width: 100%;
+				display: flex;
+				flex-direction: row;
+				flex-wrap: nowrap;
+				align-items: center;
+				justify-content: space-between;
+			}
+		}
+		.title {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 500;
+			font-size: 32rpx;
+			color: #222222;
+			line-height: 44rpx;
+		}
+		.content-header {
+			height: 80rpx;
+			padding: 0 24rpx;
+			@include u-flex(row, center, space-between);
+			&-l {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 26rpx;
+				color: #FFFFFF;
+				line-height: 28rpx;
+				@include u-flex(row, center, flex-start);
+				.address {
+					width: 20rpx;
+					height: 30rpx;
+					margin-right: 6rpx;
+				}
+			}
+			&-title{
+				display: flex;
+				flex: 1;
+			    justify-content: center;
+				align-items: center;
+				font-size: 34rpx;
+				font-weight: 444;
+				color: #fff;
+			}
+		}
+	    
+		.nav_box{
+			width: 100%;
+			.status_bar {
+				height: var(--status-bar-height);
+				width: 100%;
+			}
+			.nav_bar {
+				height: 44px;
+				width: 100%;
+			}
+		}
+	
+	}
+	
+	
+	.container {
+		position: relative;
+		.jkda_top_bg {
+			position: absolute;
+			top:0;
+		    /* #ifdef H5 */
+			top:-20px ;
+			/* #endif */
+			left: 0;
+			
+			width: 100%;
+			height: auto;
+		}
+
+		&-body {
+			position: relative;
+			padding: 32rpx 24rpx;
+			// #ifndef H5
+			padding-top: calc(32rpx);
+			// #endif
+			// #ifdef H5
+			padding-top: calc(var(--status-bar-height) + 60rpx);
+			// #endif
+			padding-bottom: calc(var(--window-bottom) + 170rpx);
+		}
+	}
+
+	.popbox {
+		background-color: #fff;
+		width: 630rpx;
+		padding: 40rpx;
+		box-sizing: border-box;
+		border-radius: 32rpx 32rpx 32rpx 32rpx;
+		overflow: hidden;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+
+		&-title {
+			font-size: 34rpx;
+			color: #333333;
+			text-align: center;
+		}
+
+		.uni-input-wrapper {
+			width: 100%;
+			height: 78rpx;
+			margin-top: 36rpx;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			border: 2rpx solid #ECECEC;
+			padding: 0 24rpx;
+			@include u-flex(row, center, space-between);
+			.uni-icon {
+				flex-shrink: 0;
+				width: 32rpx;
+				height: 32rpx;
+			}
+		}
+
+		&-footer {
+			margin-top: 40rpx;
+			@include u-flex(row, center, space-between);
+			&-btn {
+				width: 248rpx;
+				height: 84rpx;
+				line-height: 84rpx;
+				border-radius: 42rpx;
+				font-size: 32rpx;
+				vertical-align: middle;
+				&::after {
+					border: none;
+				}
+			}
+			.cancel {
+				background: #F4F4F4;
+				color: #757575;
+			}
+
+			.confirm {
+				background: #FF5C03;
+				color: #FFFFFF;
+			}
+		}
+	}
+
+	.userbox {
+		padding: 32rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		@include u-flex(row, center, space-between);
+		&-headimg {
+			flex-shrink: 0;
+			width: 140rpx;
+			height: 140rpx;
+			image{
+				width: 140rpx;
+				height: 140rpx;
+				border-radius: 50%;
+			}
+		}
+
+		&-left {
+			flex-shrink: 0;
+			flex: 1;
+			@include u-flex(row, center, flex-start);
+		}
+
+		&-info {
+			margin-left: 24rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 32rpx;
+			color: #222222;
+			&-tag {
+				margin-top: 30rpx;
+				font-weight: 400;
+				font-size: 22rpx;
+				color: #FF5C03;
+				@include u-flex(row, center, flex-start);
+				view {
+					min-width: 62rpx;
+					height: 42rpx;
+					padding: 0 20rpx;
+					box-sizing: border-box;
+					background: #FCF0E7;
+					border-radius: 24rpx 24rpx 24rpx 24rpx;
+					text-align: center;
+					line-height: 42rpx;
+					margin-right: 14rpx;
+				}
+			}
+		}
+
+		&-right {
+			margin-left: 24rpx;
+			image {
+				width: 48rpx;
+				height: 48rpx;
+			}
+		}
+	}
+
+	.box-title {
+		height: 80rpx;
+		line-height: 80rpx;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 500;
+		font-size: 36rpx;
+		color: #222222;
+		margin: 20rpx 0;
+		@include u-flex(row, center, space-between);
+		&-right {
+			flex-shrink: 0;
+			min-width: 240rpx;
+			height: 64rpx;
+			padding: 0 32rpx;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			border-radius: 32rpx 32rpx 32rpx 32rpx;
+			font-size: 24rpx;
+			color: #FF5C03;
+			@include u-flex(row, center, center);
+
+			image {
+				width: 24rpx;
+				height: 24rpx;
+				margin-right: 8rpx;
+			}
+		}
+	}
+
+	.cardbox {
+		@include u-flex(row, center, flex-start);
+		flex-wrap: wrap;
+		gap: 16rpx 14rpx;
+
+		&-item {
+			width: 344rpx;
+			height: 264rpx;
+			background: #FFFFFF;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			padding: 24rpx 24rpx 24rpx 24rpx;
+			box-sizing: border-box;
+			overflow: hidden;
+		}
+		.bmibox-tagbox {
+			min-width: 72rpx;
+			height: 40rpx;
+		}
+		.bmibox {
+			&-tag {
+				min-width: 72rpx;
+				height: 40rpx;
+				line-height: 40rpx;
+				text-align: center;
+				padding: 0 12rpx;
+				box-sizing: border-box;
+				display: inline-block;
+				background: #FCF0E7;
+				border-radius: 8rpx 8rpx 8rpx 8rpx;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #FF5C03;
+			}
+
+			&-info {
+				@include u-flex(row, center, flex-start);
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 24rpx;
+				color: #999999;
+			}
+
+			&-infolabel {
+				min-width: 48rpx;
+				flex-shrink: 0;
+			}
+
+			&-infoval {
+				flex: 1;
+				padding: 0 12rpx;
+				text-align: center;
+				font-weight: 500;
+				color: #222222;
+			}
+
+			&-edit {
+				width: 32rpx;
+				height: 32rpx;
+				flex-shrink: 0;
+			}
+		}
+
+		&-maintitle {
+			margin-bottom: 4rpx;
+			font-weight: 600;
+			font-size: 30rpx;
+			color: #333333;
+		}
+
+		&-title {
+			@include u-flex(row, center, space-between);
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #999999;
+
+			image {
+				width: 72rpx;
+				height: 72rpx;
+				flex-shrink: 0;
+			}
+		}
+
+		.resnum {
+			font-family: DIN, DIN;
+			font-weight: 500;
+			font-size: 64rpx;
+		}
+
+		&-res {
+			height: 78rpx;
+			margin: 20rpx 0 6rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 48rpx;
+			color: #333333;
+		}
+
+		&-time {
+			font-weight: 400;
+			font-size: 22rpx;
+			color: #999999;
+		}
+	}
+
+	.health-item {
+		width: 343rpx;
+		height: 224rpx;
+		padding: 24rpx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		border-radius: 16rpx 16rpx 16rpx 16rpx;
+		overflow: hidden;
+		position: relative;
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 400;
+		font-size: 24rpx;
+		color: #999999;
+	}
+
+	.health-item-info {
+		position: relative;
+	}
+
+	.health-bgicon {
+		position: absolute;
+		right: 0;
+		bottom: 0;
+		width: 168rpx;
+		height: 168rpx;
+	}
+
+	.text-overflow {
+		word-break:break-all;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 4;
+		-webkit-box-orient: vertical;
+	}
+
+	.footer {
+		width: 100%;
+		height: 152rpx;
+		padding: 20rpx 24rpx;
+		box-sizing: border-box;
+		background: #FFFFFF;
+		box-shadow: 0rpx -6rpx 8rpx 0rpx rgba(114, 114, 114, 0.1);
+		position: fixed;
+		bottom: var(--window-bottom);
+		left: 0;
+
+		&-btn {
+			height: 112rpx;
+			background: #FF5C03;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 34rpx;
+			color: #FFFFFF;
+			line-height: 112rpx;
+			text-align: center;
+		}
+	}
+</style>

+ 648 - 0
pages/user/healthReport.vue

@@ -0,0 +1,648 @@
+<template>
+	<view class="content">
+		<!-- 个人信息 -->
+		<view :style="{height:statusBarHeight}"></view>
+		<view class="top-box" >
+			<view class="back-box x-f">
+				<image src="/static/image/device/back_icon32.png"></image>
+				<view @click="goBack()">返回</view>
+			</view>
+			<view class="tab-box">
+				健康报告
+			</view>
+<!-- 			<view :style="{width: width < height ?'18px':'102px'}"></view> -->
+		</view>
+		<view class="user-info">
+			<view class="info-box">
+				<view class="left">
+					<view class="head-box">
+						<image class="img" src="@/static/images/pages_watch/images/my_heads_icon.png" mode="aspectFill">
+						</image>
+					</view>
+					<view class="info">
+						<text class="name one-t">{{userInfo.username}}</text>
+						<div class="info-top">
+							<text class="sex">性别:{{userInfo.sex==1?'男':userInfo.sex==0?'女':'-'}}</text>
+							<text>年龄:{{userInfo.age|| '-'}}岁</text>
+						</div>
+						<div class="phone">
+							手机号:{{userInfo.phone|| '-'}}
+						</div>
+					</view>
+				</view>
+				<!-- <image  class="right" src="@/static/image/my/icon_edit.png" mode="aspectFill" @click="editInfo"></image> -->
+			</view>
+			<view class="userinfo-list x-bc">
+				<view class="userinfo-item x-bc">
+					<view>
+						<view>身高</view>
+						<view style="margin-top: 8rpx;"><text class="num">{{userInfo.height || '--'}}</text>cm</view>
+					</view>
+					<image src="@/static/images/pages_watch/icons/height_icon.png" mode="aspectFill"></image>
+				</view>
+				<view class="userinfo-item x-bc">
+					<view>
+						<view>体重</view>
+						<view style="margin-top: 8rpx;"><text class="num">{{userInfo.weight || '--'}}</text>kg</view>
+					</view>
+					<image src="@/static/images/pages_watch/icons/weight_icon.png" mode="aspectFill"></image>
+				</view>
+			</view>
+			<view class="userinfo-list x-bc">
+				<view class="userinfo-item">
+					<view>
+						<view>既往病史</view>
+						<view style="margin-top: 8rpx;height: 80rpx;" class="two-t"><text
+								class="txt">{{userInfo.previousMedicalHistory|| '--'}}</text></view>
+					</view>
+					<!-- <image src="@/static/images/pages_watch/icons/weight_icon.png" mode="aspectFill"></image> -->
+				</view>
+				<view class="userinfo-item">
+					<view>
+						<view>过敏史</view>
+						<view style="margin-top: 8rpx;height: 80rpx;" class="two-t"><text
+								class="txt">{{userInfo.historyOfAllergies|| '--'}}</text></view>
+					</view>
+					<!-- <image src="@/static/image/healthRecords/gms_icon.png" mode="aspectFill"></image> -->
+				</view>
+			</view>
+		</view>
+		<!-- 详细信息 -->
+		<view class="info-detail">
+			<view class="item">
+				<view class="x-bc">
+					<text class="label">舌诊</text>
+					<text class="time">{{infoTongue.createTime||'-'}}</text>
+				</view>
+
+				<view class="content" v-if="infoTongue">
+					<view class="desc">
+						{{infoTongue.taiseName||'无'}}:{{infoTongue.taiseDesc||'-'}}
+					</view>
+					<view class="desc">
+						{{infoTongue.shemianName||'无'}}:{{infoTongue.shemianDesc||'-'}}
+					</view>
+					<view class="desc">
+						{{infoTongue.botai==1?"有剥苔":"未见剥苔"}}:{{infoTongue.botaiDesc||'-'}}
+					</view>
+					<view class="desc">
+						{{infoTongue.liewen==1?"有裂纹":"未见裂纹"}}:{{infoTongue.liewenDesc||'-'}}
+					</view>
+					<view class="desc">
+						{{infoTongue.chihen==1?"有齿痕":"未见齿痕"}}:{{infoTongue.chihenDesc||'-'}}
+					</view>
+				</view>
+			</view>
+			<view class="item column">
+				<view class="left">
+					<view class="x-bc">
+						<text class="label">面诊</text>
+						<text class="time">{{formatCreateTime(infoSurface.createTime)||'-'}}</text>
+					</view>
+					<view class="content">
+						<view class="desc">
+							面色:{{infoSurface.complexionResult||'-'}}
+						</view>
+						<view class="desc">
+							区域色斑:{{infoSurface.spotProblems||'-'}}
+						</view>
+						<view class="desc">
+							浮肿特征:{{infoSurface.swellingProblems||'-'}}
+						</view>
+						<view class="desc">
+							光泽度:{{infoSurface.glowResult||'-'}}
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="item">
+				<view class="x-bc">
+					<text class="label">脉诊</text>
+					<text class="time">{{infoPulse.createTime||'-'}}</text>
+				</view>
+				<view class="content">
+					<view class="desc">
+						左手:{{leftHandResult}}
+					</view>
+					<view class="desc">
+						右手:{{rightHandResult}}
+					</view>
+					<view class="desc">
+						脉搏总结:{{infoPulse.pulseSummary||'-'}}
+					</view>
+				</view>
+			</view>
+
+		</view>
+		<view class="footer" @click="addApp">
+			<text>更多报告详情,请下载芳华未来APP</text>
+		</view>
+		<view v-if="isCode" class="mask">
+			<view class="popup-container2">
+				<view class="title-t">扫码下载APP</view>
+				<!-- <view class="title-r">点击确认查看检测报告</view> -->
+				<image style="width: 200px;height: 200px;margin-bottom: 20px;" src="@/static/images/afangh.png"></image>
+				<view class="btn-r" @click="closeP">关闭</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		getUserInfoByUserId,
+		selectQueryFsUser,
+		getDiagnosis
+	} from '@/api/user.js';
+	export default {
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				avatar: "",
+				nickName: "",
+				deptName: "",
+				postNames: "",
+				phonenumber: "",
+				email: "",
+				sex: "",
+				isShow: false,
+				isCode:false,
+				userId: undefined,
+				userInfo: {},
+				infoTongue: {},
+				infoSurface: {},
+				infoPulse: {},
+				leftHandResult:null,
+				rightHandResult:null,
+				userId:null
+			}
+		},
+		onLoad(options) {
+			if (options.userId) {
+				this.userId=options.userId
+				this.getDiagnosis(this.userId)
+			}
+			//this.getDiagnosis('4054874814')
+		},
+		onShow() {
+
+		},
+		methods: {
+			goBack(){
+				uni.navigateBack({
+					delta:1
+				})
+			},
+			formatCreateTime(rawTime) {
+				// 先处理“无时间”的情况,返回默认值 "-"
+				if (!rawTime) return "-";
+
+				const date = new Date(rawTime); // 将原始时间转为 Date 对象
+				const year = date.getFullYear();
+				const month = String(date.getMonth() + 1).padStart(2, "0"); // 月份从0开始,补0成两位数
+				const day = String(date.getDate()).padStart(2, "0"); // 日期补0
+				const hour = String(date.getHours()).padStart(2, "0"); // 小时补0
+				const minute = String(date.getMinutes()).padStart(2, "0"); // 分钟补0
+				const second = String(date.getSeconds()).padStart(2, "0");
+				// 返回最终格式(可按需调整,如只显示日期则去掉 hour:minute)
+				return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
+			},
+			closeP(){
+				this.isCode=false
+			},
+			addApp() {
+				this.isCode=true
+				// let platform = uni.getSystemInfoSync().platform;
+				// // let isAndroid=platform=="android";
+				// if (platform === 'android') {
+				// 	// #ifdef H5
+				// 	window.open("https://m.malink.cn/s/2UZjMz", '_blank');
+				// 	// #endif
+				// } else if(platform === 'ios'){
+				// 	// #ifdef H5
+				// 	window.open("https://apps.apple.com/cn/app/%E8%8A%B3%E5%8D%8E%E6%9C%AA%E6%9D%A5/id6738688148",
+				// 		'_blank');
+				// 	// #endif
+				// }
+			},
+			selectQueryFsUser(userId) {
+				uni.showLoading({
+					title: '加载中'
+				})
+				var data = {
+					userId: userId
+				};
+				selectQueryFsUser(data).then(
+					res => {
+						if (res.code == 200) {
+							this.userInfo = res.data
+							uni.hideLoading()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							uni.hideLoading()
+						}
+					},
+					rej => {}
+				);
+			},
+			getDiagnosis(userId) {
+				uni.showLoading({
+					title: '加载中'
+				})
+				var data = {
+					userId: userId
+				};
+				getDiagnosis(data).then(
+					res => {
+						if (res.code == 200) {
+							this.userInfo = res.data.user
+							this.infoSurface = res.data.HealthSurface?res.data.HealthSurface:'暂无信息'
+							this.infoTongue = res.data.HealthTongue?res.data.HealthTongue:'暂无信息'
+							this.infoPulse = res.data.HealthPulse?res.data.HealthPulse:'暂无信息'
+							this.leftHandResult=res.data.HealthPulse.leftHandResult?JSON.parse(res.data.HealthPulse.leftHandResult).leftHandResult:'-'
+							this.rightHandResult=res.data.HealthPulse.rightHandResult?JSON.parse(res.data.HealthPulse.rightHandResult).rightHandResult:'-'
+							uni.hideLoading()
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+							uni.hideLoading()
+						}
+					},
+					rej => {}
+				);
+			},
+		}
+	}
+</script>
+
+
+<style scoped lang="scss">
+	page {
+		background: linear-gradient(#FBF4EE 0%, #fff 100%);
+		background-repeat: no-repeat;
+	}
+	
+	.top-box {
+		padding: 0 24rpx;
+		margin-top: 20px;
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-bottom: 30px;
+	
+		.title {
+			font-family: Source Han Serif CN, Source Han Serif CN;
+			font-weight: bold;
+			font-size: 30px;
+			color: #8F6726;
+			text-align: center;
+		}
+	     .tab-box{
+			 font-size: 36rpx;
+			 color: #8F6726;
+		 }
+		.back-box {
+			width: 102px;
+			height: 47px;
+			background: #FFFFFF;
+			border-radius: 6px 6px 6px 6px;
+			border: 1px solid #8F6726;
+			// padding: 12px 8px;
+			justify-content: center;
+	
+			view {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #8F6726;
+				text-align: center;
+				margin-left: 10px;
+			}
+	
+			// position: absolute;
+			// left: 30px;
+			image {
+				width: 24px;
+				height: 24px;
+			}
+		}
+	
+		.select {
+			min-width: 160px;
+			height: 47px;
+			background: #FFFFFF;
+			border-radius: 6px 6px 6px 6px;
+			border: 1px solid #8F6726;
+			padding: 12px;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+	
+			image {
+				width: 24px;
+				height: 24px;
+	
+				&:last-child {
+					width: 12px;
+					height: 12px;
+				}
+			}
+	
+			.date {
+				width: 100%;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+			}
+	
+			.text {
+				margin-left: 10px;
+				margin-right: 10px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #8F6726;
+				text-align: center;
+			}
+		}
+	}
+.mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 999;
+		animation: fadeIn 0.3s ease;
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container2 {
+		//width: 50%;
+		min-height: 250px;
+		background: #FBF4EE;
+		border-radius: 12px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: space-between;
+		padding: 30px 50px;
+
+		.title-t {
+			font-size: 24px;
+			font-weight: bold;
+			color: #8F6726;
+			text-align: center;
+			margin-bottom: 20px;
+		}
+
+		.title-r {
+			font-size: 20px;
+			color: #8F6726;
+			text-align: center;
+			padding: 20px 0;
+		}
+
+		.btn-r {
+			text-align: center;
+			background: #8F6726;
+			font-size: 20px;
+			color: #FBF4EE;
+			border-radius: 12px;
+			width: 100%;
+			height: 50px;
+			line-height: 50px;
+		}
+	}
+
+	.one-t {
+		white-space: nowrap;
+		/* 强制文本不换行 */
+		overflow: hidden;
+		/* 隐藏超出容器的内容 */
+		text-overflow: ellipsis;
+		/* 超出部分显示省略号 */
+	}
+
+	.two-t {
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 2;
+		/* 强制显示2行,超出部分省略 */
+		overflow: hidden;
+	}
+
+	.content {
+		padding-bottom: 30rpx;
+		// background: #FBF4EE;
+		// 个人信息
+		.user-info {
+			// background: #FBF4EE;
+			padding: 0 24rpx;
+
+			.info-box {
+				margin-top: 20rpx;
+				margin-bottom: 20rpx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				background: #FFFFFF;
+				border-radius: 16rpx 16rpx 16rpx 16rpx;
+
+				.left {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					padding: 20rpx;
+
+					.head-box {
+						width: 120rpx;
+						height: 120rpx;
+						line-height: 100rpx;
+						font-size: 30rpx;
+						text-align: center;
+						margin-right: 20rpx;
+
+						.img {
+							border-radius: 50%;
+							width: 100%;
+							height: 100%;
+						}
+					}
+
+					.info {
+						width: calc(100% - 140rpx);
+						height: 120rpx;
+						display: flex;
+						flex-direction: column;
+						justify-content: space-between;
+						color: #333;
+
+						.name {
+							font-size: 30rpx;
+
+						}
+
+						.info-top {
+							color: #999999;
+							font-size: 24rpx;
+
+							.sex {
+								margin-right: 20rpx;
+							}
+						}
+
+						.phone {
+							font-size: 24rpx;
+							color: #999999;
+						}
+
+						.title {
+							font-size: 28rpx;
+						}
+					}
+				}
+
+				.right {
+					width: 40rpx;
+					height: 40rpx;
+				}
+			}
+
+			.userinfo-list {
+				margin: 0 -16rpx 0 0;
+
+				.userinfo-item {
+					flex: 1;
+					min-height: 136rpx;
+					padding: 24rpx;
+					box-sizing: border-box;
+					margin: 0 16rpx 16rpx 0;
+					background: #FFFFFF;
+					border-radius: 16rpx 16rpx 16rpx 16rpx;
+					font-family: PingFang SC;
+					font-weight: 400;
+					font-size: 24rpx;
+					color: #757575;
+
+					image {
+						width: 56rpx;
+						height: 56rpx;
+					}
+
+					.num {
+						font-family: DIN, DIN;
+						font-weight: 500;
+						font-size: 36rpx;
+						color: #333333;
+						margin-right: 10rpx;
+					}
+
+					.txt {
+						font-family: PingFang SC;
+						font-weight: 500;
+						font-size: 24rpx;
+						color: #333333;
+					}
+				}
+			}
+
+			.comp-info {
+				padding: 20rpx 0 40rpx;
+				display: flex;
+				align-items: center;
+
+				.img {
+					width: 30rpx;
+					height: 30rpx;
+					margin-right: 20rpx;
+				}
+
+				.text {
+					font-size: 30rpx;
+					color: #fff;
+				}
+			}
+		}
+
+		// 详细信息
+		.info-detail {
+			padding: 0 24rpx;
+			margin-top: 20rpx;
+			overflow: hidden;
+
+			.item {
+				margin-bottom: 20rpx;
+				border-bottom: 1px solid #f7f7f7;
+				display: flex;
+				flex-direction: column;
+				justify-content: space-between;
+
+				.label {
+					font-size: 36rpx;
+					font-weight: bold;
+					margin-right: 20rpx;
+				}
+
+				.time {
+					font-weight: 400;
+					font-size: 24rpx;
+					color: #666666;
+				}
+
+				.content {
+					margin-top: 20rpx;
+					padding: 20rpx;
+					font-family: PingFang SC;
+					font-weight: 400;
+					font-size: 28rpx;
+					background: #FFFFFF;
+					border-radius: 16rpx 16rpx 16rpx 16rpx;
+					border: 1px solid #FBF4EE;
+
+					.desc {
+						margin-bottom: 20rpx;
+						padding-left: 20rpx;
+						position: relative;
+						line-height: 40rpx;
+
+						&::before {
+							content: '';
+							position: absolute;
+							z-index: 9;
+							top: 15rpx;
+							left: 0;
+							width: 10rpx;
+							height: 10rpx;
+							background: #8F6726;
+							border-radius: 5rpx;
+						}
+					}
+				}
+			}
+		}
+
+		.footer {
+			margin: 30rpx 20rpx 0;
+			padding: 20rpx 0;
+			border-radius: 16rpx 16rpx 16rpx 16rpx;
+			background: #8F6726;
+			font-size: 28rpx;
+			color: #fff;
+			text-align: center;
+		}
+	}
+</style>

+ 984 - 0
pages/user/myUserList.vue

@@ -0,0 +1,984 @@
+<template>
+	<view class="border-box">
+		<view class="content">
+			<view class="top-box">
+				<view class="back-box x-f">
+					<image src="/static/image/device/back_icon32.png"></image>
+					<view @click="goBack()">返回</view>
+				</view>
+				<view class="tab-box">
+					<view v-for="(item,index) in tabs" :key="index" :class="aIndex==item.val?'item active':'item'"
+						@click="getTab(item)">
+						{{item.name}}
+					</view>
+				</view>
+				<view :style="{width: width < height ?'18px':'138px'}"></view>
+			</view>
+			<view class="btn-box x-bc" :class="{ 'flex-box': width < height }">
+				<view class="x-f dl">
+					<view class="search">
+						<image src="/static/image/device/search_icon25.png"></image>
+						<input type="text" placeholder="请输入客户姓名或者手机号" v-model="keyword" @confirm="rightTap" />
+					</view>
+					<view class="dateBox">
+						<picker mode="date" @change="createTimesChange" style="width: 100%;">
+							<view class="date x-bc">
+								<text class="text" :style="{color:createTimes!=='' ?'#222':'#999'}">
+									{{createTimes!=='' ? createTimes: '请选择服务时间'}}
+								</text>
+								<image src="/static/image/device/calendar_icon24.png"></image>
+							</view>
+						</picker>
+					</view>
+				</view>
+				<view class="x-f dr">
+					<view class="rest" @click="clear">重置</view>
+					<view class="export" @click="toExport">
+						<image src="/static/image/device/cp_download_icon24.png"></image>
+						导出
+					</view>
+				</view>
+			</view>
+			<view class="user-list" :class="{ 'flex-box': width < height }">
+				<view class="table-title x-f">
+					<view class="col col-1">序号</view>
+					<view class="col col-2">客户账号</view>
+					<view class="col col-2">名称</view>
+					<view class="col col-1">性别</view>
+					<!-- <view class="col col-2">客户关系</view> -->
+					<!-- <view class="col col-1">年龄</view> -->
+					<view class="col col-2">手机号</view>
+					<view class="col col-3">上次服务时间</view>
+					<view class="col col-2">服务类型</view>
+					<view class="col col-2">推荐产品</view>
+					<view class="col col-3">操作</view>
+				</view>
+
+				<view class="table-item" v-for="(item,index) in dataList" :key="index">
+					<view class="col col-1">{{index+1}}</view>
+					<view class="col col-2">{{item.username||'--'}}</view>
+					<view class="col col-2">{{item.nickName||'--'}}</view>
+					<view class="col col-1">{{item.sex==1?"男":"女"}}</view>
+					<!-- <view class="col col-2">--</view> -->
+					<!-- <view class="col col-1">{{item.birthday||'--'}}</view> -->
+					<view class="col col-2">{{item.phone||'--'}}</view>
+					<view class="col col-3">{{item.createTimes||'--'}}</view>
+					<view class="col col-2">体质辨识</view>
+					<view class="col col-2">{{item.product||'无'}}</view>
+					<view class="col col-3 btn-box">
+						<view class="btn" @click="goList(item.userId)">体质辨识</view>
+						<view class="btn">开方详情</view>
+					</view>
+				</view>
+
+			</view>
+			<view v-if="showDetail" class="mask">
+				<view class="popup-container2">
+					<view class="title-t">温馨提示</view>
+					<view class="title-r">检测报告请下载芳华未来APP查看</view>
+					<view class="btn-r" @click="closeP">确认</view>
+				</view>
+			</view>
+			<view v-if="showList" class="mask">
+				<!-- 弹窗内容 -->
+				<view class="popup-container">
+					<!-- 弹窗头部 -->
+					<view class="popup-header">
+						<text class="popup-title">选择体质辨识</text>
+						<view class="close-btn" @click="onCloseList">
+							<image src="/static/image/device/close_icon32.png"></image>
+						</view>
+					</view>
+					<!-- 弹窗主体内容 -->
+					<view class="popup-content">
+						<view class="userList-box">
+							<view class="userList" v-if="reportList.length>0">
+								<view class="item" v-for="(item,index) in reportList" :key="index">
+									<view class="title x-f">
+										<view>报告日期:{{item.createTimes||''}}</view>
+										<view style="margin-left: 30px;">报告编号:{{item.numberId||''}}</view>
+									</view>
+									<view class="right-box">
+										<view class="rest" @click="onOpenDetail(item)">
+											查看
+										</view>
+									</view>
+								</view>
+							</view>
+
+						</view>
+						<view v-if="reportList.length==0" class="isNull">暂无数据</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	import {
+		selectUsernameOrPhoneOrTime,
+		getExport,
+		selectNotGeneratedReport,
+		selectSuccessGeneratedReport
+	} from '@/api/user.js'
+	import {
+		getDictByKey
+	} from '@/api/common.js'
+	import {
+		tr
+	} from "date-fns/locale";
+	export default {
+		mixins: [MescrollMixin], // 使用mixin
+		data() {
+			return {
+				height: uni.getSystemInfoSync().screenHeight,
+				width: uni.getSystemInfoSync().screenWidth,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
+				hosLevelOptions: [],
+				tabs: [{
+						val: '',
+						name: '全部客户'
+					},
+					{
+						val: '0',
+						name: '待问诊客户'
+					},
+					{
+						val: '1',
+						name: '购买客户'
+					},
+
+				],
+				total: 10,
+				aIndex: '',
+				createTimes: '',
+				keyword: '',
+				type: 0,
+				mescroll: null,
+				downOption: { //下拉刷新
+					use: true,
+					auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback)
+				},
+				upOption: {
+					onScroll: false,
+					use: true, // 是否启用上拉加载; 默认true
+					page: {
+						pae: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+						size: 10 // 每页数据的数量,默认10
+					},
+					noMoreSize: 10, // 配置列表的总数量要大于等于5条才显示'-- END --'的提示
+					textNoMore: "已经到底了",
+					empty: {
+						icon: 'https://cos.his.cdwjyyh.com/fs/20240423/cf4a86b913a04341bb44e34bb4d37aa2.png',
+						tip: '暂无数据'
+					}
+				},
+				dataList: [],
+				reportList: [],
+				showList: false,
+				showDetail: false
+			}
+		},
+		onLoad(options) {
+			this.selectUsernameOrPhoneOrTime()
+			//this.getDictByKey("sys_hospital_level");
+		},
+		onShow() {
+
+		},
+		methods: {
+			goBack() {
+				// uni.navigateBack({
+				// 	delta:1
+				// })	
+				// uni.redirectTo({
+				// 	url: '/pages/index/index'
+				// });
+				uni.navigateBack({
+				  delta:1
+				})
+				//设置50ms延时跳转目标界面
+				// setTimeout(() => {
+				// 	uni.navigateTo({
+				// 	 url: '/pages/index/index',
+				// 	})
+				// }, 50);
+			},
+			onCloseList() {
+				this.showList = false
+			},
+			onOpenDetail(item) {
+				this.showDetail = true
+				this.showList = false
+			},
+			closeP() {
+				this.showDetail = false
+			},
+			getTab(item) {
+				this.aIndex = item.val
+				if (item.val == '0') {
+					this.selectNotGeneratedReport()
+				} else {
+					this.selectUsernameOrPhoneOrTime()
+				}
+			},
+			rightTap(e) {
+				this.keyword = e.target.value
+				this.selectUsernameOrPhoneOrTime()
+			},
+			clear() {
+				this.keyword = ''
+				this.createTimes = ''
+				this.selectUsernameOrPhoneOrTime()
+			},
+			createTimesChange(e) {
+				console.log('e', e)
+				this.createTimes = e.detail.value
+				this.selectUsernameOrPhoneOrTime()
+			},
+			goList(id) {
+				var data = {
+					userId: id
+				}
+				selectSuccessGeneratedReport(data).then(res => {
+						if (res.code == 200) {
+							this.reportList = res.data
+							this.reportList.forEach(item => {
+							  item.createTimes = this.$timeFormat(item.createTimes, 'yyyy年mm月dd日')
+							})
+							this.showList = true
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+
+			},
+			selectNotGeneratedReport() {
+				var data = {
+					nickName: this.keyword,
+					phone: this.keyword,
+					createTimes: this.createTimes
+				}
+				selectNotGeneratedReport(data).then(res => {
+						if (res.code == 200) {
+							console.log('res', res)
+							this.dataList = res.data
+							this.total = res.data.length
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			selectUsernameOrPhoneOrTime() {
+				var data = {
+					nickName: this.keyword,
+					phone: this.keyword,
+					createTimes: this.createTimes
+				}
+				// var user=uni.getStorageSync('userInfo');
+				selectUsernameOrPhoneOrTime(data).then(res => {
+						if (res.code == 200) {
+							console.log('res', res)
+							this.dataList = res.data
+							this.total = res.data.length
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			toExport() {
+				var data = {
+					nickName: this.keyword,
+					phone: this.keyword,
+					createTimes: this.createTimes
+				}
+				// var user=uni.getStorageSync('userInfo');
+				getExport(data).then(res => {
+						if (res.code == 200) {
+							uni.showToast({
+								icon: 'success',
+								title: "导出成功",
+							});
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none'
+							});
+						}
+					},
+					rej => {}
+				);
+			},
+			typeChange(item) {
+				this.type = item.index
+				console.log(this.type)
+				this.mescroll.resetUpScroll()
+			},
+			navTo(url) {
+				uni.navigateTo({
+					url: url
+				})
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			/*下拉刷新的回调 */
+			downCallback() {
+				this.mescroll.resetUpScroll()
+			},
+			/*上拉加载的回调*/
+			upCallback(page) {
+				//联网加载数据
+				var that = this;
+				var data = {
+					type: this.type + 1,
+					pageNum: page.num,
+					pageSize: page.size
+				};
+				getMyDoctorList(data).then(res => {
+					if (res.code == 200) {
+						if (page.num == 1) {
+							res.data.list.forEach(function(value, index, array) {
+								value.prices = JSON.parse(value.priceJson)
+							});
+							that.dataList = res.data.list;
+
+						} else {
+							that.dataList = that.dataList.concat(res.data.list);
+
+						}
+						that.mescroll.endBySize(res.data.list.length, res.data.total);
+
+					} else {
+						uni.showToast({
+							icon: 'none',
+							title: "请求失败",
+						});
+						that.dataList = null;
+						that.mescroll.endErr();
+					}
+				});
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+
+		height: 100%;
+		background: #f6f6f6;
+	}
+</style>
+<style scoped lang="scss">
+	.border-box {
+		width: 100vw;
+		height: 100vh;
+		overflow: hidden;
+		background-image: url(/static/image/device/ipad_yjf_boder.png);
+		background-repeat: no-repeat;
+		position: relative;
+		background-size: 100% 100%;
+		box-sizing: border-box;
+		padding: 10px;
+	}
+
+	.content {
+		// height: 100%;
+		width: 100%;
+		height: 100%;
+		background-image: url(/static/image/device/inner_page_bg.png);
+		background-repeat: no-repeat;
+		background-size: 100% 100%;
+		position: relative;
+		padding: 30px;
+		.top-box {
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			margin-bottom: 50px;
+
+	.back-box {
+		width: 102px;
+		height: 47px;
+		background: #FFFFFF;
+		border-radius: 6px 6px 6px 6px;
+		border: 1px solid #8F6726;
+		// padding: 12px 8px;
+		justify-content: center;
+		view {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 18px;
+			color: #8F6726;
+			text-align: center;
+			margin-left: 10px;
+		}
+		// position: absolute;
+		// left: 30px;
+		image {
+			width: 24px;
+			height: 24px;
+		}
+	}
+
+			.tab-box {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.item {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 144px;
+					height: 43px;
+					background: #FBF4EE;
+					border-radius: 4px;
+					border: 1px solid rgba(143,103,38,0.3);
+					font-family: Source Han Serif CN, Source Han Serif CN;
+					font-weight: 500;
+					font-size: 24px;
+					color: #8F6726;
+					text-align: center;
+					margin-right: 26px;
+
+					&.active {
+						background: linear-gradient(180deg, #E3B379 0%, #8F6726 100%);
+						border: 1px solid #8F6726;
+				font-weight: bold;
+						font-size: 24px;
+						color: #FFFFFF;
+					}
+
+					&:last-child {
+						margin-right: 0;
+					}
+				}
+			}
+		}
+
+		.btn-box {
+			&.flex-box{
+				flex-direction: column;
+				.dl{
+					width: 100%;
+					justify-content: left;
+				}
+				.dr{
+					margin-top: 20px;
+					width: 100%;
+					justify-content: right;
+				}
+				
+			}
+			image {
+				width: 18px;
+				height: 18px;
+			}
+
+			input {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #9B9B9B;
+				text-align: left;
+			}
+
+			.search {
+				width: 311px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				display: flex;
+				align-items: center;
+				padding: 15px;
+				margin-right: 16px;
+				box-sizing: border-box;
+                uni-input{
+					width: 100%;
+				}
+				image {
+					margin-right: 10px;
+				}
+			}
+
+			.dateBox {
+				width: 230px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				padding: 15px;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				image {
+					margin-left: 10px;
+				}
+
+				.date {
+					width: 100%;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.text {
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 18px;
+					text-align: left;
+				}
+			}
+
+			.rest {
+				width: 83px;
+				height: 47px;
+				background: #FFFFFF;
+				border-radius: 6px 6px 6px 6px;
+				border: 1px solid #8F6726;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size:18px;
+				color: #8F6726;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+
+			.export {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				width: 108px;
+				height: 47px;
+				background: #8F6726;
+				border-radius: 6px 6px 6px 6px;
+				color: #fff;
+				font-size: 18px;
+				margin-left: 16px;
+
+				image {
+					margin-right: 5px;
+				}
+			}
+		}
+
+		.user-list {
+			border-radius: 16px 16px 0 0;
+			background: #FFFFFF;
+			margin-top: 30px;
+			width: 100%;
+			/* 横向滚动:适配小屏设备,避免列挤压 */
+			height: calc(100vh - 270px);
+			overflow-y: auto;
+			overflow-x: auto;
+            &.flex-box{
+				height: calc(100vh - 370px);
+			}
+			&::-webkit-scrollbar {
+				display: block !important;
+				width: 10px !important;
+				/* 滚动条宽度 */
+			}
+
+			&::-webkit-scrollbar-thumb {
+				background: #8F6726 !important;
+				/* 滚动条滑块颜色 */
+				border-radius: 5px !important;
+				/* 滑块圆角 */
+			}
+
+			.table-title {
+				position: sticky;
+				top: 0;
+				/* 滚动时吸附在顶部 */
+				z-index: 10;
+				width: 100%; /* 确保宽度占满容器 */
+				min-width: max-content; /* 标准写法 */
+				background: #E9DDCD;
+				height: 47px;
+				justify-content: space-between;
+				view {
+					background: #E9DDCD;
+					line-height: 47px;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 500;
+					font-size: 16px;
+					color: #8F6726;
+					text-align: center;
+				}
+			}
+		}
+
+		.table-item {
+			background: #FFFFFF;
+			height: 47px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			// min-width: 1200px;
+			width:100%; /* 确保宽度占满容器 */
+ min-width: max-content; /* 关键:如果内容超出容器宽度,表头宽度跟随内容撑开 */
+			/* 最小宽度:确保小屏可横向滚动,列不挤压 */
+			.btn-box {
+				width: 100%;
+
+				.btn {
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 16px;
+					color: #A14212;
+					text-align: center;
+
+					&:last-child {
+						margin-left: 16px;
+					}
+				}
+			}
+
+		}
+	}
+
+	/* 遮罩层样式 */
+	.mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 999;
+		animation: fadeIn 0.3s ease;
+	}
+
+	.isNull {
+		text-align: center;
+		color: #8F6726;
+		font-size: 18px;
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container2 {
+		//width: 50%;
+		height: 250px;
+		background: #FBF4EE;
+		border-radius: 12px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: space-between;
+		padding: 30px 50px;
+	
+		.title-t {
+			font-size: 24px;
+			font-weight: bold;
+			color: #8F6726;
+			text-align: center;
+		}
+	
+		.title-r {
+			font-size: 20px;
+			color: #8F6726;
+			text-align: center;
+		}
+	
+		.btn-r {
+			text-align: center;
+			background: #8F6726;
+			font-size: 20px;
+			color: #FBF4EE;
+			border-radius: 12px;
+			width: 60%;
+			height: 50px;
+			line-height: 50px;
+		}
+	}
+
+	/* 弹窗容器样式 */
+	.popup-container {
+		width: 80%;
+		// min-width: 840px;
+		background: #FBF4EE;
+		border-radius: 16px;
+		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
+		animation: scaleIn 0.3s ease;
+		overflow: hidden;
+	}
+
+	/* 弹窗头部样式 */
+	.popup-header {
+		padding: 20px;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		background: #E9DDCD;
+
+		.goback {
+			background: #FFFFFF;
+			border-radius: 4px;
+			border: 1px solid #8F6726;
+			padding: 10px 16px;
+			font-size: 24px;
+			color: #8F6726;
+			text-align: center;
+		}
+	}
+
+	.popup-title {
+		flex: 1;
+		font-family: Source Han Serif CN, Source Han Serif CN;
+		font-weight: bold;
+		font-size: 24px;
+		color: #8F6726;
+		text-align: center;
+	}
+
+	.close-btn {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		transition: all 0.2s ease;
+
+		image {
+			width: 24px;
+			height: 24px;
+		}
+	}
+
+	/* 弹窗内容样式 */
+	.popup-content {
+		// width: 90%;
+		padding: 40px 30px;
+		font-size: 24px;
+		color: #666;
+		line-height: 1.6;
+		background: #FBF4EE;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin: auto;
+
+		.form-item {
+			display: flex;
+			align-items: center;
+			margin-bottom: 30px;
+
+			.label {
+				width: 164px;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 500;
+				font-size: 28px;
+				color: #8F6726;
+				text-align: right;
+			}
+
+			.form-input {
+				width: 540px;
+				height: 64px;
+				box-sizing: border-box;
+				background: #FFFFFF;
+				border-radius: 8px;
+				border: 2px solid #8F6726;
+				padding: 15px 26px;
+			}
+
+			.text-input {
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 24px;
+				color: #9B9B9B;
+				text-align: left;
+			}
+
+			.r-box {
+				width: 540px;
+				height: 64px;
+			}
+
+			.picker-box {
+
+				// width: 540px;
+				// height: 64px;
+				// box-sizing: border-box;
+				// background: #FFFFFF;
+				// border-radius: 8px;
+				// border: 2px solid #8F6726;
+				// padding: 15px 26px;
+				.date {
+					image {
+						width: 32px;
+						height: 32px;
+					}
+				}
+
+			}
+
+		}
+	}
+
+	.userList-box {
+		// margin-top: 30px;
+		width: 100%;
+		background: #FFFFFF;
+		border-radius: 16px;
+		overflow: hidden;
+	}
+
+	.userList {
+		width: 100%;
+		height: 330px;
+		overflow-y: auto;
+
+		&::-webkit-scrollbar {
+			display: block !important;
+			width: 10px !important;
+			/* 滚动条宽度 */
+		}
+
+		&::-webkit-scrollbar-thumb {
+			background: #8F6726 !important;
+			/* 滚动条滑块颜色 */
+			border-radius: 5px !important;
+			/* 滑块圆角 */
+		}
+
+		.item {
+			width: 100%;
+			padding: 17px 22px;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			border-bottom: 1px solid #8F6726;
+
+			.title {
+				flex: 1;
+				font-family: PingFang SC, PingFang SC;
+				font-weight: 400;
+				font-size: 18px;
+				color: #8F6726;
+				text-align: left;
+			}
+
+			.right-box {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				.rest {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 59px;
+					height: 33px;
+					border-radius: 6px 6px 6px 6px;
+					border: 1px solid #8F6726;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 16px;
+					color: #8F6726;
+					margin-right: 16px;
+				}
+
+				.select {
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					width: 80px;
+					height: 44px;
+					border-radius: 8px;
+					border: 2px solid #8F6726;
+					font-family: PingFang SC, PingFang SC;
+					font-weight: 400;
+					font-size: 20px;
+					color: #8F6726;
+
+					&.active {
+						background: #8F6726;
+						color: #fff;
+					}
+				}
+			}
+
+			&:last-child {
+				border-bottom: none;
+			}
+		}
+	}
+
+	.footer {
+		position: fixed;
+		bottom: 80px;
+		right: 80px;
+	}
+
+	/* 统一列样式:控制对齐、溢出、内边距 */
+	.col {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		width: 100%;
+		padding: 0 10px;
+		line-height: 47px;
+		/* 适配多行文本 */
+		font-size: 16px;
+		color: #8F6726;
+		white-space: nowrap;
+		/* 禁止换行(可选,根据需求调整) */
+		overflow: hidden;
+		text-overflow: ellipsis;
+		/* 长文本省略号 */
+	}
+
+	/* 列宽规则:按内容重要性分配宽度(核心优化) */
+	.col-1 {
+		flex: 0 0 60px;
+		
+	}
+
+	/* 窄列:序号、性别、年龄(内容短) */
+	.col-2 {
+		flex: 0 0 120px;
+		
+	}
+
+	/* 中列:客户账号、客户关系(内容中等) */
+	.col-3 {
+		flex: 0 0 180px;
+		
+	}
+
+	/* 宽列:名称、手机号、时间(内容长) */
+	.col-4 {
+		flex: 0 0 220px;
+		
+	}
+</style>

+ 231 - 0
pages/user/userInfo.vue

@@ -0,0 +1,231 @@
+<template>
+	<view class="content">
+		<!-- 个人信息 -->
+		<view class="user-info">
+			<view class="info-box">
+				<view class="left">
+					<view class="head-box">
+						<image class="img" :src="avatar" mode="aspectFill"></image>
+					</view>
+					<view class="info">
+						<text class="name">{{nickName}}</text>
+						<text class="title">{{postNames}}</text>
+					</view>
+				</view>
+				<!-- <image  class="right" src="@/static/image/my/icon_edit.png" mode="aspectFill" @click="editInfo"></image> -->
+			</view>
+		
+		</view>
+		<!-- 详细信息 -->
+		<view class="info-detail">
+			<view class="item">
+				<text class="label">姓名</text>
+				<text class="text">{{nickName}}</text>
+			</view>
+			<view class="item column" @click="callPhone(phonenumber)">
+				<view class="left">
+					<text class="label">手机</text>
+					<text class="text">{{phonenumber}}</text>
+				</view>
+				<image class="img" src="/static/images/icon_phone_left.png" mode="aspectFill"  ></image>
+			</view>
+			<view class="item">
+				<text class="label">性别</text>
+				<text class="text">{{sex}}</text>
+			</view>
+			<view class="item">
+				<text class="label">邮箱</text>
+				<text class="text">{{email}}</text>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getUserInfoByUserId,getUserInfo} from '@/api/user.js';
+	export default {
+		data() {
+			return {
+				avatar:"/static/images/detault_head.jpg", 
+				nickName:"",
+				deptName:"",
+				postNames:"",
+				phonenumber:"",
+				email:"",
+				sex:"",
+				isShow:false,
+				userId:undefined,
+			}
+		},
+		onLoad(option) {
+			// 修改顶部导航背景色
+			// uni.setNavigationBarColor({
+			// 	frontColor: '#ffffff',
+			// 	backgroundColor: '#FF5C03',
+			// 	animation: {
+			// 		duration: 400,
+			// 		timingFunc: 'easeIn'
+			// 	}
+			// });
+			if(!this.$isEmpty(option.userId)){
+				this.userId = option.userId;
+				this.isShow=true;
+			}
+			
+		},
+		onShow() {
+			this.getUserInfo();
+		},
+		methods: {
+			bindUser(data){
+				var that=this;
+				that.nickName=data.user.nickName;
+				that.phonenumber=data.user.phone;
+				that.email=data.user.email;
+				if(data.user.sex==0){
+					that.sex="男";
+				}
+				else if(data.user.sex==1){
+					that.sex="女";
+				}
+				else if(data.user.sex==2){
+					that.sex="未知";
+				}
+				if(!that.$isEmpty(data.user.avatar)){
+					that.avatar=data.user.avatar;
+				}
+			},
+			getUserInfoByUserId(userId){
+				var data = {userId:userId};
+				var that=this;
+				getUserInfoByUserId(data).then(
+					res => {
+						that.bindUser(res);
+						
+					},
+					rej => {}
+				);
+			},
+			getUserInfo(){
+				var data = {};
+				var that=this;
+				getUserInfo(data).then(
+					res => {
+						that.bindUser(res);
+					},
+					rej => {}
+				);
+			},
+			// 拨打电话
+			callPhone(tel){
+				uni.makePhoneCall({
+					phoneNumber: tel
+				})
+			},
+			// 个人信息编辑
+			editInfo() {
+				uni.navigateTo({
+					url: './editUser'
+				})
+			}
+		}
+	}
+</script>
+
+
+<style scoped lang="scss">
+	page{
+		background: #fff;
+	}
+	.content{
+		background: #fff;
+		// 个人信息
+		.user-info{
+			background: #f7f7f7;
+			padding: 0 30upx;
+			.info-box{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.left{
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					padding: 20upx 0;
+					.head-box{
+						width: 120upx;
+						height: 120upx;
+						line-height: 100upx;
+						font-size: 30upx;
+						text-align: center;
+						margin-right: 20upx;
+						.img{
+							border-radius: 50%;
+							width: 100%;
+							height: 100%;
+						}
+					}
+					.info{
+						height: 80upx;
+						display: flex;
+						flex-direction: column;
+						justify-content: space-between;
+						color: #333;
+						.name{
+							font-size: 30upx;
+						}
+						.title{
+							font-size: 28upx;
+						}
+					}
+				}
+				.right{
+					width: 40upx;
+					height: 40upx;
+				}
+			}
+			.comp-info{
+				padding: 20upx 0 40upx;
+				display: flex;
+				align-items: center;
+				.img{
+					width: 30upx;
+					height: 30upx;
+					margin-right: 20upx;
+				}
+				.text{
+					font-size: 30upx;
+					color: #fff;
+				}
+			}
+		}
+		// 详细信息
+		.info-detail{
+			padding: 0 24upx;
+			margin-top: 20rpx;
+			.item{
+				padding: 20upx 0;
+				border-bottom: 1px solid #f7f7f7;
+				.label{
+					font-size: 30upx;
+					color: #999;
+					margin-right: 20upx;
+				}
+				.text{
+					font-size: 30upx;
+					color: #333;
+				}
+				&.column{
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.img{
+						width: 50upx;
+						height: 50upx;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 42 - 0
postcss.config.js

@@ -0,0 +1,42 @@
+const path = require('path')
+module.exports = {
+  parser: 'postcss-comment',
+  plugins: {
+    'postcss-import': {
+      resolve(id, basedir, importOptions) {
+        if (id.startsWith('~@/')) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3))
+        } else if (id.startsWith('@/')) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2))
+        } else if (id.startsWith('/') && !id.startsWith('//')) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1))
+        }
+        return id
+      }
+    },
+    'autoprefixer': {
+      overrideBrowserslist: ["Android >= 4", "ios >= 8"],
+      remove: process.env.UNI_PLATFORM !== 'h5'
+    },
+    // 借助postcss-px-to-viewport插件,实现px转rem,文档:https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md
+    // 以下配置,可以将px转换为rem,如果要调整比例,可以调整 viewportWidth 来实现
+    'postcss-px-to-viewport': {
+      unitToConvert: 'px', // 需要转换的单位。我这里是px,如果你的项目都是用的rpx,就改成rpx
+      viewportWidth: 1280,// 密度,一般为750 || 375。这里可以自己修改
+      unitPrecision: 5,
+      propList: ['*'],
+	  viewportUnit: "vh", // 指定需要转换成的视窗单位,默认vw
+      fontViewportUnit: 'vh', // 字体需要转成的单位,只针对 font-size 属性
+      selectorBlackList: [],
+      minPixelValue: 1,
+      mediaQuery: false,
+      replace: true,
+      exclude: undefined,
+      include: undefined,
+      landscape:false,
+	  landscapeUnit: 'vw', // 横屏时使用的单位
+	  landscapeWidth: 1280 // 横屏时使用的视窗宽度
+    },
+    '@dcloudio/vue-cli-plugin-uni/packages/postcss': {}
+  }
+}

+ 58 - 0
readme.md

@@ -0,0 +1,58 @@
+# vue2版本!!!
+vue3版本请前往:[https://ext.dcloud.net.cn/plugin?id=13307](https://ext.dcloud.net.cn/plugin?id=13307)
+
+## uniapp markdown渲染解析.md语法及代码高亮
+> **组件名:uaMarkdown**
+> 代码块: `<ua-markdown>`
+
+
+uaMarkdown组件是基于`uniapp+vue2`自定义解析markdown语法插件、支持代码块高亮,编译兼容H5+小程序端+App端。
+
+
+### 引入方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,只需将本组件`ua-markdown`放在components目录,在页面`template`中即可直接使用。
+
+
+### 基本用法 
+
+**示例**
+
+- 基础用法
+
+```html
+const mdvalue = '### uniapp markdwon'
+<ua-markdown :source="mdvalue" />
+```
+
+- 去掉代码块行号
+
+```html
+<ua-markdown :source="xxx" :showLine="false" />
+```
+
+- source测试值
+```js
+mdValue: "使用 JavaScript 编写的冒泡排序算法:\n\n```js\nfunction bubbleSort(arr) {\n  var len = arr.length;\n  for (var i = 0; i < len - 1; i++) {\n    for (var j = 0; j < len - 1 - i; j++) {\n      if (arr[j] > arr[j + 1]) {\n        var temp = arr[j];\n        arr[j] = arr[j + 1];\n        arr[j + 1] = temp;\n      }\n    }\n  }\n  return arr;\n}\n\n// 示例\nvar arr = [5, 3, 8, 4, 2];\nconsole.log(bubbleSort(arr)); // [2, 3, 4, 5, 8]\n```\n\n该算法的基本思路是依次比较相邻的两个元素,如果它们的顺序不正确则交换它们的位置。每一轮比较都会找到当前待排序序列中的最大值,所以需要进行 `n-1` 轮比较。在每一轮比较中,需要比较 `n-i-1` 对元素。"
+
+mdValue: "列出30个常见的Emoji表情字符:\n\n1. 😃\n2. 😁\n3. 😂\n4. 🤣\n5. 😄\n6. 😅\n7. 😆\n8. 😉\n9. 😊\n10. 😋\n11. 😎\n12. 😍\n13. 😘\n14. 😗\n15. 😙\n16. 😚\n17. ☺️\n18. 🙂\n19. 🙃\n20. 😇\n21. 😌\n22. 😔\n23. 😖\n24. 😞\n25. 😟\n26. 😢\n27. 😭\n28. 😩\n29. 😫\n30. 😶\n\n请注意,这些Emoji字符串可能在某些设备上显示效果不同,因为它们的渲染和实现可能因平台和操作系统而异。"
+
+mdValue: "| name | code |\n| --- | --- |\n| Uniapp markdown| 1 |\n```js\nconst name = 'Uniapp markdown'\nconst code = 1\n```\n****\n# level1\n## level2\n### level3\n#### level4\n##### level5\n###### level6\n****\n**BOLD**\n~~DELETE~~\n_ITALIC_\n<u>UNDERLINE<u>"
+
+mdValue: "## Links\n\n[link text](http://dev.nodeca.com)\n\n[link with title](http://nodeca.github.io/pica/demo/ \"title text!\")\n\n\n## Plugins\n\nThe killer feature of `markdown-it` is very effective support of\n[syntax plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin)\n\n\n## Images\n\n![Minion](https://octodex.github.com/images/minion.png)\n![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg \"The Stormtroopocat\")\n\nLike links, Images also have a footnote style syntax\n\n![Alt text][id]\n\nWith a reference later in the document defining the URL location:\n\n[id]: https://octodex.github.com/images/dojocat.jpg  \"The Dojocat\""
+```
+
+
+### API
+
+### uaMarkdown Props 
+
+|属性名|类型|默认值|说明|
+|:-:|:-:|:-:|:-:|
+|source|String|-| 渲染解析内容 |
+|showLine|Boolean|true| 是否显示代码块行号 |
+
+
+### 💝最后
+
+开发不易,希望各位小伙伴们多多支持下哈~~ ☕️☕️

BIN
static/image/ai_right_icon.png


BIN
static/image/black_back.png


BIN
static/image/device/add_icon32.png


BIN
static/image/device/add_icon68.png


BIN
static/image/device/album_icon24.png


BIN
static/image/device/arrow_icon16.png


BIN
static/image/device/back_icon32.png


BIN
static/image/device/back_icon33.png


BIN
static/image/device/calendar_icon24.png


BIN
static/image/device/close_icon32.png


BIN
static/image/device/close_icon33.png


BIN
static/image/device/code_icon32.png


BIN
static/image/device/code_icon36.png


BIN
static/image/device/company_manage_icon32.png


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä