cmy 1 month ago
commit
31cd0bb1cc
100 changed files with 27654 additions and 0 deletions
  1. BIN
      .DS_Store
  2. 23 0
      .hbuilderx/launch.json
  3. 438 0
      App.vue
  4. 27 0
      androidPrivacy.json
  5. 7 0
      components/css/animate.css
  6. 111 0
      components/cz-countdown/cz-countdown.vue
  7. 96 0
      components/cz-countdown/cz-countdown2.vue
  8. 28 0
      components/gaoyia-parse/components/wxParseAudio.vue
  9. 94 0
      components/gaoyia-parse/components/wxParseImg.vue
  10. 55 0
      components/gaoyia-parse/components/wxParseTable.vue
  11. 98 0
      components/gaoyia-parse/components/wxParseTemplate0.vue
  12. 88 0
      components/gaoyia-parse/components/wxParseTemplate1.vue
  13. 88 0
      components/gaoyia-parse/components/wxParseTemplate10.vue
  14. 86 0
      components/gaoyia-parse/components/wxParseTemplate11.vue
  15. 88 0
      components/gaoyia-parse/components/wxParseTemplate2.vue
  16. 88 0
      components/gaoyia-parse/components/wxParseTemplate3.vue
  17. 88 0
      components/gaoyia-parse/components/wxParseTemplate4.vue
  18. 88 0
      components/gaoyia-parse/components/wxParseTemplate5.vue
  19. 88 0
      components/gaoyia-parse/components/wxParseTemplate6.vue
  20. 88 0
      components/gaoyia-parse/components/wxParseTemplate7.vue
  21. 88 0
      components/gaoyia-parse/components/wxParseTemplate8.vue
  22. 88 0
      components/gaoyia-parse/components/wxParseTemplate9.vue
  23. 15 0
      components/gaoyia-parse/components/wxParseVideo.vue
  24. 261 0
      components/gaoyia-parse/libs/html2json.js
  25. 156 0
      components/gaoyia-parse/libs/htmlparser.js
  26. 209 0
      components/gaoyia-parse/libs/wxDiscode.js
  27. 259 0
      components/gaoyia-parse/parse.css
  28. 228 0
      components/gaoyia-parse/parse.vue
  29. 197 0
      components/helang-compress/helang-compress.vue
  30. 83 0
      components/mao-scroll/mao-scroll.vue
  31. 55 0
      components/mescroll-uni/components/mescroll-down.css
  32. 47 0
      components/mescroll-uni/components/mescroll-down.vue
  33. 90 0
      components/mescroll-uni/components/mescroll-empty.vue
  34. 83 0
      components/mescroll-uni/components/mescroll-top.vue
  35. 47 0
      components/mescroll-uni/components/mescroll-up.css
  36. 39 0
      components/mescroll-uni/components/mescroll-up.vue
  37. 19 0
      components/mescroll-uni/mescroll-body.css
  38. 348 0
      components/mescroll-uni/mescroll-body.vue
  39. 65 0
      components/mescroll-uni/mescroll-mixins.js
  40. 36 0
      components/mescroll-uni/mescroll-uni-option.js
  41. 36 0
      components/mescroll-uni/mescroll-uni.css
  42. 799 0
      components/mescroll-uni/mescroll-uni.js
  43. 424 0
      components/mescroll-uni/mescroll-uni.vue
  44. 48 0
      components/mescroll-uni/mixins/mescroll-comp.js
  45. 59 0
      components/mescroll-uni/mixins/mescroll-more-item.js
  46. 74 0
      components/mescroll-uni/mixins/mescroll-more.js
  47. 109 0
      components/mescroll-uni/wxs/mixins.js
  48. 92 0
      components/mescroll-uni/wxs/renderjs.js
  49. 268 0
      components/mescroll-uni/wxs/wxs.wxs
  50. 26 0
      components/mpvue-citypicker/mpvueCityPicker.vue
  51. 0 0
      components/scancode/reqrcode.js
  52. 110 0
      components/tm-public/chat/chatGroupMsg.vue
  53. 115 0
      components/tm-public/chat/cimg.vue
  54. 123 0
      components/tm-public/chat/msg.vue
  55. 130 0
      components/tm-public/chat/red.vue
  56. 138 0
      components/tm-public/chat/redEnvelopeTransfer.vue
  57. 138 0
      components/tm-public/chat/redEnvelopeTransferRefund.vue
  58. 141 0
      components/tm-public/chat/redTransfer.vue
  59. 89 0
      components/tm-public/chat/tip.vue
  60. 107 0
      components/tm-public/chat/video.vue
  61. 138 0
      components/tm-public/chat/voice.vue
  62. BIN
      components/tm-public/img/hold_talk.png
  63. 143 0
      components/tm-public/recording/recording.vue
  64. 160 0
      components/tm-public/recording/recordingApp.vue
  65. 155 0
      components/tm-public/recording/recordingH5.vue
  66. BIN
      components/ui-header/img/back.png
  67. BIN
      components/ui-header/img/back_brown.png
  68. BIN
      components/ui-header/img/liebiao.png
  69. BIN
      components/ui-header/img/while_brown.png
  70. 145 0
      components/ui-header/index.vue
  71. 119 0
      components/ui-pay/index.vue
  72. 259 0
      components/ui-pay/pay.vue
  73. 117 0
      components/ui-pay/payDialog.vue
  74. 143 0
      components/ui-public/customer-wiget.vue
  75. 127 0
      components/ui-swiper/ui-swiper.vue
  76. 59 0
      components/uni-rate/readme.md
  77. 120 0
      components/uni-rate/uni-rate.vue
  78. 25 0
      components/uni-status-bar/uni-status-bar.vue
  79. 12542 0
      components/w-picker/city-data/area.js
  80. 1503 0
      components/w-picker/city-data/city.js
  81. 139 0
      components/w-picker/city-data/province.js
  82. 502 0
      components/w-picker/w-picker.js
  83. 801 0
      components/w-picker/w-picker.vue
  84. 223 0
      config/api.js
  85. 17 0
      config/global.js
  86. 49 0
      index.html
  87. 110 0
      library/Base.js
  88. 75 0
      library/Container.js
  89. 104 0
      library/Event/SocketEvent.js
  90. 209 0
      library/Http.js
  91. 134 0
      library/Request.js
  92. 25 0
      library/interceptors/After.js
  93. 64 0
      library/interceptors/Before.js
  94. 24 0
      library/interceptors/Complete.js
  95. 24 0
      library/interceptors/Fail.js
  96. 24 0
      library/interceptors/Success.js
  97. 79 0
      library/socket/Message.js
  98. 502 0
      library/socket/WebSokcet.js
  99. 889 0
      library/utils/Comm.js
  100. 699 0
      library/utils/Face.js

BIN
.DS_Store


+ 23 - 0
.hbuilderx/launch.json

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

+ 438 - 0
App.vue

@@ -0,0 +1,438 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+
+<style>
+	@import url("/components/gaoyia-parse/parse.css");
+	@import url("/components/css/animate.css");
+
+	page {
+		background: #F8F6F6;
+		-webkit-text-size-adjust: none
+	}
+
+	.clearfix {
+		zoom: 1
+	}
+
+	.clearfix:after {
+		clear: both;
+		display: block;
+		visibility: hidden;
+		overflow: hidden;
+		height: 0;
+		content: '\20'
+	}
+
+	button.nt {
+		background: transparent;
+		font-size: 12px;
+		padding: 0;
+		border-radius: 0;
+		color: #303033;
+		margin: 0px;
+		line-height: 1;
+		overflow: visible
+	}
+
+	button.nt::after {
+		border: 0;
+	}
+
+	.fx-r {
+		display: flex;
+		flex-direction: row;
+		flex-wrap: wrap;
+	}
+
+	.fx-h {
+		display: flex;
+		flex-direction: column;
+	}
+
+	.fx-ac {
+		justify-content: center;
+	}
+
+	.fx-as {
+		justify-content: flex-start;
+	}
+
+	.fx-ae {
+		justify-content: flex-end;
+	}
+
+	.fx-bc {
+		align-items: center;
+	}
+
+	.fx-be {
+		align-items: flex-end;
+	}
+
+	.fx-bs {
+		align-items: flex-start;
+	}
+
+	.fx-g1 {
+		flex-grow: 1;
+	}
+
+	.fx-g2 {
+		flex-grow: 2;
+	}
+
+	.fx-g3 {
+		flex-grow: 3;
+	}
+
+	.fx-g4 {
+		flex-grow: 4;
+	}
+
+	.fx-s {
+		flex-shrink: 0;
+	}
+
+	.pr {
+		position: relative;
+	}
+
+	.pa {
+		position: absolute;
+	}
+
+	.fl {
+		float: left
+	}
+
+	.fr {
+		float: right
+	}
+
+	.font-14 {
+		font-size: 14px !important;
+	}
+
+	.font-12 {
+		font-size: 12px !important;
+	}
+
+	.border-none {
+		border: none !important;
+	}
+
+	.text-r {
+		text-align: right
+	}
+
+	.text-l {
+		text-align: left
+	}
+
+	.dn {
+		display: none !important;
+	}
+
+	.db {
+		display: block !important;
+	}
+
+	.mk {
+		background: #000;
+		opacity: 0.5;
+		position: fixed;
+		top: 0px;
+		left: 0px;
+		right: 0px;
+		bottom: 0px;
+		z-index: 100
+	}
+
+	@keyframes rotate {
+		from {
+			transform: rotate(0deg)
+		}
+
+		to {
+			transform: rotate(359deg)
+		}
+	}
+
+	.ihover:active {
+		opacity: .5
+	}
+
+	.ripple,
+	button.ripple {
+		position: relative;
+		overflow: hidden
+	}
+
+	.ripple:after,
+	button.ripple:after {
+		content: "";
+		background: rgba(255, 255, 255, 0.3);
+		display: block;
+		position: absolute;
+		border-radius: 50%;
+		padding-top: 240%;
+		padding-left: 240%;
+		margin-top: -120%;
+		margin-left: -120%;
+		opacity: 0;
+		transition: all 1s
+	}
+
+	.ripple:active:after,
+	button.ripple:active:after {
+		padding-top: 0;
+		padding-left: 0;
+		margin-top: 0;
+		margin-left: 0;
+		opacity: 1;
+		transition: 0s
+	}
+
+	.pbl-box {
+		-moz-column-count: 2;
+		-webkit-column-count: 2;
+		column-count: 2;
+		-moz-column-gap: 5px;
+		-webkit-column-gap: 5px;
+	}
+
+	.pbl-item {
+		-webkit-column-break-inside: avoid;
+		-moz-page-break-inside: avoid;
+		-webkit-column-break-inside: avoid;
+		break-inside: avoid;
+	}
+
+	.app-more {
+		text-align: center;
+		height: 30px;
+	}
+
+	.app-more image {
+		width: 20px;
+		height: 20px;
+		animation: rotate 1.5s linear infinite;
+		margin-right: 4px;
+	}
+
+	.app-more text {
+		margin-left: 3px;
+		position: relative;
+		top: -4px;
+		font-size: 12px;
+	}
+
+	.app-more-button {
+		position: relative;
+		height: 30px;
+	}
+
+	.app-more-button text {
+		padding: 0px 20px;
+		background: #f2f2f2;
+	}
+
+	.app-more-button .hr {
+		background: #e5e5e5;
+		width: 90%;
+		height: 1px;
+		margin-left: 5%;
+		position: absolute;
+		top: 16px;
+	}
+
+	.app-more-button .a-m-c {
+		position: absolute;
+		z-index: 9;
+		width: 100%;
+		height: 30px;
+	}
+
+	.placeholder-style {
+		color: #d5d5d9;
+		font-size: 15px;
+	}
+
+	.placeholder-style2 {
+		color: #666666;
+		font-size: 14px;
+	}
+
+	.placeholder-999 {
+		color: #999999;
+		font-size: 12px;
+	}
+
+	/*****超出一行省略*****/
+	.shenlueStyle {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis
+	}
+
+	.shenlueStyle2 {
+		text-overflow: -o-ellipsis-lastline;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+
+	.shenlueStyle3 {
+		text-overflow: -o-ellipsis-lastline;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 3;
+		line-clamp: 3;
+		-webkit-box-orient: vertical;
+	}
+
+	.bgChangColor {
+		background: linear-gradient(to right, #ff6879, #e81a62)
+	}
+
+	.scrollHide::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		color: transparent;
+	}
+
+	.font-size18 {
+		font-size: 18px !important;
+	}
+
+	img[lazy=loading] {
+		opacity: 0;
+	}
+
+	img[lazy=loaded] {
+		transition: opacity 1s ease;
+	}
+
+	.loading {
+		text-align: center;
+		height: 30px;
+		color: #4A2723;
+		line-height: 30px;
+		width: 100%;
+	}
+
+	.loading image {
+		width: 20px;
+		height: 20px;
+		animation: rotate 1.5s linear infinite;
+		margin-right: 4px;
+	}
+
+	.loading text {
+		margin-left: 3px;
+		position: relative;
+		font-size: 12px;
+	}
+
+	.loading.complete {
+		font-size: 14px;
+		color: #ccc;
+		padding: 10px 0;
+	}
+
+	@keyframes rotate {
+		from {
+			transform: rotate(0deg)
+		}
+
+		to {
+			transform: rotate(359deg)
+		}
+	}
+
+	@keyframes posterScale {
+		0% {
+			transform: scale(0.9);
+		}
+
+		100% {
+			transform: scale(1.2);
+		}
+	}
+
+	::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		color: transparent;
+	}
+
+
+
+	.load-app {
+		position: absolute;
+		width: 100%;
+		height: 100%;
+		top: 0;
+		left: 0;
+	}
+
+	.load-app image {
+		width: 60px;
+		height: 60px;
+	}
+
+	.load-app .tipbb {
+		font-size: 14px;
+		color: #ccc;
+		background: #ccc -webkit-linear-gradient(left, #ccc, #7d7b7b 50%, #474646 90%, #ccc) no-repeat 0 0;
+		background-size: 20% 100%;
+		-webkit-background-clip: text;
+		-webkit-text-fill-color: transparent;
+		text-align: center;
+		font-weight: bold;
+		text-decoration: underline;
+
+	}
+
+	.load-app .tipbb {
+		-webkit-animation: slideShine 2s linear infinite;
+		animation: slideShine 2s linear infinite;
+		margin-top: 10px;
+	}
+
+	@-webkit-keyframes slideShine {
+		0% {
+			background-position: 0 0;
+		}
+
+		100% {
+			background-position: 100% 100%;
+		}
+	}
+
+	@keyframes slideShine {
+		0% {
+			background-position: 0 0;
+		}
+
+		100% {
+			background-position: 100% 100%;
+		}
+	}
+</style>

+ 27 - 0
androidPrivacy.json

@@ -0,0 +1,27 @@
+{
+    "version" : "1",
+    "prompt" : "template",
+    "title" : "服务协议和隐私政策",
+    "message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,将向您说明:<br/>1.为会员提供上传头像,推荐附近产品信息,我们会收集您的部分必要信息。<br/>为提供上述服务,我们可能会存储权限,摄像头等敏感信息。您有权拒绝或者撤回授权。<br/>3.未经您同意,我们不会从第三方获取,共享或对外提供您的信息。<br/>你可阅读<a href=\"https://apps.yiqucbb.cn/h5/#/pages/user/operation/user\">《服务协议》</a>和<a href=\"https://apps.yiqucbb.cn/h5/#/pages/user/operation/agreement\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+    "buttonAccept" : "同意并接受",
+    "buttonRefuse" : "暂不同意",
+    "second" : {
+        "title" : "确认提示",
+        "message" : "  进入应用前,你需先同意<a href=\"https://apps.yiqucbb.cn/h5/#/pages/user/operation/user\">《服务协议》</a>和<a href=\"https://apps.yiqucbb.cn/h5/#/pages/user/operation/agreement\">《隐私政策》</a>\t",
+        "buttonAccept" : "同意并继续",
+        "buttonRefuse" : "退出应用"
+    },
+    "styles" : {
+        "backgroundColor" : "#FFFFFF",
+        "borderRadius" : "5px",
+        "title" : {
+            "color" : "#d81111"
+        },
+        "buttonAccept" : {
+            "color" : "#000000"
+        },
+        "buttonRefuse" : {
+            "color" : "#CCCCCC"
+        }
+    }
+}

File diff suppressed because it is too large
+ 7 - 0
components/css/animate.css


+ 111 - 0
components/cz-countdown/cz-countdown.vue

@@ -0,0 +1,111 @@
+<template>
+	<view class="countdown" :class="styleName == 'while' ? 'while' : ''">
+		{{ fontSize }}
+		<view class="time" :style="'font-size:' + fontSize +'px;'" v-if="d!=0">{{d <= 9 ? ('0' + d)  : d }}</view> 
+		<text class="text" :style="'font-size:' + fontSize +'px;'" v-if="d!=0">天</text>
+		<view class="time" :style="'font-size:' + fontSize +'px;'" style="margin-left: 9rpx;">{{h<10?'0'+h:h}}</view>
+		<text class="text">小时</text>
+		<view class="time" :style="'font-size:' + fontSize +'px;'">{{m<10?'0'+m:m}}</view>
+		<text class="text">分</text>
+		<view class="time" :style="'font-size:' + fontSize +'px;'">{{s<10?'0'+s:s}}</view>
+		<text class="text">秒</text>
+	</view>
+</template>
+
+<script>
+	export default{
+		props:{
+			startTime: {
+				type: String,
+			},
+			endTime:{
+				type: String,
+			},
+			fontSize:{
+				type:Number,
+				default:10 
+			},
+			styleName:{
+				type : String,
+				default(){
+					return "while"
+				}
+			}
+		},
+		data(){
+			return{
+				timer:null,
+				d:0,
+				h:0,
+				m:0,
+				s:0
+			}
+		},
+		mounted() {
+			this.time()
+		},
+		beforeDestroy(){
+			clearInterval(this.timer);
+			this.timer = null;
+		},
+		computed:{
+			sTime(){return this.startTime},
+			eTime(){return this.endTime}
+		},
+		watch:{
+			endTime(){
+				clearInterval(this.timer);
+				this.time()
+			}
+		},
+		methods:{ 
+			time(){
+				let leftTime = this.GetDateDiff(this.sTime,this.eTime)
+				this.getCountdownTime(leftTime)
+			},
+			//计算两个时间差
+			GetDateDiff(startTime, endTime) {
+			    //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式
+			    startTime = startTime.replace(/\-/g, "/");
+			    endTime = endTime.replace(/\-/g, "/");
+			    //将计算间隔类性字符转换为小写
+			    var sTime = new Date(startTime); 
+			    var eTime = new Date(endTime); 
+			    return parseInt((eTime.getTime() - sTime.getTime()) / 1000);
+			},
+			//计算活动结束时间
+			getCountdownTime(leftTime){
+				let time = leftTime
+				if (time>0) {
+					this.timer = setInterval(() => {
+						if(time == 0){
+							clearInterval(this.timer)
+							this.h = 0
+							this.m = 0
+							this.s = 0
+						}else{
+							this.d = parseInt(leftTime/3600/24);
+							this.h = parseInt((time/3600)%24);
+							this.m = parseInt((time/60)%60);
+							this.s = parseInt(time%60);
+							time --
+						}
+					},1000)
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.countdown{
+		display: flex;align-items: center;font-size: 20rpx;color: #fff;
+		.time{padding: 4rpx;background-color: #606060;border-radius: 4rpx;box-sizing: border-box;}
+		.text{font-size: 36rpx;font-weight: bolder;margin: 0 4rpx;color: #606060;}
+	}
+	.countdown.while{
+		font-size: 10px;color: #FFFFFF;
+		.time{background: #db292b;border-radius: 4px;color: #fff;text-align :center;}
+		.text{font-size: 10px;font-weight: bolder;margin: 0 4rpx;}
+	}
+</style>

+ 96 - 0
components/cz-countdown/cz-countdown2.vue

@@ -0,0 +1,96 @@
+<template>
+	<view class="countdown fx-r fx-bc" :class="styleName == 'while' ? 'while' : ''">
+		<view class="time" v-if="d!=0">{{d}}</view> 
+		<text class="text" v-if="d!=0">天</text>
+		<view class="time" style="margin-left: 9rpx;">{{h<10?'0'+h:h}}</view>
+		<text class="text">小时</text>
+		<view class="time">{{m<10?'0'+m:m}}</view>
+		<text class="text">分</text>
+		<view class="time">{{s<10?'0'+s:s}}</view>
+		<text class="text">秒</text>
+	</view>
+</template>
+
+<script>
+	export default{
+		props:{
+			startTime: {
+				type: String,
+			},
+			endTime:{
+				type: String,
+			},
+			styleName:{
+				type : String,
+				default(){
+					return "while"
+				}
+			}
+		},
+		data(){
+			return{
+				timer:null,
+				d:0,
+				h:0,
+				m:0,
+				s:0
+			}
+		},
+		mounted() {
+			this.time()
+		},
+		beforeDestroy(){
+			clearInterval(this.timer);
+			this.timer = null;
+		},
+		computed:{
+			sTime(){return this.startTime},
+			eTime(){return this.endTime}
+		},
+		watch:{
+			endTime(){
+				clearInterval(this.timer);
+				this.time()
+			}
+		},
+		methods:{ 
+			time(){
+				let leftTime = this.GetDateDiff(this.sTime,this.eTime)
+				this.getCountdownTime(leftTime)
+			},
+			//计算两个时间差
+			GetDateDiff(startTime, endTime) {
+			    //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式
+			    startTime = startTime.replace(/\-/g, "/");
+			    endTime = endTime.replace(/\-/g, "/");
+			    //将计算间隔类性字符转换为小写
+			    var sTime = new Date(startTime); 
+			    var eTime = new Date(endTime); 
+			    return parseInt((eTime.getTime() - sTime.getTime()) / 1000);
+			},
+			//计算活动结束时间
+			getCountdownTime(leftTime){
+				let time = leftTime
+				if (time>0) {
+					this.timer = setInterval(() => {
+						if(time == 0){
+							clearInterval(this.timer)
+							this.h = 0
+							this.m = 0
+							this.s = 0
+						}else{
+							this.d = parseInt(leftTime/3600/24);
+							this.h = parseInt((time/3600)%24);
+							this.m = parseInt((time/60)%60);
+							this.s = parseInt(time%60);
+							time --
+						}
+					},1000)
+				}
+			}
+		}
+	}
+</script>
+<style>
+	.countdown{font-size: 14px;color: red;}
+</style>

+ 28 - 0
components/gaoyia-parse/components/wxParseAudio.vue

@@ -0,0 +1,28 @@
+<template>
+	<!-- '<audio/>' 组件不再维护,建议使用能力更强的 'uni.createInnerAudioContext' 接口 有时间再改-->
+  <!--增加audio标签支持-->
+  <audio
+    :id="node.attr.id"
+    :class="node.classStr"
+    :style="node.styleStr"
+    :src="node.attr.src"
+    :loop="node.attr.loop"
+    :poster="node.attr.poster"
+    :name="node.attr.name"
+    :author="node.attr.author"
+    controls></audio>
+</template>
+
+<script>
+export default {
+  name: 'wxParseAudio',
+  props: {
+    node: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+};
+</script>

+ 94 - 0
components/gaoyia-parse/components/wxParseImg.vue

@@ -0,0 +1,94 @@
+<template>
+	<image
+		:mode="node.attr.mode"
+		:lazy-load="node.attr.lazyLoad"
+		:class="node.classStr"
+		:style="newStyleStr || node.styleStr"
+		:data-src="node.attr.src"
+		:src="node.attr.src"
+		@tap="wxParseImgTap"
+		@load="wxParseImgLoad"
+	/>
+</template>
+
+<script>
+export default {
+	name: 'wxParseImg',
+	data() {
+		return {
+			newStyleStr: '',
+			preview: true
+		};
+	},
+	inject: ['parseWidth'],
+	mounted() {},
+	props: {
+		node: {
+			type: Object,
+			default() {
+				return {};
+			}
+		}
+	},
+	
+	methods: {
+		wxParseImgTap(e) {
+			if (!this.preview) return;
+			const { src } = e.currentTarget.dataset;
+			if (!src) return;
+			let parent = this.$parent;
+			while (!parent.preview || typeof parent.preview !== 'function') {
+				// TODO 遍历获取父节点执行方法
+				parent = parent.$parent;
+			}
+			parent.preview(src, e);
+		},
+		// 图片视觉宽高计算函数区
+		wxParseImgLoad(e) {
+			const { src } = e.currentTarget.dataset;
+			if (!src) return;
+			let { width, height } = e.mp.detail;
+
+			const recal = this.wxAutoImageCal(width, height);
+
+			const { imageheight, imageWidth } = recal;
+			const { padding, mode } = this.node.attr;//删除padding
+			// const { mode } = this.node.attr;
+
+			const { styleStr } = this.node;
+			const imageHeightStyle = mode === 'widthFix' ? '' : `height: ${imageheight}px;`;
+
+			this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px; padding: 0 ${+padding}px;`;//删除padding
+			// this.newStyleStr = `${styleStr}; ${imageHeightStyle}; width: ${imageWidth}px;`;
+		},
+		// 计算视觉优先的图片宽高
+		wxAutoImageCal(originalWidth, originalHeight) {
+			// 获取图片的原始长宽
+			const windowWidth = this.parseWidth.value;
+			const results = {};
+
+			if (originalWidth < 60 || originalHeight < 60) {
+				const { src } = this.node.attr;
+				let parent = this.$parent;
+				while (!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.removeImageUrl(src);
+				this.preview = false;
+			}
+
+			// 判断按照那种方式进行缩放
+			if (originalWidth > windowWidth) {
+				// 在图片width大于手机屏幕width时候
+				results.imageWidth = windowWidth;
+				results.imageheight = windowWidth * (originalHeight / originalWidth);
+			} else {
+				// 否则展示原来的数据
+				results.imageWidth = originalWidth;
+				results.imageheight = originalHeight;
+			}
+			return results;
+		}
+	}
+};
+</script>

+ 55 - 0
components/gaoyia-parse/components/wxParseTable.vue

@@ -0,0 +1,55 @@
+<template>
+	<div class='tablebox'>
+		<rich-text :nodes="nodes" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+	</div>
+</template>
+<script>
+export default {
+	name: 'wxParseTable',
+	props: {
+		node: {
+			type: Object,
+			default() {
+				return {};
+			},
+		},
+	},
+	inject: ['parseSelect'],
+	data() {
+		return {
+			nodes:[]
+		};
+	},
+	mounted() {
+		this.nodes=this.loadNode([this.node]);
+	},
+	methods: {
+		loadNode(node) {
+			let obj = [];
+			for (let children of node) {
+				if (children.node=='element') {
+					let t = {
+						name:children.tag,
+						attrs: {
+							class: children.classStr,
+							// style: children.styleStr,
+						},
+						children: children.nodes?this.loadNode(children.nodes):[]
+					}
+					
+					obj.push(t)
+				} else if(children.node=='text'){
+					obj.push({
+						type: 'text',
+						text: children.text
+					})
+				}
+			}
+			return obj
+		}
+	}
+};
+</script>
+<style>
+	@import url("../parse.css");
+</style>

+ 98 - 0
components/gaoyia-parse/components/wxParseTemplate0.vue

@@ -0,0 +1,98 @@
+<template>
+	<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node"/>
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text'">{{node.text}}</block>
+</template>
+
+<script>
+	// #ifdef APP-PLUS | H5
+	import wxParseTemplate from './wxParseTemplate0';
+	// #endif
+	// #ifdef MP
+	import wxParseTemplate from './wxParseTemplate1';
+	// #endif
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+
+	export default {
+		// #ifdef APP-PLUS | H5
+		name: 'wxParseTemplate',
+		// #endif
+		// #ifdef MP
+		name: 'wxParseTemplate0',
+		// #endif
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;// TODO currentTarget才有dataset
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {// TODO 遍历获取父节点执行方法
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate1.vue

@@ -0,0 +1,88 @@
+<template>
+	<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text'">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate2';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate1',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate10.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate11';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate10',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 86 - 0
components/gaoyia-parse/components/wxParseTemplate11.vue

@@ -0,0 +1,86 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<rich-text :nodes="node" :class="node.classStr" :style="'user-select:' + parseSelect"></rich-text>
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate11',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate2.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text'">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate3';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate2',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate3.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate4';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate3',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate4.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate5';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate4',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate5.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate6';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate5',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate6.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate7';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate6',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate7.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate8';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate7',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate8.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate9';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate8',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 88 - 0
components/gaoyia-parse/components/wxParseTemplate9.vue

@@ -0,0 +1,88 @@
+<template>
+		<!--判断是否是标签节点-->
+	<block v-if="node.node == 'element'">
+		<!--button类型-->
+		<button v-if="node.tag == 'button'" type="default" size="mini" :class="node.classStr" :style="node.styleStr">
+			<wx-parse-template :node="node" />
+		</button>
+		
+		<!--a类型-->
+		<view v-else-if="node.tag == 'a'" @click="wxParseATap(node.attr,$event)" :class="node.classStr" :data-href="node.attr.href" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--li类型-->
+		<view v-else-if="node.tag == 'li'" :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+		
+		<!--table类型-->
+		<wx-parse-table v-else-if="node.tag == 'table'" :class="node.classStr" :style="node.styleStr" :node="node" />
+		
+		<!--br类型-->
+		<!-- #ifndef H5 -->
+			<text v-else-if="node.tag == 'br'">\n</text>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+			<br v-else-if="node.tag == 'br'">
+		<!-- #endif -->
+		
+		<!--video类型-->
+		<wx-parse-video :node="node" v-else-if="node.tag == 'video'"/>
+	
+		<!--audio类型-->
+		<wx-parse-audio :node="node" v-else-if="node.tag == 'audio'"/>
+	
+		<!--img类型-->
+		<wx-parse-img :node="node" v-else-if="node.tag == 'img'" :style="node.styleStr"/>
+	
+		<!--其他标签-->
+		<view v-else :class="node.classStr" :style="node.styleStr">
+			<block v-for="(node, index) of node.nodes" :key="index">
+				<wx-parse-template :node="node" />
+			</block>
+		</view>
+	</block>
+	
+	<!--判断是否是文本节点-->
+	<block v-else-if="node.node == 'text' ">{{node.text}}</block>
+</template>
+
+<script>
+	import wxParseTemplate from './wxParseTemplate10';
+	import wxParseImg from './wxParseImg';
+	import wxParseVideo from './wxParseVideo';
+	import wxParseAudio from './wxParseAudio';
+	import wxParseTable from './wxParseTable';
+	
+	export default {
+		name: 'wxParseTemplate9',
+		props: {
+			node: {},
+		},
+		components: {
+			wxParseTemplate,
+			wxParseImg,
+			wxParseVideo,
+			wxParseAudio,
+			wxParseTable
+		},
+		methods: {
+			wxParseATap(attr,e) {
+				const {
+					href
+				} = e.currentTarget.dataset;
+				if (!href) return;
+				let parent = this.$parent;
+				while(!parent.preview || typeof parent.preview !== 'function') {
+					parent = parent.$parent;
+				}
+				parent.navigate(href, e, attr);
+			}
+		}
+	};
+</script>

+ 15 - 0
components/gaoyia-parse/components/wxParseVideo.vue

@@ -0,0 +1,15 @@
+<template>
+  <!--增加video标签支持,并循环添加-->
+  <view :class="node.classStr" :style="node.styleStr">
+    <video :class="node.classStr" :style="node.styleStr" class="video-video" :src="node.attr.src"></video>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'wxParseVideo',
+  props: {
+    node: {},
+  },
+};
+</script>

+ 261 - 0
components/gaoyia-parse/libs/html2json.js

@@ -0,0 +1,261 @@
+/**
+ * html2Json 改造来自: https://github.com/Jxck/html2json
+ *
+ *
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *               垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+
+import wxDiscode from './wxDiscode';
+import HTMLParser from './htmlparser';
+
+function makeMap(str) {
+  const obj = {};
+  const items = str.split(',');
+  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+  return obj;
+}
+
+// Block Elements - HTML 5
+const block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+// Inline Elements - HTML 5
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+function removeDOCTYPE(html) {
+  const isDocument = /<body.*>([^]*)<\/body>/.test(html);
+  return isDocument ? RegExp.$1 : html;
+}
+
+function trimHtml(html) {
+  return html
+    .replace(/<!--.*?-->/gi, '')
+    .replace(/\/\*.*?\*\//gi, '')
+    .replace(/[ ]+</gi, '<')
+    .replace(/<script[^]*<\/script>/gi, '')
+    .replace(/<style[^]*<\/style>/gi, '');
+}
+
+function getScreenInfo() {
+  const screen = {};
+  wx.getSystemInfo({
+    success: (res) => {
+      screen.width = res.windowWidth;
+      screen.height = res.windowHeight;
+    },
+  });
+  return screen;
+}
+
+function html2json(html, customHandler, imageProp, host) {
+  // 处理字符串
+  html = removeDOCTYPE(html);
+  html = trimHtml(html);
+  html = wxDiscode.strDiscode(html);
+  // 生成node节点
+  const bufArray = [];
+  const results = {
+    nodes: [],
+    imageUrls: [],
+  };
+
+	const screen = getScreenInfo();
+  function Node(tag) {
+    this.node = 'element';
+    this.tag = tag;
+		
+		this.$screen = screen;
+  }
+
+  HTMLParser(html, {
+    start(tag, attrs, unary) {
+      // node for this element
+      const node = new Node(tag);
+
+      if (bufArray.length !== 0) {
+        const parent = bufArray[0];
+        if (parent.nodes === undefined) {
+          parent.nodes = [];
+        }
+      }
+
+      if (block[tag]) {
+        node.tagType = 'block';
+      } else if (inline[tag]) {
+        node.tagType = 'inline';
+      } else if (closeSelf[tag]) {
+        node.tagType = 'closeSelf';
+      }
+
+      node.attr = attrs.reduce((pre, attr) => {
+        const { name } = attr;
+        let { value } = attr;
+        if (name === 'class') {
+          node.classStr = value;
+        }
+        // has multi attibutes
+        // make it array of attribute
+        if (name === 'style') {
+          node.styleStr = value;
+        }
+        if (value.match(/ /)) {
+          value = value.split(' ');
+        }
+
+        // if attr already exists
+        // merge it
+        if (pre[name]) {
+          if (Array.isArray(pre[name])) {
+            // already array, push to last
+            pre[name].push(value);
+          } else {
+            // single value, make it array
+            pre[name] = [pre[name], value];
+          }
+        } else {
+          // not exist, put it
+          pre[name] = value;
+        }
+
+        return pre;
+      }, {});
+
+      // 优化样式相关属性
+      if (node.classStr) {
+        node.classStr += ` ${node.tag}`;
+      } else {
+        node.classStr = node.tag;
+      }
+      if (node.tagType === 'inline') {
+        node.classStr += ' inline';
+      }
+
+      // 对img添加额外数据
+      if (node.tag === 'img') {
+        let imgUrl = node.attr.src;
+        imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain);
+        Object.assign(node.attr, imageProp, {
+          src: imgUrl || '',
+        });
+        if (imgUrl) {
+          results.imageUrls.push(imgUrl);
+        }
+      }
+
+      // 处理a标签属性
+      if (node.tag === 'a') {
+        node.attr.href = node.attr.href || '';
+      }
+
+      // 处理font标签样式属性
+      if (node.tag === 'font') {
+        const fontSize = [
+          'x-small',
+          'small',
+          'medium',
+          'large',
+          'x-large',
+          'xx-large',
+          '-webkit-xxx-large',
+        ];
+        const styleAttrs = {
+          color: 'color',
+          face: 'font-family',
+          size: 'font-size',
+        };
+        if (!node.styleStr) node.styleStr = '';
+        Object.keys(styleAttrs).forEach((key) => {
+          if (node.attr[key]) {
+            const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
+            node.styleStr += `${styleAttrs[key]}: ${value};`;
+          }
+        });
+      }
+
+      // 临时记录source资源
+      if (node.tag === 'source') {
+        results.source = node.attr.src;
+      }
+
+      if (customHandler.start) {
+        customHandler.start(node, results);
+      }
+
+      if (unary) {
+        // if this tag doesn't have end tag
+        // like <img src="hoge.png"/>
+        // add to parents
+        const parent = bufArray[0] || results;
+        if (parent.nodes === undefined) {
+          parent.nodes = [];
+        }
+        parent.nodes.push(node);
+      } else {
+        bufArray.unshift(node);
+      }
+    },
+    end(tag) {
+      // merge into parent tag
+      const node = bufArray.shift();
+      if (node.tag !== tag) {
+        console.error('invalid state: mismatch end tag');
+      }
+
+      // 当有缓存source资源时于于video补上src资源
+      if (node.tag === 'video' && results.source) {
+        node.attr.src = results.source;
+        delete results.source;
+      }
+
+      if (customHandler.end) {
+        customHandler.end(node, results);
+      }
+
+      if (bufArray.length === 0) {
+        results.nodes.push(node);
+      } else {
+        const parent = bufArray[0];
+        if (!parent.nodes) {
+          parent.nodes = [];
+        }
+        parent.nodes.push(node);
+      }
+    },
+    chars(text) {
+      if (!text.trim()) return;
+
+      const node = {
+        node: 'text',
+        text,
+      };
+
+      if (customHandler.chars) {
+        customHandler.chars(node, results);
+      }
+
+      if (bufArray.length === 0) {
+        results.nodes.push(node);
+      } else {
+        const parent = bufArray[0];
+        if (parent.nodes === undefined) {
+          parent.nodes = [];
+        }
+        parent.nodes.push(node);
+      }
+    },
+  });
+
+  return results;
+}
+
+export default html2json;

+ 156 - 0
components/gaoyia-parse/libs/htmlparser.js

@@ -0,0 +1,156 @@
+/**
+ *
+ * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
+ *
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *               垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+// Regular Expressions for parsing tags and attributes
+
+const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
+const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
+const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
+
+function makeMap(str) {
+  const obj = {};
+  const items = str.split(',');
+  for (let i = 0; i < items.length; i += 1) obj[items[i]] = true;
+  return obj;
+}
+
+// Empty Elements - HTML 5
+const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
+
+// Block Elements - HTML 5
+const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
+
+// Inline Elements - HTML 5
+const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
+
+// Elements that you can, intentionally, leave open
+// (and which close themselves)
+const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
+
+// Attributes that have their values filled in disabled="disabled"
+const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
+
+function HTMLParser(html, handler) {
+  let index;
+  let chars;
+  let match;
+  let last = html;
+  const stack = [];
+
+  stack.last = () => stack[stack.length - 1];
+
+  function parseEndTag(tag, tagName) {
+    // If no tag name is provided, clean shop
+    let pos;
+    if (!tagName) {
+      pos = 0;
+    } else {
+      // Find the closest opened tag of the same type
+      tagName = tagName.toLowerCase();
+      for (pos = stack.length - 1; pos >= 0; pos -= 1) {
+        if (stack[pos] === tagName) break;
+      }
+    }
+    if (pos >= 0) {
+      // Close all the open elements, up the stack
+      for (let i = stack.length - 1; i >= pos; i -= 1) {
+        if (handler.end) handler.end(stack[i]);
+      }
+
+      // Remove the open elements from the stack
+      stack.length = pos;
+    }
+  }
+
+  function parseStartTag(tag, tagName, rest, unary) {
+    tagName = tagName.toLowerCase();
+
+    if (block[tagName]) {
+      while (stack.last() && inline[stack.last()]) {
+        parseEndTag('', stack.last());
+      }
+    }
+
+    if (closeSelf[tagName] && stack.last() === tagName) {
+      parseEndTag('', tagName);
+    }
+
+    unary = empty[tagName] || !!unary;
+
+    if (!unary) stack.push(tagName);
+
+    if (handler.start) {
+      const attrs = [];
+
+      rest.replace(attr, function genAttr(matches, name) {
+        const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
+
+        attrs.push({
+          name,
+          value,
+          escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // "
+        });
+      });
+
+      if (handler.start) {
+        handler.start(tagName, attrs, unary);
+      }
+    }
+  }
+
+  while (html) {
+    chars = true;
+
+    if (html.indexOf('</') === 0) {
+      match = html.match(endTag);
+
+      if (match) {
+        html = html.substring(match[0].length);
+        match[0].replace(endTag, parseEndTag);
+        chars = false;
+      }
+
+      // start tag
+    } else if (html.indexOf('<') === 0) {
+      match = html.match(startTag);
+
+      if (match) {
+        html = html.substring(match[0].length);
+        match[0].replace(startTag, parseStartTag);
+        chars = false;
+      }
+    }
+
+    if (chars) {
+      index = html.indexOf('<');
+      let text = '';
+      while (index === 0) {
+        text += '<';
+        html = html.substring(1);
+        index = html.indexOf('<');
+      }
+      text += index < 0 ? html : html.substring(0, index);
+      html = index < 0 ? '' : html.substring(index);
+
+      if (handler.chars) handler.chars(text);
+    }
+
+    if (html === last) throw new Error(`Parse Error: ${html}`);
+    last = html;
+  }
+
+  // Clean up any remaining tags
+  parseEndTag();
+}
+
+export default HTMLParser;

+ 209 - 0
components/gaoyia-parse/libs/wxDiscode.js

@@ -0,0 +1,209 @@
+// HTML 支持的数学符号
+function strNumDiscode(str) {
+str = str.replace(/&forall;|&#8704;|&#x2200;/g, '∀');
+str = str.replace(/&part;|&#8706;|&#x2202;/g, '∂');
+str = str.replace(/&exist;|&#8707;|&#x2203;/g, '∃');
+str = str.replace(/&empty;|&#8709;|&#x2205;/g, '∅');
+str = str.replace(/&nabla;|&#8711;|&#x2207;/g, '∇');
+str = str.replace(/&isin;|&#8712;|&#x2208;/g, '∈');
+str = str.replace(/&notin;|&#8713;|&#x2209;/g, '∉');
+str = str.replace(/&ni;|&#8715;|&#x220b;/g, '∋');
+str = str.replace(/&prod;|&#8719;|&#x220f;/g, '∏');
+str = str.replace(/&sum;|&#8721;|&#x2211;/g, '∑');
+str = str.replace(/&minus;|&#8722;|&#x2212;/g, '−');
+str = str.replace(/&lowast;|&#8727;|&#x2217;/g, '∗');
+str = str.replace(/&radic;|&#8730;|&#x221a;/g, '√');
+str = str.replace(/&prop;|&#8733;|&#x221d;/g, '∝');
+str = str.replace(/&infin;|&#8734;|&#x221e;/g, '∞');
+str = str.replace(/&ang;|&#8736;|&#x2220;/g, '∠');
+str = str.replace(/&and;|&#8743;|&#x2227;/g, '∧');
+str = str.replace(/&or;|&#8744;|&#x2228;/g, '∨');
+str = str.replace(/&cap;|&#8745;|&#x2229;/g, '∩');
+str = str.replace(/&cup;|&#8746;|&#x222a;/g, '∪');
+str = str.replace(/&int;|&#8747;|&#x222b;/g, '∫');
+str = str.replace(/&there4;|&#8756;|&#x2234;/g, '∴');
+str = str.replace(/&sim;|&#8764;|&#x223c;/g, '∼');
+str = str.replace(/&cong;|&#8773;|&#x2245;/g, '≅');
+str = str.replace(/&asymp;|&#8776;|&#x2248;/g, '≈');
+str = str.replace(/&ne;|&#8800;|&#x2260;/g, '≠');
+str = str.replace(/&le;|&#8804;|&#x2264;/g, '≤');
+str = str.replace(/&ge;|&#8805;|&#x2265;/g, '≥');
+str = str.replace(/&sub;|&#8834;|&#x2282;/g, '⊂');
+str = str.replace(/&sup;|&#8835;|&#x2283;/g, '⊃');
+str = str.replace(/&nsub;|&#8836;|&#x2284;/g, '⊄');
+str = str.replace(/&sube;|&#8838;|&#x2286;/g, '⊆');
+str = str.replace(/&supe;|&#8839;|&#x2287;/g, '⊇');
+str = str.replace(/&oplus;|&#8853;|&#x2295;/g, '⊕');
+str = str.replace(/&otimes;|&#8855;|&#x2297;/g, '⊗');
+str = str.replace(/&perp;|&#8869;|&#x22a5;/g, '⊥');
+str = str.replace(/&sdot;|&#8901;|&#x22c5;/g, '⋅');
+return str;
+}
+
+// HTML 支持的希腊字母
+function strGreeceDiscode(str) {
+str = str.replace(/&Alpha;|&#913;|&#x391;/g, 'Α');
+str = str.replace(/&Beta;|&#914;|&#x392;/g, 'Β');
+str = str.replace(/&Gamma;|&#915;|&#x393;/g, 'Γ');
+str = str.replace(/&Delta;|&#916;|&#x394;/g, 'Δ');
+str = str.replace(/&Epsilon;|&#917;|&#x395;/g, 'Ε');
+str = str.replace(/&Zeta;|&#918;|&#x396;/g, 'Ζ');
+str = str.replace(/&Eta;|&#919;|&#x397;/g, 'Η');
+str = str.replace(/&Theta;|&#920;|&#x398;/g, 'Θ');
+str = str.replace(/&Iota;|&#921;|&#x399;/g, 'Ι');
+str = str.replace(/&Kappa;|&#922;|&#x39a;/g, 'Κ');
+str = str.replace(/&Lambda;|&#923;|&#x39b;/g, 'Λ');
+str = str.replace(/&Mu;|&#924;|&#x39c;/g, 'Μ');
+str = str.replace(/&Nu;|&#925;|&#x39d;/g, 'Ν');
+str = str.replace(/&Xi;|&#925;|&#x39d;/g, 'Ν');
+str = str.replace(/&Omicron;|&#927;|&#x39f;/g, 'Ο');
+str = str.replace(/&Pi;|&#928;|&#x3a0;/g, 'Π');
+str = str.replace(/&Rho;|&#929;|&#x3a1;/g, 'Ρ');
+str = str.replace(/&Sigma;|&#931;|&#x3a3;/g, 'Σ');
+str = str.replace(/&Tau;|&#932;|&#x3a4;/g, 'Τ');
+str = str.replace(/&Upsilon;|&#933;|&#x3a5;/g, 'Υ');
+str = str.replace(/&Phi;|&#934;|&#x3a6;/g, 'Φ');
+str = str.replace(/&Chi;|&#935;|&#x3a7;/g, 'Χ');
+str = str.replace(/&Psi;|&#936;|&#x3a8;/g, 'Ψ');
+str = str.replace(/&Omega;|&#937;|&#x3a9;/g, 'Ω');
+
+str = str.replace(/&alpha;|&#945;|&#x3b1;/g, 'α');
+str = str.replace(/&beta;|&#946;|&#x3b2;/g, 'β');
+str = str.replace(/&gamma;|&#947;|&#x3b3;/g, 'γ');
+str = str.replace(/&delta;|&#948;|&#x3b4;/g, 'δ');
+str = str.replace(/&epsilon;|&#949;|&#x3b5;/g, 'ε');
+str = str.replace(/&zeta;|&#950;|&#x3b6;/g, 'ζ');
+str = str.replace(/&eta;|&#951;|&#x3b7;/g, 'η');
+str = str.replace(/&theta;|&#952;|&#x3b8;/g, 'θ');
+str = str.replace(/&iota;|&#953;|&#x3b9;/g, 'ι');
+str = str.replace(/&kappa;|&#954;|&#x3ba;/g, 'κ');
+str = str.replace(/&lambda;|&#955;|&#x3bb;/g, 'λ');
+str = str.replace(/&mu;|&#956;|&#x3bc;/g, 'μ');
+str = str.replace(/&nu;|&#957;|&#x3bd;/g, 'ν');
+str = str.replace(/&xi;|&#958;|&#x3be;/g, 'ξ');
+str = str.replace(/&omicron;|&#959;|&#x3bf;/g, 'ο');
+str = str.replace(/&pi;|&#960;|&#x3c0;/g, 'π');
+str = str.replace(/&rho;|&#961;|&#x3c1;/g, 'ρ');
+str = str.replace(/&sigmaf;|&#962;|&#x3c2;/g, 'ς');
+str = str.replace(/&sigma;|&#963;|&#x3c3;/g, 'σ');
+str = str.replace(/&tau;|&#964;|&#x3c4;/g, 'τ');
+str = str.replace(/&upsilon;|&#965;|&#x3c5;/g, 'υ');
+str = str.replace(/&phi;|&#966;|&#x3c6;/g, 'φ');
+str = str.replace(/&chi;|&#967;|&#x3c7;/g, 'χ');
+str = str.replace(/&psi;|&#968;|&#x3c8;/g, 'ψ');
+str = str.replace(/&omega;|&#969;|&#x3c9;/g, 'ω');
+str = str.replace(/&thetasym;|&#977;|&#x3d1;/g, 'ϑ');
+str = str.replace(/&upsih;|&#978;|&#x3d2;/g, 'ϒ');
+str = str.replace(/&piv;|&#982;|&#x3d6;/g, 'ϖ');
+str = str.replace(/&middot;|&#183;|&#xb7;/g, '·');
+return str;
+}
+
+function strcharacterDiscode(str) {
+// 加入常用解析
+
+// str = str.replace(/&nbsp;|&#32;|&#x20;/g, "&nbsp;");
+// str = str.replace(/&ensp;|&#8194;|&#x2002;/g, '&ensp;');
+// str = str.replace(/&#12288;|&#x3000;/g, '<span class=\'spaceshow\'> </span>');
+// str = str.replace(/&emsp;|&#8195;|&#x2003;/g, '&emsp;');
+// str = str.replace(/&quot;|&#34;|&#x22;/g, "\"");
+// str = str.replace(/&apos;|&#39;|&#x27;/g, "&apos;");
+// str = str.replace(/&acute;|&#180;|&#xB4;/g, "´");
+// str = str.replace(/&times;|&#215;|&#xD7;/g, "×");
+// str = str.replace(/&divide;|&#247;|&#xF7;/g, "÷");
+// str = str.replace(/&amp;|&#38;|&#x26;/g, '&amp;');
+// str = str.replace(/&lt;|&#60;|&#x3c;/g, '&lt;');
+// str = str.replace(/&gt;|&#62;|&#x3e;/g, '&gt;');
+
+
+
+
+str = str.replace(/&nbsp;|&#32;|&#x20;/g, "<span class='spaceshow'> </span>");
+str = str.replace(/&ensp;|&#8194;|&#x2002;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&#12288;|&#x3000;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&emsp;|&#8195;|&#x2003;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&quot;|&#34;|&#x22;/g, "\"");
+str = str.replace(/&quot;|&#39;|&#x27;/g, "'");
+str = str.replace(/&acute;|&#180;|&#xB4;/g, "´");
+str = str.replace(/&times;|&#215;|&#xD7;/g, "×");
+str = str.replace(/&divide;|&#247;|&#xF7;/g, "÷");
+str = str.replace(/&amp;|&#38;|&#x26;/g, '&');
+str = str.replace(/&lt;|&#60;|&#x3c;/g, '<');
+str = str.replace(/&gt;|&#62;|&#x3e;/g, '>');
+return str;
+}
+
+// HTML 支持的其他实体
+function strOtherDiscode(str) {
+str = str.replace(/&OElig;|&#338;|&#x152;/g, 'Œ');
+str = str.replace(/&oelig;|&#339;|&#x153;/g, 'œ');
+str = str.replace(/&Scaron;|&#352;|&#x160;/g, 'Š');
+str = str.replace(/&scaron;|&#353;|&#x161;/g, 'š');
+str = str.replace(/&Yuml;|&#376;|&#x178;/g, 'Ÿ');
+str = str.replace(/&fnof;|&#402;|&#x192;/g, 'ƒ');
+str = str.replace(/&circ;|&#710;|&#x2c6;/g, 'ˆ');
+str = str.replace(/&tilde;|&#732;|&#x2dc;/g, '˜');
+str = str.replace(/&thinsp;|$#8201;|&#x2009;/g, '<span class=\'spaceshow\'> </span>');
+str = str.replace(/&zwnj;|&#8204;|&#x200C;/g, '<span class=\'spaceshow\'>‌</span>');
+str = str.replace(/&zwj;|$#8205;|&#x200D;/g, '<span class=\'spaceshow\'>‍</span>');
+str = str.replace(/&lrm;|$#8206;|&#x200E;/g, '<span class=\'spaceshow\'>‎</span>');
+str = str.replace(/&rlm;|&#8207;|&#x200F;/g, '<span class=\'spaceshow\'>‏</span>');
+str = str.replace(/&ndash;|&#8211;|&#x2013;/g, '–');
+str = str.replace(/&mdash;|&#8212;|&#x2014;/g, '—');
+str = str.replace(/&lsquo;|&#8216;|&#x2018;/g, '‘');
+str = str.replace(/&rsquo;|&#8217;|&#x2019;/g, '’');
+str = str.replace(/&sbquo;|&#8218;|&#x201a;/g, '‚');
+str = str.replace(/&ldquo;|&#8220;|&#x201c;/g, '“');
+str = str.replace(/&rdquo;|&#8221;|&#x201d;/g, '”');
+str = str.replace(/&bdquo;|&#8222;|&#x201e;/g, '„');
+str = str.replace(/&dagger;|&#8224;|&#x2020;/g, '†');
+str = str.replace(/&Dagger;|&#8225;|&#x2021;/g, '‡');
+str = str.replace(/&bull;|&#8226;|&#x2022;/g, '•');
+str = str.replace(/&hellip;|&#8230;|&#x2026;/g, '…');
+str = str.replace(/&permil;|&#8240;|&#x2030;/g, '‰');
+str = str.replace(/&prime;|&#8242;|&#x2032;/g, '′');
+str = str.replace(/&Prime;|&#8243;|&#x2033;/g, '″');
+str = str.replace(/&lsaquo;|&#8249;|&#x2039;/g, '‹');
+str = str.replace(/&rsaquo;|&#8250;|&#x203a;/g, '›');
+str = str.replace(/&oline;|&#8254;|&#x203e;/g, '‾');
+str = str.replace(/&euro;|&#8364;|&#x20ac;/g, '€');
+str = str.replace(/&trade;|&#8482;|&#x2122;/g, '™');
+str = str.replace(/&larr;|&#8592;|&#x2190;/g, '←');
+str = str.replace(/&uarr;|&#8593;|&#x2191;/g, '↑');
+str = str.replace(/&rarr;|&#8594;|&#x2192;/g, '→');
+str = str.replace(/&darr;|&#8595;|&#x2193;/g, '↓');
+str = str.replace(/&harr;|&#8596;|&#x2194;/g, '↔');
+str = str.replace(/&crarr;|&#8629;|&#x21b5;/g, '↵');
+str = str.replace(/&lceil;|&#8968;|&#x2308;/g, '⌈');
+str = str.replace(/&rceil;|&#8969;|&#x2309;/g, '⌉');
+str = str.replace(/&lfloor;|&#8970;|&#x230a;/g, '⌊');
+str = str.replace(/&rfloor;|&#8971;|&#x230b;/g, '⌋');
+str = str.replace(/&loz;|&#9674;|&#x25ca;/g, '◊');
+str = str.replace(/&spades;|&#9824;|&#x2660;/g, '♠');
+str = str.replace(/&clubs;|&#9827;|&#x2663;/g, '♣');
+str = str.replace(/&hearts;|&#9829;|&#x2665;/g, '♥');
+str = str.replace(/&diams;|&#9830;|&#x2666;/g, '♦');
+return str;
+}
+
+function strDiscode(str) {
+  str = strNumDiscode(str);
+  str = strGreeceDiscode(str);
+  str = strcharacterDiscode(str);
+  str = strOtherDiscode(str);
+  return str;
+}
+
+function urlToHttpUrl(url, domain) {
+  if (/^\/\//.test(url)) {
+    return `https:${url}`;
+  } else if (/^\//.test(url)) {
+    return `https://${domain}${url}`;
+  }
+  return url;
+}
+
+export default {
+  strDiscode,
+  urlToHttpUrl,
+};

+ 259 - 0
components/gaoyia-parse/parse.css

@@ -0,0 +1,259 @@
+/**
+ * author: Di (微信小程序开发工程师)
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
+ *         垂直微信小程序开发交流社区
+ *
+ * github地址: https://github.com/icindy/wxParse
+ *
+ * for: 微信小程序富文本解析
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
+ */
+/**
+ * 请在全局下引入该文件,@import '/static/wxParse.css';
+ */
+.wxParse {
+	user-select:none;
+	width: 100%;
+	font-family: Helvetica, "PingFangSC", 'Microsoft Yahei', '微软雅黑', Arial, sans-serif;
+	color: #333;
+	line-height: 1.5;
+	font-size: 1em;
+	text-align:justify;/* //左右两端对齐 */
+}
+.wxParse view ,.wxParse uni-view{
+	word-break: break-word;
+}
+.wxParse .p {
+	padding-bottom: 0.5em;
+	clear: both;
+	/* letter-spacing: 0;//字间距 */
+}
+.wxParse .inline {
+  display: inline!important;
+  white-space:inherit!important;
+  margin: 0;
+  padding: 0;
+}
+
+.wxParse .div {
+  margin: 0;
+  padding: 0;
+  display: block;
+}
+
+.wxParse .h1{
+  font-size: 2em;
+  line-height: 1.2em;
+  margin: 0.67em 0;
+}
+.wxParse .h2{
+  font-size: 1.5em;
+  margin: 0.83em 0;
+}
+.wxParse .h3{
+  font-size: 1.17em;
+  margin: 1em 0;
+}
+.wxParse .h4{
+  margin: 1.33em 0;
+}
+.wxParse .h5{
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+.wxParse .h6{
+  font-size: 0.83em;
+  margin: 1.67em 0;
+}
+
+.wxParse .h1,
+.wxParse .h2,
+.wxParse .h3,
+.wxParse .h4,
+.wxParse .h5,
+.wxParse .h6,
+.wxParse .b,
+.wxParse .strong{
+  font-weight: bolder;
+}
+
+.wxParse .i,
+.wxParse .cite,
+.wxParse .em,
+.wxParse .var,
+.wxParse .address {
+  font-style: italic;
+}
+.wxParse .spaceshow{
+	  white-space: pre;
+}
+.wxParse .pre,
+.wxParse .tt,
+.wxParse .code,
+.wxParse .kbd,
+.wxParse .samp {
+  font-family: monospace;
+}
+.wxParse .pre {
+  overflow: auto;
+  background: #f5f5f5;
+  padding: 16upx;
+  white-space: pre;
+  margin: 1em 0upx;
+  font-size: 24upx;
+}
+.wxParse .code {
+	overflow: auto;
+	padding: 16upx;
+	white-space: pre;
+	margin: 1em 0upx;
+	background: #f5f5f5;
+	font-size: 24upx;
+}
+
+.wxParse .big {
+  font-size: 1.17em;
+}
+
+.wxParse .small,
+.wxParse .sub,
+.wxParse .sup {
+  font-size: 0.83em;
+}
+
+.wxParse .sub {
+  vertical-align: sub;
+}
+.wxParse .sup {
+  vertical-align: super;
+}
+
+.wxParse .s,
+.wxParse .strike,
+.wxParse .del {
+  text-decoration: line-through;
+}
+
+.wxParse .strong,
+.wxParse .text,
+.wxParse .span,
+.wxParse .s {
+  display: inline;
+}
+
+.wxParse .a {
+  color: deepskyblue;
+}
+
+.wxParse .video {
+  text-align: center;
+  margin: 22upx 0;
+}
+
+.wxParse .video-video {
+  width: 100%;
+}
+.wxParse .uni-image{
+	max-width: 100%;
+}
+.wxParse .img {
+  display: block;
+  max-width: 100%;
+  margin-bottom: 0em;/* //与p标签底部padding同时修改 */
+  overflow: hidden;
+}
+
+.wxParse .blockquote {
+  margin: 10upx 0;
+  padding: 22upx 0 22upx 22upx;
+  font-family: Courier, Calibri, "宋体";
+  background: #f5f5f5;
+  border-left: 6upx solid #dbdbdb;
+}
+.wxParse .blockquote .p {
+  margin: 0;
+}
+.wxParse .ul, .wxParse .ol {
+  display: block;
+  margin: 1em 0;
+  padding-left: 2em;
+}
+.wxParse .ol {
+  list-style-type: disc;
+}
+.wxParse .ol {
+  list-style-type: decimal;
+}
+.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+
+.wxParse .ol>.li,.wxParse .ul>.li {
+  display: list-item;
+  align-items: baseline;
+  text-align: match-parent;
+}
+.wxParse .ul .ul, .wxParse .ol .ul {
+  list-style-type: circle;
+}
+.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul {
+    list-style-type: square;
+}
+
+.wxParse .u {
+  text-decoration: underline;
+}
+.wxParse .hide {
+  display: none;
+}
+.wxParse .del {
+  display: inline;
+}
+.wxParse .figure {
+  overflow: hidden;
+}
+.wxParse .tablebox{
+	overflow: auto;
+	background-color: #f5f5f5;
+	background: #f5f5f5;
+	font-size: 13px;
+	padding: 8px;
+}
+.wxParse .table .table,.wxParse .table{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* 内边框 */
+	/* width: 100%; */
+	overflow: auto;
+	white-space: pre;
+}
+.wxParse .tbody{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* 内边框 */
+	border: 1px solid #dadada;
+}
+.wxParse .table  .thead, .wxParse  .table .tfoot, .wxParse  .table .th{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	background: #ececec;
+	font-weight: 40;
+}
+.wxParse  .table .tr {
+	border-collapse:collapse;
+	box-sizing: border-box;
+	/* border: 2px solid #F0AD4E; */
+	overflow:auto;
+}
+.wxParse  .table .th,
+.wxParse  .table .td{
+	border-collapse:collapse;
+	box-sizing: border-box;
+	border: 2upx solid #dadada;
+	overflow:auto;
+}
+.wxParse .audio, .wxParse .uni-audio-default{
+	display: block;
+}

+ 228 - 0
components/gaoyia-parse/parse.vue

@@ -0,0 +1,228 @@
+<!--**
+ * forked from:https://github.com/F-loat/mpvue-wxParse
+ *
+ * github地址: https://github.com/dcloudio/uParse
+ *
+ * for: uni-app框架下 富文本解析
+ * 
+ * 优化 by gaoyia@qq.com  https://github.com/gaoyia/parse
+ */-->
+
+<template>
+	
+	<!--基础元素-->
+	<div class="wxParse" :class="className" :style="'user-select:' + userSelect">
+		<block v-for="(node, index) of nodes" :key="index" v-if="!loading">
+			<wxParseTemplate :node="node" />
+		</block>
+	</div>
+</template>
+
+<script>
+import HtmlToJson from './libs/html2json';
+import wxParseTemplate from './components/wxParseTemplate0';
+
+	
+	export default {
+		name: 'wxParse',
+		props: {
+			// user-select:none;
+			userSelect: {
+				type: String,
+				default: 'text' //none |text| all | element
+			},
+			imgOptions: {
+				type: [Object, Boolean],
+				default: function() {
+					return {
+						loop: false,
+						indicator: 'number',
+						longPressActions: false
+						// longPressActions: {
+						// 	 itemList: ['发送给朋友', '保存图片', '收藏'],
+						// 		success: function (res) {
+						// 			console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+						// 		},
+						// 		fail: function (res) {
+						// 			console.log(res.errMsg);
+						// 		}    
+						// 	}
+						// }
+					}
+				}
+			},
+			loading: {
+				type: Boolean,
+				default: false
+			},
+			className: {
+				type: String,
+				default: ''
+			},
+			content: {
+				type: String,
+				default: ''
+			},
+			noData: {
+				type: String,
+				default: '<div style="color: red;">数据不能为空</div>'
+			},
+			startHandler: {
+				type: Function,
+				default () {
+					return node => {
+						node.attr.class = null;
+						node.attr.style = null;
+					};
+				}
+			},
+			endHandler: {
+				type: Function,
+				default: null
+			},
+			charsHandler: {
+				type: Function,
+				default: null
+			},
+			imageProp: {
+				type: Object,
+				default () {
+					return {
+						mode: 'aspectFit',
+						padding: 0,
+						lazyLoad: false,
+						domain: ''
+					};
+				}
+			}
+		},
+		components: {
+			wxParseTemplate
+		},
+		data() {
+			return {
+				nodes: {},
+				imageUrls: [],
+				wxParseWidth: {
+					value: 0
+				}
+			};
+		},
+		computed: {},
+		mounted() {
+			this.setHtml()
+		},
+		methods: {
+			setHtml() {
+				this.getWidth().then((data) => {
+					this.wxParseWidth.value = data;
+				})
+				let {
+					content,
+					noData,
+					imageProp,
+					startHandler,
+					endHandler,
+					charsHandler
+				} = this;
+				let parseData = content || noData;
+				let customHandler = {
+					start: startHandler,
+					end: endHandler,
+					chars: charsHandler
+				};
+				let results = HtmlToJson(parseData, customHandler, imageProp, this);
+
+				this.imageUrls = results.imageUrls;
+				// this.nodes = results.nodes;
+				
+				
+				this.nodes = [];
+				results.nodes.forEach((item) => {
+					setTimeout(() => {
+						this.nodes.push(item)
+					}, 0);
+				})
+			},
+			getWidth() {
+				return new Promise((res, rej) => {
+					// #ifndef MP-ALIPAY || MP-BAIDU
+					uni.createSelectorQuery()
+						.in(this)
+						.select('.wxParse')
+						.fields({
+								size: true,
+								scrollOffset: true
+							},
+							data => {
+								res(data.width);
+							}
+						).exec();
+					// #endif
+					// #ifdef MP-BAIDU
+					const query = swan.createSelectorQuery();
+					query.select('.wxParse').boundingClientRect();
+					query.exec(obj => {
+						const rect = obj[0]
+						if (rect) {
+							res(rect.width);
+						}
+					});
+					// #endif
+					// #ifdef MP-ALIPAY
+					my.createSelectorQuery()
+						.select('.wxParse')
+						.boundingClientRect().exec((ret) => {
+							res(ret[0].width);
+						});
+					// #endif
+				});
+			},
+			navigate(href, $event, attr) {
+				console.log(href, attr);
+				this.$emit('navigate', href, $event);
+			},
+			preview(src, $event) {
+				if (!this.imageUrls.length || typeof this.imgOptions === 'boolean') {
+
+				} else {
+					uni.previewImage({
+						current: src,
+						urls: this.imageUrls,
+						loop: this.imgOptions.loop,
+						indicator: this.imgOptions.indicator,
+						longPressActions: this.imgOptions.longPressActions
+					});
+				}
+				this.$emit('preview', src, $event);
+			},
+			removeImageUrl(src) {
+				const {
+					imageUrls
+				} = this;
+				imageUrls.splice(imageUrls.indexOf(src), 1);
+			}
+		},
+		// 父组件中提供
+		provide() {
+			return {
+				parseWidth: this.wxParseWidth,
+				parseSelect: this.userSelect
+				// 提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。
+			};
+		},
+		watch: {
+			content(){
+				this.setHtml()
+			}
+			// content: {
+			// 	handler: function(newVal, oldVal) {
+			// 		if (newVal !== oldVal) {
+			// 			
+			// 		}
+			// 	},
+			// 	deep: true
+			// }
+		}
+	};
+</script>

+ 197 - 0
components/helang-compress/helang-compress.vue

@@ -0,0 +1,197 @@
+<template>
+	<view class="compress" v-if="canvasId">
+		<canvas :canvas-id="canvasId" :style="{ width: canvasSize.width,height: canvasSize.height}"></canvas>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				pic:'',
+				canvasSize: {
+					width: 0,
+					height: 0
+				},
+				canvasId:""
+			}
+		},
+		mounted() {
+			if(!uni || !uni._helang_compress_canvas){
+				uni._helang_compress_canvas = 1;
+			}else{
+				uni._helang_compress_canvas++;
+			}
+			this.canvasId = `compress-canvas${uni._helang_compress_canvas}`;
+		},
+		methods: {
+			// 压缩
+			compressFun(params) {
+				return new Promise(async (resolve, reject) => {
+					// 等待图片信息
+					let info = await this.getImageInfo(params.src).then(info=>info).catch(()=>null);
+					
+					if(!info){
+						reject('获取图片信息异常');
+						return;
+					}
+					
+					// 设置最大 & 最小 尺寸
+					const maxSize = params.maxSize || 1080;
+					const minSize = params.minSize || 640;
+					
+					// 当前图片尺寸
+					let {width,height} = info;
+					
+					// 非 H5 平台进行最小尺寸校验
+					// #ifndef H5
+					if(width <= minSize && height <= minSize){
+						resolve(params.src);
+						return;
+					}
+					// #endif
+					
+					// 最大尺寸计算
+					if (width > maxSize || height > maxSize) {
+						if (width > height) {
+							height = Math.floor(height / (width / maxSize));
+							width = maxSize;
+						} else {
+							width = Math.floor(width / (height / maxSize));
+							height = maxSize;
+						}
+					}
+					
+					// 设置画布尺寸
+					this.$set(this,"canvasSize",{
+						width: `${width}px`,
+						height: `${height}px`
+					});
+					
+					
+					// Vue.nextTick 回调在 App 有异常,则使用 setTimeout 等待DOM更新
+					setTimeout(() => {
+						const ctx = uni.createCanvasContext(this.canvasId, this);
+						ctx.clearRect(0,0,width, height)
+						ctx.drawImage(info.path, 0, 0, width, height);
+						ctx.draw(false, () => {
+							uni.canvasToTempFilePath({
+								x: 0,
+								y: 0,
+								width: width,
+								height: height,
+								destWidth: width,
+								destHeight: height,
+								canvasId: this.canvasId,
+								fileType: params.fileType || 'png',
+								quality: params.quality || 0.9,
+								success: (res) => {									
+									// 在H5平台下,tempFilePath 为 base64
+									resolve(res.tempFilePath);
+								},
+								fail:(err)=>{
+									reject(null);
+								}
+							},this);
+						});
+					}, 300);
+				});
+			},
+			// 获取图片信息
+			getImageInfo(src){
+				return new Promise((resolve, reject)=>{
+					uni.getImageInfo({
+						src,
+						success: (info)=> {
+							resolve(info);
+						},
+						fail: () => {
+							reject(null);
+						}
+					});
+				});
+			},
+			// 批量压缩
+			compress(params){
+				// index:进度,done:成功,fail:失败
+				let [index,done,fail] = [0,0,0];
+				// 压缩完成的路径集合
+				let paths = [];
+				// 待压缩的图片
+				let waitList = [];
+				if(typeof params.src == 'string'){
+					waitList = [params.src];
+				}else{
+					waitList = params.src;
+				}
+				// 批量压缩方法
+				let batch = ()=>{
+					return new Promise((resolve, reject)=>{
+						// 开始
+						let start = async ()=>{
+							// 等待图片压缩方法返回
+							let path = await next().catch(()=>null);
+							if(path){
+								done++;
+								paths.push(path);
+							}else{
+								fail++;
+							}
+							
+							params.progress && params.progress({
+								done,
+								fail,
+								count:waitList.length
+							});
+							
+							index++;
+							// 压缩完成
+							if(index >= waitList.length){
+								resolve(true);
+							}else{
+								start();
+							}
+						}
+						start();
+					});
+				}
+				// 依次调用压缩方法
+				let next = ()=>{
+					return this.compressFun({
+						src:waitList[index],
+						maxSize:params.maxSize,
+						fileType:params.fileType,
+						quality:params.quality,
+						minSize:params.minSize
+					})
+				}
+				
+				// 全部压缩完成后调用
+				return new Promise(async (resolve, reject)=>{
+					// 批量压缩方法回调
+					let res = await batch();
+					if(res){
+						if(typeof params.src == 'string'){
+							resolve(paths[0]);
+						}else{
+							resolve(paths);
+						}
+					}else{
+						reject(null);
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.compress{
+		position: fixed;
+		width: 12px;
+		height: 12px;
+		overflow: hidden;
+		top: -99999px;
+		left: 0;
+	}
+</style>

+ 83 - 0
components/mao-scroll/mao-scroll.vue

@@ -0,0 +1,83 @@
+<template>
+	<view>
+		<view class="maoScroll-main" :style="'height:'+(lineHeight*showLine)+'rpx;'">
+			<view :style="'margin-top:-'+marginTop+'rpx;'">
+				<view v-for="(item,index) in showdata" :key="'maoScroll'+index" :style="'height:'+lineHeight+'rpx;'">
+					<slot :line="item" />
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'maoScroll',
+		data() {
+			return {
+				showdata: [],
+				marginTop: 0,
+				showLine: 0,
+			}
+		},
+		props:{
+			data: {
+				type: Array,
+				default: []
+			},
+			showNum: {
+				type: Number,
+				default: 3,
+			},
+			lineHeight: {
+				type: Number,
+				default: 60,
+			},
+			animationScroll: {
+				type: Number,
+				default: 500,
+			},
+			animation: {
+				type: Number,
+				default: 2000,
+			}
+		},
+		methods: {
+			init: function(){
+				this.showLine = this.showNum < this.data.length ? this.showNum : this.data.length;
+				for(let i = 0; i < this.data.length; i++){
+					this.showdata.push(this.data[i]);
+				}
+				for(let i = 0; i < this.showLine; i++){
+					this.showdata.push(this.data[i]);
+				}
+				setInterval(this.animationFunc, this.animation);
+			},
+			animationFunc: function(){
+				if(this.marginTop >= this.data.length*this.lineHeight){
+					this.marginTop = 0;
+				}
+				let stepTime = this.animationScroll/this.lineHeight;
+				
+				var step = 0;
+				let self = this;
+				var index = setInterval(function(){
+					self.marginTop = self.marginTop + 1;
+					step++;
+					if (step >= self.lineHeight) {
+						clearInterval(index);
+					}
+				}, stepTime);
+			}
+		},
+		watch: {
+			data(outdata, newdata) {
+				this.init();
+			}
+		}
+	}
+</script>
+
+<style>
+	.maoScroll-main{width: 100%;overflow: hidden;}
+</style>

+ 55 - 0
components/mescroll-uni/components/mescroll-down.css

@@ -0,0 +1,55 @@
+/* 下拉刷新区域 */
+.mescroll-downwarp {
+	position: absolute;
+	top: -100%;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	text-align: center;
+}
+
+/* 下拉刷新--内容区,定位于区域底部 */
+.mescroll-downwarp .downwarp-content {
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	width: 100%;
+	min-height: 60rpx;
+	padding: 20rpx 0;
+	text-align: center;
+}
+
+/* 下拉刷新--提示文本 */
+.mescroll-downwarp .downwarp-tip {
+	display: inline-block;
+	font-size: 28rpx;
+	vertical-align: middle;
+	margin-left: 16rpx;
+	/* color: gray; 已在style设置color,此处删去*/
+}
+
+/* 下拉刷新--旋转进度条 */
+.mescroll-downwarp .downwarp-progress {
+	display: inline-block;
+	width: 32rpx;
+	height: 32rpx;
+	border-radius: 50%;
+	border: 2rpx solid gray;
+	border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/
+	vertical-align: middle;
+}
+
+/* 旋转动画 */
+.mescroll-downwarp .mescroll-rotate {
+	animation: mescrollDownRotate 0.6s linear infinite;
+}
+
+@keyframes mescrollDownRotate {
+	0% {
+		transform: rotate(0deg);
+	}
+
+	100% {
+		transform: rotate(360deg);
+	}
+}

+ 47 - 0
components/mescroll-uni/components/mescroll-down.vue

@@ -0,0 +1,47 @@
+<!-- 下拉刷新区域 -->
+<template>
+	<view v-if="mOption.use" class="mescroll-downwarp" :style="{'background-color':mOption.bgColor,'color':mOption.textColor}">
+		<view class="downwarp-content">
+			<view class="downwarp-progress" :class="{'mescroll-rotate': isDownLoading}" :style="{'border-color':mOption.textColor, 'transform':downRotate}"></view>
+			<view class="downwarp-tip">{{downText}}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		option: Object , // down的配置项
+		type: Number, // 下拉状态(inOffset:1, outOffset:2, showLoading:3, endDownScroll:4)
+		rate: Number // 下拉比率 (inOffset: rate<1; outOffset: rate>=1)
+	},
+	computed: {
+		// 支付宝小程序需写成计算属性,prop定义default仍报错
+		mOption(){
+			return this.option || {}
+		},
+		// 是否在加载中
+		isDownLoading(){
+			return this.type === 3
+		},
+		// 旋转的角度
+		downRotate(){
+			return 'rotate(' + 360 * this.rate + 'deg)'
+		},
+		// 文本提示
+		downText(){
+			switch (this.type){
+				case 1: return this.mOption.textInOffset;
+				case 2: return this.mOption.textOutOffset;
+				case 3: return this.mOption.textLoading;
+				case 4: return this.mOption.textLoading;
+				default: return this.mOption.textInOffset;
+			}
+		}
+	}
+};
+</script>
+
+<style>
+@import "./mescroll-down.css";
+</style>

+ 90 - 0
components/mescroll-uni/components/mescroll-empty.vue

@@ -0,0 +1,90 @@
+<!--空布局
+
+可作为独立的组件, 不使用mescroll的页面也能单独引入, 以便APP全局统一管理:
+import MescrollEmpty from '@/components/mescroll-uni/components/mescroll-empty.vue';
+<mescroll-empty v-if="isShowEmpty" :option="optEmpty" @emptyclick="emptyClick"></mescroll-empty>
+
+-->
+<template>
+	<view class="mescroll-empty" :class="{ 'empty-fixed': option.fixed }" :style="{ 'z-index': option.zIndex, top: option.top }">
+		<view> <image v-if="icon" class="empty-icon" :src="icon" mode="widthFix" /> </view>
+		<view v-if="tip" class="empty-tip">{{ tip }}</view>
+		<view v-if="option.btnText" class="empty-btn" @click="emptyClick">{{ option.btnText }}</view>
+	</view>
+</template>
+
+<script>
+// 引入全局配置
+import GlobalOption from './../mescroll-uni-option.js';
+export default {
+	props: {
+		// empty的配置项: 默认为GlobalOption.up.empty
+		option: {
+			type: Object,
+			default() {
+				return {};
+			}
+		}
+	},
+	// 使用computed获取配置,用于支持option的动态配置
+	computed: {
+		// 图标
+		icon() {
+			return this.option.icon == null ? GlobalOption.up.empty.icon : this.option.icon; // 此处不使用短路求值, 用于支持传空串不显示图标
+		},
+		// 文本提示
+		tip() {
+			return this.option.tip == null ? GlobalOption.up.empty.tip : this.option.tip; // 此处不使用短路求值, 用于支持传空串不显示文本提示
+		}
+	},
+	methods: {
+		// 点击按钮
+		emptyClick() {
+			this.$emit('emptyclick');
+		}
+	}
+};
+</script>
+
+<style>
+/* 无任何数据的空布局 */
+.mescroll-empty {
+	box-sizing: border-box;
+	width: 100%;
+	padding: 100rpx 50rpx;
+	text-align: center;
+}
+
+.mescroll-empty.empty-fixed {
+	z-index: 99;
+	position: absolute; /*transform会使fixed失效,最终会降级为absolute */
+	top: 100rpx;
+	left: 0;
+}
+
+.mescroll-empty .empty-icon {
+	width: 280rpx;
+	height: 280rpx;
+}
+
+.mescroll-empty .empty-tip {
+	margin-top: 20rpx;
+	font-size: 24rpx;
+	color: gray;
+}
+
+.mescroll-empty .empty-btn {
+	display: inline-block;
+	margin-top: 40rpx;
+	min-width: 200rpx;
+	padding: 18rpx;
+	font-size: 28rpx;
+	border: 1rpx solid #e04b28;
+	border-radius: 60rpx;
+	color: #e04b28;
+}
+
+.mescroll-empty .empty-btn:active {
+	opacity: 0.75;
+}
+</style>

+ 83 - 0
components/mescroll-uni/components/mescroll-top.vue

@@ -0,0 +1,83 @@
+<!-- 回到顶部的按钮 -->
+<template>
+	<image
+		v-if="mOption.src"
+		class="mescroll-totop"
+		:class="[value ? 'mescroll-totop-in' : 'mescroll-totop-out', {'mescroll-totop-safearea': mOption.safearea}]"
+		:style="{'z-index':mOption.zIndex, 'left': left, 'right': right, 'bottom':addUnit(mOption.bottom), 'width':addUnit(mOption.width), 'border-radius':addUnit(mOption.radius)}"
+		:src="mOption.src"
+		mode="widthFix"
+		@click="toTopClick"
+	/>
+</template>
+
+<script>
+export default {
+	props: {
+		// up.toTop的配置项
+		option: Object,
+		// 是否显示
+		value: false
+	},
+	computed: {
+		// 支付宝小程序需写成计算属性,prop定义default仍报错
+		mOption(){
+			return this.option || {}
+		},
+		// 优先显示左边
+		left(){
+			return this.mOption.left ? this.addUnit(this.mOption.left) : 'auto';
+		},
+		// 右边距离 (优先显示左边)
+		right() {
+			return this.mOption.left ? 'auto' : this.addUnit(this.mOption.right);
+		}
+	},
+	methods: {
+		addUnit(num){
+			if(!num) return 0;
+			if(typeof num === 'number') return num + 'rpx';
+			return num
+		},
+		toTopClick() {
+			this.$emit('input', false); // 使v-model生效
+			this.$emit('click'); // 派发点击事件
+		}
+	}
+};
+</script>
+
+<style>
+/* 回到顶部的按钮 */
+.mescroll-totop {
+	z-index: 9990;
+	position: fixed !important; /* 加上important避免编译到H5,在多mescroll中定位失效 */
+	right: 20rpx;
+	bottom: 120rpx;
+	width: 72rpx;
+	height: auto;
+	border-radius: 50%;
+	opacity: 0;
+	transition: opacity 0.5s; /* 过渡 */
+	margin-bottom: var(--window-bottom); /* css变量 */
+}
+
+/* 适配 iPhoneX */
+@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
+	.mescroll-totop-safearea {
+		margin-bottom: calc(var(--window-bottom) + constant(safe-area-inset-bottom)); /* window-bottom + 适配 iPhoneX */
+		margin-bottom: calc(var(--window-bottom) + env(safe-area-inset-bottom));
+	}
+}
+
+/* 显示 -- 淡入 */
+.mescroll-totop-in {
+	opacity: 1;
+}
+
+/* 隐藏 -- 淡出且不接收事件*/
+.mescroll-totop-out {
+	opacity: 0;
+	pointer-events: none;
+}
+</style>

+ 47 - 0
components/mescroll-uni/components/mescroll-up.css

@@ -0,0 +1,47 @@
+/* 上拉加载区域 */
+.mescroll-upwarp {
+	box-sizing: border-box;
+	min-height: 110rpx;
+	padding: 30rpx 0;
+	text-align: center;
+	clear: both;
+}
+
+/*提示文本 */
+.mescroll-upwarp .upwarp-tip,
+.mescroll-upwarp .upwarp-nodata {
+	display: inline-block;
+	font-size: 28rpx;
+	vertical-align: middle;
+	/* color: gray; 已在style设置color,此处删去*/
+}
+
+.mescroll-upwarp .upwarp-tip {
+	margin-left: 16rpx;
+}
+
+/*旋转进度条 */
+.mescroll-upwarp .upwarp-progress {
+	display: inline-block;
+	width: 32rpx;
+	height: 32rpx;
+	border-radius: 50%;
+	border: 2rpx solid gray;
+	border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/
+	vertical-align: middle;
+}
+
+/* 旋转动画 */
+.mescroll-upwarp .mescroll-rotate {
+	animation: mescrollUpRotate 0.6s linear infinite;
+}
+
+@keyframes mescrollUpRotate {
+	0% {
+		transform: rotate(0deg);
+	}
+
+	100% {
+		transform: rotate(360deg);
+	}
+}

+ 39 - 0
components/mescroll-uni/components/mescroll-up.vue

@@ -0,0 +1,39 @@
+<!-- 上拉加载区域 -->
+<template>
+	<view class="mescroll-upwarp" :style="{'background-color':mOption.bgColor,'color':mOption.textColor}">
+		<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
+		<view v-show="isUpLoading">
+			<view class="upwarp-progress mescroll-rotate" :style="{'border-color':mOption.textColor}"></view>
+			<view class="upwarp-tip">{{ mOption.textLoading }}</view>
+		</view>
+		<!-- 无数据 -->
+		<view v-if="isUpNoMore" class="upwarp-nodata">{{ mOption.textNoMore }}</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		option: Object, // up的配置项
+		type: Number // 上拉加载的状态:0(loading前),1(loading中),2(没有更多了)
+	},
+	computed: {
+		// 支付宝小程序需写成计算属性,prop定义default仍报错
+		mOption() {
+			return this.option || {};
+		},
+		// 加载中
+		isUpLoading() {
+			return this.type === 1;
+		},
+		// 没有更多了
+		isUpNoMore() {
+			return this.type === 2;
+		}
+	}
+};
+</script>
+
+<style>
+@import './mescroll-up.css';
+</style>

+ 19 - 0
components/mescroll-uni/mescroll-body.css

@@ -0,0 +1,19 @@
+.mescroll-body {
+	position: relative; /* 下拉刷新区域相对自身定位 */
+	height: auto; /* 不可固定高度,否则overflow:hidden导致无法滑动; 同时使设置的最小高生效,实现列表不满屏仍可下拉*/
+	overflow: hidden; /* 当有元素写在mescroll-body标签前面时,可遮住下拉刷新区域 */
+	box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */
+}
+
+/* 使sticky生效: 父元素不能overflow:hidden或者overflow:auto属性 */
+.mescroll-body.mescorll-sticky{
+	overflow: unset !important
+}
+
+/* 适配 iPhoneX */
+@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
+	.mescroll-safearea {
+		padding-bottom: constant(safe-area-inset-bottom);
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+}

+ 348 - 0
components/mescroll-uni/mescroll-body.vue

@@ -0,0 +1,348 @@
+<template>
+	<view 
+	class="mescroll-body mescroll-render-touch" 
+	:class="{'mescorll-sticky': sticky}"
+	:style="{'minHeight':minHeight, 'padding-top': padTop, 'padding-bottom': padBottom}" 
+	@touchstart="wxsBiz.touchstartEvent" 
+	@touchmove="wxsBiz.touchmoveEvent" 
+	@touchend="wxsBiz.touchendEvent" 
+	@touchcancel="wxsBiz.touchendEvent"
+	:change:prop="wxsBiz.propObserver"
+	:prop="wxsProp"
+	>
+		<!-- 状态栏 -->
+		<view v-if="topbar&&statusBarHeight" class="mescroll-topbar" :style="{height: statusBarHeight+'px', background: topbar}"></view>
+		
+		<view class="mescroll-body-content mescroll-wxs-content" :style="{ transform: translateY, transition: transition }" :change:prop="wxsBiz.callObserver" :prop="callProp">
+			<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->
+			<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType" :rate="downRate"></mescroll-down> -->
+			<view v-if="mescroll.optDown.use" class="mescroll-downwarp" :style="{'background':mescroll.optDown.bgColor,'color':mescroll.optDown.textColor}">
+				<view class="downwarp-content">
+					<view class="downwarp-progress mescroll-wxs-progress" :class="{'mescroll-rotate': isDownLoading}" :style="{'border-color':mescroll.optDown.textColor, 'transform': downRotate}"></view>
+					<view class="downwarp-tip">{{downText}}</view>
+				</view>
+			</view>
+	
+			<!-- 列表内容 -->
+			<slot></slot>
+
+			<!-- 空布局 -->
+			<mescroll-empty v-if="isShowEmpty" :option="mescroll.optUp.empty" @emptyclick="emptyClick"></mescroll-empty>
+
+			<!-- 上拉加载区域 (下拉刷新时不显示, 支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)-->
+			<!-- <mescroll-up v-if="mescroll.optUp.use && !isDownLoading && upLoadType!==3" :option="mescroll.optUp" :type="upLoadType"></mescroll-up> -->
+			<view v-if="mescroll.optUp.use && !isDownLoading && upLoadType!==3" class="mescroll-upwarp" :style="{'background':mescroll.optUp.bgColor,'color':mescroll.optUp.textColor}">
+				<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
+				<view v-show="upLoadType===1">
+					<view class="upwarp-progress mescroll-rotate" :style="{'border-color':mescroll.optUp.textColor}"></view>
+					<view class="upwarp-tip">{{ mescroll.optUp.textLoading }}</view>
+				</view>
+				<!-- 无数据 -->
+				<view v-if="upLoadType===2" class="upwarp-nodata">{{ mescroll.optUp.textNoMore }}</view>
+			</view>
+		</view>
+		
+		<!-- 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效) -->
+		<!-- #ifdef H5 -->
+		<view v-if="bottombar && windowBottom>0" class="mescroll-bottombar" :style="{height: windowBottom+'px'}"></view>
+		<!-- #endif -->
+		
+		<!-- 适配iPhoneX -->
+		<view v-if="safearea" class="mescroll-safearea"></view>
+		
+		<!-- 回到顶部按钮 (fixed元素需写在transform外面,防止降级为absolute)-->
+		<mescroll-top v-model="isShowToTop" :option="mescroll.optUp.toTop" @click="toTopClick"></mescroll-top>
+		
+		<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+		<!-- renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 -->
+		<view :change:prop="renderBiz.propObserver" :prop="wxsProp"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<!-- 微信小程序, QQ小程序, app, h5使用wxs -->
+<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+<script src="./wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
+<!-- #endif -->
+
+<!-- app, h5使用renderjs -->
+<!-- #ifdef APP-PLUS || H5 -->
+<script module="renderBiz" lang="renderjs">
+	import renderBiz from './wxs/renderjs.js';
+	export default {
+		mixins: [renderBiz]
+	}
+</script>
+<!-- #endif -->
+
+<script>
+	// 引入mescroll-uni.js,处理核心逻辑
+	import MeScroll from './mescroll-uni.js';
+	// 引入全局配置
+	import GlobalOption from './mescroll-uni-option.js';
+	// 引入空布局组件
+	import MescrollEmpty from './components/mescroll-empty.vue';
+	// 引入回到顶部组件
+	import MescrollTop from './components/mescroll-top.vue';
+	// 引入兼容wxs(含renderjs)写法的mixins
+	import WxsMixin from './wxs/mixins.js';
+	
+	export default {
+		mixins: [WxsMixin],
+		components: {
+			MescrollEmpty,
+			MescrollTop
+		},
+		data() {
+			return {
+				mescroll: {optDown:{},optUp:{}}, // mescroll实例
+				downHight: 0, //下拉刷新: 容器高度
+				downRate: 0, // 下拉比率(inOffset: rate<1; outOffset: rate>=1)
+				downLoadType: 0, // 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
+				upLoadType: 0, // 上拉加载状态:0(loading前),1(loading中),2(没有更多了,显示END文本提示),3(没有更多了,不显示END文本提示)
+				isShowEmpty: false, // 是否显示空布局
+				isShowToTop: false, // 是否显示回到顶部按钮
+				windowHeight: 0, // 可使用窗口的高度
+				windowBottom: 0, // 可使用窗口的底部位置
+				statusBarHeight: 0 // 状态栏高度
+			};
+		},
+		props: {
+			down: Object, // 下拉刷新的参数配置
+			up: Object, // 上拉加载的参数配置
+			top: [String, Number], // 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			topbar: [Boolean, String], // top的偏移量是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
+			bottom: [String, Number], // 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			safearea: Boolean, // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
+			height: [String, Number], // 指定mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
+			bottombar:{ // 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效)
+				type: Boolean,
+				default: true
+			},
+			sticky: Boolean // 是否支持sticky,默认false; 当值配置true时,需避免在mescroll-body标签前面加非定位的元素,否则下拉区域无法会隐藏
+		},
+		computed: {
+			// mescroll最小高度,默认windowHeight,使列表不满屏仍可下拉
+			minHeight(){
+				return this.toPx(this.height || '100%') + 'px'
+			},
+			// 下拉布局往下偏移的距离 (px)
+			numTop() {
+				return this.toPx(this.top)
+			},
+			padTop() {
+				return this.numTop + 'px';
+			},
+			// 上拉布局往上偏移 (px)
+			numBottom() {
+				return this.toPx(this.bottom);
+			},
+			padBottom() {
+				return this.numBottom + 'px';
+			},
+			// 是否为重置下拉的状态
+			isDownReset() {
+				return this.downLoadType === 3 || this.downLoadType === 4;
+			},
+			// 过渡
+			transition() {
+				return this.isDownReset ? 'transform 300ms' : '';
+			},
+			translateY() {
+				return this.downHight > 0 ? 'translateY(' + this.downHight + 'px)' : ''; // transform会使fixed失效,需注意把fixed元素写在mescroll之外
+			},
+			// 是否在加载中
+			isDownLoading(){
+				return this.downLoadType === 3
+			},
+			// 旋转的角度
+			downRotate(){
+				return 'rotate(' + 360 * this.downRate + 'deg)'
+			},
+			// 文本提示
+			downText(){
+				if(!this.mescroll) return ""; // 避免头条小程序初始化时报错
+				switch (this.downLoadType){
+					case 1: return this.mescroll.optDown.textInOffset;
+					case 2: return this.mescroll.optDown.textOutOffset;
+					case 3: return this.mescroll.optDown.textLoading;
+					case 4: return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess==false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
+					default: return this.mescroll.optDown.textInOffset;
+				}
+			}
+		},
+		methods: {
+			//number,rpx,upx,px,% --> px的数值
+			toPx(num) {
+				if (typeof num === 'string') {
+					if (num.indexOf('px') !== -1) {
+						if (num.indexOf('rpx') !== -1) {
+							// "10rpx"
+							num = num.replace('rpx', '');
+						} else if (num.indexOf('upx') !== -1) {
+							// "10upx"
+							num = num.replace('upx', '');
+						} else {
+							// "10px"
+							return Number(num.replace('px', ''));
+						}
+					} else if (num.indexOf('%') !== -1) {
+						// 传百分比,则相对于windowHeight,传"10%"则等于windowHeight的10%
+						let rate = Number(num.replace('%', '')) / 100;
+						return this.windowHeight * rate;
+					}
+				}
+				return num ? uni.upx2px(Number(num)) : 0;
+			},
+			// 点击空布局的按钮回调
+			emptyClick() {
+				this.$emit('emptyclick', this.mescroll);
+			},
+			// 点击回到顶部的按钮回调
+			toTopClick() {
+				this.mescroll.scrollTo(0, this.mescroll.optUp.toTop.duration); // 执行回到顶部
+				this.$emit('topclick', this.mescroll); // 派发点击回到顶部按钮的回调
+			}
+		},
+		// 使用created初始化mescroll对象; 如果用mounted部分css样式编译到H5会失效
+		created() {
+			let vm = this;
+
+			let diyOption = {
+				// 下拉刷新的配置
+				down: {
+					inOffset() {
+						vm.downLoadType = 1; // 下拉的距离进入offset范围内那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					outOffset() {
+						vm.downLoadType = 2; // 下拉的距离大于offset那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					onMoving(mescroll, rate, downHight) {
+						// 下拉过程中的回调,滑动过程一直在执行;
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+						vm.downRate = rate; //下拉比率 (inOffset: rate<1; outOffset: rate>=1)
+					},
+					showLoading(mescroll, downHight) {
+						vm.downLoadType = 3; // 显示下拉刷新进度的回调 (自定义mescroll组件时,此行不可删)
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+					},
+					beforeEndDownScroll(mescroll){
+						vm.downLoadType = 4; 
+						return mescroll.optDown.beforeEndDelay // 延时结束的时长
+					},
+					endDownScroll() {
+						vm.downLoadType = 4; // 结束下拉 (自定义mescroll组件时,此行不可删)
+						vm.downHight = 0; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+						if(vm.downResetTimer) {clearTimeout(vm.downResetTimer); vm.downResetTimer = null} // 移除重置倒计时
+						vm.downResetTimer = setTimeout(()=>{ // 过渡动画执行完毕后,需重置为0的状态,避免下次inOffset不及时显示textInOffset
+							if(vm.downLoadType === 4) vm.downLoadType = 0
+						},300)
+					},
+					// 派发下拉刷新的回调
+					callback: function(mescroll) {
+						vm.$emit('down', mescroll);
+					}
+				},
+				// 上拉加载的配置
+				up: {
+					// 显示加载中的回调
+					showLoading() {
+						vm.upLoadType = 1;
+					},
+					// 显示无更多数据的回调
+					showNoMore() {
+						vm.upLoadType = 2;
+					},
+					// 隐藏上拉加载的回调
+					hideUpScroll(mescroll) {
+						vm.upLoadType = mescroll.optUp.hasNext ? 0 : 3;
+					},
+					// 空布局
+					empty: {
+						onShow(isShow) {
+							// 显示隐藏的回调
+							vm.isShowEmpty = isShow;
+						}
+					},
+					// 回到顶部
+					toTop: {
+						onShow(isShow) {
+							// 显示隐藏的回调
+							vm.isShowToTop = isShow;
+						}
+					},
+					// 派发上拉加载的回调
+					callback: function(mescroll) {
+						vm.$emit('up', mescroll);
+					}
+				}
+			};
+
+			MeScroll.extend(diyOption, GlobalOption); // 混入全局的配置
+			let myOption = JSON.parse(JSON.stringify({down: vm.down,up: vm.up})); // 深拷贝,避免对props的影响
+			MeScroll.extend(myOption, diyOption); // 混入具体界面的配置
+
+			// 初始化MeScroll对象
+			vm.mescroll = new MeScroll(myOption, true); // 传入true,标记body为滚动区域
+			// init回调mescroll对象
+			vm.$emit('init', vm.mescroll);
+
+			// 设置高度
+			const sys = uni.getSystemInfoSync();
+			if (sys.windowHeight) vm.windowHeight = sys.windowHeight;
+			if (sys.windowBottom) vm.windowBottom = sys.windowBottom;
+			if (sys.statusBarHeight) vm.statusBarHeight = sys.statusBarHeight;
+			// 使down的bottomOffset生效
+			vm.mescroll.setBodyHeight(sys.windowHeight);
+
+			// 因为使用的是page的scroll,这里需自定义scrollTo
+			vm.mescroll.resetScrollTo((y, t) => {
+				if(typeof y === 'string'){
+					// 滚动到指定view (y为css选择器)
+					setTimeout(()=>{ // 延时确保view已渲染; 不使用$nextTick
+						let selector;
+						if(y.indexOf('#')==-1 && y.indexOf('.')==-1){
+							selector = '#'+y // 不带#和. 则默认为id选择器
+						}else{
+							selector = y
+							// #ifdef APP-PLUS || H5 || MP-ALIPAY || MP-DINGTALK
+							if(y.indexOf('>>>')!=-1){ // 不支持跨自定义组件的后代选择器 (转为普通的选择器即可跨组件查询)
+								selector = y.split('>>>')[1].trim()
+							}
+							// #endif
+						}
+						uni.createSelectorQuery().select(selector).boundingClientRect(function(rect){
+							if (rect) {
+								let top = rect.top
+								top += vm.mescroll.getScrollTop()
+								uni.pageScrollTo({
+									scrollTop: top,
+									duration: t
+								})
+							} else{
+								console.error(selector + ' does not exist');
+							}
+						}).exec()
+					},30)
+				} else{
+					// 滚动到指定位置 (y必须为数字)
+					uni.pageScrollTo({
+						scrollTop: y,
+						duration: t
+					})
+				}
+			});
+
+			// 具体的界面如果不配置up.toTop.safearea,则取本vue的safearea值
+			if (vm.up && vm.up.toTop && vm.up.toTop.safearea != null) {} else {
+				vm.mescroll.optUp.toTop.safearea = vm.safearea;
+			}
+		}
+	};
+</script>
+
+<style>
+	@import "./mescroll-body.css";
+	@import "./components/mescroll-down.css";
+	@import './components/mescroll-up.css';
+</style>

+ 65 - 0
components/mescroll-uni/mescroll-mixins.js

@@ -0,0 +1,65 @@
+// mescroll-body 和 mescroll-uni 通用
+
+// import MescrollUni from "./mescroll-uni.vue";
+// import MescrollBody from "./mescroll-body.vue";
+
+const MescrollMixin = {
+	// components: { // 非H5端无法通过mixin注册组件, 只能在main.js中注册全局组件或具体界面中注册
+	// 	MescrollUni,
+	// 	MescrollBody
+	// },
+	data() {
+		return {
+			mescroll: null //mescroll实例对象
+		}
+	},
+	// 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
+	onPullDownRefresh(){
+		this.mescroll && this.mescroll.onPullDownRefresh();
+	},
+	// 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效)
+	onPageScroll(e) {
+		this.mescroll && this.mescroll.onPageScroll(e);
+	},
+	// 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效)
+	onReachBottom() {
+		this.mescroll && this.mescroll.onReachBottom();
+	},
+	methods: {
+		// mescroll组件初始化的回调,可获取到mescroll对象
+		mescrollInit(mescroll) {
+			this.mescroll = mescroll;
+			this.mescrollInitByRef(); // 兼容字节跳动小程序
+		},
+		// 以ref的方式初始化mescroll对象 (兼容字节跳动小程序)
+		mescrollInitByRef() {
+			if(!this.mescroll || !this.mescroll.resetUpScroll){
+				let mescrollRef = this.$refs.mescrollRef;
+				if(mescrollRef) this.mescroll = mescrollRef.mescroll
+			}
+		},
+		// 下拉刷新的回调 (mixin默认resetUpScroll)
+		downCallback() {
+			if(this.mescroll.optUp.use){
+				this.mescroll.resetUpScroll()
+			}else{
+				setTimeout(()=>{
+					this.mescroll.endSuccess();
+				}, 500)
+			}
+		},
+		// 上拉加载的回调
+		upCallback() {
+			// mixin默认延时500自动结束加载
+			setTimeout(()=>{
+				this.mescroll.endErr();
+			}, 500)
+		}
+	},
+	mounted() {
+		this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况
+	}
+	
+}
+
+export default MescrollMixin;

+ 36 - 0
components/mescroll-uni/mescroll-uni-option.js

@@ -0,0 +1,36 @@
+// 全局配置
+// mescroll-body 和 mescroll-uni 通用
+const GlobalOption = {
+	down: {
+		// 其他down的配置参数也可以写,这里只展示了常用的配置:
+		textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本
+		textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本
+		textLoading: '加载中 ...', // 加载中的提示文本
+		textSuccess: '加载成功', // 加载成功的文本
+		textErr: '加载失败', // 加载失败的文本
+		beforeEndDelay: 100, // 延时结束的时长 (显示加载成功/失败的时长)
+		offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调
+		native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
+	},
+	up: {
+		// 其他up的配置参数也可以写,这里只展示了常用的配置:
+		textLoading: '加载中 ...', // 加载中的提示文本
+		textNoMore: '-- END --', // 没有更多数据的提示文本
+		offset: 150, // 距底部多远时,触发upCallback,仅mescroll-uni生效 ( mescroll-body配置的是pages.json的 onReachBottomDistance )
+		toTop: {
+			// 回到顶部按钮,需配置src才显示
+			src: "https://www.mescroll.com/img/mescroll-totop.png", // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png )
+			offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px
+			right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
+			bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
+			width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx)
+		},
+		empty: {
+			use: true, // 是否显示空布局
+			icon: "https://www.mescroll.com/img/mescroll-empty.png", // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png )
+			tip: '~ 空空如也 ~' // 提示
+		}
+	}
+}
+
+export default GlobalOption

+ 36 - 0
components/mescroll-uni/mescroll-uni.css

@@ -0,0 +1,36 @@
+.mescroll-uni-warp{
+	height: 100%;
+}
+
+.mescroll-uni-content{
+	height: 100%;
+}
+
+.mescroll-uni {
+	position: relative;
+	width: 100%;
+	height: 100%;
+	min-height: 200rpx;
+	overflow-y: auto;
+	box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */
+}
+
+/* 定位的方式固定高度 */
+.mescroll-uni-fixed{
+	z-index: 1;
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	width: auto; /* 使right生效 */
+	height: auto; /* 使bottom生效 */
+}
+
+/* 适配 iPhoneX */
+@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
+	.mescroll-safearea {
+		padding-bottom: constant(safe-area-inset-bottom);
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+}

+ 799 - 0
components/mescroll-uni/mescroll-uni.js

@@ -0,0 +1,799 @@
+/* mescroll
+ * version 1.3.3
+ * 2020-09-15 wenju
+ * https://www.mescroll.com
+ */
+
+export default function MeScroll(options, isScrollBody) {
+	let me = this;
+	me.version = '1.3.3'; // mescroll版本号
+	me.options = options || {}; // 配置
+	me.isScrollBody = isScrollBody || false; // 滚动区域是否为原生页面滚动; 默认为scroll-view
+
+	me.isDownScrolling = false; // 是否在执行下拉刷新的回调
+	me.isUpScrolling = false; // 是否在执行上拉加载的回调
+	let hasDownCallback = me.options.down && me.options.down.callback; // 是否配置了down的callback
+
+	// 初始化下拉刷新
+	me.initDownScroll();
+	// 初始化上拉加载,则初始化
+	me.initUpScroll();
+
+	// 自动加载
+	setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例
+		// 自动触发下拉刷新 (只有配置了down的callback才自动触发下拉刷新)
+		if ((me.optDown.use || me.optDown.native) && me.optDown.auto && hasDownCallback) {
+			if (me.optDown.autoShowLoading) {
+				me.triggerDownScroll(); // 显示下拉进度,执行下拉回调
+			} else {
+				me.optDown.callback && me.optDown.callback(me); // 不显示下拉进度,直接执行下拉回调
+			}
+		}
+		// 自动触发上拉加载
+		if(!me.isUpAutoLoad){ // 部分小程序(头条小程序)emit是异步, 会导致isUpAutoLoad判断有误, 先延时确保先执行down的callback,再执行up的callback
+			setTimeout(function(){
+				me.optUp.use && me.optUp.auto && !me.isUpAutoLoad && me.triggerUpScroll();
+			},100)
+		}
+	}, 30); // 需让me.optDown.inited和me.optUp.inited先执行
+}
+
+/* 配置参数:下拉刷新 */
+MeScroll.prototype.extendDownScroll = function(optDown) {
+	// 下拉刷新的配置
+	MeScroll.extend(optDown, {
+		use: true, // 是否启用下拉刷新; 默认true
+		auto: true, // 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true
+		native: false, // 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
+		autoShowLoading: false, // 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false
+		isLock: false, // 是否锁定下拉刷新,默认false;
+		offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调
+		startTop: 100, // scroll-view快速滚动到顶部时,此时的scroll-top可能大于0, 此值用于控制最大的误差
+		inOffsetRate: 1, // 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
+		outOffsetRate: 0.2, // 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
+		bottomOffset: 20, // 当手指touchmove位置在距离body底部20px范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行
+		minAngle: 45, // 向下滑动最少偏移的角度,取值区间  [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突;
+		textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本
+		textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本
+		textLoading: '加载中 ...', // 加载中的提示文本
+		textSuccess: '加载成功', // 加载成功的文本
+		textErr: '加载失败', // 加载失败的文本
+		beforeEndDelay: 100, // 延时结束的时长 (显示加载成功/失败的时长)
+		bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorTop)
+		textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
+		inited: null, // 下拉刷新初始化完毕的回调
+		inOffset: null, // 下拉的距离进入offset范围内那一刻的回调
+		outOffset: null, // 下拉的距离大于offset那一刻的回调
+		onMoving: null, // 下拉过程中的回调,滑动过程一直在执行; rate下拉区域当前高度与指定距离的比值(inOffset: rate<1; outOffset: rate>=1); downHight当前下拉区域的高度
+		beforeLoading: null, // 准备触发下拉刷新的回调: 如果return true,将不触发showLoading和callback回调; 常用来完全自定义下拉刷新, 参考案例【淘宝 v6.8.0】
+		showLoading: null, // 显示下拉刷新进度的回调
+		afterLoading: null, // 显示下拉刷新进度的回调之后,马上要执行的代码 (如: 在wxs中使用)
+		beforeEndDownScroll: null, // 准备结束下拉的回调. 返回结束下拉的延时执行时间,默认0ms; 常用于结束下拉之前再显示另外一小段动画,才去隐藏下拉刷新的场景, 参考案例【dotJump】
+		endDownScroll: null, // 结束下拉刷新的回调
+		afterEndDownScroll: null, // 结束下拉刷新的回调,马上要执行的代码 (如: 在wxs中使用)
+		callback: function(mescroll) {
+			// 下拉刷新的回调;默认重置上拉加载列表为第一页
+			mescroll.resetUpScroll();
+		}
+	})
+}
+
+/* 配置参数:上拉加载 */
+MeScroll.prototype.extendUpScroll = function(optUp) {
+	// 上拉加载的配置
+	MeScroll.extend(optUp, {
+		use: true, // 是否启用上拉加载; 默认true
+		auto: true, // 是否在初始化完毕之后自动执行上拉加载的回调; 默认true
+		isLock: false, // 是否锁定上拉加载,默认false;
+		isBoth: true, // 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发;
+		callback: null, // 上拉加载的回调;function(page,mescroll){ }
+		page: {
+			num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
+			size: 10, // 每页数据的数量
+			time: null // 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复;
+		},
+		noMoreSize: 5, // 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
+		offset: 150, // 距底部多远时,触发upCallback,仅mescroll-uni生效 ( mescroll-body配置的是pages.json的 onReachBottomDistance )
+		textLoading: '加载中 ...', // 加载中的提示文本
+		textNoMore: '-- END --', // 没有更多数据的提示文本
+		bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorBottom)
+		textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
+		inited: null, // 初始化完毕的回调
+		showLoading: null, // 显示加载中的回调
+		showNoMore: null, // 显示无更多数据的回调
+		hideUpScroll: null, // 隐藏上拉加载的回调
+		errDistance: 60, // endErr的时候需往上滑动一段距离,使其往下滑动时再次触发onReachBottom,仅mescroll-body生效
+		toTop: {
+			// 回到顶部按钮,需配置src才显示
+			src: null, // 图片路径,默认null (绝对路径或网络图)
+			offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000
+			duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项)
+			btnClick: null, // 点击按钮的回调
+			onShow: null, // 是否显示的回调
+			zIndex: 9990, // fixed定位z-index值
+			left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
+			right: 20, // 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
+			bottom: 120, // 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
+			safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取本vue的safearea值)
+			width: 72, // 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
+			radius: "50%" // 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
+		},
+		empty: {
+			use: true, // 是否显示空布局
+			icon: null, // 图标路径
+			tip: '~ 暂无相关数据 ~', // 提示
+			btnText: '', // 按钮
+			btnClick: null, // 点击按钮的回调
+			onShow: null, // 是否显示的回调
+			fixed: false, // 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute)
+			top: "100rpx", // fixed定位的top值 (完整的单位值,如 "10%"; "100rpx")
+			zIndex: 99 // fixed定位z-index值
+		},
+		onScroll: false // 是否监听滚动事件
+	})
+}
+
+/* 配置参数 */
+MeScroll.extend = function(userOption, defaultOption) {
+	if (!userOption) return defaultOption;
+	for (let key in defaultOption) {
+		if (userOption[key] == null) {
+			let def = defaultOption[key];
+			if (def != null && typeof def === 'object') {
+				userOption[key] = MeScroll.extend({}, def); // 深度匹配
+			} else {
+				userOption[key] = def;
+			}
+		} else if (typeof userOption[key] === 'object') {
+			MeScroll.extend(userOption[key], defaultOption[key]); // 深度匹配
+		}
+	}
+	return userOption;
+}
+
+/* 简单判断是否配置了颜色 (非透明,非白色) */
+MeScroll.prototype.hasColor = function(color) {
+	if(!color) return false;
+	let c = color.toLowerCase();
+	return c != "#fff" && c != "#ffffff" && c != "transparent" && c != "white"
+}
+
+/* -------初始化下拉刷新------- */
+MeScroll.prototype.initDownScroll = function() {
+	let me = this;
+	// 配置参数
+	me.optDown = me.options.down || {};
+	if(!me.optDown.textColor && me.hasColor(me.optDown.bgColor)) me.optDown.textColor = "#fff"; // 当bgColor有值且textColor未设置,则textColor默认白色
+	me.extendDownScroll(me.optDown);
+	
+	// 如果是mescroll-body且配置了native,则禁止自定义的下拉刷新
+	if(me.isScrollBody && me.optDown.native){
+		me.optDown.use = false
+	}else{
+		me.optDown.native = false // 仅mescroll-body支持,mescroll-uni不支持
+	}
+	
+	me.downHight = 0; // 下拉区域的高度
+
+	// 在页面中加入下拉布局
+	if (me.optDown.use && me.optDown.inited) {
+		// 初始化完毕的回调
+		setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例
+			me.optDown.inited(me);
+		}, 0)
+	}
+}
+
+/* 列表touchstart事件 */
+MeScroll.prototype.touchstartEvent = function(e) {
+	if (!this.optDown.use) return;
+
+	this.startPoint = this.getPoint(e); // 记录起点
+	this.startTop = this.getScrollTop(); // 记录此时的滚动条位置
+	this.startAngle = 0; // 初始角度
+	this.lastPoint = this.startPoint; // 重置上次move的点
+	this.maxTouchmoveY = this.getBodyHeight() - this.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况)
+	this.inTouchend = false; // 标记不是touchend
+}
+
+/* 列表touchmove事件 */
+MeScroll.prototype.touchmoveEvent = function(e) {
+	if (!this.optDown.use) return;
+	let me = this;
+
+	let scrollTop = me.getScrollTop(); // 当前滚动条的距离
+	let curPoint = me.getPoint(e); // 当前点
+
+	let moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
+
+	// 向下拉 && 在顶部
+	// mescroll-body,直接判定在顶部即可
+	// scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove
+	// scroll-view滚动到顶部时,scrollTop不一定为0,也有可能大于0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等
+	if (moveY > 0 && (
+			(me.isScrollBody && scrollTop <= 0)
+			||
+			(!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop)) )
+		)) {
+		// 可下拉的条件
+		if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling &&
+				me.optUp.isBoth))) {
+
+			// 下拉的初始角度是否在配置的范围内
+			if(!me.startAngle) me.startAngle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90]
+			if (me.startAngle < me.optDown.minAngle) return; // 如果小于配置的角度,则不往下执行下拉刷新
+
+			// 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发
+			if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) {
+				me.inTouchend = true; // 标记执行touchend
+				me.touchendEvent(); // 提前触发touchend
+				return;
+			}
+			
+			me.preventDefault(e); // 阻止默认事件
+
+			let diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上)
+
+			// 下拉距离  < 指定距离
+			if (me.downHight < me.optDown.offset) {
+				if (me.movetype !== 1) {
+					me.movetype = 1; // 加入标记,保证只执行一次
+					me.isDownEndSuccess = null; // 重置是否加载成功的状态 (wxs执行的是wxs.wxs)
+					me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次
+					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
+				}
+				me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小
+
+				// 指定距离  <= 下拉距离
+			} else {
+				if (me.movetype !== 2) {
+					me.movetype = 2; // 加入标记,保证只执行一次
+					me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次
+					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
+				}
+				if (diff > 0) { // 向下拉
+					me.downHight += diff * me.optDown.outOffsetRate; // 越往下,高度变化越小
+				} else { // 向上收
+					me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度
+				}
+			}
+			
+			me.downHight = Math.round(me.downHight) // 取整
+			let rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值
+			me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行
+		}
+	}
+
+	me.lastPoint = curPoint; // 记录本次移动的点
+}
+
+/* 列表touchend事件 */
+MeScroll.prototype.touchendEvent = function(e) {
+	if (!this.optDown.use) return;
+	// 如果下拉区域高度已改变,则需重置回来
+	if (this.isMoveDown) {
+		if (this.downHight >= this.optDown.offset) {
+			// 符合触发刷新的条件
+			this.triggerDownScroll();
+		} else {
+			// 不符合的话 则重置
+			this.downHight = 0;
+			this.endDownScrollCall(this);
+		}
+		this.movetype = 0;
+		this.isMoveDown = false;
+	} else if (!this.isScrollBody && this.getScrollTop() === this.startTop) { // scroll-view到顶/左/右/底的滑动事件
+		let isScrollUp = this.getPoint(e).y - this.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
+		// 上滑
+		if (isScrollUp) {
+			// 需检查滑动的角度
+			let angle = this.getAngle(this.getPoint(e), this.startPoint); // 两点之间的角度,区间 [0,90]
+			if (angle > 80) {
+				// 检查并触发上拉
+				this.triggerUpScroll(true);
+			}
+		}
+	}
+}
+
+/* 根据点击滑动事件获取第一个手指的坐标 */
+MeScroll.prototype.getPoint = function(e) {
+	if (!e) {
+		return {
+			x: 0,
+			y: 0
+		}
+	}
+	if (e.touches && e.touches[0]) {
+		return {
+			x: e.touches[0].pageX,
+			y: e.touches[0].pageY
+		}
+	} else if (e.changedTouches && e.changedTouches[0]) {
+		return {
+			x: e.changedTouches[0].pageX,
+			y: e.changedTouches[0].pageY
+		}
+	} else {
+		return {
+			x: e.clientX,
+			y: e.clientY
+		}
+	}
+}
+
+/* 计算两点之间的角度: 区间 [0,90]*/
+MeScroll.prototype.getAngle = function(p1, p2) {
+	let x = Math.abs(p1.x - p2.x);
+	let y = Math.abs(p1.y - p2.y);
+	let z = Math.sqrt(x * x + y * y);
+	let angle = 0;
+	if (z !== 0) {
+		angle = Math.asin(y / z) / Math.PI * 180;
+	}
+	return angle
+}
+
+/* 触发下拉刷新 */
+MeScroll.prototype.triggerDownScroll = function() {
+	if (this.optDown.beforeLoading && this.optDown.beforeLoading(this)) {
+		//return true则处于完全自定义状态
+	} else {
+		this.showDownScroll(); // 下拉刷新中...
+		!this.optDown.native && this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据
+	}
+}
+
+/* 显示下拉进度布局 */
+MeScroll.prototype.showDownScroll = function() {
+	this.isDownScrolling = true; // 标记下拉中
+	if (this.optDown.native) {
+		uni.startPullDownRefresh(); // 系统自带的下拉刷新
+		this.showDownLoadingCall(0); // 仍触发showLoading,因为上拉加载用到
+	} else{
+		this.downHight = this.optDown.offset; // 更新下拉区域高度
+		this.showDownLoadingCall(this.downHight); // 下拉刷新中...
+	}
+}
+
+MeScroll.prototype.showDownLoadingCall = function(downHight) {
+	this.optDown.showLoading && this.optDown.showLoading(this, downHight); // 下拉刷新中...
+	this.optDown.afterLoading && this.optDown.afterLoading(this, downHight); // 下拉刷新中...触发之后马上要执行的代码
+}
+
+/* 显示系统自带的下拉刷新时需要处理的业务 */
+MeScroll.prototype.onPullDownRefresh = function() {
+	this.isDownScrolling = true; // 标记下拉中
+	this.showDownLoadingCall(0); // 仍触发showLoading,因为上拉加载用到
+	this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据
+}
+
+/* 结束下拉刷新 */
+MeScroll.prototype.endDownScroll = function() {
+	if (this.optDown.native) { // 结束原生下拉刷新
+		this.isDownScrolling = false;
+		this.endDownScrollCall(this);
+		uni.stopPullDownRefresh();
+		return
+	}
+	let me = this;
+	// 结束下拉刷新的方法
+	let endScroll = function() {
+		me.downHight = 0;
+		me.isDownScrolling = false;
+		me.endDownScrollCall(me);
+		if(!me.isScrollBody){
+			me.setScrollHeight(0) // scroll-view重置滚动区域,使数据不满屏时仍可检查触发翻页
+			me.scrollTo(0,0) // scroll-view需重置滚动条到顶部,避免startTop大于0时,对下拉刷新的影响
+		}
+	}
+	// 结束下拉刷新时的回调
+	let delay = 0;
+	if (me.optDown.beforeEndDownScroll) {
+		delay = me.optDown.beforeEndDownScroll(me); // 结束下拉刷新的延时,单位ms
+		if(me.isDownEndSuccess == null) delay = 0; // 没有执行加载中,则不延时
+	}
+	if (typeof delay === 'number' && delay > 0) {
+		setTimeout(endScroll, delay);
+	} else {
+		endScroll();
+	}
+}
+
+MeScroll.prototype.endDownScrollCall = function() {
+	this.optDown.endDownScroll && this.optDown.endDownScroll(this);
+	this.optDown.afterEndDownScroll && this.optDown.afterEndDownScroll(this);
+}
+
+/* 锁定下拉刷新:isLock=ture,null锁定;isLock=false解锁 */
+MeScroll.prototype.lockDownScroll = function(isLock) {
+	if (isLock == null) isLock = true;
+	this.optDown.isLock = isLock;
+}
+
+/* 锁定上拉加载:isLock=ture,null锁定;isLock=false解锁 */
+MeScroll.prototype.lockUpScroll = function(isLock) {
+	if (isLock == null) isLock = true;
+	this.optUp.isLock = isLock;
+}
+
+/* -------初始化上拉加载------- */
+MeScroll.prototype.initUpScroll = function() {
+	let me = this;
+	// 配置参数
+	me.optUp = me.options.up || {use: false}
+	if(!me.optUp.textColor && me.hasColor(me.optUp.bgColor)) me.optUp.textColor = "#fff"; // 当bgColor有值且textColor未设置,则textColor默认白色
+	me.extendUpScroll(me.optUp);
+
+	if (me.optUp.use === false) return; // 配置不使用上拉加载时,则不初始化上拉布局
+	me.optUp.hasNext = true; // 如果使用上拉,则默认有下一页
+	me.startNum = me.optUp.page.num + 1; // 记录page开始的页码
+
+	// 初始化完毕的回调
+	if (me.optUp.inited) {
+		setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例
+			me.optUp.inited(me);
+		}, 0)
+	}
+}
+
+/*滚动到底部的事件 (仅mescroll-body生效)*/
+MeScroll.prototype.onReachBottom = function() {
+	if (this.isScrollBody && !this.isUpScrolling) { // 只能支持下拉刷新的时候同时可以触发上拉加载,否则滚动到底部就需要上滑一点才能触发onReachBottom
+		if (!this.optUp.isLock && this.optUp.hasNext) {
+			this.triggerUpScroll();
+		}
+	}
+}
+
+/*列表滚动事件 (仅mescroll-body生效)*/
+MeScroll.prototype.onPageScroll = function(e) {
+	if (!this.isScrollBody) return;
+	
+	// 更新滚动条的位置 (主要用于判断下拉刷新时,滚动条是否在顶部)
+	this.setScrollTop(e.scrollTop);
+
+	// 顶部按钮的显示隐藏
+	if (e.scrollTop >= this.optUp.toTop.offset) {
+		this.showTopBtn();
+	} else {
+		this.hideTopBtn();
+	}
+}
+
+/*列表滚动事件*/
+MeScroll.prototype.scroll = function(e, onScroll) {
+	// 更新滚动条的位置
+	this.setScrollTop(e.scrollTop);
+	// 更新滚动内容高度
+	this.setScrollHeight(e.scrollHeight);
+
+	// 向上滑还是向下滑动
+	if (this.preScrollY == null) this.preScrollY = 0;
+	this.isScrollUp = e.scrollTop - this.preScrollY > 0;
+	this.preScrollY = e.scrollTop;
+
+	// 上滑 && 检查并触发上拉
+	this.isScrollUp && this.triggerUpScroll(true);
+
+	// 顶部按钮的显示隐藏
+	if (e.scrollTop >= this.optUp.toTop.offset) {
+		this.showTopBtn();
+	} else {
+		this.hideTopBtn();
+	}
+
+	// 滑动监听
+	this.optUp.onScroll && onScroll && onScroll()
+}
+
+/* 触发上拉加载 */
+MeScroll.prototype.triggerUpScroll = function(isCheck) {
+	if (!this.isUpScrolling && this.optUp.use && this.optUp.callback) {
+		// 是否校验在底部; 默认不校验
+		if (isCheck === true) {
+			let canUp = false;
+			// 还有下一页 && 没有锁定 && 不在下拉中
+			if (this.optUp.hasNext && !this.optUp.isLock && !this.isDownScrolling) {
+				if (this.getScrollBottom() <= this.optUp.offset) { // 到底部
+					canUp = true; // 标记可上拉
+				}
+			}
+			if (canUp === false) return;
+		}
+		this.showUpScroll(); // 上拉加载中...
+		this.optUp.page.num++; // 预先加一页,如果失败则减回
+		this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调
+		this.num = this.optUp.page.num; // 把最新的页数赋值在mescroll上,避免对page的影响
+		this.size = this.optUp.page.size; // 把最新的页码赋值在mescroll上,避免对page的影响
+		this.time = this.optUp.page.time; // 把最新的页码赋值在mescroll上,避免对page的影响
+		this.optUp.callback(this); // 执行回调,联网加载数据
+	}
+}
+
+/* 显示上拉加载中 */
+MeScroll.prototype.showUpScroll = function() {
+	this.isUpScrolling = true; // 标记上拉加载中
+	this.optUp.showLoading && this.optUp.showLoading(this); // 回调
+}
+
+/* 显示上拉无更多数据 */
+MeScroll.prototype.showNoMore = function() {
+	this.optUp.hasNext = false; // 标记无更多数据
+	this.optUp.showNoMore && this.optUp.showNoMore(this); // 回调
+}
+
+/* 隐藏上拉区域**/
+MeScroll.prototype.hideUpScroll = function() {
+	this.optUp.hideUpScroll && this.optUp.hideUpScroll(this); // 回调
+}
+
+/* 结束上拉加载 */
+MeScroll.prototype.endUpScroll = function(isShowNoMore) {
+	if (isShowNoMore != null) { // isShowNoMore=null,不处理下拉状态,下拉刷新的时候调用
+		if (isShowNoMore) {
+			this.showNoMore(); // isShowNoMore=true,显示无更多数据
+		} else {
+			this.hideUpScroll(); // isShowNoMore=false,隐藏上拉加载
+		}
+	}
+	this.isUpScrolling = false; // 标记结束上拉加载
+}
+
+/* 重置上拉加载列表为第一页
+ *isShowLoading 是否显示进度布局;
+ * 1.默认null,不传参,则显示上拉加载的进度布局
+ * 2.传参true, 则显示下拉刷新的进度布局
+ * 3.传参false,则不显示上拉和下拉的进度 (常用于静默更新列表数据)
+ */
+MeScroll.prototype.resetUpScroll = function(isShowLoading) {
+	if (this.optUp && this.optUp.use) {
+		let page = this.optUp.page;
+		this.prePageNum = page.num; // 缓存重置前的页码,加载失败可退回
+		this.prePageTime = page.time; // 缓存重置前的时间,加载失败可退回
+		page.num = this.startNum; // 重置为第一页
+		page.time = null; // 重置时间为空
+		if (!this.isDownScrolling && isShowLoading !== false) { // 如果不是下拉刷新触发的resetUpScroll并且不配置列表静默更新,则显示进度;
+			if (isShowLoading == null) {
+				this.removeEmpty(); // 移除空布局
+				this.showUpScroll(); // 不传参,默认显示上拉加载的进度布局
+			} else {
+				this.showDownScroll(); // 传true,显示下拉刷新的进度布局,不清空列表
+			}
+		}
+		this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调
+		this.num = page.num; // 把最新的页数赋值在mescroll上,避免对page的影响
+		this.size = page.size; // 把最新的页码赋值在mescroll上,避免对page的影响
+		this.time = page.time; // 把最新的页码赋值在mescroll上,避免对page的影响
+		this.optUp.callback && this.optUp.callback(this); // 执行上拉回调
+	}
+}
+
+/* 设置page.num的值 */
+MeScroll.prototype.setPageNum = function(num) {
+	this.optUp.page.num = num - 1;
+}
+
+/* 设置page.size的值 */
+MeScroll.prototype.setPageSize = function(size) {
+	this.optUp.page.size = size;
+}
+
+/* 联网回调成功,结束下拉刷新和上拉加载
+ * dataSize: 当前页的数据量(必传)
+ * totalPage: 总页数(必传)
+ * systime: 服务器时间 (可空)
+ */
+MeScroll.prototype.endByPage = function(dataSize, totalPage, systime) {
+	let hasNext;
+	if (this.optUp.use && totalPage != null) hasNext = this.optUp.page.num < totalPage; // 是否还有下一页
+	this.endSuccess(dataSize, hasNext, systime);
+}
+
+/* 联网回调成功,结束下拉刷新和上拉加载
+ * dataSize: 当前页的数据量(必传)
+ * totalSize: 列表所有数据总数量(必传)
+ * systime: 服务器时间 (可空)
+ */
+MeScroll.prototype.endBySize = function(dataSize, totalSize, systime) {
+	let hasNext;
+	if (this.optUp.use && totalSize != null) {
+		let loadSize = (this.optUp.page.num - 1) * this.optUp.page.size + dataSize; // 已加载的数据总数
+		hasNext = loadSize < totalSize; // 是否还有下一页
+	}
+	this.endSuccess(dataSize, hasNext, systime);
+}
+
+/* 联网回调成功,结束下拉刷新和上拉加载
+ * dataSize: 当前页的数据个数(不是所有页的数据总和),用于上拉加载判断是否还有下一页.如果不传,则会判断还有下一页
+ * hasNext: 是否还有下一页,布尔类型;用来解决这个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据dataSize判断,则需翻到第三页才会知道无更多数据,如果传了hasNext,则翻到第二页即可显示无更多数据.
+ * systime: 服务器时间(可空);用来解决这个小问题:当准备翻下一页时,数据库新增了几条记录,此时翻下一页,前面的几条数据会和上一页的重复;这里传入了systime,那么upCallback的page.time就会有值,把page.time传给服务器,让后台过滤新加入的那几条记录
+ */
+MeScroll.prototype.endSuccess = function(dataSize, hasNext, systime) {
+	let me = this;
+	// 结束下拉刷新
+	if (me.isDownScrolling) {
+		me.isDownEndSuccess = true
+		me.endDownScroll();
+	}
+
+	// 结束上拉加载
+	if (me.optUp.use) {
+		let isShowNoMore; // 是否已无更多数据
+		if (dataSize != null) {
+			let pageNum = me.optUp.page.num; // 当前页码
+			let pageSize = me.optUp.page.size; // 每页长度
+			// 如果是第一页
+			if (pageNum === 1) {
+				if (systime) me.optUp.page.time = systime; // 设置加载列表数据第一页的时间
+			}
+			if (dataSize < pageSize || hasNext === false) {
+				// 返回的数据不满一页时,则说明已无更多数据
+				me.optUp.hasNext = false;
+				if (dataSize === 0 && pageNum === 1) {
+					// 如果第一页无任何数据且配置了空布局
+					isShowNoMore = false;
+					me.showEmpty();
+				} else {
+					// 总列表数少于配置的数量,则不显示无更多数据
+					let allDataSize = (pageNum - 1) * pageSize + dataSize;
+					if (allDataSize < me.optUp.noMoreSize) {
+						isShowNoMore = false;
+					} else {
+						isShowNoMore = true;
+					}
+					me.removeEmpty(); // 移除空布局
+				}
+			} else {
+				// 还有下一页
+				isShowNoMore = false;
+				me.optUp.hasNext = true;
+				me.removeEmpty(); // 移除空布局
+			}
+		}
+
+		// 隐藏上拉
+		me.endUpScroll(isShowNoMore);
+	}
+}
+
+/* 回调失败,结束下拉刷新和上拉加载 */
+MeScroll.prototype.endErr = function(errDistance) {
+	// 结束下拉,回调失败重置回原来的页码和时间
+	if (this.isDownScrolling) {
+		this.isDownEndSuccess = false
+		let page = this.optUp.page;
+		if (page && this.prePageNum) {
+			page.num = this.prePageNum;
+			page.time = this.prePageTime;
+		}
+		this.endDownScroll();
+	}
+	// 结束上拉,回调失败重置回原来的页码
+	if (this.isUpScrolling) {
+		this.optUp.page.num--;
+		this.endUpScroll(false);
+		// 如果是mescroll-body,则需往回滚一定距离
+		if(this.isScrollBody && errDistance !== 0){ // 不处理0
+			if(!errDistance) errDistance = this.optUp.errDistance; // 不传,则取默认
+			this.scrollTo(this.getScrollTop() - errDistance, 0) // 往上回滚的距离
+		}
+	}
+}
+
+/* 显示空布局 */
+MeScroll.prototype.showEmpty = function() {
+	this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(true)
+}
+
+/* 移除空布局 */
+MeScroll.prototype.removeEmpty = function() {
+	this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(false)
+}
+
+/* 显示回到顶部的按钮 */
+MeScroll.prototype.showTopBtn = function() {
+	if (!this.topBtnShow) {
+		this.topBtnShow = true;
+		this.optUp.toTop.onShow && this.optUp.toTop.onShow(true);
+	}
+}
+
+/* 隐藏回到顶部的按钮 */
+MeScroll.prototype.hideTopBtn = function() {
+	if (this.topBtnShow) {
+		this.topBtnShow = false;
+		this.optUp.toTop.onShow && this.optUp.toTop.onShow(false);
+	}
+}
+
+/* 获取滚动条的位置 */
+MeScroll.prototype.getScrollTop = function() {
+	return this.scrollTop || 0
+}
+
+/* 记录滚动条的位置 */
+MeScroll.prototype.setScrollTop = function(y) {
+	this.scrollTop = y;
+}
+
+/* 滚动到指定位置 */
+MeScroll.prototype.scrollTo = function(y, t) {
+	this.myScrollTo && this.myScrollTo(y, t) // scrollview需自定义回到顶部方法
+}
+
+/* 自定义scrollTo */
+MeScroll.prototype.resetScrollTo = function(myScrollTo) {
+	this.myScrollTo = myScrollTo
+}
+
+/* 滚动条到底部的距离 */
+MeScroll.prototype.getScrollBottom = function() {
+	return this.getScrollHeight() - this.getClientHeight() - this.getScrollTop()
+}
+
+/* 计步器
+ star: 开始值
+ end: 结束值
+ callback(step,timer): 回调step值,计步器timer,可自行通过window.clearInterval(timer)结束计步器;
+ t: 计步时长,传0则直接回调end值;不传则默认300ms
+ rate: 周期;不传则默认30ms计步一次
+ * */
+MeScroll.prototype.getStep = function(star, end, callback, t, rate) {
+	let diff = end - star; // 差值
+	if (t === 0 || diff === 0) {
+		callback && callback(end);
+		return;
+	}
+	t = t || 300; // 时长 300ms
+	rate = rate || 30; // 周期 30ms
+	let count = t / rate; // 次数
+	let step = diff / count; // 步长
+	let i = 0; // 计数
+	let timer = setInterval(function() {
+		if (i < count - 1) {
+			star += step;
+			callback && callback(star, timer);
+			i++;
+		} else {
+			callback && callback(end, timer); // 最后一次直接设置end,避免计算误差
+			clearInterval(timer);
+		}
+	}, rate);
+}
+
+/* 滚动容器的高度 */
+MeScroll.prototype.getClientHeight = function(isReal) {
+	let h = this.clientHeight || 0
+	if (h === 0 && isReal !== true) { // 未获取到容器的高度,可临时取body的高度 (可能会有误差)
+		h = this.getBodyHeight()
+	}
+	return h
+}
+MeScroll.prototype.setClientHeight = function(h) {
+	this.clientHeight = h;
+}
+
+/* 滚动内容的高度 */
+MeScroll.prototype.getScrollHeight = function() {
+	return this.scrollHeight || 0;
+}
+MeScroll.prototype.setScrollHeight = function(h) {
+	this.scrollHeight = h;
+}
+
+/* body的高度 */
+MeScroll.prototype.getBodyHeight = function() {
+	return this.bodyHeight || 0;
+}
+MeScroll.prototype.setBodyHeight = function(h) {
+	this.bodyHeight = h;
+}
+
+/* 阻止浏览器默认滚动事件 */
+MeScroll.prototype.preventDefault = function(e) {
+	// 小程序不支持e.preventDefault, 已在wxs中禁止
+	// app的bounce只能通过配置pages.json的style.app-plus.bounce为"none"来禁止, 或使用renderjs禁止
+	// cancelable:是否可以被禁用; defaultPrevented:是否已经被禁用
+	if (e && e.cancelable && !e.defaultPrevented) e.preventDefault()
+}

+ 424 - 0
components/mescroll-uni/mescroll-uni.vue

@@ -0,0 +1,424 @@
+<template>
+	<view class="mescroll-uni-warp">
+		<scroll-view :id="viewId" class="mescroll-uni" :class="{'mescroll-uni-fixed':isFixed}" :style="{'height':scrollHeight,'padding-top':padTop,'padding-bottom':padBottom,'top':fixedTop,'bottom':fixedBottom}" :scroll-top="scrollTop" :scroll-with-animation="scrollAnim" @scroll="scroll" :scroll-y='scrollable' :enable-back-to-top="true" :throttle="false">
+			<view class="mescroll-uni-content mescroll-render-touch"
+			@touchstart="wxsBiz.touchstartEvent" 
+			@touchmove="wxsBiz.touchmoveEvent" 
+			@touchend="wxsBiz.touchendEvent" 
+			@touchcancel="wxsBiz.touchendEvent"
+			:change:prop="wxsBiz.propObserver"
+			:prop="wxsProp">
+				<!-- 状态栏 -->
+				<view v-if="topbar&&statusBarHeight" class="mescroll-topbar" :style="{height: statusBarHeight+'px', background: topbar}"></view>
+		
+				<view class="mescroll-wxs-content" :style="{'transform': translateY, 'transition': transition}" :change:prop="wxsBiz.callObserver" :prop="callProp">
+					<!-- 下拉加载区域 (支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-down组件实现)-->
+					<!-- <mescroll-down :option="mescroll.optDown" :type="downLoadType" :rate="downRate"></mescroll-down> -->
+					<view v-if="mescroll.optDown.use" class="mescroll-downwarp" :style="{'background':mescroll.optDown.bgColor,'color':mescroll.optDown.textColor}">
+						<view class="downwarp-content">
+							<view class="downwarp-progress mescroll-wxs-progress" :class="{'mescroll-rotate': isDownLoading}" :style="{'border-color':mescroll.optDown.textColor, 'transform': downRotate}"></view>
+							<view class="downwarp-tip">{{downText}}</view>
+						</view>
+					</view>
+
+					<!-- 列表内容 -->
+					<slot></slot>
+
+					<!-- 空布局 -->
+					<mescroll-empty v-if="isShowEmpty" :option="mescroll.optUp.empty" @emptyclick="emptyClick"></mescroll-empty>
+
+					<!-- 上拉加载区域 (下拉刷新时不显示, 支付宝小程序子组件传参给子子组件仍报单项数据流的异常,暂时不通过mescroll-up组件实现)-->
+					<!-- <mescroll-up v-if="mescroll.optUp.use && !isDownLoading && upLoadType!==3" :option="mescroll.optUp" :type="upLoadType"></mescroll-up> -->
+					<view v-if="mescroll.optUp.use && !isDownLoading && upLoadType!==3" class="mescroll-upwarp" :style="{'background':mescroll.optUp.bgColor,'color':mescroll.optUp.textColor}">
+						<!-- 加载中 (此处不能用v-if,否则android小程序快速上拉可能会不断触发上拉回调) -->
+						<view v-show="upLoadType===1">
+							<view class="upwarp-progress mescroll-rotate" :style="{'border-color':mescroll.optUp.textColor}"></view>
+							<view class="upwarp-tip">{{ mescroll.optUp.textLoading }}</view>
+						</view>
+						<!-- 无数据 -->
+						<view v-if="upLoadType===2" class="upwarp-nodata">{{ mescroll.optUp.textNoMore }}</view>
+					</view>
+				</view>
+			
+				<!-- 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效) -->
+				<!-- #ifdef H5 -->
+				<view v-if="bottombar && windowBottom>0" class="mescroll-bottombar" :style="{height: windowBottom+'px'}"></view>
+				<!-- #endif -->
+				
+				<!-- 适配iPhoneX -->
+				<view v-if="safearea" class="mescroll-safearea"></view>
+			</view>
+		</scroll-view>
+
+		<!-- 回到顶部按钮 (fixed元素,需写在scroll-view外面,防止滚动的时候抖动)-->
+		<mescroll-top v-model="isShowToTop" :option="mescroll.optUp.toTop" @click="toTopClick"></mescroll-top>
+		
+		<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+		<!-- renderjs的数据载体,不可写在mescroll-downwarp内部,避免use为false时,载体丢失,无法更新数据 -->
+		<view :change:prop="renderBiz.propObserver" :prop="wxsProp"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<!-- 微信小程序, QQ小程序, app, h5使用wxs -->
+<!-- #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5 -->
+<script src="./wxs/wxs.wxs" module="wxsBiz" lang="wxs"></script>
+<!-- #endif -->
+
+<!-- app, h5使用renderjs -->
+<!-- #ifdef APP-PLUS || H5 -->
+<script module="renderBiz" lang="renderjs">
+	import renderBiz from './wxs/renderjs.js';
+	export default {
+		mixins:[renderBiz]
+	}
+</script>
+<!-- #endif -->
+
+<script>
+	// 引入mescroll-uni.js,处理核心逻辑
+	import MeScroll from './mescroll-uni.js';
+	// 引入全局配置
+	import GlobalOption from './mescroll-uni-option.js';
+	// 引入空布局组件
+	import MescrollEmpty from './components/mescroll-empty.vue';
+	// 引入回到顶部组件
+	import MescrollTop from './components/mescroll-top.vue';
+	// 引入兼容wxs(含renderjs)写法的mixins
+	import WxsMixin from './wxs/mixins.js';
+	
+	export default {
+		mixins: [WxsMixin],
+		components: {
+			MescrollEmpty,
+			MescrollTop
+		},
+		data() {
+			return {
+				mescroll: {optDown:{},optUp:{}}, // mescroll实例
+				viewId: 'id_' + Math.random().toString(36).substr(2,16), // 随机生成mescroll的id(不能数字开头,否则找不到元素)
+				downHight: 0, //下拉刷新: 容器高度
+				downRate: 0, // 下拉比率(inOffset: rate<1; outOffset: rate>=1)
+				downLoadType: 0, // 下拉刷新状态: 0(loading前), 1(inOffset), 2(outOffset), 3(showLoading), 4(endDownScroll)
+				upLoadType: 0, // 上拉加载状态: 0(loading前), 1loading中, 2没有更多了,显示END文本提示, 3(没有更多了,不显示END文本提示)
+				isShowEmpty: false, // 是否显示空布局
+				isShowToTop: false, // 是否显示回到顶部按钮
+				scrollTop: 0, // 滚动条的位置
+				scrollAnim: false, // 是否开启滚动动画
+				windowTop: 0, // 可使用窗口的顶部位置
+				windowBottom: 0, // 可使用窗口的底部位置
+				windowHeight: 0, // 可使用窗口的高度
+				statusBarHeight: 0 // 状态栏高度
+			}
+		},
+		props: {
+			down: Object, // 下拉刷新的参数配置
+			up: Object, // 上拉加载的参数配置
+			top: [String, Number], // 下拉布局往下的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			topbar: [Boolean, String], // top的偏移量是否加上状态栏高度, 默认false (使用场景:取消原生导航栏时,配置此项可留出状态栏的占位, 支持传入字符串背景,如色值,背景图,渐变)
+			bottom: [String, Number], // 上拉布局往上的偏移量 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			safearea: Boolean, // bottom的偏移量是否加上底部安全区的距离, 默认false (需要适配iPhoneX时使用)
+			fixed: { // 是否通过fixed固定mescroll的高度, 默认true
+				type: Boolean,
+				default: true
+			},
+			height: [String, Number], // 指定mescroll的高度, 此项有值,则不使用fixed. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx, 百分比则相对于windowHeight)
+			bottombar:{ // 底部是否偏移TabBar的高度(默认仅在H5端的tab页生效)
+				type: Boolean,
+				default: true
+			}
+		},
+		computed: {
+			// 是否使用fixed定位 (当height有值,则不使用)
+			isFixed(){
+				return !this.height && this.fixed
+			},
+			// mescroll的高度
+			scrollHeight(){
+				if (this.isFixed) {
+					return "auto"
+				} else if(this.height){
+					return this.toPx(this.height) + 'px'
+				}else{
+					return "100%"
+				}
+			},
+			// 下拉布局往下偏移的距离 (px)
+			numTop() {
+				return this.toPx(this.top)
+			},
+			fixedTop() {
+				return this.isFixed ? (this.numTop + this.windowTop) + 'px' : 0
+			},
+			padTop() {
+				return !this.isFixed ? this.numTop + 'px' : 0
+			},
+			// 上拉布局往上偏移 (px)
+			numBottom() {
+				return this.toPx(this.bottom)
+			},
+			fixedBottom() {
+				return this.isFixed ? (this.numBottom + this.windowBottom) + 'px' : 0
+			},
+			padBottom() {
+				return !this.isFixed ? this.numBottom + 'px' : 0
+			},
+			// 是否为重置下拉的状态
+			isDownReset(){
+				return this.downLoadType===3 || this.downLoadType===4
+			},
+			// 过渡
+			transition() {
+				return this.isDownReset ? 'transform 300ms' : '';
+			},
+			translateY() {
+				return this.downHight > 0 ? 'translateY(' + this.downHight + 'px)' : ''; // transform会使fixed失效,需注意把fixed元素写在mescroll之外
+			},
+			// 列表是否可滑动
+			scrollable(){
+				return this.downLoadType===0 || this.isDownReset
+			},
+			// 是否在加载中
+			isDownLoading(){
+				return this.downLoadType === 3
+			},
+			// 旋转的角度
+			downRotate(){
+				return 'rotate(' + 360 * this.downRate + 'deg)'
+			},
+			// 文本提示
+			downText(){
+				if(!this.mescroll) return ""; // 避免头条小程序初始化时报错
+				switch (this.downLoadType){
+					case 1: return this.mescroll.optDown.textInOffset;
+					case 2: return this.mescroll.optDown.textOutOffset;
+					case 3: return this.mescroll.optDown.textLoading;
+					case 4: return this.mescroll.isDownEndSuccess ? this.mescroll.optDown.textSuccess : this.mescroll.isDownEndSuccess==false ? this.mescroll.optDown.textErr : this.mescroll.optDown.textInOffset;
+					default: return this.mescroll.optDown.textInOffset;
+				}
+			}
+		},
+		methods: {
+			//number,rpx,upx,px,% --> px的数值
+			toPx(num){
+				if(typeof num === "string"){
+					if (num.indexOf('px') !== -1) {
+						if(num.indexOf('rpx') !== -1) { // "10rpx"
+							num = num.replace('rpx', '');
+						} else if(num.indexOf('upx') !== -1) { // "10upx"
+							num = num.replace('upx', '');
+						} else { // "10px"
+							return Number(num.replace('px', ''))
+						}
+					}else if (num.indexOf('%') !== -1){
+						// 传百分比,则相对于windowHeight,传"10%"则等于windowHeight的10%
+						let rate = Number(num.replace("%","")) / 100
+						return this.windowHeight * rate
+					}
+				}
+				return num ? uni.upx2px(Number(num)) : 0
+			},
+			//注册列表滚动事件,用于下拉刷新和上拉加载
+			scroll(e) {
+				this.mescroll.scroll(e.detail, () => {
+					this.$emit('scroll', this.mescroll) // 此时可直接通过 this.mescroll.scrollTop获取滚动条位置; this.mescroll.isScrollUp获取是否向上滑动
+				})
+			},
+			// 点击空布局的按钮回调
+			emptyClick() {
+				this.$emit('emptyclick', this.mescroll)
+			},
+			// 点击回到顶部的按钮回调
+			toTopClick() {
+				this.mescroll.scrollTo(0, this.mescroll.optUp.toTop.duration); // 执行回到顶部
+				this.$emit('topclick', this.mescroll); // 派发点击回到顶部按钮的回调
+			},
+			// 更新滚动区域的高度 (使内容不满屏和到底,都可继续翻页)
+			setClientHeight() {
+				if (this.mescroll.getClientHeight(true) === 0 && !this.isExec) {
+					this.isExec = true; // 避免多次获取
+					this.$nextTick(() => { // 确保dom已渲染
+						this.getClientInfo(data=>{
+							this.isExec = false;
+							if (data) {
+								this.mescroll.setClientHeight(data.height);
+							} else if (this.clientNum != 3) { // 极少部分情况,可能dom还未渲染完毕,递归获取,最多重试3次
+								this.clientNum = this.clientNum == null ? 1 : this.clientNum + 1;
+								setTimeout(() => {
+									this.setClientHeight()
+								}, this.clientNum * 100)
+							}
+						})
+					})
+				}
+			},
+			// 获取滚动区域的信息
+			getClientInfo(success){
+				let query = uni.createSelectorQuery();
+				// #ifndef MP-ALIPAY || MP-DINGTALK
+				query = query.in(this) // 支付宝小程序不支持in(this),而字节跳动小程序必须写in(this), 否则都取不到值
+				// #endif
+				let view = query.select('#' + this.viewId);
+				view.boundingClientRect(data => {
+					success(data)
+				}).exec();
+			}
+		},
+		// 使用created初始化mescroll对象; 如果用mounted部分css样式编译到H5会失效
+		created() {
+			let vm = this;
+
+			let diyOption = {
+				// 下拉刷新的配置
+				down: {
+					inOffset() {
+						vm.downLoadType = 1; // 下拉的距离进入offset范围内那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					outOffset() {
+						vm.downLoadType = 2; // 下拉的距离大于offset那一刻的回调 (自定义mescroll组件时,此行不可删)
+					},
+					onMoving(mescroll, rate, downHight) {
+						// 下拉过程中的回调,滑动过程一直在执行;
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+						vm.downRate = rate; //下拉比率 (inOffset: rate<1; outOffset: rate>=1)
+					},
+					showLoading(mescroll, downHight) {
+						vm.downLoadType = 3; // 显示下拉刷新进度的回调 (自定义mescroll组件时,此行不可删)
+						vm.downHight = downHight; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+					},
+					beforeEndDownScroll(mescroll){
+						vm.downLoadType = 4; 
+						return mescroll.optDown.beforeEndDelay // 延时结束的时长
+					},
+					endDownScroll() {
+						vm.downLoadType = 4; // 结束下拉 (自定义mescroll组件时,此行不可删)
+						vm.downHight = 0; // 设置下拉区域的高度 (自定义mescroll组件时,此行不可删)
+						vm.downResetTimer && clearTimeout(vm.downResetTimer)
+						vm.downResetTimer = setTimeout(()=>{ // 过渡动画执行完毕后,需重置为0的状态,以便置空this.transition,避免iOS小程序列表渲染不完整
+							if(vm.downLoadType===4) vm.downLoadType = 0
+						},300)
+					},
+					// 派发下拉刷新的回调
+					callback: function(mescroll) {
+						vm.$emit('down', mescroll)
+					}
+				},
+				// 上拉加载的配置
+				up: {
+					// 显示加载中的回调
+					showLoading() {
+						vm.upLoadType = 1;
+					},
+					// 显示无更多数据的回调
+					showNoMore() {
+						vm.upLoadType = 2;
+					},
+					// 隐藏上拉加载的回调
+					hideUpScroll(mescroll) {
+						vm.upLoadType = mescroll.optUp.hasNext ? 0 : 3;
+					},
+					// 空布局
+					empty: {
+						onShow(isShow) { // 显示隐藏的回调
+							vm.isShowEmpty = isShow;
+						}
+					},
+					// 回到顶部
+					toTop: {
+						onShow(isShow) { // 显示隐藏的回调
+							vm.isShowToTop = isShow;
+						}
+					},
+					// 派发上拉加载的回调
+					callback: function(mescroll) {
+						vm.$emit('up', mescroll);
+						// 更新容器的高度 (多mescroll的情况)
+						vm.setClientHeight()
+					}
+				}
+			}
+
+			MeScroll.extend(diyOption, GlobalOption); // 混入全局的配置
+			let myOption = JSON.parse(JSON.stringify({'down': vm.down,'up': vm.up})) // 深拷贝,避免对props的影响
+			MeScroll.extend(myOption, diyOption); // 混入具体界面的配置
+
+			// 初始化MeScroll对象
+			vm.mescroll = new MeScroll(myOption);
+			vm.mescroll.viewId = vm.viewId; // 附带id
+			// init回调mescroll对象
+			vm.$emit('init', vm.mescroll);
+			
+			// 设置高度
+			const sys = uni.getSystemInfoSync();
+			if(sys.windowTop) vm.windowTop = sys.windowTop;
+			if(sys.windowBottom) vm.windowBottom = sys.windowBottom;
+			if(sys.windowHeight) vm.windowHeight = sys.windowHeight;
+			if(sys.statusBarHeight) vm.statusBarHeight = sys.statusBarHeight;
+			// 使down的bottomOffset生效
+			vm.mescroll.setBodyHeight(sys.windowHeight);
+
+			// 因为使用的是scrollview,这里需自定义scrollTo
+			vm.mescroll.resetScrollTo((y, t) => {
+				vm.scrollAnim = (t !== 0); // t为0,则不使用动画过渡
+				if(typeof y === 'string'){
+					// 小程序不支持slot里面的scroll-into-view, 统一使用计算的方式实现
+					vm.getClientInfo(function(rect){
+						let mescrollTop = rect.top // mescroll到顶部的距离
+						let selector;
+						if(y.indexOf('#')==-1 && y.indexOf('.')==-1){
+							selector = '#'+y // 不带#和. 则默认为id选择器
+						}else{
+							selector = y
+							// #ifdef APP-PLUS || H5 || MP-ALIPAY || MP-DINGTALK
+							if(y.indexOf('>>>')!=-1){ // 不支持跨自定义组件的后代选择器 (转为普通的选择器即可跨组件查询)
+								selector = y.split('>>>')[1].trim()
+							}
+							// #endif
+						}
+						uni.createSelectorQuery().select(selector).boundingClientRect(function(rect){
+							if (rect) {
+								let curY = vm.mescroll.getScrollTop()
+								let top = rect.top - mescrollTop
+								top += curY
+								if(!vm.isFixed) top -= vm.numTop
+								vm.scrollTop = curY;
+								vm.$nextTick(function() {
+									vm.scrollTop = top
+								})
+							} else{
+								console.error(selector + ' does not exist');
+							}
+						}).exec()
+					})
+					return;
+				}
+				let curY = vm.mescroll.getScrollTop()
+				if (t === 0 || t === 300) { // 当t使用默认配置的300时,则使用系统自带的动画过渡
+					vm.scrollTop = curY;
+					vm.$nextTick(function() {
+						vm.scrollTop = y
+					})
+				} else {
+					vm.mescroll.getStep(curY, y, step => { // 此写法可支持配置t
+						vm.scrollTop = step
+					}, t)
+				}
+			})
+			
+			// 具体的界面如果不配置up.toTop.safearea,则取本vue的safearea值
+			if (vm.up && vm.up.toTop && vm.up.toTop.safearea != null) {} else {
+				vm.mescroll.optUp.toTop.safearea = vm.safearea;
+			}
+		},
+		mounted() {
+			// 设置容器的高度
+			this.setClientHeight()
+		}
+	}
+</script>
+
+<style>
+	@import "./mescroll-uni.css";
+	@import "./components/mescroll-down.css";
+	@import './components/mescroll-up.css';
+</style>

+ 48 - 0
components/mescroll-uni/mixins/mescroll-comp.js

@@ -0,0 +1,48 @@
+/**
+ * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期
+ */
+const MescrollCompMixin = {
+	// 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 (一级)
+	onPageScroll(e) {
+		this.handlePageScroll(e)
+	},
+	onReachBottom() {
+		this.handleReachBottom()
+	},
+	// 当down的native: true时, 还需传递此方法进到子组件
+	onPullDownRefresh(){
+		this.handlePullDownRefresh()
+	},
+	// mescroll-body写在子子子...组件的情况 (多级)
+	data() {
+		return {
+			mescroll: {
+				onPageScroll: e=>{
+					this.handlePageScroll(e)
+				},
+				onReachBottom: ()=>{
+					this.handleReachBottom()
+				},
+				onPullDownRefresh: ()=>{
+					this.handlePullDownRefresh()
+				}
+			}
+		}
+	},
+	methods:{
+		handlePageScroll(e){
+			let item = this.$refs["mescrollItem"];
+			if(item && item.mescroll) item.mescroll.onPageScroll(e);
+		},
+		handleReachBottom(){
+			let item = this.$refs["mescrollItem"];
+			if(item && item.mescroll) item.mescroll.onReachBottom();
+		},
+		handlePullDownRefresh(){
+			let item = this.$refs["mescrollItem"];
+			if(item && item.mescroll) item.mescroll.onPullDownRefresh();
+		}
+	}
+}
+
+export default MescrollCompMixin;

+ 59 - 0
components/mescroll-uni/mixins/mescroll-more-item.js

@@ -0,0 +1,59 @@
+/**
+ * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例)
+ */
+const MescrollMoreItemMixin = {
+	// 支付宝小程序不支持props的mixin,需写在具体的页面中
+	// #ifndef MP-ALIPAY || MP-DINGTALK
+	props:{
+		i: Number, // 每个tab页的专属下标
+		index: { // 当前tab的下标
+			type: Number,
+			default(){
+				return 0
+			}
+		}
+	},
+	// #endif
+	data() {
+		return {
+			downOption:{
+				auto:false // 不自动加载
+			},
+			upOption:{
+				auto:false // 不自动加载
+			},
+			isInit: false // 当前tab是否已初始化
+		}
+	},
+	watch:{
+		// 监听下标的变化
+		index(val){
+			if (this.i === val && !this.isInit) {
+				this.isInit = true; // 标记为true
+				this.mescroll && this.mescroll.triggerDownScroll();
+			}
+		}
+	},
+	methods: {
+		// 以ref的方式初始化mescroll对象 (兼容字节跳动小程序)
+		mescrollInitByRef() {
+			if(!this.mescroll || !this.mescroll.resetUpScroll){
+				// 字节跳动小程序编辑器不支持一个页面存在相同的ref, 多mescroll的ref需动态生成, 格式为'mescrollRef下标'
+				let mescrollRef = this.$refs.mescrollRef || this.$refs['mescrollRef'+this.i];
+				if(mescrollRef) this.mescroll = mescrollRef.mescroll
+			}
+		},
+		// mescroll组件初始化的回调,可获取到mescroll对象 (覆盖mescroll-mixins.js的mescrollInit, 为了标记isInit)
+		mescrollInit(mescroll) {
+			this.mescroll = mescroll;
+			this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序
+			// 自动加载当前tab的数据
+			if(this.i === this.index){
+				this.isInit = true; // 标记为true
+				this.mescroll.triggerDownScroll();
+			}
+		},
+	}
+}
+
+export default MescrollMoreItemMixin;

+ 74 - 0
components/mescroll-uni/mixins/mescroll-more.js

@@ -0,0 +1,74 @@
+/**
+ * mescroll-body写在子组件时, 需通过mescroll的mixins补充子组件缺少的生命周期
+ */
+const MescrollMoreMixin = {
+	data() {
+		return {
+			tabIndex: 0, // 当前tab下标
+			mescroll: {
+				onPageScroll: e=>{
+					this.handlePageScroll(e)
+				},
+				onReachBottom: ()=>{
+					this.handleReachBottom()
+				},
+				onPullDownRefresh: ()=>{
+					this.handlePullDownRefresh()
+				}
+			}
+		}
+	},
+	// 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件
+	onPageScroll(e) {
+		this.handlePageScroll(e)
+	},
+	onReachBottom() {
+		this.handleReachBottom()
+	},
+	// 当down的native: true时, 还需传递此方法进到子组件
+	onPullDownRefresh(){
+		this.handlePullDownRefresh()
+	},
+	methods:{
+		handlePageScroll(e){
+			let mescroll = this.getMescroll(this.tabIndex);
+			mescroll && mescroll.onPageScroll(e);
+		},
+		handleReachBottom(){
+			let mescroll = this.getMescroll(this.tabIndex);
+			mescroll && mescroll.onReachBottom();
+		},
+		handlePullDownRefresh(){
+			let mescroll = this.getMescroll(this.tabIndex);
+			mescroll && mescroll.onPullDownRefresh();
+		},
+		// 根据下标获取对应子组件的mescroll
+		getMescroll(i){
+			if(!this.mescrollItems) this.mescrollItems = [];
+			if(!this.mescrollItems[i]) {
+				// v-for中的refs
+				let vForItem = this.$refs["mescrollItem"];
+				if(vForItem){
+					this.mescrollItems[i] = vForItem[i]
+				}else{
+					// 普通的refs,不可重复
+					this.mescrollItems[i] = this.$refs["mescrollItem"+i];
+				}
+			}
+			let item = this.mescrollItems[i]
+			return item ? item.mescroll : null
+		},
+		// 切换tab,恢复滚动条位置
+		tabChange(i){
+			let mescroll = this.getMescroll(i);
+			if(mescroll){
+				// 延时(比$nextTick靠谱一些),确保元素已渲染
+				setTimeout(()=>{
+					mescroll.scrollTo(mescroll.getScrollTop(),0)
+				},30)
+			}
+		}
+	}
+}
+
+export default MescrollMoreMixin;

+ 109 - 0
components/mescroll-uni/wxs/mixins.js

@@ -0,0 +1,109 @@
+// 定义在wxs (含renderjs) 逻辑层的数据和方法, 与视图层相互通信
+const WxsMixin = {
+	data() {
+		return {
+			// 传入wxs视图层的数据 (响应式)
+			wxsProp: {
+				optDown:{}, // 下拉刷新的配置
+				scrollTop:0, // 滚动条的距离
+				bodyHeight:0, // body的高度
+				isDownScrolling:false, // 是否正在下拉刷新中
+				isUpScrolling:false, // 是否正在上拉加载中
+				isScrollBody:true, // 是否为mescroll-body滚动
+				isUpBoth:true, // 上拉加载时,是否同时可以下拉刷新
+				t: 0 // 数据更新的标记 (只有数据更新了,才会触发wxs的Observer)
+			},
+			
+			// 标记调用wxs视图层的方法
+			callProp: {
+				callType: '', // 方法名
+				t: 0 // 数据更新的标记 (只有数据更新了,才会触发wxs的Observer)
+			},
+			
+			// 不用wxs的平台使用此处的wxsBiz对象,抹平wxs的写法 (微信小程序和APP使用的wxsBiz对象是./wxs/wxs.wxs)
+			// #ifndef MP-WEIXIN || MP-QQ || APP-PLUS || H5
+			wxsBiz: {
+				//注册列表touchstart事件,用于下拉刷新
+				touchstartEvent: e=> {
+					this.mescroll.touchstartEvent(e);
+				},
+				//注册列表touchmove事件,用于下拉刷新
+				touchmoveEvent: e=> {
+					this.mescroll.touchmoveEvent(e);
+				},
+				//注册列表touchend事件,用于下拉刷新
+				touchendEvent: e=> {
+					this.mescroll.touchendEvent(e);
+				},
+				propObserver(){}, // 抹平wxs的写法
+				callObserver(){} // 抹平wxs的写法
+			},
+			// #endif
+			
+			// 不用renderjs的平台使用此处的renderBiz对象,抹平renderjs的写法 (app 和 h5 使用的renderBiz对象是./wxs/renderjs.js)
+			// #ifndef APP-PLUS || H5
+			renderBiz: {
+				propObserver(){} // 抹平renderjs的写法
+			}
+			// #endif
+		}
+	},
+	methods: {
+		// wxs视图层调用逻辑层的回调
+		wxsCall(msg){
+			if(msg.type === 'setWxsProp'){
+				// 更新wxsProp数据 (值改变才触发更新)
+				this.wxsProp = {
+					optDown: this.mescroll.optDown,
+					scrollTop: this.mescroll.getScrollTop(),
+					bodyHeight: this.mescroll.getBodyHeight(),
+					isDownScrolling: this.mescroll.isDownScrolling,
+					isUpScrolling: this.mescroll.isUpScrolling,
+					isUpBoth: this.mescroll.optUp.isBoth,
+					isScrollBody:this.mescroll.isScrollBody,
+					t: Date.now()
+				}
+			}else if(msg.type === 'setLoadType'){
+				// 设置inOffset,outOffset的状态
+				this.downLoadType = msg.downLoadType
+				// 状态挂载到mescroll对象, 以便在其他组件中使用, 比如<me-video>中
+				this.$set(this.mescroll, 'downLoadType', this.downLoadType)
+				// 重置是否加载成功的状态
+				this.$set(this.mescroll, 'isDownEndSuccess', null)
+			}else if(msg.type === 'triggerDownScroll'){
+				// 主动触发下拉刷新
+				this.mescroll.triggerDownScroll();
+			}else if(msg.type === 'endDownScroll'){
+				// 结束下拉刷新
+				this.mescroll.endDownScroll();
+			}else if(msg.type === 'triggerUpScroll'){
+				// 主动触发上拉加载
+				this.mescroll.triggerUpScroll(true);
+			}
+		}
+	},
+	mounted() {
+		// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS || H5
+		// 配置主动触发wxs显示加载进度的回调
+		this.mescroll.optDown.afterLoading = ()=>{
+			this.callProp = {callType: "showLoading", t: Date.now()} // 触发wxs的方法 (值改变才触发更新)
+		}
+		// 配置主动触发wxs隐藏加载进度的回调
+		this.mescroll.optDown.afterEndDownScroll = ()=>{
+			this.callProp = {callType: "endDownScroll", t: Date.now()} // 触发wxs的方法 (值改变才触发更新)
+			let delay = 300 + (this.mescroll.optDown.beforeEndDelay || 0)
+			setTimeout(()=>{
+				if(this.downLoadType === 4 || this.downLoadType === 0){
+					this.callProp = {callType: "clearTransform", t: Date.now()} // 触发wxs的方法 (值改变才触发更新)
+				}
+				// 状态挂载到mescroll对象, 以便在其他组件中使用, 比如<me-video>中
+				this.$set(this.mescroll, 'downLoadType', this.downLoadType)
+			}, delay)
+		}
+		// 初始化wxs的数据
+		this.wxsCall({type: 'setWxsProp'})
+		// #endif
+	}
+}
+
+export default WxsMixin;

+ 92 - 0
components/mescroll-uni/wxs/renderjs.js

@@ -0,0 +1,92 @@
+// 使用renderjs直接操作window对象,实现动态控制app和h5的bounce
+// bounce: iOS橡皮筋,Android半月弧,h5浏览器下拉背景等效果 (下拉刷新时禁止)
+// https://uniapp.dcloud.io/frame?id=renderjs
+
+// 与wxs的me实例一致
+var me = {}
+
+// 初始化window对象的touch事件 (仅初始化一次)
+if(window && !window.$mescrollRenderInit){
+	window.$mescrollRenderInit = true
+	
+	
+	window.addEventListener('touchstart', function(e){
+		if (me.disabled()) return;
+		me.startPoint = me.getPoint(e); // 记录起点
+	}, {passive: true})
+	
+	
+	window.addEventListener('touchmove', function(e){
+		if (me.disabled()) return;
+		if (me.getScrollTop() > 0) return; // 需在顶部下拉,才禁止bounce
+		
+		var curPoint = me.getPoint(e); // 当前点
+		var moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
+		// 向下拉
+		if (moveY > 0) {
+			// 可下拉的条件
+			if (!me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && me.isUpBoth))) {
+				
+				// 只有touch在mescroll的view上面,才禁止bounce
+				var el = e.target;
+				var isMescrollTouch = false;
+				while (el && el.tagName && el.tagName !== 'UNI-PAGE-BODY' && el.tagName != "BODY") {
+					var cls = el.classList;
+					if (cls && cls.contains('mescroll-render-touch')) {
+						isMescrollTouch = true
+						break;
+					}
+					el = el.parentNode; // 继续检查其父元素
+				}
+				// 禁止bounce (不会对swiper和iOS侧滑返回造成影响)
+				if (isMescrollTouch && e.cancelable && !e.defaultPrevented) e.preventDefault();
+			}
+		}
+	}, {passive: false})
+}
+
+/* 获取滚动条的位置 */
+me.getScrollTop = function() {
+	return me.scrollTop || 0
+}
+
+/* 是否禁用下拉刷新 */
+me.disabled = function(){
+	return !me.optDown || !me.optDown.use || me.optDown.native
+}
+
+/* 根据点击滑动事件获取第一个手指的坐标 */
+me.getPoint = function(e) {
+	if (!e) {
+		return {x: 0,y: 0}
+	}
+	if (e.touches && e.touches[0]) {
+		return {x: e.touches[0].pageX,y: e.touches[0].pageY}
+	} else if (e.changedTouches && e.changedTouches[0]) {
+		return {x: e.changedTouches[0].pageX,y: e.changedTouches[0].pageY}
+	} else {
+		return {x: e.clientX,y: e.clientY}
+	}
+}
+
+/**
+ * 监听逻辑层数据的变化 (实时更新数据)
+ */
+function propObserver(wxsProp) {
+	me.optDown = wxsProp.optDown
+	me.scrollTop = wxsProp.scrollTop
+	me.isDownScrolling = wxsProp.isDownScrolling
+	me.isUpScrolling = wxsProp.isUpScrolling
+	me.isUpBoth = wxsProp.isUpBoth
+}
+
+/* 导出模块 */
+const renderBiz = {
+	data() {
+		return {
+			propObserver: propObserver,
+		}
+	}
+}
+
+export default renderBiz;

+ 268 - 0
components/mescroll-uni/wxs/wxs.wxs

@@ -0,0 +1,268 @@
+// 使用wxs处理交互动画, 提高性能, 同时避免小程序bounce对下拉刷新的影响
+// https://uniapp.dcloud.io/frame?id=wxs
+// https://developers.weixin.qq.com/miniprogram/dev/framework/view/interactive-animation.html 
+
+// 模拟mescroll实例, 与mescroll.js的写法尽量保持一致
+var me = {}
+
+// ------ 自定义下拉刷新动画 start ------
+
+/* 下拉过程中的回调,滑动过程一直在执行 (rate<1为inOffset; rate>1为outOffset) */
+me.onMoving = function (ins, rate, downHight){
+	ins.requestAnimationFrame(function () {
+		ins.selectComponent('.mescroll-wxs-content').setStyle({
+			'will-change': 'transform', // 可解决下拉过程中, image和swiper脱离文档流的问题
+			'transform': 'translateY(' + downHight + 'px)',
+			'transition': ''
+		})
+		// 环形进度条
+		var progress = ins.selectComponent('.mescroll-wxs-progress')
+		progress && progress.setStyle({transform: 'rotate(' + 360 * rate + 'deg)'})
+	})
+}
+
+/* 显示下拉刷新进度 */
+me.showLoading = function (ins){
+	me.downHight = me.optDown.offset
+	ins.requestAnimationFrame(function () {
+		ins.selectComponent('.mescroll-wxs-content').setStyle({
+			'will-change': 'auto',
+			'transform': 'translateY(' + me.downHight + 'px)',
+			'transition': 'transform 300ms'
+		})
+	})
+}
+
+/* 结束下拉 */
+me.endDownScroll = function (ins){
+	me.downHight = 0;
+	me.isDownScrolling = false;
+	ins.requestAnimationFrame(function () {
+		ins.selectComponent('.mescroll-wxs-content').setStyle({
+			'will-change': 'auto',
+			'transform': 'translateY(0)', // 不可以写空串,否则scroll-view渲染不完整 (延时350ms会调clearTransform置空)
+			'transition': 'transform 300ms'
+		})
+	})
+}
+
+/* 结束下拉动画执行完毕后, 清除transform和transition, 避免对列表内容样式造成影响, 如: h5的list-msg示例下拉进度条漏出来等 */
+me.clearTransform = function (ins){
+	ins.requestAnimationFrame(function () {
+		ins.selectComponent('.mescroll-wxs-content').setStyle({
+			'will-change': '',
+			'transform': '',
+			'transition': ''
+		})
+	})
+}
+
+// ------ 自定义下拉刷新动画 end ------
+
+/**
+ * 监听逻辑层数据的变化 (实时更新数据)
+ */
+function propObserver(wxsProp) {
+	me.optDown = wxsProp.optDown
+	me.scrollTop = wxsProp.scrollTop
+	me.bodyHeight = wxsProp.bodyHeight
+	me.isDownScrolling = wxsProp.isDownScrolling
+	me.isUpScrolling = wxsProp.isUpScrolling
+	me.isUpBoth = wxsProp.isUpBoth
+	me.isScrollBody = wxsProp.isScrollBody
+	me.startTop = wxsProp.scrollTop // 及时更新touchstart触发的startTop, 避免scroll-view快速惯性滚动到顶部取值不准确
+}
+
+/**
+ * 监听逻辑层数据的变化 (调用wxs的方法)
+ */
+function callObserver(callProp, oldValue, ins) {
+	if (me.disabled()) return;
+	if(callProp.callType){
+		// 逻辑层(App Service)的style已失效,需在视图层(Webview)设置style
+		if(callProp.callType === 'showLoading'){
+			me.showLoading(ins)
+		}else if(callProp.callType === 'endDownScroll'){
+			me.endDownScroll(ins)
+		}else if(callProp.callType === 'clearTransform'){
+			me.clearTransform(ins)
+		}
+	}
+}
+
+/**
+ * touch事件
+ */
+function touchstartEvent(e, ins) {
+	me.downHight = 0; // 下拉的距离
+	me.startPoint = me.getPoint(e); // 记录起点
+	me.startTop = me.getScrollTop(); // 记录此时的滚动条位置
+	me.startAngle = 0; // 初始角度
+	me.lastPoint = me.startPoint; // 重置上次move的点
+	me.maxTouchmoveY = me.getBodyHeight() - me.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况)
+	me.inTouchend = false; // 标记不是touchend
+	
+	me.callMethod(ins, {type: 'setWxsProp'}) // 同步更新wxsProp的数据 (小程序是异步的,可能touchmove先执行,才到propObserver; h5和app是同步)
+}
+
+function touchmoveEvent(e, ins) {
+	var isPrevent = true // false表示不往上冒泡,相当于调用了同时调用了stopPropagation和preventDefault (对小程序生效, h5和app无效)
+	
+	if (me.disabled()) return isPrevent;
+	
+	var scrollTop = me.getScrollTop(); // 当前滚动条的距离
+	var curPoint = me.getPoint(e); // 当前点
+	
+	var moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
+	
+	// 向下拉 && 在顶部
+	// mescroll-body,直接判定在顶部即可
+	// scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove
+	// scroll-view滚动到顶部时,scrollTop不一定为0,也有可能大于0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等
+	if (moveY > 0 && (
+			(me.isScrollBody && scrollTop <= 0)
+			||
+			(!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop)) )
+		)) {
+		// 可下拉的条件
+		if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling &&
+				me.isUpBoth))) {
+	
+			// 下拉的角度是否在配置的范围内
+			if(!me.startAngle) me.startAngle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90]
+			if (me.startAngle < me.optDown.minAngle) return isPrevent; // 如果小于配置的角度,则不往下执行下拉刷新
+	
+			// 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发
+			if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) {
+				me.inTouchend = true; // 标记执行touchend
+				touchendEvent(e, ins); // 提前触发touchend
+				return isPrevent;
+			}
+			
+			isPrevent = false // 小程序是return false
+	
+			var diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上)
+	
+			// 下拉距离  < 指定距离
+			if (me.downHight < me.optDown.offset) {
+				if (me.movetype !== 1) {
+					me.movetype = 1; // 加入标记,保证只执行一次
+					// me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次
+					me.callMethod(ins, {type: 'setLoadType', downLoadType: 1})
+					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
+				}
+				me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小
+	
+				// 指定距离  <= 下拉距离
+			} else {
+				if (me.movetype !== 2) {
+					me.movetype = 2; // 加入标记,保证只执行一次
+					// me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次
+					me.callMethod(ins, {type: 'setLoadType', downLoadType: 2})
+					me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来
+				}
+				if (diff > 0) { // 向下拉
+					me.downHight += diff * me.optDown.outOffsetRate; // 越往下,高度变化越小
+				} else { // 向上收
+					me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度
+				}
+			}
+			
+			me.downHight = Math.round(me.downHight) // 取整
+			var rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值
+			// me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行
+			me.onMoving(ins, rate, me.downHight)
+		}
+	}
+	
+	me.lastPoint = curPoint; // 记录本次移动的点
+	
+	return isPrevent // false表示不往上冒泡,相当于调用了同时调用了stopPropagation和preventDefault (对小程序生效, h5和app无效)
+}
+
+function touchendEvent(e, ins) {
+	// 如果下拉区域高度已改变,则需重置回来
+	if (me.isMoveDown) {
+		if (me.downHight >= me.optDown.offset) {
+			// 符合触发刷新的条件
+			me.downHight = me.optDown.offset; // 更新下拉区域高度
+			// me.triggerDownScroll();
+			me.callMethod(ins, {type: 'triggerDownScroll'})
+		} else {
+			// 不符合的话 则重置
+			me.downHight = 0;
+			// me.optDown.endDownScroll && me.optDown.endDownScroll(me);
+			me.callMethod(ins, {type: 'endDownScroll'})
+		}
+		me.movetype = 0;
+		me.isMoveDown = false;
+	} else if (!me.isScrollBody && me.getScrollTop() === me.startTop) { // scroll-view到顶/左/右/底的滑动事件
+		var isScrollUp = me.getPoint(e).y - me.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
+		// 上滑
+		if (isScrollUp) {
+			// 需检查滑动的角度
+			var angle = me.getAngle(me.getPoint(e), me.startPoint); // 两点之间的角度,区间 [0,90]
+			if (angle > 80) {
+				// 检查并触发上拉
+				// me.triggerUpScroll(true);
+				me.callMethod(ins, {type: 'triggerUpScroll'})
+			}
+		}
+	}
+	me.callMethod(ins, {type: 'setWxsProp'}) // 同步更新wxsProp的数据 (小程序是异步的,可能touchmove先执行,才到propObserver; h5和app是同步)
+}
+
+/* 是否禁用下拉刷新 */
+me.disabled = function(){
+	return !me.optDown || !me.optDown.use || me.optDown.native
+}
+
+/* 根据点击滑动事件获取第一个手指的坐标 */
+me.getPoint = function(e) {
+	if (!e) {
+		return {x: 0,y: 0}
+	}
+	if (e.touches && e.touches[0]) {
+		return {x: e.touches[0].pageX,y: e.touches[0].pageY}
+	} else if (e.changedTouches && e.changedTouches[0]) {
+		return {x: e.changedTouches[0].pageX,y: e.changedTouches[0].pageY}
+	} else {
+		return {x: e.clientX,y: e.clientY}
+	}
+}
+
+/* 计算两点之间的角度: 区间 [0,90]*/
+me.getAngle = function (p1, p2) {
+	var x = Math.abs(p1.x - p2.x);
+	var y = Math.abs(p1.y - p2.y);
+	var z = Math.sqrt(x * x + y * y);
+	var angle = 0;
+	if (z !== 0) {
+		angle = Math.asin(y / z) / Math.PI * 180;
+	}
+	return angle
+}
+
+/* 获取滚动条的位置 */
+me.getScrollTop = function() {
+	return me.scrollTop || 0
+}
+
+/* 获取body的高度 */
+me.getBodyHeight = function() {
+	return me.bodyHeight || 0;
+}
+
+/* 调用逻辑层的方法 */
+me.callMethod = function(ins, param) {
+	if(ins) ins.callMethod('wxsCall', param)
+}
+
+/* 导出模块 */
+module.exports = {
+	propObserver: propObserver,
+	callObserver: callObserver,
+	touchstartEvent: touchstartEvent,
+	touchmoveEvent: touchmoveEvent,
+	touchendEvent: touchendEvent
+}

File diff suppressed because it is too large
+ 26 - 0
components/mpvue-citypicker/mpvueCityPicker.vue


File diff suppressed because it is too large
+ 0 - 0
components/scancode/reqrcode.js


+ 110 - 0
components/tm-public/chat/chatGroupMsg.vue

@@ -0,0 +1,110 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fff; border-bottom: 10px solid transparent;}
+ .msg .content .vimg{max-width: 200rpx;}
+ .msg .msg-in .emojis{width: 180rpx;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ 
+
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #cceaff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #cceaff; border-bottom: 10px solid transparent;}
+ .me-msg .content .vimg{max-width: 200rpx;}
+ .me-msg .msg-in .emojis{width: 180rpx;}
+ .me-msg .content .up{position: absolute;width: calc(100% - 40rpx);height: calc(100% - 40rpx);top: 20rpx;left: 20rpx; background: rgba(0,0,0,0.4);color: #fff; font-size: 14px;}
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg fx-r"  v-if="item.sendUser.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill" ></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="content" @longtap="tapLongItem">
+					<view class="i"></view>
+					<!-- #ifdef H5 -->
+						<text style="color: red;">[群公告]</text><text v-html="utils.toH5ml(item.data)"></text>
+					<!-- #endif -->
+					
+					<!-- #ifndef H5 -->  
+						<text style="color: red;">[群公告]</text><rich-text :nodes="utils.toH5ml(item.data)"></rich-text>
+					<!-- #endif -->
+				</view>
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" v-else>
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{user.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<u-loading-icon v-if="item.isSend == 0" style="margin-right: 10px;"></u-loading-icon>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/chat/waring.png"></image>
+					<view class="content"  @longtap="tapLongItem">
+						<view class="i"></view>
+						<!-- #ifdef H5-->
+							<text style="color: red;">[群公告]</text><text v-html="utils.toH5ml(item.data)"></text>
+						<!-- #endif -->
+						
+						<!-- #ifndef H5 -->  
+							<text style="color: red;">[群公告]</text><rich-text :nodes="utils.toH5ml(item.data)"></rich-text>
+						<!-- #endif -->
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="utils.getAvatar(user.avatar,'chat')"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'msg',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		data() {
+			return{ 
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapLongItem:function(ev){
+				this.$emit('longItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUid);
+			}
+		}
+	}
+</script>

+ 115 - 0
components/tm-public/chat/cimg.vue

@@ -0,0 +1,115 @@
+<style>
+	.msg{padding: 20rpx;}
+	.msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+	.msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+	.msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+	.msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+	.msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+	.msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;display: inline-block;}
+	.msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fff; border-bottom: 10px solid transparent;}
+	.msg .content .vimg{max-width: 200rpx;border-radius: 6px;}
+	.msg .msg-in .emojis{width: 180rpx;}	
+	.msg .nickname{font-size: 12px;margin-bottom:6px;}
+	  
+	
+	.me-msg{padding: 20rpx;}       
+	.msg-in{width: calc(100% - 160rpx); margin-right: 20rpx;}
+	.me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+	.me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+	.me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+	.me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+	.me-msg .content{position: relative;display: inline-block;min-height: 20px;font-size: 16px;background-color: #cceaff; margin-right: 10px;padding: 20rpx;border-radius: 8rpx;}
+	.me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #cceaff; border-bottom: 10px solid transparent;}
+	.me-msg .content .vimg{max-width: 200rpx;border-radius: 6px;}
+	.me-msg .msg-in .emojis{width: 180rpx;}
+	.me-msg .content .up{position: absolute;width: calc(100% - 40rpx);height: calc(100% - 40rpx);top: 20rpx;left: 20rpx; background: rgba(0,0,0,0.4);color: #fff; font-size: 14px;}
+	.me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+</style>
+<template>
+	<view>
+		<view class="msg fx-r" v-if="item.sendUser.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" @longtap="tapLongUserItem" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill"></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="content" >
+					<view class="i"></view>
+					<image class="vimg" :src="item.data" @longtap="tapLongItem" @tap="tapOpenImg(item.data)" mode="widthFix"></image>
+				</view>
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" v-else>
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class=" fx-r fx-bc fx-ae">  
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/chat/waring.png"></image>
+					<view class="content">
+						<view class="i"></view>
+						<image class="vimg" :src="item.data" @longtap="tapLongItem" @tap="tapOpenImg(item.data)" mode="widthFix"></image>
+						<view v-if="item.isSend == 0" class="up fx-r fx-bc fx-ac">
+							<image class="loading-msg" src="/static/chat/xloading-white.png"></image>
+						</view>  
+					</view>
+				</view>
+				
+			</view>
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill"></image></view>
+		</view>
+	
+	</view>
+</template>
+
+
+<script>
+	var swH = 0;
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'cimg',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		data() {
+			return{ 
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',item);
+			},
+			/**
+			 * 打开图片
+			 * @param {Object} item
+			 */
+			tapOpenImg:function(item){
+				this.$emit('openImg',item);
+			},
+			tapLongItem:function(ev){
+				this.$emit('longItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			
+			tapLongUserItem:function(ev){
+				this.$emit('longUserItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUser.uid);
+			}
+		}
+	}
+</script>
+

+ 123 - 0
components/tm-public/chat/msg.vue

@@ -0,0 +1,123 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fff; border-bottom: 10px solid transparent;}
+ .msg .content.remind{color: orange;}
+ .msg .content .vimg{max-width: 200rpx;}
+ .msg .msg-in .emojis{width: 180rpx;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ 
+
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #cceaff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #cceaff; border-bottom: 10px solid transparent;}
+ .me-msg .content .vimg{max-width: 200rpx;}
+ .me-msg .msg-in .emojis{width: 180rpx;}
+ .me-msg .content .up{position: absolute;width: calc(100% - 40rpx);height: calc(100% - 40rpx);top: 20rpx;left: 20rpx; background: rgba(0,0,0,0.4);color: #fff; font-size: 14px;}
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg fx-r" v-if="item.sendUser.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" @longtap="tapLongUserItem"  hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill" ></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="content" :class="item.is_remind == 1 ? 'remind': ''" @longtap="tapLongItem">
+					<view class="i"></view>
+					<!-- #ifdef H5 -->
+						<text v-html="utils.toH5ml(item.data)"></text>
+					<!-- #endif -->
+					
+					<!-- #ifndef H5 -->  
+						<rich-text :nodes="utils.toH5ml(item.data)"></rich-text>
+					<!-- #endif -->
+				</view>
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" v-else>  
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<u-loading-icon v-if="item.isSend == 0" style="margin-right: 10px;"></u-loading-icon>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/chat/waring.png"></image>
+					<view class="content"  @longtap="tapLongItem">
+						<view class="i"></view>
+						<!-- #ifdef H5-->
+							<text v-html="utils.toH5ml(item.data)"></text>
+						<!-- #endif -->
+						
+						<!-- #ifndef H5 -->  
+							<rich-text :nodes="utils.toH5ml(item.data)"></rich-text>
+						<!-- #endif -->
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="utils.getAvatar(user.avatar,'chat')"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'msg',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			},
+			chatUser:{
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		data() {
+			return{ 
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapLongItem:function(ev){
+				this.$emit('longItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			
+			tapLongUserItem:function(ev){
+				this.$emit('longUserItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUser.uid);
+			}
+		}
+	}
+</script>

+ 130 - 0
components/tm-public/chat/red.vue

@@ -0,0 +1,130 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ .msg .red_envelope{background: #fb9f3c;}
+ .msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .msg.no-msg .red_envelope{background-color:transparent;}
+ 
+ .msg .red_envelope .red-view{padding-bottom: 10px;}
+ .msg .red_envelope .red-view image{width: 30px;height: 30px;}  
+ .msg .red_envelope .red-view .text{font-size: 14px;color: #fff;}
+ .msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+  
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .me-msg .red_envelope{background: #fb9f3c;}
+ .me-msg .red_envelope .red-view{padding-bottom: 10px;}
+ .me-msg .red_envelope .red-view image{width: 30px;height: 30px;}
+ .me-msg .red_envelope .red-view .text{font-size: 14px;color: #fff;}
+ .me-msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .me-msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .me-msg.no-msg .red_envelope{background-color:transparent;}
+ .me-msg.no-msg .content .i{border-left-color:rgba(251,159,60,0.6);}
+ 
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg fx-r" :class="item.isReceiveRed ? 'no-msg' : ''" v-if="item.sendUser.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill" ></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="content" @tap="tapRedBack">
+					<view class="i"></view>
+					<view class="red_envelope">
+						<view class="red-view fx-r">
+							<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+							<view class="text">{{inItem.name}}</view>
+						</view>
+						<view class="tag">普通红包</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" :class="item.isReceiveRed ? 'no-msg' : ''"  v-else >
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<image v-if="item.isSend == 0" class="loading-msg" src="/static/img/xloading.png"></image>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/img/waring.png"></image>
+					<view class="content" @tap="tapRedBack">
+						<view class="i"></view>
+						<view class="red_envelope">
+							<view class="red-view fx-r">
+								<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+								<view class="text">{{inItem.name}}</view>
+							</view>
+							<view class="tag">普通红包</view>
+						</view>
+						
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="utils.getAvatar(user.avatar,'chat')"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'red',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		watch:{
+			item:{
+				immediate:true,
+				handler(val) {
+					this.inItem = JSON.parse(val.data);
+				}
+			}
+			
+		},
+		data() {
+			return{ 
+				inItem:{}
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapRedBack:function(){
+				this.$emit('redItem',this.item);
+			},
+			
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUser.uid);
+			}
+		}  
+	}
+</script>

+ 138 - 0
components/tm-public/chat/redEnvelopeTransfer.vue

@@ -0,0 +1,138 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ .msg .red_envelope{background: #fb9f3c;}
+ .msg .red_envelope .red-view{padding-bottom: 10px;}
+ .msg .red_envelope .red-view image{width: 30px;height: 30px;}  
+ .msg .red_envelope .red-view .text{white-space:nowrap;overflow:hidden;text-overflow: ellipsis;font-size: 14px;color: #fff;width: calc(100% - 30px);}
+ .msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .msg.no-msg .red_envelope{background-color:transparent;}
+  
+  
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .me-msg .red_envelope{background: #fb9f3c;}
+ .me-msg .red_envelope .red-view{padding-bottom: 10px;}
+ .me-msg .red_envelope .red-view image{width: 30px;height: 30px;}
+ .me-msg .red_envelope .red-view .text{font-size: 14px;color: #fff;}
+ .me-msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .me-msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .me-msg.no-msg .red_envelope{background-color:transparent;}
+ .me-msg.no-msg .content .i{border-left-color:rgba(251,159,60,0.6);}
+ 
+ 
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg no-msg fx-r"  v-if="item.user.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" hover-class="avatar-hover"><image :src="item.user.avatar" mode="aspectFill" ></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.user.nickname}}</view>
+				<view class="content" @tap="tapRedBack">
+					<view class="i"></view>
+					<view class="red_envelope">
+						<view class="red-view fx-r">
+							<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+							<view class="text">
+								<view >来自{{inItem.send.name}}的转账</view>
+								<view class="tagv1">已收款</view>
+							</view>
+							
+						</view>
+						<view class="tag">红包转账</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="me-msg no-msg fx-r fx-ae" v-else >
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.user.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<image v-if="item.isSend == 0" class="loading-msg" src="/static/img/xloading.png"></image>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/img/waring.png"></image>
+					<view class="content" @tap="tapRedBack">
+						<view class="i"></view> 
+						<view class="red_envelope">
+							<view class="red-view fx-r">
+								<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+								<view class="text">
+									<view >来自{{inItem.send.name}}的转账</view>
+									<view class="tagv1">已收款</view>
+								</view>
+							</view>
+							<view class="tag">红包转账</view>
+						</view>
+						
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar"  @tap="tapUser(0)" hover-class="avatar-hover"><image :src="item.user.avatar"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'redEnvelopeTransfer',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		watch:{
+			item:{
+				immediate:true,
+				handler(val) {
+					this.inItem = JSON.parse(val.data);
+					console.log(val);
+				}
+			}
+			
+		},
+		data() {
+			return{ 
+				inItem:{}
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapRedBack:function(){
+				this.$emit('redItem',this.item);
+			},
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUid);
+			}
+		}  
+	}
+</script>

+ 138 - 0
components/tm-public/chat/redEnvelopeTransferRefund.vue

@@ -0,0 +1,138 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ .msg .red_envelope{background: #fb9f3c;}
+ .msg .red_envelope .red-view{padding-bottom: 10px;}
+ .msg .red_envelope .red-view image{width: 30px;height: 30px;}  
+ .msg .red_envelope .red-view .text{white-space:nowrap;overflow:hidden;text-overflow: ellipsis;font-size: 14px;color: #fff;width: calc(100% - 30px);}
+ .msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .msg.no-msg .red_envelope{background-color:transparent;}
+  
+  
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .me-msg .red_envelope{background: #fb9f3c;}
+ .me-msg .red_envelope .red-view{padding-bottom: 10px;}
+ .me-msg .red_envelope .red-view image{width: 30px;height: 30px;}
+ .me-msg .red_envelope .red-view .text{font-size: 14px;color: #fff;}
+ .me-msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .me-msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .me-msg.no-msg .red_envelope{background-color:transparent;}
+ .me-msg.no-msg .content .i{border-left-color:rgba(251,159,60,0.6);}
+ 
+ 
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg no-msg fx-r"  v-if="item.user.uid != user.uid" >
+			<view class="avatar" @tap="tapUser(1)" hover-class="avatar-hover"><image :src="item.user.avatar" mode="aspectFill" ></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.user.nickname}}</view>
+				<view class="content" @tap="tapRedBack">
+					<view class="i"></view>
+					<view class="red_envelope">
+						<view class="red-view fx-r">
+							<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+							<view class="text">
+								<view >来自{{inItem.send.name}}的转账</view>
+								<view class="tagv1" style="color: red;">[已退回]</view>
+							</view>
+							
+						</view>
+						<view class="tag">红包转账</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="me-msg no-msg fx-r fx-ae" v-else >
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.user.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<image v-if="item.isSend == 0" class="loading-msg" src="/static/img/xloading.png"></image>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/img/waring.png"></image>
+					<view class="content" @tap="tapRedBack">
+						<view class="i"></view> 
+						<view class="red_envelope">
+							<view class="red-view fx-r">
+								<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+								<view class="text">
+									<view >来自{{inItem.send.name}}的转账</view>
+									<view class="tagv1" style="color: red;">[已退回]</view>
+								</view>
+							</view>
+							<view class="tag">红包转账</view>
+						</view>
+						
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="item.user.avatar"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'redEnvelopeTransferRefund',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		watch:{
+			item:{
+				immediate:true,
+				handler(val) {
+					this.inItem = JSON.parse(val.data);
+					console.log(val);
+				}
+			}
+			
+		},
+		data() {
+			return{ 
+				inItem:{}
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapRedBack:function(){
+				this.$emit('redItem',this.item);
+			},
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUid);
+			}
+		}  
+	}
+</script>

+ 141 - 0
components/tm-public/chat/redTransfer.vue

@@ -0,0 +1,141 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ .msg .red_envelope{background: #fb9f3c;}
+ .msg .red_envelope .red-view{padding-bottom: 10px;}
+ .msg .red_envelope .red-view image{width: 30px;height: 30px;}  
+ .msg .red_envelope .red-view .text{white-space:nowrap;overflow:hidden;text-overflow: ellipsis;font-size: 14px;color: #fff;width: calc(100% - 30px);}
+ .msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .msg.no-msg .red_envelope{background-color:transparent;}
+  
+  
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fb9f3c;width: 46vw;padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #fb9f3c; border-bottom: 10px solid transparent;}
+ .me-msg .red_envelope{background: #fb9f3c;}
+ .me-msg .red_envelope .red-view{padding-bottom: 10px;}
+ .me-msg .red_envelope .red-view image{width: 30px;height: 30px;}
+ .me-msg .red_envelope .red-view .text{font-size: 14px;color: #fff;}
+ .me-msg .red_envelope .tag{padding-top: 10px;font-size: 12px;border-top: 1px solid rgba(255,255,255,0.6);color: #fff;}
+ .me-msg.no-msg .content{background-color:rgba(251,159,60,0.6);}
+ .me-msg.no-msg .red_envelope{background-color:transparent;}
+ .me-msg.no-msg .content .i{border-left-color:rgba(251,159,60,0.6);}
+ 
+ 
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg fx-r" :class="item.isReceiveRed ? 'no-msg' : ''" v-if="item.user.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" hover-class="avatar-hover"><image :src="item.user.avatar" mode="aspectFill" ></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.user.nickname}}</view>
+				<view class="content"  @tap="tapRedBack">
+					<view class="i"></view>
+					<view class="red_envelope">
+						<view class="red-view fx-r">
+							<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+							<view class="text">
+								<view >{{inItem.name}}</view>
+								<view class="tagv1" v-if="inItem.f_uid == user.uid">请收款</view>
+								<view class="tagv1" v-else-if="item.sendUid == user.uid">你发起了一笔转账</view>
+								<view class="tagv1" v-else>你无需收款</view>
+							</view>
+							
+						</view>
+						<view class="tag">红包转账</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" :class="item.isReceiveRed ? 'no-msg' : ''" v-else >
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.user.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<image v-if="item.isSend == 0" class="loading-msg" src="/static/img/xloading.png"></image>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/img/waring.png"></image>
+					<view class="content" @tap="tapRedBack">
+						<view class="i"></view> 
+						<view class="red_envelope">
+							<view class="red-view fx-r">
+								<image mode="widthFix" src="/static/img/chat-red-v2.svg"></image>
+								<view class="text">
+									<view >{{inItem.name}}</view>
+									<view class="tagv1" v-if="inItem.f_uid == user.uid">请收款</view>
+									<view class="tagv1" v-else-if="item.sendUid == user.uid">你发起了一笔转账</view>
+									<view class="tagv1" v-else>你无需收款</view>
+								</view>
+							</view>
+							<view class="tag">红包转账</view>
+						</view>
+						
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="item.user.avatar"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'redTransfer',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		watch:{
+			item:{
+				immediate:true,
+				handler(val) {
+					this.inItem = JSON.parse(val.data);
+				}
+			}
+			
+		},
+		data() {
+			return{ 
+				inItem:{}
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapRedBack:function(){
+				this.$emit('redItem',this.item);
+			},
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUid);
+			}
+		}  
+	}
+</script>

+ 89 - 0
components/tm-public/chat/tip.vue

@@ -0,0 +1,89 @@
+<template>
+	<view class="app">
+		<view class="red_envelope_tip fx-r fx-bc fx-ac" v-if="item.type == 'red_envelope_tip'">
+			<image src="/static/img/chat-red-v2.svg"></image>
+			<text v-if="user.uid == inItem.lq.uid">
+				你领取{{inItem.send.name}}
+			</text>
+			<text v-else>
+				{{inItem.lq.name}} 领取您的
+			</text>
+			<text class="red" @tap="tapRed">红包</text>
+			<text v-if="inItem.is_completed">,你的红包已被领完。</text>
+		</view>
+		
+		<view class="red_envelope_tip fx-r fx-bc fx-ac" v-if="item.type == 'tip'">
+			{{item.data}}
+		</view>
+		
+		<view class="red_envelope_tip fx-r fx-bc fx-ac" v-if="item.type == 'group_del'">
+			{{inItem.nickname}}已被移除群聊
+		</view>
+		
+		<view class="red_envelope_tip fx-r fx-bc fx-ac" v-if="item.type == 'withdraw'">
+				<text v-if="item.sendUser.uid == user.uid">你撤回了一条消息</text>
+				<text v-else>{{item.sendUser.nickname}}撤回了一条消息</text>
+		</view>
+		
+		
+	</view>
+</template>
+
+<style lang="scss">
+	.red_envelope_tip{color:$ic-default-text ;font-size: 14px;padding: 10px;}
+	.red_envelope_tip image{width: 15px;height: 15px;}
+	.red_envelope_tip .red{color: #f25642;}
+</style>
+
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'tip',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		
+		watch:{
+			item:{
+				immediate:true,
+				handler(val) {
+					if(val.type == 'red_envelope_tip'){
+						this.inItem = JSON.parse(val.data);
+					}
+					
+					
+						
+					if(val.type == 'group_del')
+						this.inItem = JSON.parse(val.data);
+					
+				}
+			}
+			
+		},
+		
+		data() {
+			return{ 
+				inItem:{}
+			}
+		},
+		created() { 
+			
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRed:function(){
+				uni.navigateTo({ url:"/pages/chat/redpack/look?id=" + this.inItem.id});
+			}
+		}
+	}
+</script>  
+
+<style>
+</style>

+ 107 - 0
components/tm-public/chat/video.vue

@@ -0,0 +1,107 @@
+<style>
+	.msg{padding: 20rpx;}
+	.msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+	.msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+	.msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+	.msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+	.msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+	.msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;display: inline-block;}
+	.msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fff; border-bottom: 10px solid transparent;}
+	.msg .content .vimg{max-width: 200rpx;border-radius: 6px;}
+	.msg .msg-in .emojis{width: 180rpx;}	
+	.msg .nickname{font-size: 12px;margin-bottom:6px;}
+	  
+	
+	.me-msg{padding: 20rpx;}       
+	.msg-in{width: calc(100% - 160rpx); margin-right: 20rpx;}
+	.me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+	.me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+	.me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+	.me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+	.me-msg .content{position: relative;display: inline-block;min-height: 20px;font-size: 16px;background-color: #cceaff; margin-right: 10px;padding: 20rpx;border-radius: 8rpx;}
+	.me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #cceaff; border-bottom: 10px solid transparent;}
+	.me-msg .content .vimg{max-width: 200rpx;border-radius: 6px;}
+	.me-msg .msg-in .emojis{width: 180rpx;}
+	.me-msg .content .up{position: absolute;width: calc(100% - 40rpx);height: calc(100% - 40rpx);top: 20rpx;left: 20rpx; background: rgba(0,0,0,0.4);color: #fff; font-size: 14px;}
+	.me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+</style>
+<template>
+	<view>
+		<view class="msg fx-r" v-if="item.sendUser.uid != user.uid">
+			<view class="avatar" @tap="tapUser(1)" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill"></image></view>
+			<view class="msg-in">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="content" >
+					<view class="i"></view>
+					<image class="vimg" :src="item.data" @longtap="tapLongItem" @tap="tapOpenImg(item.data)" mode="widthFix"></image>
+				</view>
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" v-else>
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class=" fx-r fx-bc fx-ae">  
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/chat/waring.png"></image>
+					<view class="content">
+						<view class="i"></view>
+						<video :src="item.data"></video>
+						<view v-if="item.isSend == 0" class="up fx-r fx-bc fx-ac">
+							<image class="loading-msg" src="/static/img/xloading-white.png"></image>
+						</view>  
+					</view>
+				</view>
+				
+			</view>
+			<view class="avatar" @tap="tapUser(0)" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill"></image></view>
+		</view>
+	
+	</view>
+</template>
+
+
+<script>
+	var swH = 0;
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'CVideo',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		data() {
+			return{ 
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',item);
+			},
+			/**
+			 * 打开图片
+			 * @param {Object} item
+			 */
+			tapOpenImg:function(item){
+				this.$emit('openImg',item);
+			},
+			tapLongItem:function(ev){
+				this.$emit('longItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUser.uid);
+			}
+		}
+	}
+</script>
+

+ 138 - 0
components/tm-public/chat/voice.vue

@@ -0,0 +1,138 @@
+<style>
+	
+/**基本聊天数据**/
+ .msg{padding: 20rpx;}
+ .msg .msg-in{width: calc(100% - 160rpx); margin-left: 30rpx;}
+ .msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-left: 20rpx;}
+ .msg .msg-err{width:20px;height:20px;margin-left: 20rpx;}
+ .msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;margin-top: 6px;}
+ .msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #fff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .msg .content .i{width: 0;height: 0;left: -10px;position: absolute;border-top: 10px solid transparent; border-right: 10px solid #fff; border-bottom: 10px solid transparent;}
+ .msg .content .vimg{max-width: 200rpx;}
+ .msg .msg-in .emojis{width: 180rpx;}
+ .msg .nickname{font-size: 12px;margin-bottom:6px;}
+ 
+
+ .me-msg{padding: 20rpx;}  
+ .msg-in{width: calc(100% - 140rpx); margin-right: 20rpx;}
+ .me-msg .loading-msg{width:20px;height:20px;animation:rotate 1.5s linear infinite;margin-right: 20rpx;}
+ .me-msg .msg-err{width:20px;height:20px;margin-right: 20rpx;}
+ .me-msg .avatar{width: 80rpx;height: 80rpx;border-radius: 50%;overflow: hidden;}
+ .me-msg .avatar image{width: 80rpx;height: 80rpx;border-radius: 50%;}
+ .me-msg .content{position: relative;min-height: 20px;font-size: 16px;background-color: #cceaff;max-width: calc(100% - 140rpx);padding: 20rpx;border-radius: 8rpx;word-break:break-all;display:inline-block;}
+ .me-msg .content .i{width: 0;height: 0;right: -10px;position: absolute;border-top: 10px solid transparent; border-left: 10px solid #cceaff; border-bottom: 10px solid transparent;}
+ .me-msg .content .vimg{max-width: 200rpx;}
+ .me-msg .msg-in .emojis{width: 180rpx;}
+ .me-msg .content .up{position: absolute;width: calc(100% - 40rpx);height: calc(100% - 40rpx);top: 20rpx;left: 20rpx; background: rgba(0,0,0,0.4);color: #fff; font-size: 14px;}
+ .me-msg .nickname{font-size: 12px;margin-bottom:6px;margin-right: 6px;}
+/**结束**/
+</style>
+<template>
+	<view>
+		<view class="msg fx-r"  v-if="item.sendUser.uid != user.uid">
+			<view class="avatar" @longtap="tapLongUserItem" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')" mode="aspectFill" ></image></view>
+			<view class="msg-in">   
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="content" @longtap="tapLongItem" @tap="playa">
+					<view class="i"></view>
+					<text style="color: 2c2c2c;,margin-right: 3rpx;margin-right: 60px;">{{parseInt(inItem.time/1000)}} "</text>
+					<image v-if="playlyurl != inItem.filePath" src="/static/chat/yyy.png" style="width: 15px;height: 15px; margin-left:4px;" mode="widthFix"></image>
+					<image v-if="playlyurl == inItem.filePath" src="/static/chat/yyy.gif" style="width: 15px;height: 15px; margin-left:4px;" mode="widthFix"></image>
+				</view>  
+			</view>
+		</view>
+		<view class="me-msg fx-r fx-ae" v-else>
+			<view class="msg-in fx-h fx-be fx-ae">
+				<view class="nickname">{{item.sendUser.nickname}}</view>
+				<view class="msg-in fx-r fx-bc fx-ae">
+					<image v-if="item.isSend == 0" class="loading-msg" src="/static/chat/xloading.png"></image>
+					<image v-if="item.isSend == -1" @tap="tapRsend" class="msg-err" src="/static/chat/waring.png"></image>
+					<view class="content" @longtap="tapLongItem" @tap="playa">
+						<view class="i"></view>
+						<text style="color: 2c2c2c;,margin-right: 3rpx;margin-right: 60px;">{{parseInt(inItem.time/1000)}} "</text>
+						<image v-if="playlyurl != inItem.filePath" src="/static/chat/yyy.png" style="width: 15px;height: 15px; margin-left:4px;" mode="widthFix"></image>
+						<image v-if="playlyurl == inItem.filePath" src="/static/chat/yyy.gif" style="width: 15px;height: 15px; margin-left:4px;" mode="widthFix"></image>
+					</view>
+				</view>
+			</view>
+			
+			<view class="avatar" hover-class="avatar-hover"><image :src="utils.getAvatar(item.sendUser.avatar,'chat')"  mode="aspectFill"  ></image></view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import {mapState,mapMutations } from 'vuex';
+	export default {
+		computed: mapState(['user','sysData']),
+		name: 'voice',
+		props:{
+			item : {
+				type: Object,
+				default: ()=>{return {data:{}} }
+			}
+		},
+		watch:{
+			item:{
+				immediate:true,
+				handler(val) {
+					if(this.utils.isJSON(val.data)) {
+						this.inItem = JSON.parse(val.data);
+					} else {
+						this.inItem = {};
+					}
+				}
+			}
+			
+		},
+		data() {
+			return{ 
+				playlyurl:""
+			}
+		},
+		created() { 
+			//console.log(this.item);
+		},
+		mounted() {
+			
+		},
+		methods: {
+			tapRsend:function() {
+				this.$emit('rsend',this.item);
+			},
+			tapLongItem:function(ev){
+				this.$emit('longItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			   
+			playa:function(){
+				var innerAudioContext =  uni.createInnerAudioContext();
+				innerAudioContext.autoplay = true;
+				if(this.playlyurl == this.inItem.filePath){
+					this.playlyurl = ''
+					innerAudioContext.stop()
+				}else{
+					this.playlyurl = this.inItem.filePath
+					innerAudioContext.src = this.inItem.filePath
+					innerAudioContext.play()
+					innerAudioContext.onEnded(()=>{
+						this.playlyurl = ''
+					})
+				}
+			},
+			tapLongUserItem:function(ev){
+				this.$emit('longUserItem',{
+					dom : ev,
+					data : this.item
+				});
+			},
+			tapUser:function(type){
+				this.$emit('userItem',type == 0 ? this.user.uid : this.item.sendUser.uid);
+			}
+		}
+	}
+</script>

BIN
components/tm-public/img/hold_talk.png


+ 143 - 0
components/tm-public/recording/recording.vue

@@ -0,0 +1,143 @@
+<template>
+	<view class="app">
+		
+		<view class="sub-recording fx-h fx-bc fx-ac" v-if="isPopup">
+			<view class="title">按住说话</view>
+			<image  @longpress="recStart" @touchend="recStop"  class="icon" src="/static/img/hold_talk.png"></image>
+		</view>
+		
+		<view class="app-win fx-h fx-bc fx-ac" v-if="isRecorder">
+			<view class="recording-wav">
+				<view class="hr f-h">
+					<view class="top" v-if="powerLevel >= 100">
+						<view class="vc"></view>
+					</view>
+					<view class="v" :style="'height:' + (22 * (powerLevel / 100)) + 'px'"></view>
+					<view class="foot" v-if="powerLevel > 0">
+						<view class="vc"></view>
+					</view>
+				</view> 
+				<image src="/static/img/zeffect_recordbutton__recordview_bottom.png"></image>
+			</view>
+			
+			<view class="time">{{getTime()}}</view>
+		</view>
+		
+	</view>
+</template>
+
+<style>
+	.sub-recording{padding: 20px 0;}
+	.sub-recording .title{color: #787878;padding: 10px 0;font-size: 14px;}
+	.sub-recording .icon{width: 60px;height: 60px;}
+	.app-win{background: rgba(0, 0, 0, 0.8);width: 40vw;height: 40vw;position: fixed;top: calc(50% - 30vw);left: calc(50% - 20vw);border-radius: 6px;}
+	.app-win .recording-wav{width: 60px;height: 60px;position: relative;}
+	.app-win .recording-wav image{width: 60px;height: 60px;}
+	.app-win .recording-wav .hr{width: 25px;left:17px;bottom: 20px;position: absolute;z-index: 9;}
+	.app-win .recording-wav .hr .v{background: #2fbec0;}
+	
+	.app-win .recording-wav .hr .foot{height: 6px;overflow: hidden;position: relative}
+	.app-win .recording-wav .hr .foot .vc{width:26px;height: 26px; border-radius:0px 0px 26px 26px;background: #2fbec0;position: absolute;bottom: 0;}
+
+	.app-win .recording-wav .hr .top{height: 6px;overflow: hidden;position: relative;}
+	.app-win .recording-wav .hr .top .vc{width:26px;height: 26px; border-radius:26px 26px 0px 0px;background: #2fbec0;position: absolute;top: 0;}
+	.app-win .time{margin:10px 0;color: #fff;}
+</style>
+
+
+<script>
+	export default{
+		props:{
+			
+		},
+		computed:{},
+		data(){
+			return{
+				isRecorder:false,
+				rec: null,
+				powerLevel:0,
+				time : 0,
+				isPopup : false,
+				recorder:uni.getRecorderManager(),
+				recordTimer:0
+			}
+		},
+		created () {
+			this.recOpen();
+		},
+		methods:{
+			recOpen(){
+				//开始录音
+				this.recorder.onStart(()=>{
+					this.time = 0;
+					this.powerLevel = 0;
+					this.isRecorder = true;
+					this.recordTimer = setInterval(()=>{
+						this.time = this.time + 100;
+						this.powerLevel = Math.floor(Math.random() * 100 );
+					},100)
+				});
+				//录音结束
+				this.recorder.onStop( (res)=> {
+					if(this.recordTimer > 0){
+						clearInterval(this.recordTimer);
+					}
+					this.isRecorder = false;
+					if(this.time < 1000) {
+						this.utils.Tip("说话时间太短了");
+						return;
+					}
+					uni.getFileSystemManager().readFile({
+						filePath: res.tempFilePath,
+						encoding: 'base64',
+						success: res2=>{
+							console.log(res2);
+						}
+						
+					});
+					
+					//this.$emit('end',{data:(/.+;\s*base64\s*,\s*(.+)$/i.exec(reader.result)||[])[1],duration:duration});					
+					console.log('recorder stop' + JSON.stringify(res));
+					this.voicePath = res.tempFilePath;
+				});
+				//
+				this.recorder.onError(()=>{
+					this.utils.Tip("录音失败");
+				});
+			},
+			open(){
+				this.isPopup = true;
+			},
+			hide(){
+				this.isPopup = false;
+			},
+			//打开录音
+			recStart(){
+				this.recorder.start({ sampleRate:16000,format:"mp3"});			
+			},
+			/**
+			 * 停止录音
+			 */
+			recStop(){
+				this.recorder.stop();			
+			},
+			//关闭录音
+			recClose(){
+				
+			},
+			getTime:function(){
+				let seconds = parseInt(this.time / 1000);
+				if(seconds <= 60) {
+					return "00:" + (seconds < 10 ? ("0" + seconds) : seconds );
+				}
+				let seconds1 = parseInt(seconds / 60);
+				let seconds2 = parseInt(seconds  % 60);
+				
+				return (seconds1 < 10 ? ("0" + seconds1) : seconds1 ) + ":" + (seconds2 < 10 ? ("0" + seconds2) : seconds2 );
+			}
+		}
+	}
+</script>
+
+
+

+ 160 - 0
components/tm-public/recording/recordingApp.vue

@@ -0,0 +1,160 @@
+<template>
+	<view class="app">
+		
+		<view class="sub-recording fx-h fx-bc fx-ac" v-if="isPopup">
+			<view class="title">按住说话</view>
+			<image  @longpress="recStart" @touchend="recStop"  class="icon" src="/img/hold_talk.png"></image>
+		</view>
+		
+		<view class="app-win fx-h fx-bc fx-ac" v-if="isRecorder">
+			<view class="recording-wav">
+				<view class="hr f-h">
+					<view class="top" v-if="powerLevel >= 100">
+						<view class="vc"></view>
+					</view>
+					<view class="v" :style="'height:' + (22 * (powerLevel / 100)) + 'px'"></view>
+					<view class="foot" v-if="powerLevel > 0">
+						<view class="vc"></view>
+					</view>
+				</view> 
+				<image src="/static/chat/zeffect_recordbutton__recordview_bottom.png"></image>
+			</view>
+			
+			<view class="time">{{getTime()}}</view>
+		</view>
+		
+	</view>
+</template>
+
+<style>
+	.sub-recording{padding: 20px 0;}
+	.sub-recording .title{color: #787878;padding: 10px 0;font-size: 14px;}
+	.sub-recording .icon{width: 60px;height: 60px;}
+	.app-win{background: rgba(0, 0, 0, 0.8);width: 40vw;height: 40vw;position: fixed;top: calc(50% - 30vw);left: calc(50% - 20vw);border-radius: 6px;}
+	.app-win .recording-wav{width: 60px;height: 60px;position: relative;}
+	.app-win .recording-wav image{width: 60px;height: 60px;}
+	.app-win .recording-wav .hr{width: 25px;left:17px;bottom: 20px;position: absolute;z-index: 9;}
+	.app-win .recording-wav .hr .v{background: #2fbec0;}
+	
+	.app-win .recording-wav .hr .foot{height: 6px;overflow: hidden;position: relative}
+	.app-win .recording-wav .hr .foot .vc{width:26px;height: 26px; border-radius:0px 0px 26px 26px;background: #2fbec0;position: absolute;bottom: 0;}
+
+	.app-win .recording-wav .hr .top{height: 6px;overflow: hidden;position: relative;}
+	.app-win .recording-wav .hr .top .vc{width:26px;height: 26px; border-radius:26px 26px 0px 0px;background: #2fbec0;position: absolute;top: 0;}
+	.app-win .time{margin:10px 0;color: #fff;}
+</style>
+
+
+<script>
+	import { pathToBase64, base64ToPath } from 'image-tools';
+	export default{
+		props:{
+			
+		},
+		computed:{},
+		data(){
+			return{
+				isRecorder:false,
+				rec: null,
+				powerLevel:0,
+				time : 0,
+				isPopup : false,
+				recorder:uni.getRecorderManager(),
+				recordTimer:0
+			}
+		},
+		created () {
+			this.recOpen();
+		},
+		methods:{
+			recOpen(){
+				//开始录音
+				this.recorder.onStart(()=>{
+					this.time = 0;
+					this.powerLevel = 0;
+					this.isRecorder = true;
+					this.recordTimer = setInterval(()=>{
+						this.time = this.time + 100;
+						this.powerLevel = Math.floor(Math.random() * 100 );
+					},100)
+				});
+				//录音结束
+				this.recorder.onStop( (res)=> {
+					if(this.recordTimer > 0){
+						clearInterval(this.recordTimer);
+					}
+					this.isRecorder = false;  
+					if(this.time < 1000) {
+						this.utils.Tip("说话时间太短了");
+						return;
+					}
+					
+					this.imgToBase64(res.tempFilePath).then(base64=>{
+						//console.log(base64);
+						this.$emit('end',{data:(/.+;\s*base64\s*,\s*(.+)$/i.exec(base64)||[])[1],duration:this.time});
+					});
+				
+					
+					//this.$emit('end',{data:(/.+;\s*base64\s*,\s*(.+)$/i.exec(reader.result)||[])[1],duration:duration});					
+					//console.log('recorder stop' + JSON.stringify(res));
+					//this.voicePath = res.tempFilePath;
+				});
+				//
+				this.recorder.onError(()=>{
+					this.utils.Tip("录音失败");
+				});
+			},
+			open(){
+				
+				// #ifdef APP-PLUS
+					this.$store.dispatch('permission/requestPermissions', 'RECORD_AUDIO').then(res => {
+						if(res !== 1) return;
+						this.isPopup = true;
+					});   
+				
+				// #endif
+				
+			},
+			hide(){
+				this.isPopup = false;
+			},
+			//打开录音
+			recStart(){
+				this.recorder.start({ sampleRate:16000,format:"mp3"});			
+			},
+			/**
+			 * 停止录音
+			 */
+			recStop(){
+				this.recorder.stop();			
+			},
+			//关闭录音
+			recClose(){
+				
+			},
+			getTime:function(){
+				let seconds = parseInt(this.time / 1000);
+				if(seconds <= 60) {
+					return "00:" + (seconds < 10 ? ("0" + seconds) : seconds );
+				}
+				let seconds1 = parseInt(seconds / 60);
+				let seconds2 = parseInt(seconds  % 60);
+				
+				return (seconds1 < 10 ? ("0" + seconds1) : seconds1 ) + ":" + (seconds2 < 10 ? ("0" + seconds2) : seconds2 );
+			},
+			imgToBase64:function(data){
+				return new Promise((resolve,reject)=>{
+					pathToBase64(data).then(base64 => {
+						resolve(base64)
+					 }).catch(error => {
+						console.error(error)
+						reject(error)
+					})		
+				});
+			}
+		}
+	}
+</script>
+
+
+

+ 155 - 0
components/tm-public/recording/recordingH5.vue

@@ -0,0 +1,155 @@
+<template>
+	<view class="app">
+		
+		<view class="sub-recording fx-h fx-bc fx-ac" v-if="isPopup">
+			<view class="title">按住说话</view>
+			<image  @longpress="recStart" @touchend="recStop"  class="icon" src="/static/img/hold_talk.png"></image>
+		</view>
+		
+		<view class="app-win fx-h fx-bc fx-ac" v-if="isRecorder">
+			<view class="recording-wav">
+				<view class="hr f-h">
+					<view class="top" v-if="powerLevel >= 100">
+						<view class="vc"></view>
+					</view>
+					<view class="v" :style="'height:' + (22 * (powerLevel / 100)) + 'px'"></view>
+					<view class="foot" v-if="powerLevel > 0">
+						<view class="vc"></view>
+					</view>
+				</view>
+				<image src="/static/img/zeffect_recordbutton__recordview_bottom.png"></image>
+			</view>
+			
+			<view class="time">{{getTime()}}</view>
+		</view>
+		
+	</view>
+</template>
+
+<style>
+	.sub-recording{padding: 20px 0;}
+	.sub-recording .title{color: #787878;padding: 10px 0;font-size: 14px;}
+	.sub-recording .icon{width: 60px;height: 60px;}
+	.app-win{background: rgba(0, 0, 0, 0.8);width: 40vw;height: 40vw;position: fixed;top: calc(50% - 30vw);left: calc(50% - 20vw);border-radius: 6px;}
+	.app-win .recording-wav{width: 60px;height: 60px;position: relative;}
+	.app-win .recording-wav image{width: 60px;height: 60px;}
+	.app-win .recording-wav .hr{width: 25px;left:17px;bottom: 20px;position: absolute;z-index: 9;}
+	.app-win .recording-wav .hr .v{background: #2fbec0;}
+	
+	.app-win .recording-wav .hr .foot{height: 6px;overflow: hidden;position: relative}
+	.app-win .recording-wav .hr .foot .vc{width:26px;height: 26px; border-radius:0px 0px 26px 26px;background: #2fbec0;position: absolute;bottom: 0;}
+
+	.app-win .recording-wav .hr .top{height: 6px;overflow: hidden;position: relative;}
+	.app-win .recording-wav .hr .top .vc{width:26px;height: 26px; border-radius:26px 26px 0px 0px;background: #2fbec0;position: absolute;top: 0;}
+	.app-win .time{margin:10px 0;color: #fff;}
+</style>
+
+
+<script>
+		import Recorder from 'recorder-core';
+		import 'recorder-core/src/engine/mp3';
+		import 'recorder-core/src/engine/mp3-engine';
+	export default{
+		props:{},
+		name:"recordingH5",
+		computed:{},
+		data(){
+			return{
+				isRecorder:false,
+				rec: null,
+				powerLevel:0,
+				time : 0,
+				isPopup : false
+			}
+		},
+		created () {
+			this.recOpen();
+		},
+		methods:{
+			recOpen(){
+				
+			},
+			open(){
+				this.isPopup = true;
+			},
+			hide(){
+				this.isPopup = false;
+			},
+			//打开录音
+			recStart(){
+				
+				this.rec = this.rec=Recorder({
+					type:"mp3",
+					bitRate:16,
+					sampleRate:16000,
+					onProcess:(buffers,powerLevel,duration,sampleRate)=>{
+						//console.log(powerLevel);
+						this.powerLevel = powerLevel;
+						this.time = duration;
+					}
+				});
+				this.rec.open(()=>{
+					console.log("已打开:mp3 16000hz  16kbps");
+					this.time = 0;
+					this.powerLevel = 0;
+					this.isRecorder = true;
+					this.rec.start();
+					
+				},(msg,isUserNotAllow)=>{
+					console.log((isUserNotAllow?"UserNotAllow,":"")+"打开失败:"+msg);	
+				});	
+						
+						
+			},
+			/**
+			 * 停止录音
+			 */
+			recStop(){
+				if(!(this.rec&&Recorder.IsOpen())){
+					return false;
+				}
+				this.isRecorder = false;
+				if(this.time < 1000) {
+					this.utils.Tip("说话时间太短了");
+					return;
+				}
+				
+				this.rec.stop((blob,duration)=>{
+	
+					var reader=new FileReader();
+					reader.onloadend=() => {
+						this.$emit('end',{data:(/.+;\s*base64\s*,\s*(.+)$/i.exec(reader.result)||[])[1],duration:duration});
+						
+					};
+					reader.readAsDataURL(blob);
+					this.recClose();
+					//new window.File([blob, "recording.mp3", {type: ""}]);
+					
+					//this.$emit('end',{data:(window.URL||webkitURL).createObjectURL(blob),duration:duration})
+				},()=>{
+					this.utils.Tip("按住说话失败");
+				});				
+			},
+			//关闭录音
+			recClose(){
+				if(this.rec != null) {
+					this.rec.close();
+					this.rec = null;
+				}
+			},
+			getTime:function(){
+				let seconds = parseInt(this.time / 1000);
+				if(seconds <= 60) {
+					return "00:" + (seconds < 10 ? ("0" + seconds) : seconds );
+				}
+				let seconds1 = parseInt(seconds / 60);
+				let seconds2 = parseInt(seconds  % 60);
+				
+				return (seconds1 < 10 ? ("0" + seconds1) : seconds1 ) + ":" + (seconds2 < 10 ? ("0" + seconds2) : seconds2 );
+			}
+		}
+	}
+</script>
+
+
+

BIN
components/ui-header/img/back.png


BIN
components/ui-header/img/back_brown.png


BIN
components/ui-header/img/liebiao.png


BIN
components/ui-header/img/while_brown.png


+ 145 - 0
components/ui-header/index.vue

@@ -0,0 +1,145 @@
+<template>
+	<view :class="divClass">
+		<view class="ph">
+			<view v-if="isBack" class="ph-img" @tap="backClick()">
+				<image v-if="backIcon == 'back'" mode="widthFix" src="./img/back_brown.png"></image>
+				<image v-if="backIcon == 'white'" mode="widthFix" src="./img/while_brown.png"></image>
+			</view>  
+			<view class="ph-title" :style="titleStyle">{{title}}</view>
+			<view class="ph-right fx-r fx-bc" v-if="isRenwu" @click="intoTaskListClick()">
+				<image src="./img/liebiao.png"></image>
+				<view class="phr-name">任务列表</view>
+			</view>
+			
+			<view class="ph-right fx-r fx-bc" v-if="isSearch" @click="intoSearchClick()">
+				<image src="/static/img/search_black.png"></image>
+				<view class="phr-name"></view>
+			</view>
+			
+			<slot></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {mapState,mapMutations} from 'vuex';
+	export default {
+		computed: mapState(['user']),
+		name: 'index',
+		props: {
+			title: {
+				type: String,
+				default: "辣物"
+			},
+			backIcon: {
+				type: String,
+				default: "back"
+			},
+			divClass: {
+				type: String,
+				default: "page-header"
+			},
+			titleStyle: {
+				type: String,
+				default: ""
+			},
+			isBack: {
+				type: Boolean,
+				default: false
+			},
+			isRenwu: {
+				type: Boolean,
+				default: false
+			},
+			isSearch:{
+				type: Boolean,  
+				default: false
+			}
+		},
+		data() {
+			return {
+
+			}
+		},
+
+		mounted() {  
+
+		},
+		methods: {
+			backClick() {  
+				uni.navigateBack({
+					delta: 1,
+				})
+			},
+			intoTaskListClick() {
+				this.$emit('onTask',{});
+			},
+			intoSearchClick:function(){
+				this.$emit('onSearch',{});
+			}
+			
+		}
+	};
+</script>
+
+<style>
+	.page-header {
+		background: #fff;
+		z-index: 999999;
+		position: fixed;
+		left: 0;
+		right: 0;
+		box-sizing: border-box;
+	}
+
+	.ph {
+		padding: 44px 15px 0px;
+		height: 46px;
+		display: flex;
+		align-items: center;
+	}
+
+	.ph-img {
+		width: 30px;
+		height: 30px;
+		line-height: 30px;
+		text-align: center;
+		position: absolute;
+		z-index: 99;
+	}
+
+	.ph-img image {
+		width: 10px;
+		height: 10px;
+	}
+
+	.ph-title {
+		width: calc(100% - 44px);
+		height: 46px;
+		line-height: 46px;
+		text-align: center;
+		color: #3F3E3E;
+		font-size: 18px;
+		font-weight: 600;
+		position: absolute;
+	}
+
+	.ph-right {
+		margin-left: auto;
+		position: absolute;
+		right: 15px;
+		text-align: center;
+		color: #333;
+	}
+
+	.ph-right image {
+		width: 14px;
+		height: 14px;
+	}
+
+	.phr-name {
+		color: #3F3E3E;
+		font-size: 14px;
+		margin-left: 4px;
+	}
+</style>

+ 119 - 0
components/ui-pay/index.vue

@@ -0,0 +1,119 @@
+<template>
+	<view>
+	<view class="pay-view fx-h fx-ac fx-bc" v-if="isShow">
+		<view class="bg"></view>
+		<view class="pay-body">
+			<view class="pay-inner fx-h fx-bc fx-ac">
+				<image src="../../static/img/wating.png" mode="widthFix" class="alipay-icon"></image>
+				<view class="pay-txt">如果您支付成功,点击已支付,如果支付取消,请点击重新支付!</view>
+				<view class="fx-r" style="width: 100%;">
+					<view class="btn1" @tap="tapClick">已支付</view>
+					<view class="btn2" @tap="hide">取消</view>
+				</view>
+			</view>
+		</view>    
+	</view>
+	</view>
+</template>
+<style>
+	.pay-view{ position:fixed;top: 0px;left: 0px; width: 100%;height: 100%;z-index: 99;}
+	.pay-view .bg{ position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0,0,0,0.6);}
+	.alipay-icon{width: 80px;}
+	.pay-view .pay-body{ border-radius: 10px;background: #fff;width: 90%;z-index: 9;}
+	.pay-view .pay-inner{padding: 20px;}
+	.pay-view .pay-txt{font-size: 14px;color: #303033;padding: 20px 0;}
+	.pay-view .btn1{text-align: center;line-height: 30px;background: #FA4171;border-radius:2px;color: #fff;height: 30px; width: 47%;}
+	.pay-view .btn2{margin-left: 5%;text-align: center;line-height: 30px;background: #f1f1f1;border-radius:2px;color: #000;height: 30px; width: 47%;}
+	.pay-view .btn2:hover{opacity: .8;}
+</style>
+<script>
+	import {mapState,mapMutations} from 'vuex';
+	export default {
+		computed: mapState(['user']),
+		
+		name: 'ui-pay',
+		props: {
+		},
+		data() {
+			return {
+				isShow : false,
+				orderId : "",
+				interval : 0,
+				fn : null
+			}
+		},
+
+		mounted() {
+			
+		},
+		methods: {
+			
+			show:function(orderId,fn){
+				this.isShow = true;
+				this.fn = fn;
+				this.orderId = orderId;
+				if(this.interval > 0) {
+					clearInterval(this.interval);
+				}
+				this.interval = setInterval(()=>{
+					this
+						.request
+						.post("checkPay",{orderId : this.orderId})
+						.then(res=>{
+							if(res.code == 200){
+								clearInterval(this.interval);
+								if(this.fn == null) {
+									uni.redirectTo({
+										url:"/pages/user/buy/order_ok"
+									});
+								} else {
+									this.fn();
+								}
+							}
+						})
+						.catch(err=>{});
+				},1000);
+			},
+			
+			hide:function(){
+				this.isShow = false;
+				if(this.interval > 0) {
+					clearInterval(this.interval);
+					this.interval = 0;
+				}
+			},
+			
+			tapClick:function(){
+				uni.showLoading({ title:"获取支付状态.."});
+				this
+					.request
+					.post("checkPay",{orderId : this.orderId})
+					.then(res=>{
+						uni.hideLoading();
+						if(res.code == 200) {
+							clearInterval(this.interval);
+							if(this.fn == null) {
+								uni.redirectTo({
+									url:"/pages/user/buy/order_ok"
+								});
+							} else {
+								this.fn();
+							}
+						} else {
+							uni.showToast({
+								'title'	: "未支付成功,请稍等",
+								duration : 1500,
+								icon:'none'
+							});
+						}
+					})
+					.catch(err=>{
+						console.log(err);
+						uni.hideLoading();
+						uni.showModal({ title: '系统提示', content: "获取失败:" + err, showCancel: false});
+					});	
+					
+			}
+		}
+	};
+</script>

+ 259 - 0
components/ui-pay/pay.vue

@@ -0,0 +1,259 @@
+<template>
+	<view class="shandow-box" v-if="box">
+		<view class="pay_box">
+			<view class="box_title fx-r fx-bc">
+				<text>选择支付方式</text>
+				<button class='nt fx-r fx-bc fx-ac' @tap="closeBox()">
+					<image src="/static/img/m_close.png"></image>
+				</button>
+			</view>
+			<view class="pay-contain">
+				<view class="pay-item fx-r fx-bc" v-if="sysData.wxpay == 1"  @tap="payTypeSelect('wxpay')">
+					<view class="pay-ico fx-r fx-bc">
+						<image src="/static/img/weixin_pay.png"></image>
+					</view>
+					<view class="pay-title">微信支付</view>
+					<button class="nt pay-select-btn fx-r fx-bc fx-ac">
+						<image :src="payType == 'wxpay'? '/static/img/pay_select_btn.png' : '/static/img/pay_select.png'"></image>
+					</button>
+				</view>
+				
+				<view  v-if="sysData.ailpay == 1"  class="pay-item fx-r fx-bc" @tap="payTypeSelect('ailpay')">
+					<view class="pay-ico fx-r fx-bc">
+						<image src="/static/img/alipay_pay.png"></image>
+					</view>
+					<view class="pay-title">支付宝</view>
+					<button class="nt pay-select-btn fx-r fx-bc fx-ac">
+						<image :src="payType == 'ailpay'? '/static/img/pay_select_btn.png' : '/static/img/pay_select.png'"></image>
+					</button>
+				</view>
+				
+				<view  v-if="sysData.bank == 1"  class="pay-item fx-r fx-bc" @tap="payTypeSelect('unionpay')">
+					<view class="pay-ico fx-r fx-bc">
+						<image src="/static/img/unionpay.png"></image>
+					</view>
+					<view class="pay-title">银联支付</view>
+					<button class="nt pay-select-btn fx-r fx-bc fx-ac">
+						<image :src="payType == 'unionpay'? '/static/img/pay_select_btn.png' : '/static/img/pay_select.png'"></image>
+					</button>
+				</view>
+				
+				
+		
+	
+				<button class="pay-btn12" @tap="tapCheckPay(0)">确认支付</button>
+	
+			</view>
+		</view>
+		<ui-pay ref="uipay"></ui-pay>
+		
+		
+		
+	</view>
+</template>
+<style>
+	.shandow-box{position: fixed;z-index: 9999;bottom:0px;left:0px;top:0px;width:100vw;background: rgba(0,0,0,0.4);
+	/* #ifdef H5 */
+	    top:60px;
+	/* #endif */
+	}
+	.pay_box{background: #ffffff;position: absolute;bottom:0px;left:0px;right:0px;padding: 5px 0px;z-index: 2;}
+	.box_title{text-align: left;width:calc(100% - 24px);height:38px;line-height: 38px;border-bottom:1px solid #eeeeee;padding: 0px 12px;}
+	.box_title text{color:#333333;font-size: 14px;font-weight: 700;width:calc(100% - 38px)}
+	.box_title button{height:38px;width:38px;}
+	.box_title button image{width:20px;height:20px;}
+	.pay-contain{width:calc(100% - 24px);padding: 0px 12px;}
+	.pay-item{width:100%;border-bottom:1px solid #eeeeee;height:50px;}
+	.pay-ico{width:30px;height:50px;}
+	.pay-ico image{height:20px;width:20px}
+	.pay-title{height:50px;width:calc(100% - 30px - 50px);text-align: left;line-height: 50px;font-size: 14px;color:#3f454b;}
+	button.pay-select-btn{width:50px;height:50px;}
+	button.pay-select-btn image{width:20px;height:20px;}
+	.pay-btn12{ background: #ff383e; color: #fff;}
+	
+	.pop-bank{ position: fixed;z-index: 9999;width: 100%;height: 100vh;top: 0;left: 0;background: rgba(0,0,0,0.2);}
+	.pop-bank .pop-body{width: 90%;background: #fff;border-radius: 8px;height: 60vh;}
+	.pop-bank .pop-top{height: 40px;border-bottom: 1px solid #F1F1F1; position: relative;}
+	.pop-bank .pop-top{ text-align: center; line-height: 40px;font-size: 18px;}
+	.pop-bank .pop-left{position: absolute;font-size: 14px;color: #007AFF;left: 10px;top: 0px;}
+	.pop-bank .pop-top .close image{width: 20px;height: 20px; position: absolute; right: 10px;top: 10px;}
+	.pop-bank scroll-view{height: calc(60vh - 100px);}
+	.pop-bank .pop-bank-list{ border-bottom: 1px solid #F1F1F1; padding: 20px;}
+	.pop-bank .pop-bank-list:hover{background: #F1F1F1;}
+	.pop-bank .pop-bank-list image{width: 20px;height: 20px;}
+	.pop-bank .pop-bank-list text{ margin-left: 10px;}
+	.pop-bank .pop-bank-add{ height: 60px;text-align: center;line-height: 60px;font-size: 18px;}
+	.view-btn{height: 40px;border-top: 1px solid #F1F1F1;line-height: 40px;text-align: center;color: #007AFF;}
+	
+	
+</style>
+<script>
+	import {mapState,mapMutations} from 'vuex';
+	import uiPay from '@/components/ui-pay/index.vue';
+	export default {
+		computed: mapState(['user','sysData']),
+		components: {uiPay},
+		name: 'ui-check-pay',
+		props: {
+		},
+		data() {
+			return {
+				box : false,
+				payType:"",
+				orderId : "",
+				isPopBank:false,
+				bindBank : [],
+				bankId : 0,
+				isJbing : false,
+				buyType : "shop",
+				fn 	: null
+			}
+		},
+
+		mounted() {
+			
+		},
+		methods: {
+			...mapMutations(['payPayment']),
+			setbuyType(v){
+				this.buyType = v;
+			},
+			show(orderId,fn){
+				this.orderId = orderId;
+				this.fn = fn;
+				this.box = true;
+			},
+			hide:function(){
+				this.box = false;
+				if(this.$refs['uipay'] != null)
+				this.$refs.uipay.hide();
+				uni.$off('bankInit');
+			},
+	
+			
+			//
+			closeBox: function() {
+				this.box = false;
+			},
+			/**
+			 * 支付类型
+			 * @param {Object} type
+			 */
+			payTypeSelect: function(type) {
+				this.payType = type;
+			},
+			/**
+			 * 提交支付
+			 */
+			tapCheckPay:function(type){
+				
+				if(this.payType == ''){
+					return this.utils.Tip("请选择支付类型");
+				}
+				
+				if(type == 0 && this.payType == 'bank') {
+					this.tapPayBank();
+					return;
+				}
+				
+				uni.showLoading({ title: '提交支付数据中..' });
+				var post = {
+					page	  : this,
+					payType   : this.payType,
+					orderId   : this.orderId,
+					buyType	  : this.buyType,
+					bankId	  : this.bankId,
+					afterFn	  : ()=>{
+						uni.hideLoading();
+					},
+				};
+				if(this.fn != null) {
+					post.payOk = this.fn;
+				}
+				this.payPayment(post);
+			},
+			
+			
+			/**
+			 * 选择银行卡
+			 */
+			tapPayBank:function(){
+				this.utils.loadIng("获取数据中..");
+				this
+					.request
+					.post("JoinpayBindList")
+					.then(res=>{
+						uni.hideLoading();
+						if(res.code == 200) {
+							this.isPopBank = true;
+							this.bindBank = res.data;
+						} else {
+							this.utils.Tip(res.msg);
+						}
+					})
+					.catch(err=>{
+						uni.hideLoading();
+						this.utils.Tip("网络错误,请稍后尝试");
+					});
+			},
+			/**
+			 * 选择支付
+			 */
+			tapBankItem:function(id){
+				if(this.isJbing) {
+					uni.showModal({
+						title: "提示",
+						content: "确认要解绑本银行卡吗?",
+						success: res => {
+							if (res.confirm) {
+								this.utils.loadIng("操作中..");
+								this
+									.request
+									.post("JoinpayUnbind",{id:id})
+									.then(res=>{
+										uni.hideLoading();
+										if(res.code == 200) {
+											this.tapPayBank();
+										} else {
+											this.utils.Tip(res.msg);
+										}
+									})
+									.catch(err=>{
+										uni.hideLoading();
+										this.utils.Tip("网络错误,请稍后尝试");
+									});
+							}
+						},
+				});	
+				} else {
+					uni.showModal({
+						title: "提示",
+						content: "确定要支付吗?",
+						success: res => {
+							if (res.confirm) {
+							this.bankId = id;
+							this.tapCheckPay(1);	
+							}
+						},
+					});
+				}
+			},
+			/**
+			 * 解绑操作
+			 */
+			tapJbing:function(){
+				this.isJbing = !this.isJbing;
+			},
+					
+			/**
+			 * 添加银行卡
+			 */
+			tapBankAdd:function(){
+				uni.navigateTo({url:"/pages/user/buy/bankAdd"});
+				uni.$on('bankInit',()=>{
+					this.tapPayBank();
+				});
+			}
+		}
+	};
+</script>

+ 117 - 0
components/ui-pay/payDialog.vue

@@ -0,0 +1,117 @@
+<template>
+	<view class="key-pop" :hidden="!show_key">
+		<view class="key-bg"></view>
+		<view class="keyborad" :style="{transform : show_key2 ? 'translateY(0)':'translateY(100%)'}">
+			<view class="key_main">
+				<view class="main_title">
+				<u-icon name="close"  @tap="hideFun"></u-icon>
+					<text>请输入兑换密码</text>
+				</view>
+				<view class="main_content">
+					<view class="content_num">
+						<view v-for="item in inputArray" :key="item" class="content_item">{{password[item-1] ? '●' :''}}</view>
+					</view>
+					<view class="main_forget" @tap="forgetFun">忘记密码</view>
+				</view>
+				<view class="main_keyboard">
+					<view class="key_num" v-for="item in numberArray" :key="item" @tap="inputNumFun({num:item})">{{item}}</view>
+					<view class="key_null"></view>
+					<view class="key_0"  	@tap="inputNumFun({num:0})">0</view>
+					<view class="key_del"   @tap="delNumFun">
+						<image src="/static/img/del_2.png" mode="aspectFill"></image>
+					</view>
+				</view>
+				<view style="height: 100rpx;"></view>
+			</view>
+		</view>
+	</view>
+	
+</template>
+
+ 
+<style lang="scss">
+	.key-pop{position: fixed;width: 100%;height: 100%;left: 0;top: 0;}
+	.key-pop .key-bg{position: absolute;width: 100%;height: 100%;left: 0;top: 0;background: rgba(0, 0, 0, 0.5);}
+	.keyborad{width:100vw;height: 100vh;position: fixed;bottom: 0px;top:0px;left:0px;right:0px;z-index:100;display: flex;flex-direction: column;justify-content: flex-end;transform: translateY(100%);transition:all 0.4s;
+		.key_main{ width:100vw;height: 1000rpx;background: rgba(245,245,245,0.9);box-sizing: border-box;display: flex;flex-direction: column;justify-content: space-between;
+			.main_title{ font-size:34rpx;color: #000000;height: 100rpx;display: flex;align-items: center;letter-spacing: 2rpx;width:100%;box-sizing: border-box;padding:0px 20rpx;border-bottom:2rpx solid #e1e1e1;
+				image{ width:48rpx;height: 48rpx;position: relative;z-index:10}
+				text{ flex:1;margin-left:-48rpx;display: flex;justify-content: center;}
+			}
+			.main_content{ width:100%;box-sizing: border-box;padding:0px 30rpx;margin-top:40rpx;
+				.content_num{ width:100%;height: 100rpx;border:2rpx solid #DBDBDB;border-radius: 10rpx;display: flex;align-items: center;
+					.content_item{ flex: 1;height: 100%;border-right: 2rpx solid #DBDBDB;display: flex;justify-content: center;align-items: center;}
+					.content_item:last-child{ border-right:none}
+				}
+				.main_forget{ display: flex;justify-content: center;align-items: center;width:100%;font-size:28rpx;color: #007AFF;margin-top:40rpx}
+			}
+			.main_keyboard{ width:100%;height: 500rpx;background: #FFFFFF;display: flex;flex-flow: wrap;
+				.key_null,.key_del{ background: #e2e7eb;}
+				image{ width:48rpx;height: 48rpx;}
+				.key_num,.key_null,.key_del,.key_0{ width:250rpx;height: 125rpx;display: flex;align-items: center;justify-content: center;font-size: 18px;font-weight: bold;}
+				.key_num{ border-right:2rpx solid #f1f4f4;border-bottom:2rpx solid #f1f4f4;box-sizing: border-box;}
+				.key_num:active{background: #f1f1f1;}
+				.key_num:nth-child(8){border-bottom: none;}
+				.key_0{ border-top:2rpx solid #f1f4f4}
+			}
+		}  
+	}
+</style>
+
+<script>	
+	export default{
+		props:{
+		
+		},
+		computed:{},
+		data(){
+			return{
+				inputArray:[1,2,3,4,5,6],//输入密码的长度
+				numberArray:[1,2,3,4,5,6,7,8,9],//密码键盘的数字
+				password:'',//密码
+				show_key:false,
+				show_key2:false
+			}
+		},
+		methods:{
+			inputNumFun(op){
+				let _this = this
+				if(_this.password.length <=6){
+					_this.password += op.num
+					if(_this.password.length == 6){
+						_this.$emit('getPassword',{password:_this.password});
+					}
+				}
+				
+			},
+			show:function(){
+				this.password = "";
+				this.show_key = true;
+				setTimeout(()=>{
+					this.show_key2 =true;
+				},200);
+			},
+			delNumFun(){
+				if(this.password.length == 0) return
+				this.password = this.password.substring(0,this.password.length - 1);
+			},
+			
+			cleanNum(){
+				this.password  = "";
+			},
+			
+			forgetFun(){
+				uni.navigateTo({
+					url:"/pages/user/userinfo/security/mobileFind"
+				});
+			},
+			hideFun(){
+				this.show_key2 = false;
+				setTimeout(()=>{
+					this.show_key = false;
+				},300);
+			}
+		}
+	}
+</script>
+

+ 143 - 0
components/ui-public/customer-wiget.vue

@@ -0,0 +1,143 @@
+<template>
+		<u-popup :show="isShow" :zIndex="20" mode="center" bgColor="transparent">
+			<view class="pop-body fx-h fx-bc">
+				<view class="top-bg">
+					<image src="/static/img/tip-bg.png"></image>
+					<view class="text">联系客服</view>
+				</view>
+				<view class="inner fx-h fx-bc">
+					<view class="title">已为您定制专属客服</view>
+					<image src="/static/img/kfu.png" class="kfu-icon"></image>
+					<view class="wx">客服VX:{{ wxName }}</view>
+					
+					<view class="btns fx-r fx-bc">
+						<view class="n-btn ihover" @tap="tapCancel">取消</view>
+						<view class="copy-btn ihover" @tap="tapCopy">复制微信</view>
+					</view>
+					
+				</view>
+				<view class="m-close">
+					<u-icon  @tap="tapCancel" name="close-circle" size="35" color="#fff"></u-icon>
+				</view>
+			</view>
+		</u-popup>
+</template>
+<style lang="scss">
+	.pop-body{
+		position: relative;
+		.top-bg{
+			position: absolute;
+			top: -9vw;
+			z-index: 1;
+			image{
+				width: 60vw;
+				height: 18vw;
+			}
+			.text{
+				position: absolute;width: 100%;height: 100%;top: 0;left: 0;
+				font-size: 32rpx;
+				color: #734227;
+				text-align: center;
+				line-height: 16vw;
+			}
+		}
+		.inner{
+			padding: 20px;
+			width: 80vw;
+			position: relative;
+			background: #fff;
+			border-radius: 20rpx;
+			.title{
+				font-size: 32rpx;
+				color: #333333;
+				margin-bottom: 20rpx;
+				padding-top: 20rpx;
+			}
+			.wx{
+				font-size: 32rpx;
+				color: #333333;
+				margin-top: 20rpx;
+			}
+			.kfu-icon{
+				width: 180rpx;
+				height: 143rpx;
+			}
+			
+			.btns{
+				margin-top: 30rpx;
+				.n-btn{
+					border-radius: 10rpx;
+					border: 2rpx solid #DFC77C;
+					font-size: 32rpx;
+					color: #625120;
+					padding: 0 80rpx;
+					margin-right: 40rpx;
+					height: 80rpx;
+					line-height: 80rpx;
+				}
+				.copy-btn{
+					background: linear-gradient(-90deg, #D4BA6C 0%, #F9E8A5 100%);
+					border-radius: 10px;
+					font-size: 32rpx;
+					color: #625120;
+					padding: 0 80rpx;
+					height: 80rpx;
+					line-height: 80rpx;
+				}
+			}
+		}
+		.m-close{
+			margin-top: 60rpx;
+		}
+	}
+	
+</style>
+
+<script>
+	var swH = 0;
+	export default {
+		name: 'ui-customer',
+		props:{},
+		data() {
+			return{ 
+				isShow : false,
+				wxName : ""
+			}
+		},
+		methods: {
+			
+			tapCancel:function(){
+				this.isShow = false;
+			},
+			open(){
+				uni.showLoading({ title: '获取数据中..' });
+				this
+					.request
+					.post("indexGuLx")
+					.then(res => {
+						uni.hideLoading();
+						if (res.code == 200) {
+							this.wxName = res.data.wxname;
+							this.isShow = true;
+						} else {
+							this.utils.Tip(res.msg);
+						}
+					})
+					.catch((res)=>{
+						console.log(res);
+						uni.hideLoading();
+						uni.showModal({title: '系统提示',content: '加载失败,返回在尝试',showCancel: false});
+					});
+				
+			},
+			
+			tapCopy(){
+				uni.setClipboardData({
+					data : value,
+					showToast : true
+				});
+			}
+			
+		}
+	}
+</script>

+ 127 - 0
components/ui-swiper/ui-swiper.vue

@@ -0,0 +1,127 @@
+<style>
+	.swiper-img .bg{ width: 100%;}
+	.slide-indicator{position:absolute;bottom:90rpx;left:0px;width:100%}
+	.slide-indicator-item{width:20rpx;height:2rpx;background:rgba(255,255,255,0.4);margin:0 10rpx}
+	.slide-indicator-item.select{background:white}  
+</style>
+<template>
+	<view>
+		<view id="swiper" class="swiper">
+			<swiper class="swiper-img" :style="height > 0 ? ('height:' + height + 'px') : '' " :indicator-dots="indicator" autoplay="true" @change="tapChange">
+				<swiper-item @tap="tapItem(index)"  v-for="(item,index) in swData">
+					<image mode="widthFix" class="bg" :src="item.img"/>
+				</swiper-item>
+			</swiper>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	var swH = 0;
+	export default {
+		name: 'ui-swiper',
+		props:{
+			swData : {
+				type: Array,
+				default: []
+			},
+			indicator:{
+				type:Boolean,
+				default : false
+			}
+			
+		},
+		data() {
+			return{ 
+				imgsAr : [],
+				index : 0,
+				width : 0,
+				height:0
+			}
+		},
+		watch: {
+			swData() {
+				this.initView();
+			}
+		},
+		created() { 
+			this.initView();
+			this.$nextTick(() => {
+				const query = uni.createSelectorQuery().in(this);
+				query.select("#swiper").boundingClientRect(res=>{
+					console.log("xxxxx");
+					this.width = res.width;
+					if(this.swData.length > 0) this.initImg(this.index);
+				}).exec();
+			})
+			
+			
+		},
+		mounted() {
+			//this.width = ;
+		},
+		methods: {
+			
+			tapItem:function(index){
+				this.$emit('tapItem',index);
+			},
+			tapChange:function(ev){
+				this.index = ev.detail.current;
+				if(this.imgsAr[this.index] != null) {
+					this.setHeight(this.imgsAr[this.index].height);
+				}
+			},
+			/**
+			 * 初始化
+			 */
+			initView:function(){
+				this.imgsAr = [];
+			
+				for(var i in this.swData) {
+					this.imgsAr[i] = null;
+					this.initImg(i);
+				}
+				if(swH > 0) {
+					this.height = swH;
+				}
+			},
+			/**
+			 * 初始化
+			 * @param {Object} i
+			 */
+			initImg:function(i) {
+				
+				uni.getImageInfo({
+					src:this.swData[i].img,
+					success:(img) => {
+						var width = 0;
+						var height = 0;
+						if(img.width > this.width) {
+							width = this.width;
+						} else {
+							width = img.width;
+						}
+					
+						//"width": 1500,
+						//"height": 972,
+						height = (img.height / img.width) * width;
+						this.imgsAr[i] = { width:width, height:height, img:this.swData[i]};
+						console.log(this.imgsAr[i]);
+						if(this.index == i) {
+							this.setHeight(height);
+						}
+					}
+				});	
+			},
+			setHeight:function (height)
+			{
+				this.height = height;
+				swH = height;
+				this.$emit('onHeight',{height:height,index:this.index});
+			}
+		}
+	}
+</script>
+
+

+ 59 - 0
components/uni-rate/readme.md

@@ -0,0 +1,59 @@
+### Rate 评分
+
+评分组件,组件名:``uni-rate``,代码块: uRate。
+
+**使用方式:**
+
+在 ``script`` 中引用组件 
+
+```javascript
+import uniRate from "@/components/uni-rate/uni-rate.vue"
+export default {
+    components: {uniRate}
+}
+```
+
+基本用法
+
+```html
+<uni-rate value="2"></uni-rate>
+```
+
+自定义星星大小
+
+```html
+<uni-rate size="18" value="5"></uni-rate>
+```
+
+设置评分数
+
+```html
+<uni-rate max="10" value="5"></uni-rate>
+```
+
+不可点击状态
+
+```html
+<uni-rate disabled="true" value="3.5"></uni-rate>
+```
+
+实际效果参考:[https://github.com/dcloudio/uni-ui](https://github.com/dcloudio/uni-ui)
+
+**属性说明:**
+
+|属性名|类型|默认值	|说明|
+|---|----|---|---|
+|value|Number|0|当前评分|
+|max|Number|5|最大的评分|
+|size|Number|24|星星的大小|
+|margin|Number|0|星星的间距|
+|color|String|#ececec|星星的颜色|
+|active-color|String|#ffca3e|选中状态的星星的颜色|
+|is-fill|Boolean|true|星星的类型,是否为实心类型|
+|disabled|Boolean|false|是否为不可点击状态|
+
+**事件说明:**
+
+|事件称名|说明|返回参数|
+|---|----|---|
+|change|Rate 的 value 改变时触发事件,返回参数为Rate的value|{value:Number}|

+ 120 - 0
components/uni-rate/uni-rate.vue

@@ -0,0 +1,120 @@
+<template>
+	<view class="uni-rate">
+		<view class="uni-rate-icon" v-for="(star,index) in stars" :key="index" :style="{marginLeft:margin+'px'}" @click="onClick(index)">
+			<uni-icon :size="size" :color="color" :type="isFill === false || isFill === 'false' ? 'star' : 'star-filled'"></uni-icon>
+			<view class="uni-rate-icon-on" :style="{width:star.activeWitch}">
+				<uni-icon :size="size" :color="activeColor" type="star-filled"></uni-icon>
+			</view>
+		</view>
+	</view>
+</template>  
+
+<script>
+	import uniIcon from '../uni-icon/uni-icon.vue'
+	export default {
+		name: "uni-rate",
+		components: {
+			uniIcon
+		},  
+		props: {
+			isFill: { //星星的类型,是否镂空
+				type: [Boolean, String],
+				default: true
+			},
+			color: { //星星的颜色
+				type: String,
+				default: '#ececec'
+			},
+			activeColor: { //星星选中状态颜色
+				type: String,
+				default: '#ffca3e'
+			},
+			size: { //星星的大小
+				type: [Number, String],
+				default: 24
+			},
+			value: { //当前评分
+				type: [Number, String],
+				default: 0
+			},
+			max: { //最大评分
+				type: [Number, String],
+				default: 5
+			},
+			margin: { //星星的间距
+				type: [Number, String],
+				default: 0
+			},
+			disabled: { //是否可点击
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		data() {
+			console.log('data')
+			return {
+				maxSync: this.max,
+				valueSync: this.value
+			}
+		},
+		computed: {
+			stars() {
+				const max = Number(this.maxSync) ? Number(this.maxSync) : 5
+				const value = Number(this.valueSync) ? Number(this.valueSync) : 0
+				const starList = []
+				const floorValue = Math.floor(value)
+				const ceilValue = Math.ceil(value)
+				for (let i = 0; i < max; i++) {
+					if (floorValue > i) {
+						starList.push({
+							activeWitch: '100%'
+						})
+					} else if (ceilValue - 1 === i) {
+						starList.push({
+							activeWitch: (value - floorValue) * 100 + '%'
+						})
+					} else {
+						starList.push({
+							activeWitch: '0'
+						})
+					}
+				}
+				return starList
+			}
+		},
+		methods: {
+			onClick(index) {
+				if (this.disabled === true || this.disabled === 'true') {
+					return
+				}
+				this.valueSync = index + 1
+				this.$emit('change', {
+					value: this.valueSync
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.uni-rate {
+		line-height: 0;
+		font-size: 0;
+		display: flex;
+		flex-direction: row;
+
+		&-icon {
+			position: relative;
+			line-height: 0;
+			font-size: 0;
+			display: inline-block;
+
+			&-on {
+				position: absolute;
+				top: 0;
+				left: 0;
+				overflow: hidden;
+			}
+		}
+	}
+</style>

+ 25 - 0
components/uni-status-bar/uni-status-bar.vue

@@ -0,0 +1,25 @@
+<template>
+	<view :style="{ height: statusBarHeight }" class="uni-status-bar">
+		<slot />
+	</view>
+</template>
+
+<script>
+	var statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px'
+	export default {
+		name: 'UniStatusBar',
+		data() {
+			return {
+				statusBarHeight: statusBarHeight
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-status-bar {
+		width: 750rpx;
+		height: 20px;
+		// height: var(--status-bar-height);
+	}
+</style>

+ 12542 - 0
components/w-picker/city-data/area.js

@@ -0,0 +1,12542 @@
+/* eslint-disable */
+var areaData = [
+  [
+    [{
+        "label": "东城区",
+        "value": "110101"
+      },
+      {
+        "label": "西城区",
+        "value": "110102"
+      },
+      {
+        "label": "朝阳区",
+        "value": "110105"
+      },
+      {
+        "label": "丰台区",
+        "value": "110106"
+      },
+      {
+        "label": "石景山区",
+        "value": "110107"
+      },
+      {
+        "label": "海淀区",
+        "value": "110108"
+      },
+      {
+        "label": "门头沟区",
+        "value": "110109"
+      },
+      {
+        "label": "房山区",
+        "value": "110111"
+      },
+      {
+        "label": "通州区",
+        "value": "110112"
+      },
+      {
+        "label": "顺义区",
+        "value": "110113"
+      },
+      {
+        "label": "昌平区",
+        "value": "110114"
+      },
+      {
+        "label": "大兴区",
+        "value": "110115"
+      },
+      {
+        "label": "怀柔区",
+        "value": "110116"
+      },
+      {
+        "label": "平谷区",
+        "value": "110117"
+      },
+      {
+        "label": "密云区",
+        "value": "110118"
+      },
+      {
+        "label": "延庆区",
+        "value": "110119"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "和平区",
+        "value": "120101"
+      },
+      {
+        "label": "河东区",
+        "value": "120102"
+      },
+      {
+        "label": "河西区",
+        "value": "120103"
+      },
+      {
+        "label": "南开区",
+        "value": "120104"
+      },
+      {
+        "label": "河北区",
+        "value": "120105"
+      },
+      {
+        "label": "红桥区",
+        "value": "120106"
+      },
+      {
+        "label": "东丽区",
+        "value": "120110"
+      },
+      {
+        "label": "西青区",
+        "value": "120111"
+      },
+      {
+        "label": "津南区",
+        "value": "120112"
+      },
+      {
+        "label": "北辰区",
+        "value": "120113"
+      },
+      {
+        "label": "武清区",
+        "value": "120114"
+      },
+      {
+        "label": "宝坻区",
+        "value": "120115"
+      },
+      {
+        "label": "滨海新区",
+        "value": "120116"
+      },
+      {
+        "label": "宁河区",
+        "value": "120117"
+      },
+      {
+        "label": "静海区",
+        "value": "120118"
+      },
+      {
+        "label": "蓟州区",
+        "value": "120119"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "长安区",
+        "value": "130102"
+      },
+      {
+        "label": "桥西区",
+        "value": "130104"
+      },
+      {
+        "label": "新华区",
+        "value": "130105"
+      },
+      {
+        "label": "井陉矿区",
+        "value": "130107"
+      },
+      {
+        "label": "裕华区",
+        "value": "130108"
+      },
+      {
+        "label": "藁城区",
+        "value": "130109"
+      },
+      {
+        "label": "鹿泉区",
+        "value": "130110"
+      },
+      {
+        "label": "栾城区",
+        "value": "130111"
+      },
+      {
+        "label": "井陉县",
+        "value": "130121"
+      },
+      {
+        "label": "正定县",
+        "value": "130123"
+      },
+      {
+        "label": "行唐县",
+        "value": "130125"
+      },
+      {
+        "label": "灵寿县",
+        "value": "130126"
+      },
+      {
+        "label": "高邑县",
+        "value": "130127"
+      },
+      {
+        "label": "深泽县",
+        "value": "130128"
+      },
+      {
+        "label": "赞皇县",
+        "value": "130129"
+      },
+      {
+        "label": "无极县",
+        "value": "130130"
+      },
+      {
+        "label": "平山县",
+        "value": "130131"
+      },
+      {
+        "label": "元氏县",
+        "value": "130132"
+      },
+      {
+        "label": "赵县",
+        "value": "130133"
+      },
+      {
+        "label": "石家庄高新技术产业开发区",
+        "value": "130171"
+      },
+      {
+        "label": "石家庄循环化工园区",
+        "value": "130172"
+      },
+      {
+        "label": "辛集市",
+        "value": "130181"
+      },
+      {
+        "label": "晋州市",
+        "value": "130183"
+      },
+      {
+        "label": "新乐市",
+        "value": "130184"
+      }
+    ],
+    [{
+        "label": "路南区",
+        "value": "130202"
+      },
+      {
+        "label": "路北区",
+        "value": "130203"
+      },
+      {
+        "label": "古冶区",
+        "value": "130204"
+      },
+      {
+        "label": "开平区",
+        "value": "130205"
+      },
+      {
+        "label": "丰南区",
+        "value": "130207"
+      },
+      {
+        "label": "丰润区",
+        "value": "130208"
+      },
+      {
+        "label": "曹妃甸区",
+        "value": "130209"
+      },
+      {
+        "label": "滦县",
+        "value": "130223"
+      },
+      {
+        "label": "滦南县",
+        "value": "130224"
+      },
+      {
+        "label": "乐亭县",
+        "value": "130225"
+      },
+      {
+        "label": "迁西县",
+        "value": "130227"
+      },
+      {
+        "label": "玉田县",
+        "value": "130229"
+      },
+      {
+        "label": "唐山市芦台经济技术开发区",
+        "value": "130271"
+      },
+      {
+        "label": "唐山市汉沽管理区",
+        "value": "130272"
+      },
+      {
+        "label": "唐山高新技术产业开发区",
+        "value": "130273"
+      },
+      {
+        "label": "河北唐山海港经济开发区",
+        "value": "130274"
+      },
+      {
+        "label": "遵化市",
+        "value": "130281"
+      },
+      {
+        "label": "迁安市",
+        "value": "130283"
+      }
+    ],
+    [{
+        "label": "海港区",
+        "value": "130302"
+      },
+      {
+        "label": "山海关区",
+        "value": "130303"
+      },
+      {
+        "label": "北戴河区",
+        "value": "130304"
+      },
+      {
+        "label": "抚宁区",
+        "value": "130306"
+      },
+      {
+        "label": "青龙满族自治县",
+        "value": "130321"
+      },
+      {
+        "label": "昌黎县",
+        "value": "130322"
+      },
+      {
+        "label": "卢龙县",
+        "value": "130324"
+      },
+      {
+        "label": "秦皇岛市经济技术开发区",
+        "value": "130371"
+      },
+      {
+        "label": "北戴河新区",
+        "value": "130372"
+      }
+    ],
+    [{
+        "label": "邯山区",
+        "value": "130402"
+      },
+      {
+        "label": "丛台区",
+        "value": "130403"
+      },
+      {
+        "label": "复兴区",
+        "value": "130404"
+      },
+      {
+        "label": "峰峰矿区",
+        "value": "130406"
+      },
+      {
+        "label": "肥乡区",
+        "value": "130407"
+      },
+      {
+        "label": "永年区",
+        "value": "130408"
+      },
+      {
+        "label": "临漳县",
+        "value": "130423"
+      },
+      {
+        "label": "成安县",
+        "value": "130424"
+      },
+      {
+        "label": "大名县",
+        "value": "130425"
+      },
+      {
+        "label": "涉县",
+        "value": "130426"
+      },
+      {
+        "label": "磁县",
+        "value": "130427"
+      },
+      {
+        "label": "邱县",
+        "value": "130430"
+      },
+      {
+        "label": "鸡泽县",
+        "value": "130431"
+      },
+      {
+        "label": "广平县",
+        "value": "130432"
+      },
+      {
+        "label": "馆陶县",
+        "value": "130433"
+      },
+      {
+        "label": "魏县",
+        "value": "130434"
+      },
+      {
+        "label": "曲周县",
+        "value": "130435"
+      },
+      {
+        "label": "邯郸经济技术开发区",
+        "value": "130471"
+      },
+      {
+        "label": "邯郸冀南新区",
+        "value": "130473"
+      },
+      {
+        "label": "武安市",
+        "value": "130481"
+      }
+    ],
+    [{
+        "label": "桥东区",
+        "value": "130502"
+      },
+      {
+        "label": "桥西区",
+        "value": "130503"
+      },
+      {
+        "label": "邢台县",
+        "value": "130521"
+      },
+      {
+        "label": "临城县",
+        "value": "130522"
+      },
+      {
+        "label": "内丘县",
+        "value": "130523"
+      },
+      {
+        "label": "柏乡县",
+        "value": "130524"
+      },
+      {
+        "label": "隆尧县",
+        "value": "130525"
+      },
+      {
+        "label": "任县",
+        "value": "130526"
+      },
+      {
+        "label": "南和县",
+        "value": "130527"
+      },
+      {
+        "label": "宁晋县",
+        "value": "130528"
+      },
+      {
+        "label": "巨鹿县",
+        "value": "130529"
+      },
+      {
+        "label": "新河县",
+        "value": "130530"
+      },
+      {
+        "label": "广宗县",
+        "value": "130531"
+      },
+      {
+        "label": "平乡县",
+        "value": "130532"
+      },
+      {
+        "label": "威县",
+        "value": "130533"
+      },
+      {
+        "label": "清河县",
+        "value": "130534"
+      },
+      {
+        "label": "临西县",
+        "value": "130535"
+      },
+      {
+        "label": "河北邢台经济开发区",
+        "value": "130571"
+      },
+      {
+        "label": "南宫市",
+        "value": "130581"
+      },
+      {
+        "label": "沙河市",
+        "value": "130582"
+      }
+    ],
+    [{
+        "label": "竞秀区",
+        "value": "130602"
+      },
+      {
+        "label": "莲池区",
+        "value": "130606"
+      },
+      {
+        "label": "满城区",
+        "value": "130607"
+      },
+      {
+        "label": "清苑区",
+        "value": "130608"
+      },
+      {
+        "label": "徐水区",
+        "value": "130609"
+      },
+      {
+        "label": "涞水县",
+        "value": "130623"
+      },
+      {
+        "label": "阜平县",
+        "value": "130624"
+      },
+      {
+        "label": "定兴县",
+        "value": "130626"
+      },
+      {
+        "label": "唐县",
+        "value": "130627"
+      },
+      {
+        "label": "高阳县",
+        "value": "130628"
+      },
+      {
+        "label": "容城县",
+        "value": "130629"
+      },
+      {
+        "label": "涞源县",
+        "value": "130630"
+      },
+      {
+        "label": "望都县",
+        "value": "130631"
+      },
+      {
+        "label": "安新县",
+        "value": "130632"
+      },
+      {
+        "label": "易县",
+        "value": "130633"
+      },
+      {
+        "label": "曲阳县",
+        "value": "130634"
+      },
+      {
+        "label": "蠡县",
+        "value": "130635"
+      },
+      {
+        "label": "顺平县",
+        "value": "130636"
+      },
+      {
+        "label": "博野县",
+        "value": "130637"
+      },
+      {
+        "label": "雄县",
+        "value": "130638"
+      },
+      {
+        "label": "保定高新技术产业开发区",
+        "value": "130671"
+      },
+      {
+        "label": "保定白沟新城",
+        "value": "130672"
+      },
+      {
+        "label": "涿州市",
+        "value": "130681"
+      },
+      {
+        "label": "定州市",
+        "value": "130682"
+      },
+      {
+        "label": "安国市",
+        "value": "130683"
+      },
+      {
+        "label": "高碑店市",
+        "value": "130684"
+      }
+    ],
+    [{
+        "label": "桥东区",
+        "value": "130702"
+      },
+      {
+        "label": "桥西区",
+        "value": "130703"
+      },
+      {
+        "label": "宣化区",
+        "value": "130705"
+      },
+      {
+        "label": "下花园区",
+        "value": "130706"
+      },
+      {
+        "label": "万全区",
+        "value": "130708"
+      },
+      {
+        "label": "崇礼区",
+        "value": "130709"
+      },
+      {
+        "label": "张北县",
+        "value": "130722"
+      },
+      {
+        "label": "康保县",
+        "value": "130723"
+      },
+      {
+        "label": "沽源县",
+        "value": "130724"
+      },
+      {
+        "label": "尚义县",
+        "value": "130725"
+      },
+      {
+        "label": "蔚县",
+        "value": "130726"
+      },
+      {
+        "label": "阳原县",
+        "value": "130727"
+      },
+      {
+        "label": "怀安县",
+        "value": "130728"
+      },
+      {
+        "label": "怀来县",
+        "value": "130730"
+      },
+      {
+        "label": "涿鹿县",
+        "value": "130731"
+      },
+      {
+        "label": "赤城县",
+        "value": "130732"
+      },
+      {
+        "label": "张家口市高新技术产业开发区",
+        "value": "130771"
+      },
+      {
+        "label": "张家口市察北管理区",
+        "value": "130772"
+      },
+      {
+        "label": "张家口市塞北管理区",
+        "value": "130773"
+      }
+    ],
+    [{
+        "label": "双桥区",
+        "value": "130802"
+      },
+      {
+        "label": "双滦区",
+        "value": "130803"
+      },
+      {
+        "label": "鹰手营子矿区",
+        "value": "130804"
+      },
+      {
+        "label": "承德县",
+        "value": "130821"
+      },
+      {
+        "label": "兴隆县",
+        "value": "130822"
+      },
+      {
+        "label": "滦平县",
+        "value": "130824"
+      },
+      {
+        "label": "隆化县",
+        "value": "130825"
+      },
+      {
+        "label": "丰宁满族自治县",
+        "value": "130826"
+      },
+      {
+        "label": "宽城满族自治县",
+        "value": "130827"
+      },
+      {
+        "label": "围场满族蒙古族自治县",
+        "value": "130828"
+      },
+      {
+        "label": "承德高新技术产业开发区",
+        "value": "130871"
+      },
+      {
+        "label": "平泉市",
+        "value": "130881"
+      }
+    ],
+    [{
+        "label": "新华区",
+        "value": "130902"
+      },
+      {
+        "label": "运河区",
+        "value": "130903"
+      },
+      {
+        "label": "沧县",
+        "value": "130921"
+      },
+      {
+        "label": "青县",
+        "value": "130922"
+      },
+      {
+        "label": "东光县",
+        "value": "130923"
+      },
+      {
+        "label": "海兴县",
+        "value": "130924"
+      },
+      {
+        "label": "盐山县",
+        "value": "130925"
+      },
+      {
+        "label": "肃宁县",
+        "value": "130926"
+      },
+      {
+        "label": "南皮县",
+        "value": "130927"
+      },
+      {
+        "label": "吴桥县",
+        "value": "130928"
+      },
+      {
+        "label": "献县",
+        "value": "130929"
+      },
+      {
+        "label": "孟村回族自治县",
+        "value": "130930"
+      },
+      {
+        "label": "河北沧州经济开发区",
+        "value": "130971"
+      },
+      {
+        "label": "沧州高新技术产业开发区",
+        "value": "130972"
+      },
+      {
+        "label": "沧州渤海新区",
+        "value": "130973"
+      },
+      {
+        "label": "泊头市",
+        "value": "130981"
+      },
+      {
+        "label": "任丘市",
+        "value": "130982"
+      },
+      {
+        "label": "黄骅市",
+        "value": "130983"
+      },
+      {
+        "label": "河间市",
+        "value": "130984"
+      }
+    ],
+    [{
+        "label": "安次区",
+        "value": "131002"
+      },
+      {
+        "label": "广阳区",
+        "value": "131003"
+      },
+      {
+        "label": "固安县",
+        "value": "131022"
+      },
+      {
+        "label": "永清县",
+        "value": "131023"
+      },
+      {
+        "label": "香河县",
+        "value": "131024"
+      },
+      {
+        "label": "大城县",
+        "value": "131025"
+      },
+      {
+        "label": "文安县",
+        "value": "131026"
+      },
+      {
+        "label": "大厂回族自治县",
+        "value": "131028"
+      },
+      {
+        "label": "廊坊经济技术开发区",
+        "value": "131071"
+      },
+      {
+        "label": "霸州市",
+        "value": "131081"
+      },
+      {
+        "label": "三河市",
+        "value": "131082"
+      }
+    ],
+    [{
+        "label": "桃城区",
+        "value": "131102"
+      },
+      {
+        "label": "冀州区",
+        "value": "131103"
+      },
+      {
+        "label": "枣强县",
+        "value": "131121"
+      },
+      {
+        "label": "武邑县",
+        "value": "131122"
+      },
+      {
+        "label": "武强县",
+        "value": "131123"
+      },
+      {
+        "label": "饶阳县",
+        "value": "131124"
+      },
+      {
+        "label": "安平县",
+        "value": "131125"
+      },
+      {
+        "label": "故城县",
+        "value": "131126"
+      },
+      {
+        "label": "景县",
+        "value": "131127"
+      },
+      {
+        "label": "阜城县",
+        "value": "131128"
+      },
+      {
+        "label": "河北衡水经济开发区",
+        "value": "131171"
+      },
+      {
+        "label": "衡水滨湖新区",
+        "value": "131172"
+      },
+      {
+        "label": "深州市",
+        "value": "131182"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "小店区",
+        "value": "140105"
+      },
+      {
+        "label": "迎泽区",
+        "value": "140106"
+      },
+      {
+        "label": "杏花岭区",
+        "value": "140107"
+      },
+      {
+        "label": "尖草坪区",
+        "value": "140108"
+      },
+      {
+        "label": "万柏林区",
+        "value": "140109"
+      },
+      {
+        "label": "晋源区",
+        "value": "140110"
+      },
+      {
+        "label": "清徐县",
+        "value": "140121"
+      },
+      {
+        "label": "阳曲县",
+        "value": "140122"
+      },
+      {
+        "label": "娄烦县",
+        "value": "140123"
+      },
+      {
+        "label": "山西转型综合改革示范区",
+        "value": "140171"
+      },
+      {
+        "label": "古交市",
+        "value": "140181"
+      }
+    ],
+    [{
+        "label": "城区",
+        "value": "140202"
+      },
+      {
+        "label": "矿区",
+        "value": "140203"
+      },
+      {
+        "label": "南郊区",
+        "value": "140211"
+      },
+      {
+        "label": "新荣区",
+        "value": "140212"
+      },
+      {
+        "label": "阳高县",
+        "value": "140221"
+      },
+      {
+        "label": "天镇县",
+        "value": "140222"
+      },
+      {
+        "label": "广灵县",
+        "value": "140223"
+      },
+      {
+        "label": "灵丘县",
+        "value": "140224"
+      },
+      {
+        "label": "浑源县",
+        "value": "140225"
+      },
+      {
+        "label": "左云县",
+        "value": "140226"
+      },
+      {
+        "label": "大同县",
+        "value": "140227"
+      },
+      {
+        "label": "山西大同经济开发区",
+        "value": "140271"
+      }
+    ],
+    [{
+        "label": "城区",
+        "value": "140302"
+      },
+      {
+        "label": "矿区",
+        "value": "140303"
+      },
+      {
+        "label": "郊区",
+        "value": "140311"
+      },
+      {
+        "label": "平定县",
+        "value": "140321"
+      },
+      {
+        "label": "盂县",
+        "value": "140322"
+      },
+      {
+        "label": "山西阳泉经济开发区",
+        "value": "140371"
+      }
+    ],
+    [{
+        "label": "城区",
+        "value": "140402"
+      },
+      {
+        "label": "郊区",
+        "value": "140411"
+      },
+      {
+        "label": "长治县",
+        "value": "140421"
+      },
+      {
+        "label": "襄垣县",
+        "value": "140423"
+      },
+      {
+        "label": "屯留县",
+        "value": "140424"
+      },
+      {
+        "label": "平顺县",
+        "value": "140425"
+      },
+      {
+        "label": "黎城县",
+        "value": "140426"
+      },
+      {
+        "label": "壶关县",
+        "value": "140427"
+      },
+      {
+        "label": "长子县",
+        "value": "140428"
+      },
+      {
+        "label": "武乡县",
+        "value": "140429"
+      },
+      {
+        "label": "沁县",
+        "value": "140430"
+      },
+      {
+        "label": "沁源县",
+        "value": "140431"
+      },
+      {
+        "label": "山西长治高新技术产业园区",
+        "value": "140471"
+      },
+      {
+        "label": "潞城市",
+        "value": "140481"
+      }
+    ],
+    [{
+        "label": "城区",
+        "value": "140502"
+      },
+      {
+        "label": "沁水县",
+        "value": "140521"
+      },
+      {
+        "label": "阳城县",
+        "value": "140522"
+      },
+      {
+        "label": "陵川县",
+        "value": "140524"
+      },
+      {
+        "label": "泽州县",
+        "value": "140525"
+      },
+      {
+        "label": "高平市",
+        "value": "140581"
+      }
+    ],
+    [{
+        "label": "朔城区",
+        "value": "140602"
+      },
+      {
+        "label": "平鲁区",
+        "value": "140603"
+      },
+      {
+        "label": "山阴县",
+        "value": "140621"
+      },
+      {
+        "label": "应县",
+        "value": "140622"
+      },
+      {
+        "label": "右玉县",
+        "value": "140623"
+      },
+      {
+        "label": "怀仁县",
+        "value": "140624"
+      },
+      {
+        "label": "山西朔州经济开发区",
+        "value": "140671"
+      }
+    ],
+    [{
+        "label": "榆次区",
+        "value": "140702"
+      },
+      {
+        "label": "榆社县",
+        "value": "140721"
+      },
+      {
+        "label": "左权县",
+        "value": "140722"
+      },
+      {
+        "label": "和顺县",
+        "value": "140723"
+      },
+      {
+        "label": "昔阳县",
+        "value": "140724"
+      },
+      {
+        "label": "寿阳县",
+        "value": "140725"
+      },
+      {
+        "label": "太谷县",
+        "value": "140726"
+      },
+      {
+        "label": "祁县",
+        "value": "140727"
+      },
+      {
+        "label": "平遥县",
+        "value": "140728"
+      },
+      {
+        "label": "灵石县",
+        "value": "140729"
+      },
+      {
+        "label": "介休市",
+        "value": "140781"
+      }
+    ],
+    [{
+        "label": "盐湖区",
+        "value": "140802"
+      },
+      {
+        "label": "临猗县",
+        "value": "140821"
+      },
+      {
+        "label": "万荣县",
+        "value": "140822"
+      },
+      {
+        "label": "闻喜县",
+        "value": "140823"
+      },
+      {
+        "label": "稷山县",
+        "value": "140824"
+      },
+      {
+        "label": "新绛县",
+        "value": "140825"
+      },
+      {
+        "label": "绛县",
+        "value": "140826"
+      },
+      {
+        "label": "垣曲县",
+        "value": "140827"
+      },
+      {
+        "label": "夏县",
+        "value": "140828"
+      },
+      {
+        "label": "平陆县",
+        "value": "140829"
+      },
+      {
+        "label": "芮城县",
+        "value": "140830"
+      },
+      {
+        "label": "永济市",
+        "value": "140881"
+      },
+      {
+        "label": "河津市",
+        "value": "140882"
+      }
+    ],
+    [{
+        "label": "忻府区",
+        "value": "140902"
+      },
+      {
+        "label": "定襄县",
+        "value": "140921"
+      },
+      {
+        "label": "五台县",
+        "value": "140922"
+      },
+      {
+        "label": "代县",
+        "value": "140923"
+      },
+      {
+        "label": "繁峙县",
+        "value": "140924"
+      },
+      {
+        "label": "宁武县",
+        "value": "140925"
+      },
+      {
+        "label": "静乐县",
+        "value": "140926"
+      },
+      {
+        "label": "神池县",
+        "value": "140927"
+      },
+      {
+        "label": "五寨县",
+        "value": "140928"
+      },
+      {
+        "label": "岢岚县",
+        "value": "140929"
+      },
+      {
+        "label": "河曲县",
+        "value": "140930"
+      },
+      {
+        "label": "保德县",
+        "value": "140931"
+      },
+      {
+        "label": "偏关县",
+        "value": "140932"
+      },
+      {
+        "label": "五台山风景名胜区",
+        "value": "140971"
+      },
+      {
+        "label": "原平市",
+        "value": "140981"
+      }
+    ],
+    [{
+        "label": "尧都区",
+        "value": "141002"
+      },
+      {
+        "label": "曲沃县",
+        "value": "141021"
+      },
+      {
+        "label": "翼城县",
+        "value": "141022"
+      },
+      {
+        "label": "襄汾县",
+        "value": "141023"
+      },
+      {
+        "label": "洪洞县",
+        "value": "141024"
+      },
+      {
+        "label": "古县",
+        "value": "141025"
+      },
+      {
+        "label": "安泽县",
+        "value": "141026"
+      },
+      {
+        "label": "浮山县",
+        "value": "141027"
+      },
+      {
+        "label": "吉县",
+        "value": "141028"
+      },
+      {
+        "label": "乡宁县",
+        "value": "141029"
+      },
+      {
+        "label": "大宁县",
+        "value": "141030"
+      },
+      {
+        "label": "隰县",
+        "value": "141031"
+      },
+      {
+        "label": "永和县",
+        "value": "141032"
+      },
+      {
+        "label": "蒲县",
+        "value": "141033"
+      },
+      {
+        "label": "汾西县",
+        "value": "141034"
+      },
+      {
+        "label": "侯马市",
+        "value": "141081"
+      },
+      {
+        "label": "霍州市",
+        "value": "141082"
+      }
+    ],
+    [{
+        "label": "离石区",
+        "value": "141102"
+      },
+      {
+        "label": "文水县",
+        "value": "141121"
+      },
+      {
+        "label": "交城县",
+        "value": "141122"
+      },
+      {
+        "label": "兴县",
+        "value": "141123"
+      },
+      {
+        "label": "临县",
+        "value": "141124"
+      },
+      {
+        "label": "柳林县",
+        "value": "141125"
+      },
+      {
+        "label": "石楼县",
+        "value": "141126"
+      },
+      {
+        "label": "岚县",
+        "value": "141127"
+      },
+      {
+        "label": "方山县",
+        "value": "141128"
+      },
+      {
+        "label": "中阳县",
+        "value": "141129"
+      },
+      {
+        "label": "交口县",
+        "value": "141130"
+      },
+      {
+        "label": "孝义市",
+        "value": "141181"
+      },
+      {
+        "label": "汾阳市",
+        "value": "141182"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "新城区",
+        "value": "150102"
+      },
+      {
+        "label": "回民区",
+        "value": "150103"
+      },
+      {
+        "label": "玉泉区",
+        "value": "150104"
+      },
+      {
+        "label": "赛罕区",
+        "value": "150105"
+      },
+      {
+        "label": "土默特左旗",
+        "value": "150121"
+      },
+      {
+        "label": "托克托县",
+        "value": "150122"
+      },
+      {
+        "label": "和林格尔县",
+        "value": "150123"
+      },
+      {
+        "label": "清水河县",
+        "value": "150124"
+      },
+      {
+        "label": "武川县",
+        "value": "150125"
+      },
+      {
+        "label": "呼和浩特金海工业园区",
+        "value": "150171"
+      },
+      {
+        "label": "呼和浩特经济技术开发区",
+        "value": "150172"
+      }
+    ],
+    [{
+        "label": "东河区",
+        "value": "150202"
+      },
+      {
+        "label": "昆都仑区",
+        "value": "150203"
+      },
+      {
+        "label": "青山区",
+        "value": "150204"
+      },
+      {
+        "label": "石拐区",
+        "value": "150205"
+      },
+      {
+        "label": "白云鄂博矿区",
+        "value": "150206"
+      },
+      {
+        "label": "九原区",
+        "value": "150207"
+      },
+      {
+        "label": "土默特右旗",
+        "value": "150221"
+      },
+      {
+        "label": "固阳县",
+        "value": "150222"
+      },
+      {
+        "label": "达尔罕茂明安联合旗",
+        "value": "150223"
+      },
+      {
+        "label": "包头稀土高新技术产业开发区",
+        "value": "150271"
+      }
+    ],
+    [{
+        "label": "海勃湾区",
+        "value": "150302"
+      },
+      {
+        "label": "海南区",
+        "value": "150303"
+      },
+      {
+        "label": "乌达区",
+        "value": "150304"
+      }
+    ],
+    [{
+        "label": "红山区",
+        "value": "150402"
+      },
+      {
+        "label": "元宝山区",
+        "value": "150403"
+      },
+      {
+        "label": "松山区",
+        "value": "150404"
+      },
+      {
+        "label": "阿鲁科尔沁旗",
+        "value": "150421"
+      },
+      {
+        "label": "巴林左旗",
+        "value": "150422"
+      },
+      {
+        "label": "巴林右旗",
+        "value": "150423"
+      },
+      {
+        "label": "林西县",
+        "value": "150424"
+      },
+      {
+        "label": "克什克腾旗",
+        "value": "150425"
+      },
+      {
+        "label": "翁牛特旗",
+        "value": "150426"
+      },
+      {
+        "label": "喀喇沁旗",
+        "value": "150428"
+      },
+      {
+        "label": "宁城县",
+        "value": "150429"
+      },
+      {
+        "label": "敖汉旗",
+        "value": "150430"
+      }
+    ],
+    [{
+        "label": "科尔沁区",
+        "value": "150502"
+      },
+      {
+        "label": "科尔沁左翼中旗",
+        "value": "150521"
+      },
+      {
+        "label": "科尔沁左翼后旗",
+        "value": "150522"
+      },
+      {
+        "label": "开鲁县",
+        "value": "150523"
+      },
+      {
+        "label": "库伦旗",
+        "value": "150524"
+      },
+      {
+        "label": "奈曼旗",
+        "value": "150525"
+      },
+      {
+        "label": "扎鲁特旗",
+        "value": "150526"
+      },
+      {
+        "label": "通辽经济技术开发区",
+        "value": "150571"
+      },
+      {
+        "label": "霍林郭勒市",
+        "value": "150581"
+      }
+    ],
+    [{
+        "label": "东胜区",
+        "value": "150602"
+      },
+      {
+        "label": "康巴什区",
+        "value": "150603"
+      },
+      {
+        "label": "达拉特旗",
+        "value": "150621"
+      },
+      {
+        "label": "准格尔旗",
+        "value": "150622"
+      },
+      {
+        "label": "鄂托克前旗",
+        "value": "150623"
+      },
+      {
+        "label": "鄂托克旗",
+        "value": "150624"
+      },
+      {
+        "label": "杭锦旗",
+        "value": "150625"
+      },
+      {
+        "label": "乌审旗",
+        "value": "150626"
+      },
+      {
+        "label": "伊金霍洛旗",
+        "value": "150627"
+      }
+    ],
+    [{
+        "label": "海拉尔区",
+        "value": "150702"
+      },
+      {
+        "label": "扎赉诺尔区",
+        "value": "150703"
+      },
+      {
+        "label": "阿荣旗",
+        "value": "150721"
+      },
+      {
+        "label": "莫力达瓦达斡尔族自治旗",
+        "value": "150722"
+      },
+      {
+        "label": "鄂伦春自治旗",
+        "value": "150723"
+      },
+      {
+        "label": "鄂温克族自治旗",
+        "value": "150724"
+      },
+      {
+        "label": "陈巴尔虎旗",
+        "value": "150725"
+      },
+      {
+        "label": "新巴尔虎左旗",
+        "value": "150726"
+      },
+      {
+        "label": "新巴尔虎右旗",
+        "value": "150727"
+      },
+      {
+        "label": "满洲里市",
+        "value": "150781"
+      },
+      {
+        "label": "牙克石市",
+        "value": "150782"
+      },
+      {
+        "label": "扎兰屯市",
+        "value": "150783"
+      },
+      {
+        "label": "额尔古纳市",
+        "value": "150784"
+      },
+      {
+        "label": "根河市",
+        "value": "150785"
+      }
+    ],
+    [{
+        "label": "临河区",
+        "value": "150802"
+      },
+      {
+        "label": "五原县",
+        "value": "150821"
+      },
+      {
+        "label": "磴口县",
+        "value": "150822"
+      },
+      {
+        "label": "乌拉特前旗",
+        "value": "150823"
+      },
+      {
+        "label": "乌拉特中旗",
+        "value": "150824"
+      },
+      {
+        "label": "乌拉特后旗",
+        "value": "150825"
+      },
+      {
+        "label": "杭锦后旗",
+        "value": "150826"
+      }
+    ],
+    [{
+        "label": "集宁区",
+        "value": "150902"
+      },
+      {
+        "label": "卓资县",
+        "value": "150921"
+      },
+      {
+        "label": "化德县",
+        "value": "150922"
+      },
+      {
+        "label": "商都县",
+        "value": "150923"
+      },
+      {
+        "label": "兴和县",
+        "value": "150924"
+      },
+      {
+        "label": "凉城县",
+        "value": "150925"
+      },
+      {
+        "label": "察哈尔右翼前旗",
+        "value": "150926"
+      },
+      {
+        "label": "察哈尔右翼中旗",
+        "value": "150927"
+      },
+      {
+        "label": "察哈尔右翼后旗",
+        "value": "150928"
+      },
+      {
+        "label": "四子王旗",
+        "value": "150929"
+      },
+      {
+        "label": "丰镇市",
+        "value": "150981"
+      }
+    ],
+    [{
+        "label": "乌兰浩特市",
+        "value": "152201"
+      },
+      {
+        "label": "阿尔山市",
+        "value": "152202"
+      },
+      {
+        "label": "科尔沁右翼前旗",
+        "value": "152221"
+      },
+      {
+        "label": "科尔沁右翼中旗",
+        "value": "152222"
+      },
+      {
+        "label": "扎赉特旗",
+        "value": "152223"
+      },
+      {
+        "label": "突泉县",
+        "value": "152224"
+      }
+    ],
+    [{
+        "label": "二连浩特市",
+        "value": "152501"
+      },
+      {
+        "label": "锡林浩特市",
+        "value": "152502"
+      },
+      {
+        "label": "阿巴嘎旗",
+        "value": "152522"
+      },
+      {
+        "label": "苏尼特左旗",
+        "value": "152523"
+      },
+      {
+        "label": "苏尼特右旗",
+        "value": "152524"
+      },
+      {
+        "label": "东乌珠穆沁旗",
+        "value": "152525"
+      },
+      {
+        "label": "西乌珠穆沁旗",
+        "value": "152526"
+      },
+      {
+        "label": "太仆寺旗",
+        "value": "152527"
+      },
+      {
+        "label": "镶黄旗",
+        "value": "152528"
+      },
+      {
+        "label": "正镶白旗",
+        "value": "152529"
+      },
+      {
+        "label": "正蓝旗",
+        "value": "152530"
+      },
+      {
+        "label": "多伦县",
+        "value": "152531"
+      },
+      {
+        "label": "乌拉盖管委会",
+        "value": "152571"
+      }
+    ],
+    [{
+        "label": "阿拉善左旗",
+        "value": "152921"
+      },
+      {
+        "label": "阿拉善右旗",
+        "value": "152922"
+      },
+      {
+        "label": "额济纳旗",
+        "value": "152923"
+      },
+      {
+        "label": "内蒙古阿拉善经济开发区",
+        "value": "152971"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "和平区",
+        "value": "210102"
+      },
+      {
+        "label": "沈河区",
+        "value": "210103"
+      },
+      {
+        "label": "大东区",
+        "value": "210104"
+      },
+      {
+        "label": "皇姑区",
+        "value": "210105"
+      },
+      {
+        "label": "铁西区",
+        "value": "210106"
+      },
+      {
+        "label": "苏家屯区",
+        "value": "210111"
+      },
+      {
+        "label": "浑南区",
+        "value": "210112"
+      },
+      {
+        "label": "沈北新区",
+        "value": "210113"
+      },
+      {
+        "label": "于洪区",
+        "value": "210114"
+      },
+      {
+        "label": "辽中区",
+        "value": "210115"
+      },
+      {
+        "label": "康平县",
+        "value": "210123"
+      },
+      {
+        "label": "法库县",
+        "value": "210124"
+      },
+      {
+        "label": "新民市",
+        "value": "210181"
+      }
+    ],
+    [{
+        "label": "中山区",
+        "value": "210202"
+      },
+      {
+        "label": "西岗区",
+        "value": "210203"
+      },
+      {
+        "label": "沙河口区",
+        "value": "210204"
+      },
+      {
+        "label": "甘井子区",
+        "value": "210211"
+      },
+      {
+        "label": "旅顺口区",
+        "value": "210212"
+      },
+      {
+        "label": "金州区",
+        "value": "210213"
+      },
+      {
+        "label": "普兰店区",
+        "value": "210214"
+      },
+      {
+        "label": "长海县",
+        "value": "210224"
+      },
+      {
+        "label": "瓦房店市",
+        "value": "210281"
+      },
+      {
+        "label": "庄河市",
+        "value": "210283"
+      }
+    ],
+    [{
+        "label": "铁东区",
+        "value": "210302"
+      },
+      {
+        "label": "铁西区",
+        "value": "210303"
+      },
+      {
+        "label": "立山区",
+        "value": "210304"
+      },
+      {
+        "label": "千山区",
+        "value": "210311"
+      },
+      {
+        "label": "台安县",
+        "value": "210321"
+      },
+      {
+        "label": "岫岩满族自治县",
+        "value": "210323"
+      },
+      {
+        "label": "海城市",
+        "value": "210381"
+      }
+    ],
+    [{
+        "label": "新抚区",
+        "value": "210402"
+      },
+      {
+        "label": "东洲区",
+        "value": "210403"
+      },
+      {
+        "label": "望花区",
+        "value": "210404"
+      },
+      {
+        "label": "顺城区",
+        "value": "210411"
+      },
+      {
+        "label": "抚顺县",
+        "value": "210421"
+      },
+      {
+        "label": "新宾满族自治县",
+        "value": "210422"
+      },
+      {
+        "label": "清原满族自治县",
+        "value": "210423"
+      }
+    ],
+    [{
+        "label": "平山区",
+        "value": "210502"
+      },
+      {
+        "label": "溪湖区",
+        "value": "210503"
+      },
+      {
+        "label": "明山区",
+        "value": "210504"
+      },
+      {
+        "label": "南芬区",
+        "value": "210505"
+      },
+      {
+        "label": "本溪满族自治县",
+        "value": "210521"
+      },
+      {
+        "label": "桓仁满族自治县",
+        "value": "210522"
+      }
+    ],
+    [{
+        "label": "元宝区",
+        "value": "210602"
+      },
+      {
+        "label": "振兴区",
+        "value": "210603"
+      },
+      {
+        "label": "振安区",
+        "value": "210604"
+      },
+      {
+        "label": "宽甸满族自治县",
+        "value": "210624"
+      },
+      {
+        "label": "东港市",
+        "value": "210681"
+      },
+      {
+        "label": "凤城市",
+        "value": "210682"
+      }
+    ],
+    [{
+        "label": "古塔区",
+        "value": "210702"
+      },
+      {
+        "label": "凌河区",
+        "value": "210703"
+      },
+      {
+        "label": "太和区",
+        "value": "210711"
+      },
+      {
+        "label": "黑山县",
+        "value": "210726"
+      },
+      {
+        "label": "义县",
+        "value": "210727"
+      },
+      {
+        "label": "凌海市",
+        "value": "210781"
+      },
+      {
+        "label": "北镇市",
+        "value": "210782"
+      }
+    ],
+    [{
+        "label": "站前区",
+        "value": "210802"
+      },
+      {
+        "label": "西市区",
+        "value": "210803"
+      },
+      {
+        "label": "鲅鱼圈区",
+        "value": "210804"
+      },
+      {
+        "label": "老边区",
+        "value": "210811"
+      },
+      {
+        "label": "盖州市",
+        "value": "210881"
+      },
+      {
+        "label": "大石桥市",
+        "value": "210882"
+      }
+    ],
+    [{
+        "label": "海州区",
+        "value": "210902"
+      },
+      {
+        "label": "新邱区",
+        "value": "210903"
+      },
+      {
+        "label": "太平区",
+        "value": "210904"
+      },
+      {
+        "label": "清河门区",
+        "value": "210905"
+      },
+      {
+        "label": "细河区",
+        "value": "210911"
+      },
+      {
+        "label": "阜新蒙古族自治县",
+        "value": "210921"
+      },
+      {
+        "label": "彰武县",
+        "value": "210922"
+      }
+    ],
+    [{
+        "label": "白塔区",
+        "value": "211002"
+      },
+      {
+        "label": "文圣区",
+        "value": "211003"
+      },
+      {
+        "label": "宏伟区",
+        "value": "211004"
+      },
+      {
+        "label": "弓长岭区",
+        "value": "211005"
+      },
+      {
+        "label": "太子河区",
+        "value": "211011"
+      },
+      {
+        "label": "辽阳县",
+        "value": "211021"
+      },
+      {
+        "label": "灯塔市",
+        "value": "211081"
+      }
+    ],
+    [{
+        "label": "双台子区",
+        "value": "211102"
+      },
+      {
+        "label": "兴隆台区",
+        "value": "211103"
+      },
+      {
+        "label": "大洼区",
+        "value": "211104"
+      },
+      {
+        "label": "盘山县",
+        "value": "211122"
+      }
+    ],
+    [{
+        "label": "银州区",
+        "value": "211202"
+      },
+      {
+        "label": "清河区",
+        "value": "211204"
+      },
+      {
+        "label": "铁岭县",
+        "value": "211221"
+      },
+      {
+        "label": "西丰县",
+        "value": "211223"
+      },
+      {
+        "label": "昌图县",
+        "value": "211224"
+      },
+      {
+        "label": "调兵山市",
+        "value": "211281"
+      },
+      {
+        "label": "开原市",
+        "value": "211282"
+      }
+    ],
+    [{
+        "label": "双塔区",
+        "value": "211302"
+      },
+      {
+        "label": "龙城区",
+        "value": "211303"
+      },
+      {
+        "label": "朝阳县",
+        "value": "211321"
+      },
+      {
+        "label": "建平县",
+        "value": "211322"
+      },
+      {
+        "label": "喀喇沁左翼蒙古族自治县",
+        "value": "211324"
+      },
+      {
+        "label": "北票市",
+        "value": "211381"
+      },
+      {
+        "label": "凌源市",
+        "value": "211382"
+      }
+    ],
+    [{
+        "label": "连山区",
+        "value": "211402"
+      },
+      {
+        "label": "龙港区",
+        "value": "211403"
+      },
+      {
+        "label": "南票区",
+        "value": "211404"
+      },
+      {
+        "label": "绥中县",
+        "value": "211421"
+      },
+      {
+        "label": "建昌县",
+        "value": "211422"
+      },
+      {
+        "label": "兴城市",
+        "value": "211481"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "南关区",
+        "value": "220102"
+      },
+      {
+        "label": "宽城区",
+        "value": "220103"
+      },
+      {
+        "label": "朝阳区",
+        "value": "220104"
+      },
+      {
+        "label": "二道区",
+        "value": "220105"
+      },
+      {
+        "label": "绿园区",
+        "value": "220106"
+      },
+      {
+        "label": "双阳区",
+        "value": "220112"
+      },
+      {
+        "label": "九台区",
+        "value": "220113"
+      },
+      {
+        "label": "农安县",
+        "value": "220122"
+      },
+      {
+        "label": "长春经济技术开发区",
+        "value": "220171"
+      },
+      {
+        "label": "长春净月高新技术产业开发区",
+        "value": "220172"
+      },
+      {
+        "label": "长春高新技术产业开发区",
+        "value": "220173"
+      },
+      {
+        "label": "长春汽车经济技术开发区",
+        "value": "220174"
+      },
+      {
+        "label": "榆树市",
+        "value": "220182"
+      },
+      {
+        "label": "德惠市",
+        "value": "220183"
+      }
+    ],
+    [{
+        "label": "昌邑区",
+        "value": "220202"
+      },
+      {
+        "label": "龙潭区",
+        "value": "220203"
+      },
+      {
+        "label": "船营区",
+        "value": "220204"
+      },
+      {
+        "label": "丰满区",
+        "value": "220211"
+      },
+      {
+        "label": "永吉县",
+        "value": "220221"
+      },
+      {
+        "label": "吉林经济开发区",
+        "value": "220271"
+      },
+      {
+        "label": "吉林高新技术产业开发区",
+        "value": "220272"
+      },
+      {
+        "label": "吉林中国新加坡食品区",
+        "value": "220273"
+      },
+      {
+        "label": "蛟河市",
+        "value": "220281"
+      },
+      {
+        "label": "桦甸市",
+        "value": "220282"
+      },
+      {
+        "label": "舒兰市",
+        "value": "220283"
+      },
+      {
+        "label": "磐石市",
+        "value": "220284"
+      }
+    ],
+    [{
+        "label": "铁西区",
+        "value": "220302"
+      },
+      {
+        "label": "铁东区",
+        "value": "220303"
+      },
+      {
+        "label": "梨树县",
+        "value": "220322"
+      },
+      {
+        "label": "伊通满族自治县",
+        "value": "220323"
+      },
+      {
+        "label": "公主岭市",
+        "value": "220381"
+      },
+      {
+        "label": "双辽市",
+        "value": "220382"
+      }
+    ],
+    [{
+        "label": "龙山区",
+        "value": "220402"
+      },
+      {
+        "label": "西安区",
+        "value": "220403"
+      },
+      {
+        "label": "东丰县",
+        "value": "220421"
+      },
+      {
+        "label": "东辽县",
+        "value": "220422"
+      }
+    ],
+    [{
+        "label": "东昌区",
+        "value": "220502"
+      },
+      {
+        "label": "二道江区",
+        "value": "220503"
+      },
+      {
+        "label": "通化县",
+        "value": "220521"
+      },
+      {
+        "label": "辉南县",
+        "value": "220523"
+      },
+      {
+        "label": "柳河县",
+        "value": "220524"
+      },
+      {
+        "label": "梅河口市",
+        "value": "220581"
+      },
+      {
+        "label": "集安市",
+        "value": "220582"
+      }
+    ],
+    [{
+        "label": "浑江区",
+        "value": "220602"
+      },
+      {
+        "label": "江源区",
+        "value": "220605"
+      },
+      {
+        "label": "抚松县",
+        "value": "220621"
+      },
+      {
+        "label": "靖宇县",
+        "value": "220622"
+      },
+      {
+        "label": "长白朝鲜族自治县",
+        "value": "220623"
+      },
+      {
+        "label": "临江市",
+        "value": "220681"
+      }
+    ],
+    [{
+        "label": "宁江区",
+        "value": "220702"
+      },
+      {
+        "label": "前郭尔罗斯蒙古族自治县",
+        "value": "220721"
+      },
+      {
+        "label": "长岭县",
+        "value": "220722"
+      },
+      {
+        "label": "乾安县",
+        "value": "220723"
+      },
+      {
+        "label": "吉林松原经济开发区",
+        "value": "220771"
+      },
+      {
+        "label": "扶余市",
+        "value": "220781"
+      }
+    ],
+    [{
+        "label": "洮北区",
+        "value": "220802"
+      },
+      {
+        "label": "镇赉县",
+        "value": "220821"
+      },
+      {
+        "label": "通榆县",
+        "value": "220822"
+      },
+      {
+        "label": "吉林白城经济开发区",
+        "value": "220871"
+      },
+      {
+        "label": "洮南市",
+        "value": "220881"
+      },
+      {
+        "label": "大安市",
+        "value": "220882"
+      }
+    ],
+    [{
+        "label": "延吉市",
+        "value": "222401"
+      },
+      {
+        "label": "图们市",
+        "value": "222402"
+      },
+      {
+        "label": "敦化市",
+        "value": "222403"
+      },
+      {
+        "label": "珲春市",
+        "value": "222404"
+      },
+      {
+        "label": "龙井市",
+        "value": "222405"
+      },
+      {
+        "label": "和龙市",
+        "value": "222406"
+      },
+      {
+        "label": "汪清县",
+        "value": "222424"
+      },
+      {
+        "label": "安图县",
+        "value": "222426"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "道里区",
+        "value": "230102"
+      },
+      {
+        "label": "南岗区",
+        "value": "230103"
+      },
+      {
+        "label": "道外区",
+        "value": "230104"
+      },
+      {
+        "label": "平房区",
+        "value": "230108"
+      },
+      {
+        "label": "松北区",
+        "value": "230109"
+      },
+      {
+        "label": "香坊区",
+        "value": "230110"
+      },
+      {
+        "label": "呼兰区",
+        "value": "230111"
+      },
+      {
+        "label": "阿城区",
+        "value": "230112"
+      },
+      {
+        "label": "双城区",
+        "value": "230113"
+      },
+      {
+        "label": "依兰县",
+        "value": "230123"
+      },
+      {
+        "label": "方正县",
+        "value": "230124"
+      },
+      {
+        "label": "宾县",
+        "value": "230125"
+      },
+      {
+        "label": "巴彦县",
+        "value": "230126"
+      },
+      {
+        "label": "木兰县",
+        "value": "230127"
+      },
+      {
+        "label": "通河县",
+        "value": "230128"
+      },
+      {
+        "label": "延寿县",
+        "value": "230129"
+      },
+      {
+        "label": "尚志市",
+        "value": "230183"
+      },
+      {
+        "label": "五常市",
+        "value": "230184"
+      }
+    ],
+    [{
+        "label": "龙沙区",
+        "value": "230202"
+      },
+      {
+        "label": "建华区",
+        "value": "230203"
+      },
+      {
+        "label": "铁锋区",
+        "value": "230204"
+      },
+      {
+        "label": "昂昂溪区",
+        "value": "230205"
+      },
+      {
+        "label": "富拉尔基区",
+        "value": "230206"
+      },
+      {
+        "label": "碾子山区",
+        "value": "230207"
+      },
+      {
+        "label": "梅里斯达斡尔族区",
+        "value": "230208"
+      },
+      {
+        "label": "龙江县",
+        "value": "230221"
+      },
+      {
+        "label": "依安县",
+        "value": "230223"
+      },
+      {
+        "label": "泰来县",
+        "value": "230224"
+      },
+      {
+        "label": "甘南县",
+        "value": "230225"
+      },
+      {
+        "label": "富裕县",
+        "value": "230227"
+      },
+      {
+        "label": "克山县",
+        "value": "230229"
+      },
+      {
+        "label": "克东县",
+        "value": "230230"
+      },
+      {
+        "label": "拜泉县",
+        "value": "230231"
+      },
+      {
+        "label": "讷河市",
+        "value": "230281"
+      }
+    ],
+    [{
+        "label": "鸡冠区",
+        "value": "230302"
+      },
+      {
+        "label": "恒山区",
+        "value": "230303"
+      },
+      {
+        "label": "滴道区",
+        "value": "230304"
+      },
+      {
+        "label": "梨树区",
+        "value": "230305"
+      },
+      {
+        "label": "城子河区",
+        "value": "230306"
+      },
+      {
+        "label": "麻山区",
+        "value": "230307"
+      },
+      {
+        "label": "鸡东县",
+        "value": "230321"
+      },
+      {
+        "label": "虎林市",
+        "value": "230381"
+      },
+      {
+        "label": "密山市",
+        "value": "230382"
+      }
+    ],
+    [{
+        "label": "向阳区",
+        "value": "230402"
+      },
+      {
+        "label": "工农区",
+        "value": "230403"
+      },
+      {
+        "label": "南山区",
+        "value": "230404"
+      },
+      {
+        "label": "兴安区",
+        "value": "230405"
+      },
+      {
+        "label": "东山区",
+        "value": "230406"
+      },
+      {
+        "label": "兴山区",
+        "value": "230407"
+      },
+      {
+        "label": "萝北县",
+        "value": "230421"
+      },
+      {
+        "label": "绥滨县",
+        "value": "230422"
+      }
+    ],
+    [{
+        "label": "尖山区",
+        "value": "230502"
+      },
+      {
+        "label": "岭东区",
+        "value": "230503"
+      },
+      {
+        "label": "四方台区",
+        "value": "230505"
+      },
+      {
+        "label": "宝山区",
+        "value": "230506"
+      },
+      {
+        "label": "集贤县",
+        "value": "230521"
+      },
+      {
+        "label": "友谊县",
+        "value": "230522"
+      },
+      {
+        "label": "宝清县",
+        "value": "230523"
+      },
+      {
+        "label": "饶河县",
+        "value": "230524"
+      }
+    ],
+    [{
+        "label": "萨尔图区",
+        "value": "230602"
+      },
+      {
+        "label": "龙凤区",
+        "value": "230603"
+      },
+      {
+        "label": "让胡路区",
+        "value": "230604"
+      },
+      {
+        "label": "红岗区",
+        "value": "230605"
+      },
+      {
+        "label": "大同区",
+        "value": "230606"
+      },
+      {
+        "label": "肇州县",
+        "value": "230621"
+      },
+      {
+        "label": "肇源县",
+        "value": "230622"
+      },
+      {
+        "label": "林甸县",
+        "value": "230623"
+      },
+      {
+        "label": "杜尔伯特蒙古族自治县",
+        "value": "230624"
+      },
+      {
+        "label": "大庆高新技术产业开发区",
+        "value": "230671"
+      }
+    ],
+    [{
+        "label": "伊春区",
+        "value": "230702"
+      },
+      {
+        "label": "南岔区",
+        "value": "230703"
+      },
+      {
+        "label": "友好区",
+        "value": "230704"
+      },
+      {
+        "label": "西林区",
+        "value": "230705"
+      },
+      {
+        "label": "翠峦区",
+        "value": "230706"
+      },
+      {
+        "label": "新青区",
+        "value": "230707"
+      },
+      {
+        "label": "美溪区",
+        "value": "230708"
+      },
+      {
+        "label": "金山屯区",
+        "value": "230709"
+      },
+      {
+        "label": "五营区",
+        "value": "230710"
+      },
+      {
+        "label": "乌马河区",
+        "value": "230711"
+      },
+      {
+        "label": "汤旺河区",
+        "value": "230712"
+      },
+      {
+        "label": "带岭区",
+        "value": "230713"
+      },
+      {
+        "label": "乌伊岭区",
+        "value": "230714"
+      },
+      {
+        "label": "红星区",
+        "value": "230715"
+      },
+      {
+        "label": "上甘岭区",
+        "value": "230716"
+      },
+      {
+        "label": "嘉荫县",
+        "value": "230722"
+      },
+      {
+        "label": "铁力市",
+        "value": "230781"
+      }
+    ],
+    [{
+        "label": "向阳区",
+        "value": "230803"
+      },
+      {
+        "label": "前进区",
+        "value": "230804"
+      },
+      {
+        "label": "东风区",
+        "value": "230805"
+      },
+      {
+        "label": "郊区",
+        "value": "230811"
+      },
+      {
+        "label": "桦南县",
+        "value": "230822"
+      },
+      {
+        "label": "桦川县",
+        "value": "230826"
+      },
+      {
+        "label": "汤原县",
+        "value": "230828"
+      },
+      {
+        "label": "同江市",
+        "value": "230881"
+      },
+      {
+        "label": "富锦市",
+        "value": "230882"
+      },
+      {
+        "label": "抚远市",
+        "value": "230883"
+      }
+    ],
+    [{
+        "label": "新兴区",
+        "value": "230902"
+      },
+      {
+        "label": "桃山区",
+        "value": "230903"
+      },
+      {
+        "label": "茄子河区",
+        "value": "230904"
+      },
+      {
+        "label": "勃利县",
+        "value": "230921"
+      }
+    ],
+    [{
+        "label": "东安区",
+        "value": "231002"
+      },
+      {
+        "label": "阳明区",
+        "value": "231003"
+      },
+      {
+        "label": "爱民区",
+        "value": "231004"
+      },
+      {
+        "label": "西安区",
+        "value": "231005"
+      },
+      {
+        "label": "林口县",
+        "value": "231025"
+      },
+      {
+        "label": "牡丹江经济技术开发区",
+        "value": "231071"
+      },
+      {
+        "label": "绥芬河市",
+        "value": "231081"
+      },
+      {
+        "label": "海林市",
+        "value": "231083"
+      },
+      {
+        "label": "宁安市",
+        "value": "231084"
+      },
+      {
+        "label": "穆棱市",
+        "value": "231085"
+      },
+      {
+        "label": "东宁市",
+        "value": "231086"
+      }
+    ],
+    [{
+        "label": "爱辉区",
+        "value": "231102"
+      },
+      {
+        "label": "嫩江县",
+        "value": "231121"
+      },
+      {
+        "label": "逊克县",
+        "value": "231123"
+      },
+      {
+        "label": "孙吴县",
+        "value": "231124"
+      },
+      {
+        "label": "北安市",
+        "value": "231181"
+      },
+      {
+        "label": "五大连池市",
+        "value": "231182"
+      }
+    ],
+    [{
+        "label": "北林区",
+        "value": "231202"
+      },
+      {
+        "label": "望奎县",
+        "value": "231221"
+      },
+      {
+        "label": "兰西县",
+        "value": "231222"
+      },
+      {
+        "label": "青冈县",
+        "value": "231223"
+      },
+      {
+        "label": "庆安县",
+        "value": "231224"
+      },
+      {
+        "label": "明水县",
+        "value": "231225"
+      },
+      {
+        "label": "绥棱县",
+        "value": "231226"
+      },
+      {
+        "label": "安达市",
+        "value": "231281"
+      },
+      {
+        "label": "肇东市",
+        "value": "231282"
+      },
+      {
+        "label": "海伦市",
+        "value": "231283"
+      }
+    ],
+    [{
+        "label": "加格达奇区",
+        "value": "232701"
+      },
+      {
+        "label": "松岭区",
+        "value": "232702"
+      },
+      {
+        "label": "新林区",
+        "value": "232703"
+      },
+      {
+        "label": "呼中区",
+        "value": "232704"
+      },
+      {
+        "label": "呼玛县",
+        "value": "232721"
+      },
+      {
+        "label": "塔河县",
+        "value": "232722"
+      },
+      {
+        "label": "漠河县",
+        "value": "232723"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "黄浦区",
+        "value": "310101"
+      },
+      {
+        "label": "徐汇区",
+        "value": "310104"
+      },
+      {
+        "label": "长宁区",
+        "value": "310105"
+      },
+      {
+        "label": "静安区",
+        "value": "310106"
+      },
+      {
+        "label": "普陀区",
+        "value": "310107"
+      },
+      {
+        "label": "虹口区",
+        "value": "310109"
+      },
+      {
+        "label": "杨浦区",
+        "value": "310110"
+      },
+      {
+        "label": "闵行区",
+        "value": "310112"
+      },
+      {
+        "label": "宝山区",
+        "value": "310113"
+      },
+      {
+        "label": "嘉定区",
+        "value": "310114"
+      },
+      {
+        "label": "浦东新区",
+        "value": "310115"
+      },
+      {
+        "label": "金山区",
+        "value": "310116"
+      },
+      {
+        "label": "松江区",
+        "value": "310117"
+      },
+      {
+        "label": "青浦区",
+        "value": "310118"
+      },
+      {
+        "label": "奉贤区",
+        "value": "310120"
+      },
+      {
+        "label": "崇明区",
+        "value": "310151"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "玄武区",
+        "value": "320102"
+      },
+      {
+        "label": "秦淮区",
+        "value": "320104"
+      },
+      {
+        "label": "建邺区",
+        "value": "320105"
+      },
+      {
+        "label": "鼓楼区",
+        "value": "320106"
+      },
+      {
+        "label": "浦口区",
+        "value": "320111"
+      },
+      {
+        "label": "栖霞区",
+        "value": "320113"
+      },
+      {
+        "label": "雨花台区",
+        "value": "320114"
+      },
+      {
+        "label": "江宁区",
+        "value": "320115"
+      },
+      {
+        "label": "六合区",
+        "value": "320116"
+      },
+      {
+        "label": "溧水区",
+        "value": "320117"
+      },
+      {
+        "label": "高淳区",
+        "value": "320118"
+      }
+    ],
+    [{
+        "label": "锡山区",
+        "value": "320205"
+      },
+      {
+        "label": "惠山区",
+        "value": "320206"
+      },
+      {
+        "label": "滨湖区",
+        "value": "320211"
+      },
+      {
+        "label": "梁溪区",
+        "value": "320213"
+      },
+      {
+        "label": "新吴区",
+        "value": "320214"
+      },
+      {
+        "label": "江阴市",
+        "value": "320281"
+      },
+      {
+        "label": "宜兴市",
+        "value": "320282"
+      }
+    ],
+    [{
+        "label": "鼓楼区",
+        "value": "320302"
+      },
+      {
+        "label": "云龙区",
+        "value": "320303"
+      },
+      {
+        "label": "贾汪区",
+        "value": "320305"
+      },
+      {
+        "label": "泉山区",
+        "value": "320311"
+      },
+      {
+        "label": "铜山区",
+        "value": "320312"
+      },
+      {
+        "label": "丰县",
+        "value": "320321"
+      },
+      {
+        "label": "沛县",
+        "value": "320322"
+      },
+      {
+        "label": "睢宁县",
+        "value": "320324"
+      },
+      {
+        "label": "徐州经济技术开发区",
+        "value": "320371"
+      },
+      {
+        "label": "新沂市",
+        "value": "320381"
+      },
+      {
+        "label": "邳州市",
+        "value": "320382"
+      }
+    ],
+    [{
+        "label": "天宁区",
+        "value": "320402"
+      },
+      {
+        "label": "钟楼区",
+        "value": "320404"
+      },
+      {
+        "label": "新北区",
+        "value": "320411"
+      },
+      {
+        "label": "武进区",
+        "value": "320412"
+      },
+      {
+        "label": "金坛区",
+        "value": "320413"
+      },
+      {
+        "label": "溧阳市",
+        "value": "320481"
+      }
+    ],
+    [{
+        "label": "虎丘区",
+        "value": "320505"
+      },
+      {
+        "label": "吴中区",
+        "value": "320506"
+      },
+      {
+        "label": "相城区",
+        "value": "320507"
+      },
+      {
+        "label": "姑苏区",
+        "value": "320508"
+      },
+      {
+        "label": "吴江区",
+        "value": "320509"
+      },
+      {
+        "label": "苏州工业园区",
+        "value": "320571"
+      },
+      {
+        "label": "常熟市",
+        "value": "320581"
+      },
+      {
+        "label": "张家港市",
+        "value": "320582"
+      },
+      {
+        "label": "昆山市",
+        "value": "320583"
+      },
+      {
+        "label": "太仓市",
+        "value": "320585"
+      }
+    ],
+    [{
+        "label": "崇川区",
+        "value": "320602"
+      },
+      {
+        "label": "港闸区",
+        "value": "320611"
+      },
+      {
+        "label": "通州区",
+        "value": "320612"
+      },
+      {
+        "label": "海安县",
+        "value": "320621"
+      },
+      {
+        "label": "如东县",
+        "value": "320623"
+      },
+      {
+        "label": "南通经济技术开发区",
+        "value": "320671"
+      },
+      {
+        "label": "启东市",
+        "value": "320681"
+      },
+      {
+        "label": "如皋市",
+        "value": "320682"
+      },
+      {
+        "label": "海门市",
+        "value": "320684"
+      }
+    ],
+    [{
+        "label": "连云区",
+        "value": "320703"
+      },
+      {
+        "label": "海州区",
+        "value": "320706"
+      },
+      {
+        "label": "赣榆区",
+        "value": "320707"
+      },
+      {
+        "label": "东海县",
+        "value": "320722"
+      },
+      {
+        "label": "灌云县",
+        "value": "320723"
+      },
+      {
+        "label": "灌南县",
+        "value": "320724"
+      },
+      {
+        "label": "连云港经济技术开发区",
+        "value": "320771"
+      },
+      {
+        "label": "连云港高新技术产业开发区",
+        "value": "320772"
+      }
+    ],
+    [{
+        "label": "淮安区",
+        "value": "320803"
+      },
+      {
+        "label": "淮阴区",
+        "value": "320804"
+      },
+      {
+        "label": "清江浦区",
+        "value": "320812"
+      },
+      {
+        "label": "洪泽区",
+        "value": "320813"
+      },
+      {
+        "label": "涟水县",
+        "value": "320826"
+      },
+      {
+        "label": "盱眙县",
+        "value": "320830"
+      },
+      {
+        "label": "金湖县",
+        "value": "320831"
+      },
+      {
+        "label": "淮安经济技术开发区",
+        "value": "320871"
+      }
+    ],
+    [{
+        "label": "亭湖区",
+        "value": "320902"
+      },
+      {
+        "label": "盐都区",
+        "value": "320903"
+      },
+      {
+        "label": "大丰区",
+        "value": "320904"
+      },
+      {
+        "label": "响水县",
+        "value": "320921"
+      },
+      {
+        "label": "滨海县",
+        "value": "320922"
+      },
+      {
+        "label": "阜宁县",
+        "value": "320923"
+      },
+      {
+        "label": "射阳县",
+        "value": "320924"
+      },
+      {
+        "label": "建湖县",
+        "value": "320925"
+      },
+      {
+        "label": "盐城经济技术开发区",
+        "value": "320971"
+      },
+      {
+        "label": "东台市",
+        "value": "320981"
+      }
+    ],
+    [{
+        "label": "广陵区",
+        "value": "321002"
+      },
+      {
+        "label": "邗江区",
+        "value": "321003"
+      },
+      {
+        "label": "江都区",
+        "value": "321012"
+      },
+      {
+        "label": "宝应县",
+        "value": "321023"
+      },
+      {
+        "label": "扬州经济技术开发区",
+        "value": "321071"
+      },
+      {
+        "label": "仪征市",
+        "value": "321081"
+      },
+      {
+        "label": "高邮市",
+        "value": "321084"
+      }
+    ],
+    [{
+        "label": "京口区",
+        "value": "321102"
+      },
+      {
+        "label": "润州区",
+        "value": "321111"
+      },
+      {
+        "label": "丹徒区",
+        "value": "321112"
+      },
+      {
+        "label": "镇江新区",
+        "value": "321171"
+      },
+      {
+        "label": "丹阳市",
+        "value": "321181"
+      },
+      {
+        "label": "扬中市",
+        "value": "321182"
+      },
+      {
+        "label": "句容市",
+        "value": "321183"
+      }
+    ],
+    [{
+        "label": "海陵区",
+        "value": "321202"
+      },
+      {
+        "label": "高港区",
+        "value": "321203"
+      },
+      {
+        "label": "姜堰区",
+        "value": "321204"
+      },
+      {
+        "label": "泰州医药高新技术产业开发区",
+        "value": "321271"
+      },
+      {
+        "label": "兴化市",
+        "value": "321281"
+      },
+      {
+        "label": "靖江市",
+        "value": "321282"
+      },
+      {
+        "label": "泰兴市",
+        "value": "321283"
+      }
+    ],
+    [{
+        "label": "宿城区",
+        "value": "321302"
+      },
+      {
+        "label": "宿豫区",
+        "value": "321311"
+      },
+      {
+        "label": "沭阳县",
+        "value": "321322"
+      },
+      {
+        "label": "泗阳县",
+        "value": "321323"
+      },
+      {
+        "label": "泗洪县",
+        "value": "321324"
+      },
+      {
+        "label": "宿迁经济技术开发区",
+        "value": "321371"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "上城区",
+        "value": "330102"
+      },
+      {
+        "label": "下城区",
+        "value": "330103"
+      },
+      {
+        "label": "江干区",
+        "value": "330104"
+      },
+      {
+        "label": "拱墅区",
+        "value": "330105"
+      },
+      {
+        "label": "西湖区",
+        "value": "330106"
+      },
+      {
+        "label": "滨江区",
+        "value": "330108"
+      },
+      {
+        "label": "萧山区",
+        "value": "330109"
+      },
+      {
+        "label": "余杭区",
+        "value": "330110"
+      },
+      {
+        "label": "富阳区",
+        "value": "330111"
+      },
+      {
+        "label": "临安区",
+        "value": "330112"
+      },
+      {
+        "label": "桐庐县",
+        "value": "330122"
+      },
+      {
+        "label": "淳安县",
+        "value": "330127"
+      },
+      {
+        "label": "建德市",
+        "value": "330182"
+      }
+    ],
+    [{
+        "label": "海曙区",
+        "value": "330203"
+      },
+      {
+        "label": "江北区",
+        "value": "330205"
+      },
+      {
+        "label": "北仑区",
+        "value": "330206"
+      },
+      {
+        "label": "镇海区",
+        "value": "330211"
+      },
+      {
+        "label": "鄞州区",
+        "value": "330212"
+      },
+      {
+        "label": "奉化区",
+        "value": "330213"
+      },
+      {
+        "label": "象山县",
+        "value": "330225"
+      },
+      {
+        "label": "宁海县",
+        "value": "330226"
+      },
+      {
+        "label": "余姚市",
+        "value": "330281"
+      },
+      {
+        "label": "慈溪市",
+        "value": "330282"
+      }
+    ],
+    [{
+        "label": "鹿城区",
+        "value": "330302"
+      },
+      {
+        "label": "龙湾区",
+        "value": "330303"
+      },
+      {
+        "label": "瓯海区",
+        "value": "330304"
+      },
+      {
+        "label": "洞头区",
+        "value": "330305"
+      },
+      {
+        "label": "永嘉县",
+        "value": "330324"
+      },
+      {
+        "label": "平阳县",
+        "value": "330326"
+      },
+      {
+        "label": "苍南县",
+        "value": "330327"
+      },
+      {
+        "label": "文成县",
+        "value": "330328"
+      },
+      {
+        "label": "泰顺县",
+        "value": "330329"
+      },
+      {
+        "label": "温州经济技术开发区",
+        "value": "330371"
+      },
+      {
+        "label": "瑞安市",
+        "value": "330381"
+      },
+      {
+        "label": "乐清市",
+        "value": "330382"
+      }
+    ],
+    [{
+        "label": "南湖区",
+        "value": "330402"
+      },
+      {
+        "label": "秀洲区",
+        "value": "330411"
+      },
+      {
+        "label": "嘉善县",
+        "value": "330421"
+      },
+      {
+        "label": "海盐县",
+        "value": "330424"
+      },
+      {
+        "label": "海宁市",
+        "value": "330481"
+      },
+      {
+        "label": "平湖市",
+        "value": "330482"
+      },
+      {
+        "label": "桐乡市",
+        "value": "330483"
+      }
+    ],
+    [{
+        "label": "吴兴区",
+        "value": "330502"
+      },
+      {
+        "label": "南浔区",
+        "value": "330503"
+      },
+      {
+        "label": "德清县",
+        "value": "330521"
+      },
+      {
+        "label": "长兴县",
+        "value": "330522"
+      },
+      {
+        "label": "安吉县",
+        "value": "330523"
+      }
+    ],
+    [{
+        "label": "越城区",
+        "value": "330602"
+      },
+      {
+        "label": "柯桥区",
+        "value": "330603"
+      },
+      {
+        "label": "上虞区",
+        "value": "330604"
+      },
+      {
+        "label": "新昌县",
+        "value": "330624"
+      },
+      {
+        "label": "诸暨市",
+        "value": "330681"
+      },
+      {
+        "label": "嵊州市",
+        "value": "330683"
+      }
+    ],
+    [{
+        "label": "婺城区",
+        "value": "330702"
+      },
+      {
+        "label": "金东区",
+        "value": "330703"
+      },
+      {
+        "label": "武义县",
+        "value": "330723"
+      },
+      {
+        "label": "浦江县",
+        "value": "330726"
+      },
+      {
+        "label": "磐安县",
+        "value": "330727"
+      },
+      {
+        "label": "兰溪市",
+        "value": "330781"
+      },
+      {
+        "label": "义乌市",
+        "value": "330782"
+      },
+      {
+        "label": "东阳市",
+        "value": "330783"
+      },
+      {
+        "label": "永康市",
+        "value": "330784"
+      }
+    ],
+    [{
+        "label": "柯城区",
+        "value": "330802"
+      },
+      {
+        "label": "衢江区",
+        "value": "330803"
+      },
+      {
+        "label": "常山县",
+        "value": "330822"
+      },
+      {
+        "label": "开化县",
+        "value": "330824"
+      },
+      {
+        "label": "龙游县",
+        "value": "330825"
+      },
+      {
+        "label": "江山市",
+        "value": "330881"
+      }
+    ],
+    [{
+        "label": "定海区",
+        "value": "330902"
+      },
+      {
+        "label": "普陀区",
+        "value": "330903"
+      },
+      {
+        "label": "岱山县",
+        "value": "330921"
+      },
+      {
+        "label": "嵊泗县",
+        "value": "330922"
+      }
+    ],
+    [{
+        "label": "椒江区",
+        "value": "331002"
+      },
+      {
+        "label": "黄岩区",
+        "value": "331003"
+      },
+      {
+        "label": "路桥区",
+        "value": "331004"
+      },
+      {
+        "label": "三门县",
+        "value": "331022"
+      },
+      {
+        "label": "天台县",
+        "value": "331023"
+      },
+      {
+        "label": "仙居县",
+        "value": "331024"
+      },
+      {
+        "label": "温岭市",
+        "value": "331081"
+      },
+      {
+        "label": "临海市",
+        "value": "331082"
+      },
+      {
+        "label": "玉环市",
+        "value": "331083"
+      }
+    ],
+    [{
+        "label": "莲都区",
+        "value": "331102"
+      },
+      {
+        "label": "青田县",
+        "value": "331121"
+      },
+      {
+        "label": "缙云县",
+        "value": "331122"
+      },
+      {
+        "label": "遂昌县",
+        "value": "331123"
+      },
+      {
+        "label": "松阳县",
+        "value": "331124"
+      },
+      {
+        "label": "云和县",
+        "value": "331125"
+      },
+      {
+        "label": "庆元县",
+        "value": "331126"
+      },
+      {
+        "label": "景宁畲族自治县",
+        "value": "331127"
+      },
+      {
+        "label": "龙泉市",
+        "value": "331181"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "瑶海区",
+        "value": "340102"
+      },
+      {
+        "label": "庐阳区",
+        "value": "340103"
+      },
+      {
+        "label": "蜀山区",
+        "value": "340104"
+      },
+      {
+        "label": "包河区",
+        "value": "340111"
+      },
+      {
+        "label": "长丰县",
+        "value": "340121"
+      },
+      {
+        "label": "肥东县",
+        "value": "340122"
+      },
+      {
+        "label": "肥西县",
+        "value": "340123"
+      },
+      {
+        "label": "庐江县",
+        "value": "340124"
+      },
+      {
+        "label": "合肥高新技术产业开发区",
+        "value": "340171"
+      },
+      {
+        "label": "合肥经济技术开发区",
+        "value": "340172"
+      },
+      {
+        "label": "合肥新站高新技术产业开发区",
+        "value": "340173"
+      },
+      {
+        "label": "巢湖市",
+        "value": "340181"
+      }
+    ],
+    [{
+        "label": "镜湖区",
+        "value": "340202"
+      },
+      {
+        "label": "弋江区",
+        "value": "340203"
+      },
+      {
+        "label": "鸠江区",
+        "value": "340207"
+      },
+      {
+        "label": "三山区",
+        "value": "340208"
+      },
+      {
+        "label": "芜湖县",
+        "value": "340221"
+      },
+      {
+        "label": "繁昌县",
+        "value": "340222"
+      },
+      {
+        "label": "南陵县",
+        "value": "340223"
+      },
+      {
+        "label": "无为县",
+        "value": "340225"
+      },
+      {
+        "label": "芜湖经济技术开发区",
+        "value": "340271"
+      },
+      {
+        "label": "安徽芜湖长江大桥经济开发区",
+        "value": "340272"
+      }
+    ],
+    [{
+        "label": "龙子湖区",
+        "value": "340302"
+      },
+      {
+        "label": "蚌山区",
+        "value": "340303"
+      },
+      {
+        "label": "禹会区",
+        "value": "340304"
+      },
+      {
+        "label": "淮上区",
+        "value": "340311"
+      },
+      {
+        "label": "怀远县",
+        "value": "340321"
+      },
+      {
+        "label": "五河县",
+        "value": "340322"
+      },
+      {
+        "label": "固镇县",
+        "value": "340323"
+      },
+      {
+        "label": "蚌埠市高新技术开发区",
+        "value": "340371"
+      },
+      {
+        "label": "蚌埠市经济开发区",
+        "value": "340372"
+      }
+    ],
+    [{
+        "label": "大通区",
+        "value": "340402"
+      },
+      {
+        "label": "田家庵区",
+        "value": "340403"
+      },
+      {
+        "label": "谢家集区",
+        "value": "340404"
+      },
+      {
+        "label": "八公山区",
+        "value": "340405"
+      },
+      {
+        "label": "潘集区",
+        "value": "340406"
+      },
+      {
+        "label": "凤台县",
+        "value": "340421"
+      },
+      {
+        "label": "寿县",
+        "value": "340422"
+      }
+    ],
+    [{
+        "label": "花山区",
+        "value": "340503"
+      },
+      {
+        "label": "雨山区",
+        "value": "340504"
+      },
+      {
+        "label": "博望区",
+        "value": "340506"
+      },
+      {
+        "label": "当涂县",
+        "value": "340521"
+      },
+      {
+        "label": "含山县",
+        "value": "340522"
+      },
+      {
+        "label": "和县",
+        "value": "340523"
+      }
+    ],
+    [{
+        "label": "杜集区",
+        "value": "340602"
+      },
+      {
+        "label": "相山区",
+        "value": "340603"
+      },
+      {
+        "label": "烈山区",
+        "value": "340604"
+      },
+      {
+        "label": "濉溪县",
+        "value": "340621"
+      }
+    ],
+    [{
+        "label": "铜官区",
+        "value": "340705"
+      },
+      {
+        "label": "义安区",
+        "value": "340706"
+      },
+      {
+        "label": "郊区",
+        "value": "340711"
+      },
+      {
+        "label": "枞阳县",
+        "value": "340722"
+      }
+    ],
+    [{
+        "label": "迎江区",
+        "value": "340802"
+      },
+      {
+        "label": "大观区",
+        "value": "340803"
+      },
+      {
+        "label": "宜秀区",
+        "value": "340811"
+      },
+      {
+        "label": "怀宁县",
+        "value": "340822"
+      },
+      {
+        "label": "潜山县",
+        "value": "340824"
+      },
+      {
+        "label": "太湖县",
+        "value": "340825"
+      },
+      {
+        "label": "宿松县",
+        "value": "340826"
+      },
+      {
+        "label": "望江县",
+        "value": "340827"
+      },
+      {
+        "label": "岳西县",
+        "value": "340828"
+      },
+      {
+        "label": "安徽安庆经济开发区",
+        "value": "340871"
+      },
+      {
+        "label": "桐城市",
+        "value": "340881"
+      }
+    ],
+    [{
+        "label": "屯溪区",
+        "value": "341002"
+      },
+      {
+        "label": "黄山区",
+        "value": "341003"
+      },
+      {
+        "label": "徽州区",
+        "value": "341004"
+      },
+      {
+        "label": "歙县",
+        "value": "341021"
+      },
+      {
+        "label": "休宁县",
+        "value": "341022"
+      },
+      {
+        "label": "黟县",
+        "value": "341023"
+      },
+      {
+        "label": "祁门县",
+        "value": "341024"
+      }
+    ],
+    [{
+        "label": "琅琊区",
+        "value": "341102"
+      },
+      {
+        "label": "南谯区",
+        "value": "341103"
+      },
+      {
+        "label": "来安县",
+        "value": "341122"
+      },
+      {
+        "label": "全椒县",
+        "value": "341124"
+      },
+      {
+        "label": "定远县",
+        "value": "341125"
+      },
+      {
+        "label": "凤阳县",
+        "value": "341126"
+      },
+      {
+        "label": "苏滁现代产业园",
+        "value": "341171"
+      },
+      {
+        "label": "滁州经济技术开发区",
+        "value": "341172"
+      },
+      {
+        "label": "天长市",
+        "value": "341181"
+      },
+      {
+        "label": "明光市",
+        "value": "341182"
+      }
+    ],
+    [{
+        "label": "颍州区",
+        "value": "341202"
+      },
+      {
+        "label": "颍东区",
+        "value": "341203"
+      },
+      {
+        "label": "颍泉区",
+        "value": "341204"
+      },
+      {
+        "label": "临泉县",
+        "value": "341221"
+      },
+      {
+        "label": "太和县",
+        "value": "341222"
+      },
+      {
+        "label": "阜南县",
+        "value": "341225"
+      },
+      {
+        "label": "颍上县",
+        "value": "341226"
+      },
+      {
+        "label": "阜阳合肥现代产业园区",
+        "value": "341271"
+      },
+      {
+        "label": "阜阳经济技术开发区",
+        "value": "341272"
+      },
+      {
+        "label": "界首市",
+        "value": "341282"
+      }
+    ],
+    [{
+        "label": "埇桥区",
+        "value": "341302"
+      },
+      {
+        "label": "砀山县",
+        "value": "341321"
+      },
+      {
+        "label": "萧县",
+        "value": "341322"
+      },
+      {
+        "label": "灵璧县",
+        "value": "341323"
+      },
+      {
+        "label": "泗县",
+        "value": "341324"
+      },
+      {
+        "label": "宿州马鞍山现代产业园区",
+        "value": "341371"
+      },
+      {
+        "label": "宿州经济技术开发区",
+        "value": "341372"
+      }
+    ],
+    [{
+        "label": "金安区",
+        "value": "341502"
+      },
+      {
+        "label": "裕安区",
+        "value": "341503"
+      },
+      {
+        "label": "叶集区",
+        "value": "341504"
+      },
+      {
+        "label": "霍邱县",
+        "value": "341522"
+      },
+      {
+        "label": "舒城县",
+        "value": "341523"
+      },
+      {
+        "label": "金寨县",
+        "value": "341524"
+      },
+      {
+        "label": "霍山县",
+        "value": "341525"
+      }
+    ],
+    [{
+        "label": "谯城区",
+        "value": "341602"
+      },
+      {
+        "label": "涡阳县",
+        "value": "341621"
+      },
+      {
+        "label": "蒙城县",
+        "value": "341622"
+      },
+      {
+        "label": "利辛县",
+        "value": "341623"
+      }
+    ],
+    [{
+        "label": "贵池区",
+        "value": "341702"
+      },
+      {
+        "label": "东至县",
+        "value": "341721"
+      },
+      {
+        "label": "石台县",
+        "value": "341722"
+      },
+      {
+        "label": "青阳县",
+        "value": "341723"
+      }
+    ],
+    [{
+        "label": "宣州区",
+        "value": "341802"
+      },
+      {
+        "label": "郎溪县",
+        "value": "341821"
+      },
+      {
+        "label": "广德县",
+        "value": "341822"
+      },
+      {
+        "label": "泾县",
+        "value": "341823"
+      },
+      {
+        "label": "绩溪县",
+        "value": "341824"
+      },
+      {
+        "label": "旌德县",
+        "value": "341825"
+      },
+      {
+        "label": "宣城市经济开发区",
+        "value": "341871"
+      },
+      {
+        "label": "宁国市",
+        "value": "341881"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "鼓楼区",
+        "value": "350102"
+      },
+      {
+        "label": "台江区",
+        "value": "350103"
+      },
+      {
+        "label": "仓山区",
+        "value": "350104"
+      },
+      {
+        "label": "马尾区",
+        "value": "350105"
+      },
+      {
+        "label": "晋安区",
+        "value": "350111"
+      },
+      {
+        "label": "闽侯县",
+        "value": "350121"
+      },
+      {
+        "label": "连江县",
+        "value": "350122"
+      },
+      {
+        "label": "罗源县",
+        "value": "350123"
+      },
+      {
+        "label": "闽清县",
+        "value": "350124"
+      },
+      {
+        "label": "永泰县",
+        "value": "350125"
+      },
+      {
+        "label": "平潭县",
+        "value": "350128"
+      },
+      {
+        "label": "福清市",
+        "value": "350181"
+      },
+      {
+        "label": "长乐市",
+        "value": "350182"
+      }
+    ],
+    [{
+        "label": "思明区",
+        "value": "350203"
+      },
+      {
+        "label": "海沧区",
+        "value": "350205"
+      },
+      {
+        "label": "湖里区",
+        "value": "350206"
+      },
+      {
+        "label": "集美区",
+        "value": "350211"
+      },
+      {
+        "label": "同安区",
+        "value": "350212"
+      },
+      {
+        "label": "翔安区",
+        "value": "350213"
+      }
+    ],
+    [{
+        "label": "城厢区",
+        "value": "350302"
+      },
+      {
+        "label": "涵江区",
+        "value": "350303"
+      },
+      {
+        "label": "荔城区",
+        "value": "350304"
+      },
+      {
+        "label": "秀屿区",
+        "value": "350305"
+      },
+      {
+        "label": "仙游县",
+        "value": "350322"
+      }
+    ],
+    [{
+        "label": "梅列区",
+        "value": "350402"
+      },
+      {
+        "label": "三元区",
+        "value": "350403"
+      },
+      {
+        "label": "明溪县",
+        "value": "350421"
+      },
+      {
+        "label": "清流县",
+        "value": "350423"
+      },
+      {
+        "label": "宁化县",
+        "value": "350424"
+      },
+      {
+        "label": "大田县",
+        "value": "350425"
+      },
+      {
+        "label": "尤溪县",
+        "value": "350426"
+      },
+      {
+        "label": "沙县",
+        "value": "350427"
+      },
+      {
+        "label": "将乐县",
+        "value": "350428"
+      },
+      {
+        "label": "泰宁县",
+        "value": "350429"
+      },
+      {
+        "label": "建宁县",
+        "value": "350430"
+      },
+      {
+        "label": "永安市",
+        "value": "350481"
+      }
+    ],
+    [{
+        "label": "鲤城区",
+        "value": "350502"
+      },
+      {
+        "label": "丰泽区",
+        "value": "350503"
+      },
+      {
+        "label": "洛江区",
+        "value": "350504"
+      },
+      {
+        "label": "泉港区",
+        "value": "350505"
+      },
+      {
+        "label": "惠安县",
+        "value": "350521"
+      },
+      {
+        "label": "安溪县",
+        "value": "350524"
+      },
+      {
+        "label": "永春县",
+        "value": "350525"
+      },
+      {
+        "label": "德化县",
+        "value": "350526"
+      },
+      {
+        "label": "金门县",
+        "value": "350527"
+      },
+      {
+        "label": "石狮市",
+        "value": "350581"
+      },
+      {
+        "label": "晋江市",
+        "value": "350582"
+      },
+      {
+        "label": "南安市",
+        "value": "350583"
+      }
+    ],
+    [{
+        "label": "芗城区",
+        "value": "350602"
+      },
+      {
+        "label": "龙文区",
+        "value": "350603"
+      },
+      {
+        "label": "云霄县",
+        "value": "350622"
+      },
+      {
+        "label": "漳浦县",
+        "value": "350623"
+      },
+      {
+        "label": "诏安县",
+        "value": "350624"
+      },
+      {
+        "label": "长泰县",
+        "value": "350625"
+      },
+      {
+        "label": "东山县",
+        "value": "350626"
+      },
+      {
+        "label": "南靖县",
+        "value": "350627"
+      },
+      {
+        "label": "平和县",
+        "value": "350628"
+      },
+      {
+        "label": "华安县",
+        "value": "350629"
+      },
+      {
+        "label": "龙海市",
+        "value": "350681"
+      }
+    ],
+    [{
+        "label": "延平区",
+        "value": "350702"
+      },
+      {
+        "label": "建阳区",
+        "value": "350703"
+      },
+      {
+        "label": "顺昌县",
+        "value": "350721"
+      },
+      {
+        "label": "浦城县",
+        "value": "350722"
+      },
+      {
+        "label": "光泽县",
+        "value": "350723"
+      },
+      {
+        "label": "松溪县",
+        "value": "350724"
+      },
+      {
+        "label": "政和县",
+        "value": "350725"
+      },
+      {
+        "label": "邵武市",
+        "value": "350781"
+      },
+      {
+        "label": "武夷山市",
+        "value": "350782"
+      },
+      {
+        "label": "建瓯市",
+        "value": "350783"
+      }
+    ],
+    [{
+        "label": "新罗区",
+        "value": "350802"
+      },
+      {
+        "label": "永定区",
+        "value": "350803"
+      },
+      {
+        "label": "长汀县",
+        "value": "350821"
+      },
+      {
+        "label": "上杭县",
+        "value": "350823"
+      },
+      {
+        "label": "武平县",
+        "value": "350824"
+      },
+      {
+        "label": "连城县",
+        "value": "350825"
+      },
+      {
+        "label": "漳平市",
+        "value": "350881"
+      }
+    ],
+    [{
+        "label": "蕉城区",
+        "value": "350902"
+      },
+      {
+        "label": "霞浦县",
+        "value": "350921"
+      },
+      {
+        "label": "古田县",
+        "value": "350922"
+      },
+      {
+        "label": "屏南县",
+        "value": "350923"
+      },
+      {
+        "label": "寿宁县",
+        "value": "350924"
+      },
+      {
+        "label": "周宁县",
+        "value": "350925"
+      },
+      {
+        "label": "柘荣县",
+        "value": "350926"
+      },
+      {
+        "label": "福安市",
+        "value": "350981"
+      },
+      {
+        "label": "福鼎市",
+        "value": "350982"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "东湖区",
+        "value": "360102"
+      },
+      {
+        "label": "西湖区",
+        "value": "360103"
+      },
+      {
+        "label": "青云谱区",
+        "value": "360104"
+      },
+      {
+        "label": "湾里区",
+        "value": "360105"
+      },
+      {
+        "label": "青山湖区",
+        "value": "360111"
+      },
+      {
+        "label": "新建区",
+        "value": "360112"
+      },
+      {
+        "label": "南昌县",
+        "value": "360121"
+      },
+      {
+        "label": "安义县",
+        "value": "360123"
+      },
+      {
+        "label": "进贤县",
+        "value": "360124"
+      }
+    ],
+    [{
+        "label": "昌江区",
+        "value": "360202"
+      },
+      {
+        "label": "珠山区",
+        "value": "360203"
+      },
+      {
+        "label": "浮梁县",
+        "value": "360222"
+      },
+      {
+        "label": "乐平市",
+        "value": "360281"
+      }
+    ],
+    [{
+        "label": "安源区",
+        "value": "360302"
+      },
+      {
+        "label": "湘东区",
+        "value": "360313"
+      },
+      {
+        "label": "莲花县",
+        "value": "360321"
+      },
+      {
+        "label": "上栗县",
+        "value": "360322"
+      },
+      {
+        "label": "芦溪县",
+        "value": "360323"
+      }
+    ],
+    [{
+        "label": "濂溪区",
+        "value": "360402"
+      },
+      {
+        "label": "浔阳区",
+        "value": "360403"
+      },
+      {
+        "label": "柴桑区",
+        "value": "360404"
+      },
+      {
+        "label": "武宁县",
+        "value": "360423"
+      },
+      {
+        "label": "修水县",
+        "value": "360424"
+      },
+      {
+        "label": "永修县",
+        "value": "360425"
+      },
+      {
+        "label": "德安县",
+        "value": "360426"
+      },
+      {
+        "label": "都昌县",
+        "value": "360428"
+      },
+      {
+        "label": "湖口县",
+        "value": "360429"
+      },
+      {
+        "label": "彭泽县",
+        "value": "360430"
+      },
+      {
+        "label": "瑞昌市",
+        "value": "360481"
+      },
+      {
+        "label": "共青城市",
+        "value": "360482"
+      },
+      {
+        "label": "庐山市",
+        "value": "360483"
+      }
+    ],
+    [{
+        "label": "渝水区",
+        "value": "360502"
+      },
+      {
+        "label": "分宜县",
+        "value": "360521"
+      }
+    ],
+    [{
+        "label": "月湖区",
+        "value": "360602"
+      },
+      {
+        "label": "余江县",
+        "value": "360622"
+      },
+      {
+        "label": "贵溪市",
+        "value": "360681"
+      }
+    ],
+    [{
+        "label": "章贡区",
+        "value": "360702"
+      },
+      {
+        "label": "南康区",
+        "value": "360703"
+      },
+      {
+        "label": "赣县区",
+        "value": "360704"
+      },
+      {
+        "label": "信丰县",
+        "value": "360722"
+      },
+      {
+        "label": "大余县",
+        "value": "360723"
+      },
+      {
+        "label": "上犹县",
+        "value": "360724"
+      },
+      {
+        "label": "崇义县",
+        "value": "360725"
+      },
+      {
+        "label": "安远县",
+        "value": "360726"
+      },
+      {
+        "label": "龙南县",
+        "value": "360727"
+      },
+      {
+        "label": "定南县",
+        "value": "360728"
+      },
+      {
+        "label": "全南县",
+        "value": "360729"
+      },
+      {
+        "label": "宁都县",
+        "value": "360730"
+      },
+      {
+        "label": "于都县",
+        "value": "360731"
+      },
+      {
+        "label": "兴国县",
+        "value": "360732"
+      },
+      {
+        "label": "会昌县",
+        "value": "360733"
+      },
+      {
+        "label": "寻乌县",
+        "value": "360734"
+      },
+      {
+        "label": "石城县",
+        "value": "360735"
+      },
+      {
+        "label": "瑞金市",
+        "value": "360781"
+      }
+    ],
+    [{
+        "label": "吉州区",
+        "value": "360802"
+      },
+      {
+        "label": "青原区",
+        "value": "360803"
+      },
+      {
+        "label": "吉安县",
+        "value": "360821"
+      },
+      {
+        "label": "吉水县",
+        "value": "360822"
+      },
+      {
+        "label": "峡江县",
+        "value": "360823"
+      },
+      {
+        "label": "新干县",
+        "value": "360824"
+      },
+      {
+        "label": "永丰县",
+        "value": "360825"
+      },
+      {
+        "label": "泰和县",
+        "value": "360826"
+      },
+      {
+        "label": "遂川县",
+        "value": "360827"
+      },
+      {
+        "label": "万安县",
+        "value": "360828"
+      },
+      {
+        "label": "安福县",
+        "value": "360829"
+      },
+      {
+        "label": "永新县",
+        "value": "360830"
+      },
+      {
+        "label": "井冈山市",
+        "value": "360881"
+      }
+    ],
+    [{
+        "label": "袁州区",
+        "value": "360902"
+      },
+      {
+        "label": "奉新县",
+        "value": "360921"
+      },
+      {
+        "label": "万载县",
+        "value": "360922"
+      },
+      {
+        "label": "上高县",
+        "value": "360923"
+      },
+      {
+        "label": "宜丰县",
+        "value": "360924"
+      },
+      {
+        "label": "靖安县",
+        "value": "360925"
+      },
+      {
+        "label": "铜鼓县",
+        "value": "360926"
+      },
+      {
+        "label": "丰城市",
+        "value": "360981"
+      },
+      {
+        "label": "樟树市",
+        "value": "360982"
+      },
+      {
+        "label": "高安市",
+        "value": "360983"
+      }
+    ],
+    [{
+        "label": "临川区",
+        "value": "361002"
+      },
+      {
+        "label": "东乡区",
+        "value": "361003"
+      },
+      {
+        "label": "南城县",
+        "value": "361021"
+      },
+      {
+        "label": "黎川县",
+        "value": "361022"
+      },
+      {
+        "label": "南丰县",
+        "value": "361023"
+      },
+      {
+        "label": "崇仁县",
+        "value": "361024"
+      },
+      {
+        "label": "乐安县",
+        "value": "361025"
+      },
+      {
+        "label": "宜黄县",
+        "value": "361026"
+      },
+      {
+        "label": "金溪县",
+        "value": "361027"
+      },
+      {
+        "label": "资溪县",
+        "value": "361028"
+      },
+      {
+        "label": "广昌县",
+        "value": "361030"
+      }
+    ],
+    [{
+        "label": "信州区",
+        "value": "361102"
+      },
+      {
+        "label": "广丰区",
+        "value": "361103"
+      },
+      {
+        "label": "上饶县",
+        "value": "361121"
+      },
+      {
+        "label": "玉山县",
+        "value": "361123"
+      },
+      {
+        "label": "铅山县",
+        "value": "361124"
+      },
+      {
+        "label": "横峰县",
+        "value": "361125"
+      },
+      {
+        "label": "弋阳县",
+        "value": "361126"
+      },
+      {
+        "label": "余干县",
+        "value": "361127"
+      },
+      {
+        "label": "鄱阳县",
+        "value": "361128"
+      },
+      {
+        "label": "万年县",
+        "value": "361129"
+      },
+      {
+        "label": "婺源县",
+        "value": "361130"
+      },
+      {
+        "label": "德兴市",
+        "value": "361181"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "历下区",
+        "value": "370102"
+      },
+      {
+        "label": "市中区",
+        "value": "370103"
+      },
+      {
+        "label": "槐荫区",
+        "value": "370104"
+      },
+      {
+        "label": "天桥区",
+        "value": "370105"
+      },
+      {
+        "label": "历城区",
+        "value": "370112"
+      },
+      {
+        "label": "长清区",
+        "value": "370113"
+      },
+      {
+        "label": "章丘区",
+        "value": "370114"
+      },
+      {
+        "label": "平阴县",
+        "value": "370124"
+      },
+      {
+        "label": "济阳县",
+        "value": "370125"
+      },
+      {
+        "label": "商河县",
+        "value": "370126"
+      },
+      {
+        "label": "济南高新技术产业开发区",
+        "value": "370171"
+      }
+    ],
+    [{
+        "label": "市南区",
+        "value": "370202"
+      },
+      {
+        "label": "市北区",
+        "value": "370203"
+      },
+      {
+        "label": "黄岛区",
+        "value": "370211"
+      },
+      {
+        "label": "崂山区",
+        "value": "370212"
+      },
+      {
+        "label": "李沧区",
+        "value": "370213"
+      },
+      {
+        "label": "城阳区",
+        "value": "370214"
+      },
+      {
+        "label": "即墨区",
+        "value": "370215"
+      },
+      {
+        "label": "青岛高新技术产业开发区",
+        "value": "370271"
+      },
+      {
+        "label": "胶州市",
+        "value": "370281"
+      },
+      {
+        "label": "平度市",
+        "value": "370283"
+      },
+      {
+        "label": "莱西市",
+        "value": "370285"
+      }
+    ],
+    [{
+        "label": "淄川区",
+        "value": "370302"
+      },
+      {
+        "label": "张店区",
+        "value": "370303"
+      },
+      {
+        "label": "博山区",
+        "value": "370304"
+      },
+      {
+        "label": "临淄区",
+        "value": "370305"
+      },
+      {
+        "label": "周村区",
+        "value": "370306"
+      },
+      {
+        "label": "桓台县",
+        "value": "370321"
+      },
+      {
+        "label": "高青县",
+        "value": "370322"
+      },
+      {
+        "label": "沂源县",
+        "value": "370323"
+      }
+    ],
+    [{
+        "label": "市中区",
+        "value": "370402"
+      },
+      {
+        "label": "薛城区",
+        "value": "370403"
+      },
+      {
+        "label": "峄城区",
+        "value": "370404"
+      },
+      {
+        "label": "台儿庄区",
+        "value": "370405"
+      },
+      {
+        "label": "山亭区",
+        "value": "370406"
+      },
+      {
+        "label": "滕州市",
+        "value": "370481"
+      }
+    ],
+    [{
+        "label": "东营区",
+        "value": "370502"
+      },
+      {
+        "label": "河口区",
+        "value": "370503"
+      },
+      {
+        "label": "垦利区",
+        "value": "370505"
+      },
+      {
+        "label": "利津县",
+        "value": "370522"
+      },
+      {
+        "label": "广饶县",
+        "value": "370523"
+      },
+      {
+        "label": "东营经济技术开发区",
+        "value": "370571"
+      },
+      {
+        "label": "东营港经济开发区",
+        "value": "370572"
+      }
+    ],
+    [{
+        "label": "芝罘区",
+        "value": "370602"
+      },
+      {
+        "label": "福山区",
+        "value": "370611"
+      },
+      {
+        "label": "牟平区",
+        "value": "370612"
+      },
+      {
+        "label": "莱山区",
+        "value": "370613"
+      },
+      {
+        "label": "长岛县",
+        "value": "370634"
+      },
+      {
+        "label": "烟台高新技术产业开发区",
+        "value": "370671"
+      },
+      {
+        "label": "烟台经济技术开发区",
+        "value": "370672"
+      },
+      {
+        "label": "龙口市",
+        "value": "370681"
+      },
+      {
+        "label": "莱阳市",
+        "value": "370682"
+      },
+      {
+        "label": "莱州市",
+        "value": "370683"
+      },
+      {
+        "label": "蓬莱市",
+        "value": "370684"
+      },
+      {
+        "label": "招远市",
+        "value": "370685"
+      },
+      {
+        "label": "栖霞市",
+        "value": "370686"
+      },
+      {
+        "label": "海阳市",
+        "value": "370687"
+      }
+    ],
+    [{
+        "label": "潍城区",
+        "value": "370702"
+      },
+      {
+        "label": "寒亭区",
+        "value": "370703"
+      },
+      {
+        "label": "坊子区",
+        "value": "370704"
+      },
+      {
+        "label": "奎文区",
+        "value": "370705"
+      },
+      {
+        "label": "临朐县",
+        "value": "370724"
+      },
+      {
+        "label": "昌乐县",
+        "value": "370725"
+      },
+      {
+        "label": "潍坊滨海经济技术开发区",
+        "value": "370772"
+      },
+      {
+        "label": "青州市",
+        "value": "370781"
+      },
+      {
+        "label": "诸城市",
+        "value": "370782"
+      },
+      {
+        "label": "寿光市",
+        "value": "370783"
+      },
+      {
+        "label": "安丘市",
+        "value": "370784"
+      },
+      {
+        "label": "高密市",
+        "value": "370785"
+      },
+      {
+        "label": "昌邑市",
+        "value": "370786"
+      }
+    ],
+    [{
+        "label": "任城区",
+        "value": "370811"
+      },
+      {
+        "label": "兖州区",
+        "value": "370812"
+      },
+      {
+        "label": "微山县",
+        "value": "370826"
+      },
+      {
+        "label": "鱼台县",
+        "value": "370827"
+      },
+      {
+        "label": "金乡县",
+        "value": "370828"
+      },
+      {
+        "label": "嘉祥县",
+        "value": "370829"
+      },
+      {
+        "label": "汶上县",
+        "value": "370830"
+      },
+      {
+        "label": "泗水县",
+        "value": "370831"
+      },
+      {
+        "label": "梁山县",
+        "value": "370832"
+      },
+      {
+        "label": "济宁高新技术产业开发区",
+        "value": "370871"
+      },
+      {
+        "label": "曲阜市",
+        "value": "370881"
+      },
+      {
+        "label": "邹城市",
+        "value": "370883"
+      }
+    ],
+    [{
+        "label": "泰山区",
+        "value": "370902"
+      },
+      {
+        "label": "岱岳区",
+        "value": "370911"
+      },
+      {
+        "label": "宁阳县",
+        "value": "370921"
+      },
+      {
+        "label": "东平县",
+        "value": "370923"
+      },
+      {
+        "label": "新泰市",
+        "value": "370982"
+      },
+      {
+        "label": "肥城市",
+        "value": "370983"
+      }
+    ],
+    [{
+        "label": "环翠区",
+        "value": "371002"
+      },
+      {
+        "label": "文登区",
+        "value": "371003"
+      },
+      {
+        "label": "威海火炬高技术产业开发区",
+        "value": "371071"
+      },
+      {
+        "label": "威海经济技术开发区",
+        "value": "371072"
+      },
+      {
+        "label": "威海临港经济技术开发区",
+        "value": "371073"
+      },
+      {
+        "label": "荣成市",
+        "value": "371082"
+      },
+      {
+        "label": "乳山市",
+        "value": "371083"
+      }
+    ],
+    [{
+        "label": "东港区",
+        "value": "371102"
+      },
+      {
+        "label": "岚山区",
+        "value": "371103"
+      },
+      {
+        "label": "五莲县",
+        "value": "371121"
+      },
+      {
+        "label": "莒县",
+        "value": "371122"
+      },
+      {
+        "label": "日照经济技术开发区",
+        "value": "371171"
+      },
+      {
+        "label": "日照国际海洋城",
+        "value": "371172"
+      }
+    ],
+    [{
+        "label": "莱城区",
+        "value": "371202"
+      },
+      {
+        "label": "钢城区",
+        "value": "371203"
+      }
+    ],
+    [{
+        "label": "兰山区",
+        "value": "371302"
+      },
+      {
+        "label": "罗庄区",
+        "value": "371311"
+      },
+      {
+        "label": "河东区",
+        "value": "371312"
+      },
+      {
+        "label": "沂南县",
+        "value": "371321"
+      },
+      {
+        "label": "郯城县",
+        "value": "371322"
+      },
+      {
+        "label": "沂水县",
+        "value": "371323"
+      },
+      {
+        "label": "兰陵县",
+        "value": "371324"
+      },
+      {
+        "label": "费县",
+        "value": "371325"
+      },
+      {
+        "label": "平邑县",
+        "value": "371326"
+      },
+      {
+        "label": "莒南县",
+        "value": "371327"
+      },
+      {
+        "label": "蒙阴县",
+        "value": "371328"
+      },
+      {
+        "label": "临沭县",
+        "value": "371329"
+      },
+      {
+        "label": "临沂高新技术产业开发区",
+        "value": "371371"
+      },
+      {
+        "label": "临沂经济技术开发区",
+        "value": "371372"
+      },
+      {
+        "label": "临沂临港经济开发区",
+        "value": "371373"
+      }
+    ],
+    [{
+        "label": "德城区",
+        "value": "371402"
+      },
+      {
+        "label": "陵城区",
+        "value": "371403"
+      },
+      {
+        "label": "宁津县",
+        "value": "371422"
+      },
+      {
+        "label": "庆云县",
+        "value": "371423"
+      },
+      {
+        "label": "临邑县",
+        "value": "371424"
+      },
+      {
+        "label": "齐河县",
+        "value": "371425"
+      },
+      {
+        "label": "平原县",
+        "value": "371426"
+      },
+      {
+        "label": "夏津县",
+        "value": "371427"
+      },
+      {
+        "label": "武城县",
+        "value": "371428"
+      },
+      {
+        "label": "德州经济技术开发区",
+        "value": "371471"
+      },
+      {
+        "label": "德州运河经济开发区",
+        "value": "371472"
+      },
+      {
+        "label": "乐陵市",
+        "value": "371481"
+      },
+      {
+        "label": "禹城市",
+        "value": "371482"
+      }
+    ],
+    [{
+        "label": "东昌府区",
+        "value": "371502"
+      },
+      {
+        "label": "阳谷县",
+        "value": "371521"
+      },
+      {
+        "label": "莘县",
+        "value": "371522"
+      },
+      {
+        "label": "茌平县",
+        "value": "371523"
+      },
+      {
+        "label": "东阿县",
+        "value": "371524"
+      },
+      {
+        "label": "冠县",
+        "value": "371525"
+      },
+      {
+        "label": "高唐县",
+        "value": "371526"
+      },
+      {
+        "label": "临清市",
+        "value": "371581"
+      }
+    ],
+    [{
+        "label": "滨城区",
+        "value": "371602"
+      },
+      {
+        "label": "沾化区",
+        "value": "371603"
+      },
+      {
+        "label": "惠民县",
+        "value": "371621"
+      },
+      {
+        "label": "阳信县",
+        "value": "371622"
+      },
+      {
+        "label": "无棣县",
+        "value": "371623"
+      },
+      {
+        "label": "博兴县",
+        "value": "371625"
+      },
+      {
+        "label": "邹平县",
+        "value": "371626"
+      }
+    ],
+    [{
+        "label": "牡丹区",
+        "value": "371702"
+      },
+      {
+        "label": "定陶区",
+        "value": "371703"
+      },
+      {
+        "label": "曹县",
+        "value": "371721"
+      },
+      {
+        "label": "单县",
+        "value": "371722"
+      },
+      {
+        "label": "成武县",
+        "value": "371723"
+      },
+      {
+        "label": "巨野县",
+        "value": "371724"
+      },
+      {
+        "label": "郓城县",
+        "value": "371725"
+      },
+      {
+        "label": "鄄城县",
+        "value": "371726"
+      },
+      {
+        "label": "东明县",
+        "value": "371728"
+      },
+      {
+        "label": "菏泽经济技术开发区",
+        "value": "371771"
+      },
+      {
+        "label": "菏泽高新技术开发区",
+        "value": "371772"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "中原区",
+        "value": "410102"
+      },
+      {
+        "label": "二七区",
+        "value": "410103"
+      },
+      {
+        "label": "管城回族区",
+        "value": "410104"
+      },
+      {
+        "label": "金水区",
+        "value": "410105"
+      },
+      {
+        "label": "上街区",
+        "value": "410106"
+      },
+      {
+        "label": "惠济区",
+        "value": "410108"
+      },
+      {
+        "label": "中牟县",
+        "value": "410122"
+      },
+      {
+        "label": "郑州经济技术开发区",
+        "value": "410171"
+      },
+      {
+        "label": "郑州高新技术产业开发区",
+        "value": "410172"
+      },
+      {
+        "label": "郑州航空港经济综合实验区",
+        "value": "410173"
+      },
+      {
+        "label": "巩义市",
+        "value": "410181"
+      },
+      {
+        "label": "荥阳市",
+        "value": "410182"
+      },
+      {
+        "label": "新密市",
+        "value": "410183"
+      },
+      {
+        "label": "新郑市",
+        "value": "410184"
+      },
+      {
+        "label": "登封市",
+        "value": "410185"
+      }
+    ],
+    [{
+        "label": "龙亭区",
+        "value": "410202"
+      },
+      {
+        "label": "顺河回族区",
+        "value": "410203"
+      },
+      {
+        "label": "鼓楼区",
+        "value": "410204"
+      },
+      {
+        "label": "禹王台区",
+        "value": "410205"
+      },
+      {
+        "label": "祥符区",
+        "value": "410212"
+      },
+      {
+        "label": "杞县",
+        "value": "410221"
+      },
+      {
+        "label": "通许县",
+        "value": "410222"
+      },
+      {
+        "label": "尉氏县",
+        "value": "410223"
+      },
+      {
+        "label": "兰考县",
+        "value": "410225"
+      }
+    ],
+    [{
+        "label": "老城区",
+        "value": "410302"
+      },
+      {
+        "label": "西工区",
+        "value": "410303"
+      },
+      {
+        "label": "瀍河回族区",
+        "value": "410304"
+      },
+      {
+        "label": "涧西区",
+        "value": "410305"
+      },
+      {
+        "label": "吉利区",
+        "value": "410306"
+      },
+      {
+        "label": "洛龙区",
+        "value": "410311"
+      },
+      {
+        "label": "孟津县",
+        "value": "410322"
+      },
+      {
+        "label": "新安县",
+        "value": "410323"
+      },
+      {
+        "label": "栾川县",
+        "value": "410324"
+      },
+      {
+        "label": "嵩县",
+        "value": "410325"
+      },
+      {
+        "label": "汝阳县",
+        "value": "410326"
+      },
+      {
+        "label": "宜阳县",
+        "value": "410327"
+      },
+      {
+        "label": "洛宁县",
+        "value": "410328"
+      },
+      {
+        "label": "伊川县",
+        "value": "410329"
+      },
+      {
+        "label": "洛阳高新技术产业开发区",
+        "value": "410371"
+      },
+      {
+        "label": "偃师市",
+        "value": "410381"
+      }
+    ],
+    [{
+        "label": "新华区",
+        "value": "410402"
+      },
+      {
+        "label": "卫东区",
+        "value": "410403"
+      },
+      {
+        "label": "石龙区",
+        "value": "410404"
+      },
+      {
+        "label": "湛河区",
+        "value": "410411"
+      },
+      {
+        "label": "宝丰县",
+        "value": "410421"
+      },
+      {
+        "label": "叶县",
+        "value": "410422"
+      },
+      {
+        "label": "鲁山县",
+        "value": "410423"
+      },
+      {
+        "label": "郏县",
+        "value": "410425"
+      },
+      {
+        "label": "平顶山高新技术产业开发区",
+        "value": "410471"
+      },
+      {
+        "label": "平顶山市新城区",
+        "value": "410472"
+      },
+      {
+        "label": "舞钢市",
+        "value": "410481"
+      },
+      {
+        "label": "汝州市",
+        "value": "410482"
+      }
+    ],
+    [{
+        "label": "文峰区",
+        "value": "410502"
+      },
+      {
+        "label": "北关区",
+        "value": "410503"
+      },
+      {
+        "label": "殷都区",
+        "value": "410505"
+      },
+      {
+        "label": "龙安区",
+        "value": "410506"
+      },
+      {
+        "label": "安阳县",
+        "value": "410522"
+      },
+      {
+        "label": "汤阴县",
+        "value": "410523"
+      },
+      {
+        "label": "滑县",
+        "value": "410526"
+      },
+      {
+        "label": "内黄县",
+        "value": "410527"
+      },
+      {
+        "label": "安阳高新技术产业开发区",
+        "value": "410571"
+      },
+      {
+        "label": "林州市",
+        "value": "410581"
+      }
+    ],
+    [{
+        "label": "鹤山区",
+        "value": "410602"
+      },
+      {
+        "label": "山城区",
+        "value": "410603"
+      },
+      {
+        "label": "淇滨区",
+        "value": "410611"
+      },
+      {
+        "label": "浚县",
+        "value": "410621"
+      },
+      {
+        "label": "淇县",
+        "value": "410622"
+      },
+      {
+        "label": "鹤壁经济技术开发区",
+        "value": "410671"
+      }
+    ],
+    [{
+        "label": "红旗区",
+        "value": "410702"
+      },
+      {
+        "label": "卫滨区",
+        "value": "410703"
+      },
+      {
+        "label": "凤泉区",
+        "value": "410704"
+      },
+      {
+        "label": "牧野区",
+        "value": "410711"
+      },
+      {
+        "label": "新乡县",
+        "value": "410721"
+      },
+      {
+        "label": "获嘉县",
+        "value": "410724"
+      },
+      {
+        "label": "原阳县",
+        "value": "410725"
+      },
+      {
+        "label": "延津县",
+        "value": "410726"
+      },
+      {
+        "label": "封丘县",
+        "value": "410727"
+      },
+      {
+        "label": "长垣县",
+        "value": "410728"
+      },
+      {
+        "label": "新乡高新技术产业开发区",
+        "value": "410771"
+      },
+      {
+        "label": "新乡经济技术开发区",
+        "value": "410772"
+      },
+      {
+        "label": "新乡市平原城乡一体化示范区",
+        "value": "410773"
+      },
+      {
+        "label": "卫辉市",
+        "value": "410781"
+      },
+      {
+        "label": "辉县市",
+        "value": "410782"
+      }
+    ],
+    [{
+        "label": "解放区",
+        "value": "410802"
+      },
+      {
+        "label": "中站区",
+        "value": "410803"
+      },
+      {
+        "label": "马村区",
+        "value": "410804"
+      },
+      {
+        "label": "山阳区",
+        "value": "410811"
+      },
+      {
+        "label": "修武县",
+        "value": "410821"
+      },
+      {
+        "label": "博爱县",
+        "value": "410822"
+      },
+      {
+        "label": "武陟县",
+        "value": "410823"
+      },
+      {
+        "label": "温县",
+        "value": "410825"
+      },
+      {
+        "label": "焦作城乡一体化示范区",
+        "value": "410871"
+      },
+      {
+        "label": "沁阳市",
+        "value": "410882"
+      },
+      {
+        "label": "孟州市",
+        "value": "410883"
+      }
+    ],
+    [{
+        "label": "华龙区",
+        "value": "410902"
+      },
+      {
+        "label": "清丰县",
+        "value": "410922"
+      },
+      {
+        "label": "南乐县",
+        "value": "410923"
+      },
+      {
+        "label": "范县",
+        "value": "410926"
+      },
+      {
+        "label": "台前县",
+        "value": "410927"
+      },
+      {
+        "label": "濮阳县",
+        "value": "410928"
+      },
+      {
+        "label": "河南濮阳工业园区",
+        "value": "410971"
+      },
+      {
+        "label": "濮阳经济技术开发区",
+        "value": "410972"
+      }
+    ],
+    [{
+        "label": "魏都区",
+        "value": "411002"
+      },
+      {
+        "label": "建安区",
+        "value": "411003"
+      },
+      {
+        "label": "鄢陵县",
+        "value": "411024"
+      },
+      {
+        "label": "襄城县",
+        "value": "411025"
+      },
+      {
+        "label": "许昌经济技术开发区",
+        "value": "411071"
+      },
+      {
+        "label": "禹州市",
+        "value": "411081"
+      },
+      {
+        "label": "长葛市",
+        "value": "411082"
+      }
+    ],
+    [{
+        "label": "源汇区",
+        "value": "411102"
+      },
+      {
+        "label": "郾城区",
+        "value": "411103"
+      },
+      {
+        "label": "召陵区",
+        "value": "411104"
+      },
+      {
+        "label": "舞阳县",
+        "value": "411121"
+      },
+      {
+        "label": "临颍县",
+        "value": "411122"
+      },
+      {
+        "label": "漯河经济技术开发区",
+        "value": "411171"
+      }
+    ],
+    [{
+        "label": "湖滨区",
+        "value": "411202"
+      },
+      {
+        "label": "陕州区",
+        "value": "411203"
+      },
+      {
+        "label": "渑池县",
+        "value": "411221"
+      },
+      {
+        "label": "卢氏县",
+        "value": "411224"
+      },
+      {
+        "label": "河南三门峡经济开发区",
+        "value": "411271"
+      },
+      {
+        "label": "义马市",
+        "value": "411281"
+      },
+      {
+        "label": "灵宝市",
+        "value": "411282"
+      }
+    ],
+    [{
+        "label": "宛城区",
+        "value": "411302"
+      },
+      {
+        "label": "卧龙区",
+        "value": "411303"
+      },
+      {
+        "label": "南召县",
+        "value": "411321"
+      },
+      {
+        "label": "方城县",
+        "value": "411322"
+      },
+      {
+        "label": "西峡县",
+        "value": "411323"
+      },
+      {
+        "label": "镇平县",
+        "value": "411324"
+      },
+      {
+        "label": "内乡县",
+        "value": "411325"
+      },
+      {
+        "label": "淅川县",
+        "value": "411326"
+      },
+      {
+        "label": "社旗县",
+        "value": "411327"
+      },
+      {
+        "label": "唐河县",
+        "value": "411328"
+      },
+      {
+        "label": "新野县",
+        "value": "411329"
+      },
+      {
+        "label": "桐柏县",
+        "value": "411330"
+      },
+      {
+        "label": "南阳高新技术产业开发区",
+        "value": "411371"
+      },
+      {
+        "label": "南阳市城乡一体化示范区",
+        "value": "411372"
+      },
+      {
+        "label": "邓州市",
+        "value": "411381"
+      }
+    ],
+    [{
+        "label": "梁园区",
+        "value": "411402"
+      },
+      {
+        "label": "睢阳区",
+        "value": "411403"
+      },
+      {
+        "label": "民权县",
+        "value": "411421"
+      },
+      {
+        "label": "睢县",
+        "value": "411422"
+      },
+      {
+        "label": "宁陵县",
+        "value": "411423"
+      },
+      {
+        "label": "柘城县",
+        "value": "411424"
+      },
+      {
+        "label": "虞城县",
+        "value": "411425"
+      },
+      {
+        "label": "夏邑县",
+        "value": "411426"
+      },
+      {
+        "label": "豫东综合物流产业聚集区",
+        "value": "411471"
+      },
+      {
+        "label": "河南商丘经济开发区",
+        "value": "411472"
+      },
+      {
+        "label": "永城市",
+        "value": "411481"
+      }
+    ],
+    [{
+        "label": "浉河区",
+        "value": "411502"
+      },
+      {
+        "label": "平桥区",
+        "value": "411503"
+      },
+      {
+        "label": "罗山县",
+        "value": "411521"
+      },
+      {
+        "label": "光山县",
+        "value": "411522"
+      },
+      {
+        "label": "新县",
+        "value": "411523"
+      },
+      {
+        "label": "商城县",
+        "value": "411524"
+      },
+      {
+        "label": "固始县",
+        "value": "411525"
+      },
+      {
+        "label": "潢川县",
+        "value": "411526"
+      },
+      {
+        "label": "淮滨县",
+        "value": "411527"
+      },
+      {
+        "label": "息县",
+        "value": "411528"
+      },
+      {
+        "label": "信阳高新技术产业开发区",
+        "value": "411571"
+      }
+    ],
+    [{
+        "label": "川汇区",
+        "value": "411602"
+      },
+      {
+        "label": "扶沟县",
+        "value": "411621"
+      },
+      {
+        "label": "西华县",
+        "value": "411622"
+      },
+      {
+        "label": "商水县",
+        "value": "411623"
+      },
+      {
+        "label": "沈丘县",
+        "value": "411624"
+      },
+      {
+        "label": "郸城县",
+        "value": "411625"
+      },
+      {
+        "label": "淮阳县",
+        "value": "411626"
+      },
+      {
+        "label": "太康县",
+        "value": "411627"
+      },
+      {
+        "label": "鹿邑县",
+        "value": "411628"
+      },
+      {
+        "label": "河南周口经济开发区",
+        "value": "411671"
+      },
+      {
+        "label": "项城市",
+        "value": "411681"
+      }
+    ],
+    [{
+        "label": "驿城区",
+        "value": "411702"
+      },
+      {
+        "label": "西平县",
+        "value": "411721"
+      },
+      {
+        "label": "上蔡县",
+        "value": "411722"
+      },
+      {
+        "label": "平舆县",
+        "value": "411723"
+      },
+      {
+        "label": "正阳县",
+        "value": "411724"
+      },
+      {
+        "label": "确山县",
+        "value": "411725"
+      },
+      {
+        "label": "泌阳县",
+        "value": "411726"
+      },
+      {
+        "label": "汝南县",
+        "value": "411727"
+      },
+      {
+        "label": "遂平县",
+        "value": "411728"
+      },
+      {
+        "label": "新蔡县",
+        "value": "411729"
+      },
+      {
+        "label": "河南驻马店经济开发区",
+        "value": "411771"
+      }
+    ],
+    [{
+      "label": "济源市",
+      "value": "419001"
+    }]
+  ],
+  [
+    [{
+        "label": "江岸区",
+        "value": "420102"
+      },
+      {
+        "label": "江汉区",
+        "value": "420103"
+      },
+      {
+        "label": "硚口区",
+        "value": "420104"
+      },
+      {
+        "label": "汉阳区",
+        "value": "420105"
+      },
+      {
+        "label": "武昌区",
+        "value": "420106"
+      },
+      {
+        "label": "青山区",
+        "value": "420107"
+      },
+      {
+        "label": "洪山区",
+        "value": "420111"
+      },
+      {
+        "label": "东西湖区",
+        "value": "420112"
+      },
+      {
+        "label": "汉南区",
+        "value": "420113"
+      },
+      {
+        "label": "蔡甸区",
+        "value": "420114"
+      },
+      {
+        "label": "江夏区",
+        "value": "420115"
+      },
+      {
+        "label": "黄陂区",
+        "value": "420116"
+      },
+      {
+        "label": "新洲区",
+        "value": "420117"
+      }
+    ],
+    [{
+        "label": "黄石港区",
+        "value": "420202"
+      },
+      {
+        "label": "西塞山区",
+        "value": "420203"
+      },
+      {
+        "label": "下陆区",
+        "value": "420204"
+      },
+      {
+        "label": "铁山区",
+        "value": "420205"
+      },
+      {
+        "label": "阳新县",
+        "value": "420222"
+      },
+      {
+        "label": "大冶市",
+        "value": "420281"
+      }
+    ],
+    [{
+        "label": "茅箭区",
+        "value": "420302"
+      },
+      {
+        "label": "张湾区",
+        "value": "420303"
+      },
+      {
+        "label": "郧阳区",
+        "value": "420304"
+      },
+      {
+        "label": "郧西县",
+        "value": "420322"
+      },
+      {
+        "label": "竹山县",
+        "value": "420323"
+      },
+      {
+        "label": "竹溪县",
+        "value": "420324"
+      },
+      {
+        "label": "房县",
+        "value": "420325"
+      },
+      {
+        "label": "丹江口市",
+        "value": "420381"
+      }
+    ],
+    [{
+        "label": "西陵区",
+        "value": "420502"
+      },
+      {
+        "label": "伍家岗区",
+        "value": "420503"
+      },
+      {
+        "label": "点军区",
+        "value": "420504"
+      },
+      {
+        "label": "猇亭区",
+        "value": "420505"
+      },
+      {
+        "label": "夷陵区",
+        "value": "420506"
+      },
+      {
+        "label": "远安县",
+        "value": "420525"
+      },
+      {
+        "label": "兴山县",
+        "value": "420526"
+      },
+      {
+        "label": "秭归县",
+        "value": "420527"
+      },
+      {
+        "label": "长阳土家族自治县",
+        "value": "420528"
+      },
+      {
+        "label": "五峰土家族自治县",
+        "value": "420529"
+      },
+      {
+        "label": "宜都市",
+        "value": "420581"
+      },
+      {
+        "label": "当阳市",
+        "value": "420582"
+      },
+      {
+        "label": "枝江市",
+        "value": "420583"
+      }
+    ],
+    [{
+        "label": "襄城区",
+        "value": "420602"
+      },
+      {
+        "label": "樊城区",
+        "value": "420606"
+      },
+      {
+        "label": "襄州区",
+        "value": "420607"
+      },
+      {
+        "label": "南漳县",
+        "value": "420624"
+      },
+      {
+        "label": "谷城县",
+        "value": "420625"
+      },
+      {
+        "label": "保康县",
+        "value": "420626"
+      },
+      {
+        "label": "老河口市",
+        "value": "420682"
+      },
+      {
+        "label": "枣阳市",
+        "value": "420683"
+      },
+      {
+        "label": "宜城市",
+        "value": "420684"
+      }
+    ],
+    [{
+        "label": "梁子湖区",
+        "value": "420702"
+      },
+      {
+        "label": "华容区",
+        "value": "420703"
+      },
+      {
+        "label": "鄂城区",
+        "value": "420704"
+      }
+    ],
+    [{
+        "label": "东宝区",
+        "value": "420802"
+      },
+      {
+        "label": "掇刀区",
+        "value": "420804"
+      },
+      {
+        "label": "京山县",
+        "value": "420821"
+      },
+      {
+        "label": "沙洋县",
+        "value": "420822"
+      },
+      {
+        "label": "钟祥市",
+        "value": "420881"
+      }
+    ],
+    [{
+        "label": "孝南区",
+        "value": "420902"
+      },
+      {
+        "label": "孝昌县",
+        "value": "420921"
+      },
+      {
+        "label": "大悟县",
+        "value": "420922"
+      },
+      {
+        "label": "云梦县",
+        "value": "420923"
+      },
+      {
+        "label": "应城市",
+        "value": "420981"
+      },
+      {
+        "label": "安陆市",
+        "value": "420982"
+      },
+      {
+        "label": "汉川市",
+        "value": "420984"
+      }
+    ],
+    [{
+        "label": "沙市区",
+        "value": "421002"
+      },
+      {
+        "label": "荆州区",
+        "value": "421003"
+      },
+      {
+        "label": "公安县",
+        "value": "421022"
+      },
+      {
+        "label": "监利县",
+        "value": "421023"
+      },
+      {
+        "label": "江陵县",
+        "value": "421024"
+      },
+      {
+        "label": "荆州经济技术开发区",
+        "value": "421071"
+      },
+      {
+        "label": "石首市",
+        "value": "421081"
+      },
+      {
+        "label": "洪湖市",
+        "value": "421083"
+      },
+      {
+        "label": "松滋市",
+        "value": "421087"
+      }
+    ],
+    [{
+        "label": "黄州区",
+        "value": "421102"
+      },
+      {
+        "label": "团风县",
+        "value": "421121"
+      },
+      {
+        "label": "红安县",
+        "value": "421122"
+      },
+      {
+        "label": "罗田县",
+        "value": "421123"
+      },
+      {
+        "label": "英山县",
+        "value": "421124"
+      },
+      {
+        "label": "浠水县",
+        "value": "421125"
+      },
+      {
+        "label": "蕲春县",
+        "value": "421126"
+      },
+      {
+        "label": "黄梅县",
+        "value": "421127"
+      },
+      {
+        "label": "龙感湖管理区",
+        "value": "421171"
+      },
+      {
+        "label": "麻城市",
+        "value": "421181"
+      },
+      {
+        "label": "武穴市",
+        "value": "421182"
+      }
+    ],
+    [{
+        "label": "咸安区",
+        "value": "421202"
+      },
+      {
+        "label": "嘉鱼县",
+        "value": "421221"
+      },
+      {
+        "label": "通城县",
+        "value": "421222"
+      },
+      {
+        "label": "崇阳县",
+        "value": "421223"
+      },
+      {
+        "label": "通山县",
+        "value": "421224"
+      },
+      {
+        "label": "赤壁市",
+        "value": "421281"
+      }
+    ],
+    [{
+        "label": "曾都区",
+        "value": "421303"
+      },
+      {
+        "label": "随县",
+        "value": "421321"
+      },
+      {
+        "label": "广水市",
+        "value": "421381"
+      }
+    ],
+    [{
+        "label": "恩施市",
+        "value": "422801"
+      },
+      {
+        "label": "利川市",
+        "value": "422802"
+      },
+      {
+        "label": "建始县",
+        "value": "422822"
+      },
+      {
+        "label": "巴东县",
+        "value": "422823"
+      },
+      {
+        "label": "宣恩县",
+        "value": "422825"
+      },
+      {
+        "label": "咸丰县",
+        "value": "422826"
+      },
+      {
+        "label": "来凤县",
+        "value": "422827"
+      },
+      {
+        "label": "鹤峰县",
+        "value": "422828"
+      }
+    ],
+    [{
+        "label": "仙桃市",
+        "value": "429004"
+      },
+      {
+        "label": "潜江市",
+        "value": "429005"
+      },
+      {
+        "label": "天门市",
+        "value": "429006"
+      },
+      {
+        "label": "神农架林区",
+        "value": "429021"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "芙蓉区",
+        "value": "430102"
+      },
+      {
+        "label": "天心区",
+        "value": "430103"
+      },
+      {
+        "label": "岳麓区",
+        "value": "430104"
+      },
+      {
+        "label": "开福区",
+        "value": "430105"
+      },
+      {
+        "label": "雨花区",
+        "value": "430111"
+      },
+      {
+        "label": "望城区",
+        "value": "430112"
+      },
+      {
+        "label": "长沙县",
+        "value": "430121"
+      },
+      {
+        "label": "浏阳市",
+        "value": "430181"
+      },
+      {
+        "label": "宁乡市",
+        "value": "430182"
+      }
+    ],
+    [{
+        "label": "荷塘区",
+        "value": "430202"
+      },
+      {
+        "label": "芦淞区",
+        "value": "430203"
+      },
+      {
+        "label": "石峰区",
+        "value": "430204"
+      },
+      {
+        "label": "天元区",
+        "value": "430211"
+      },
+      {
+        "label": "株洲县",
+        "value": "430221"
+      },
+      {
+        "label": "攸县",
+        "value": "430223"
+      },
+      {
+        "label": "茶陵县",
+        "value": "430224"
+      },
+      {
+        "label": "炎陵县",
+        "value": "430225"
+      },
+      {
+        "label": "云龙示范区",
+        "value": "430271"
+      },
+      {
+        "label": "醴陵市",
+        "value": "430281"
+      }
+    ],
+    [{
+        "label": "雨湖区",
+        "value": "430302"
+      },
+      {
+        "label": "岳塘区",
+        "value": "430304"
+      },
+      {
+        "label": "湘潭县",
+        "value": "430321"
+      },
+      {
+        "label": "湖南湘潭高新技术产业园区",
+        "value": "430371"
+      },
+      {
+        "label": "湘潭昭山示范区",
+        "value": "430372"
+      },
+      {
+        "label": "湘潭九华示范区",
+        "value": "430373"
+      },
+      {
+        "label": "湘乡市",
+        "value": "430381"
+      },
+      {
+        "label": "韶山市",
+        "value": "430382"
+      }
+    ],
+    [{
+        "label": "珠晖区",
+        "value": "430405"
+      },
+      {
+        "label": "雁峰区",
+        "value": "430406"
+      },
+      {
+        "label": "石鼓区",
+        "value": "430407"
+      },
+      {
+        "label": "蒸湘区",
+        "value": "430408"
+      },
+      {
+        "label": "南岳区",
+        "value": "430412"
+      },
+      {
+        "label": "衡阳县",
+        "value": "430421"
+      },
+      {
+        "label": "衡南县",
+        "value": "430422"
+      },
+      {
+        "label": "衡山县",
+        "value": "430423"
+      },
+      {
+        "label": "衡东县",
+        "value": "430424"
+      },
+      {
+        "label": "祁东县",
+        "value": "430426"
+      },
+      {
+        "label": "衡阳综合保税区",
+        "value": "430471"
+      },
+      {
+        "label": "湖南衡阳高新技术产业园区",
+        "value": "430472"
+      },
+      {
+        "label": "湖南衡阳松木经济开发区",
+        "value": "430473"
+      },
+      {
+        "label": "耒阳市",
+        "value": "430481"
+      },
+      {
+        "label": "常宁市",
+        "value": "430482"
+      }
+    ],
+    [{
+        "label": "双清区",
+        "value": "430502"
+      },
+      {
+        "label": "大祥区",
+        "value": "430503"
+      },
+      {
+        "label": "北塔区",
+        "value": "430511"
+      },
+      {
+        "label": "邵东县",
+        "value": "430521"
+      },
+      {
+        "label": "新邵县",
+        "value": "430522"
+      },
+      {
+        "label": "邵阳县",
+        "value": "430523"
+      },
+      {
+        "label": "隆回县",
+        "value": "430524"
+      },
+      {
+        "label": "洞口县",
+        "value": "430525"
+      },
+      {
+        "label": "绥宁县",
+        "value": "430527"
+      },
+      {
+        "label": "新宁县",
+        "value": "430528"
+      },
+      {
+        "label": "城步苗族自治县",
+        "value": "430529"
+      },
+      {
+        "label": "武冈市",
+        "value": "430581"
+      }
+    ],
+    [{
+        "label": "岳阳楼区",
+        "value": "430602"
+      },
+      {
+        "label": "云溪区",
+        "value": "430603"
+      },
+      {
+        "label": "君山区",
+        "value": "430611"
+      },
+      {
+        "label": "岳阳县",
+        "value": "430621"
+      },
+      {
+        "label": "华容县",
+        "value": "430623"
+      },
+      {
+        "label": "湘阴县",
+        "value": "430624"
+      },
+      {
+        "label": "平江县",
+        "value": "430626"
+      },
+      {
+        "label": "岳阳市屈原管理区",
+        "value": "430671"
+      },
+      {
+        "label": "汨罗市",
+        "value": "430681"
+      },
+      {
+        "label": "临湘市",
+        "value": "430682"
+      }
+    ],
+    [{
+        "label": "武陵区",
+        "value": "430702"
+      },
+      {
+        "label": "鼎城区",
+        "value": "430703"
+      },
+      {
+        "label": "安乡县",
+        "value": "430721"
+      },
+      {
+        "label": "汉寿县",
+        "value": "430722"
+      },
+      {
+        "label": "澧县",
+        "value": "430723"
+      },
+      {
+        "label": "临澧县",
+        "value": "430724"
+      },
+      {
+        "label": "桃源县",
+        "value": "430725"
+      },
+      {
+        "label": "石门县",
+        "value": "430726"
+      },
+      {
+        "label": "常德市西洞庭管理区",
+        "value": "430771"
+      },
+      {
+        "label": "津市市",
+        "value": "430781"
+      }
+    ],
+    [{
+        "label": "永定区",
+        "value": "430802"
+      },
+      {
+        "label": "武陵源区",
+        "value": "430811"
+      },
+      {
+        "label": "慈利县",
+        "value": "430821"
+      },
+      {
+        "label": "桑植县",
+        "value": "430822"
+      }
+    ],
+    [{
+        "label": "资阳区",
+        "value": "430902"
+      },
+      {
+        "label": "赫山区",
+        "value": "430903"
+      },
+      {
+        "label": "南县",
+        "value": "430921"
+      },
+      {
+        "label": "桃江县",
+        "value": "430922"
+      },
+      {
+        "label": "安化县",
+        "value": "430923"
+      },
+      {
+        "label": "益阳市大通湖管理区",
+        "value": "430971"
+      },
+      {
+        "label": "湖南益阳高新技术产业园区",
+        "value": "430972"
+      },
+      {
+        "label": "沅江市",
+        "value": "430981"
+      }
+    ],
+    [{
+        "label": "北湖区",
+        "value": "431002"
+      },
+      {
+        "label": "苏仙区",
+        "value": "431003"
+      },
+      {
+        "label": "桂阳县",
+        "value": "431021"
+      },
+      {
+        "label": "宜章县",
+        "value": "431022"
+      },
+      {
+        "label": "永兴县",
+        "value": "431023"
+      },
+      {
+        "label": "嘉禾县",
+        "value": "431024"
+      },
+      {
+        "label": "临武县",
+        "value": "431025"
+      },
+      {
+        "label": "汝城县",
+        "value": "431026"
+      },
+      {
+        "label": "桂东县",
+        "value": "431027"
+      },
+      {
+        "label": "安仁县",
+        "value": "431028"
+      },
+      {
+        "label": "资兴市",
+        "value": "431081"
+      }
+    ],
+    [{
+        "label": "零陵区",
+        "value": "431102"
+      },
+      {
+        "label": "冷水滩区",
+        "value": "431103"
+      },
+      {
+        "label": "祁阳县",
+        "value": "431121"
+      },
+      {
+        "label": "东安县",
+        "value": "431122"
+      },
+      {
+        "label": "双牌县",
+        "value": "431123"
+      },
+      {
+        "label": "道县",
+        "value": "431124"
+      },
+      {
+        "label": "江永县",
+        "value": "431125"
+      },
+      {
+        "label": "宁远县",
+        "value": "431126"
+      },
+      {
+        "label": "蓝山县",
+        "value": "431127"
+      },
+      {
+        "label": "新田县",
+        "value": "431128"
+      },
+      {
+        "label": "江华瑶族自治县",
+        "value": "431129"
+      },
+      {
+        "label": "永州经济技术开发区",
+        "value": "431171"
+      },
+      {
+        "label": "永州市金洞管理区",
+        "value": "431172"
+      },
+      {
+        "label": "永州市回龙圩管理区",
+        "value": "431173"
+      }
+    ],
+    [{
+        "label": "鹤城区",
+        "value": "431202"
+      },
+      {
+        "label": "中方县",
+        "value": "431221"
+      },
+      {
+        "label": "沅陵县",
+        "value": "431222"
+      },
+      {
+        "label": "辰溪县",
+        "value": "431223"
+      },
+      {
+        "label": "溆浦县",
+        "value": "431224"
+      },
+      {
+        "label": "会同县",
+        "value": "431225"
+      },
+      {
+        "label": "麻阳苗族自治县",
+        "value": "431226"
+      },
+      {
+        "label": "新晃侗族自治县",
+        "value": "431227"
+      },
+      {
+        "label": "芷江侗族自治县",
+        "value": "431228"
+      },
+      {
+        "label": "靖州苗族侗族自治县",
+        "value": "431229"
+      },
+      {
+        "label": "通道侗族自治县",
+        "value": "431230"
+      },
+      {
+        "label": "怀化市洪江管理区",
+        "value": "431271"
+      },
+      {
+        "label": "洪江市",
+        "value": "431281"
+      }
+    ],
+    [{
+        "label": "娄星区",
+        "value": "431302"
+      },
+      {
+        "label": "双峰县",
+        "value": "431321"
+      },
+      {
+        "label": "新化县",
+        "value": "431322"
+      },
+      {
+        "label": "冷水江市",
+        "value": "431381"
+      },
+      {
+        "label": "涟源市",
+        "value": "431382"
+      }
+    ],
+    [{
+        "label": "吉首市",
+        "value": "433101"
+      },
+      {
+        "label": "泸溪县",
+        "value": "433122"
+      },
+      {
+        "label": "凤凰县",
+        "value": "433123"
+      },
+      {
+        "label": "花垣县",
+        "value": "433124"
+      },
+      {
+        "label": "保靖县",
+        "value": "433125"
+      },
+      {
+        "label": "古丈县",
+        "value": "433126"
+      },
+      {
+        "label": "永顺县",
+        "value": "433127"
+      },
+      {
+        "label": "龙山县",
+        "value": "433130"
+      },
+      {
+        "label": "湖南吉首经济开发区",
+        "value": "433172"
+      },
+      {
+        "label": "湖南永顺经济开发区",
+        "value": "433173"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "荔湾区",
+        "value": "440103"
+      },
+      {
+        "label": "越秀区",
+        "value": "440104"
+      },
+      {
+        "label": "海珠区",
+        "value": "440105"
+      },
+      {
+        "label": "天河区",
+        "value": "440106"
+      },
+      {
+        "label": "白云区",
+        "value": "440111"
+      },
+      {
+        "label": "黄埔区",
+        "value": "440112"
+      },
+      {
+        "label": "番禺区",
+        "value": "440113"
+      },
+      {
+        "label": "花都区",
+        "value": "440114"
+      },
+      {
+        "label": "南沙区",
+        "value": "440115"
+      },
+      {
+        "label": "从化区",
+        "value": "440117"
+      },
+      {
+        "label": "增城区",
+        "value": "440118"
+      }
+    ],
+    [{
+        "label": "武江区",
+        "value": "440203"
+      },
+      {
+        "label": "浈江区",
+        "value": "440204"
+      },
+      {
+        "label": "曲江区",
+        "value": "440205"
+      },
+      {
+        "label": "始兴县",
+        "value": "440222"
+      },
+      {
+        "label": "仁化县",
+        "value": "440224"
+      },
+      {
+        "label": "翁源县",
+        "value": "440229"
+      },
+      {
+        "label": "乳源瑶族自治县",
+        "value": "440232"
+      },
+      {
+        "label": "新丰县",
+        "value": "440233"
+      },
+      {
+        "label": "乐昌市",
+        "value": "440281"
+      },
+      {
+        "label": "南雄市",
+        "value": "440282"
+      }
+    ],
+    [{
+        "label": "罗湖区",
+        "value": "440303"
+      },
+      {
+        "label": "福田区",
+        "value": "440304"
+      },
+      {
+        "label": "南山区",
+        "value": "440305"
+      },
+      {
+        "label": "宝安区",
+        "value": "440306"
+      },
+      {
+        "label": "龙岗区",
+        "value": "440307"
+      },
+      {
+        "label": "盐田区",
+        "value": "440308"
+      },
+      {
+        "label": "龙华区",
+        "value": "440309"
+      },
+      {
+        "label": "坪山区",
+        "value": "440310"
+      }
+    ],
+    [{
+        "label": "香洲区",
+        "value": "440402"
+      },
+      {
+        "label": "斗门区",
+        "value": "440403"
+      },
+      {
+        "label": "金湾区",
+        "value": "440404"
+      }
+    ],
+    [{
+        "label": "龙湖区",
+        "value": "440507"
+      },
+      {
+        "label": "金平区",
+        "value": "440511"
+      },
+      {
+        "label": "濠江区",
+        "value": "440512"
+      },
+      {
+        "label": "潮阳区",
+        "value": "440513"
+      },
+      {
+        "label": "潮南区",
+        "value": "440514"
+      },
+      {
+        "label": "澄海区",
+        "value": "440515"
+      },
+      {
+        "label": "南澳县",
+        "value": "440523"
+      }
+    ],
+    [{
+        "label": "禅城区",
+        "value": "440604"
+      },
+      {
+        "label": "南海区",
+        "value": "440605"
+      },
+      {
+        "label": "顺德区",
+        "value": "440606"
+      },
+      {
+        "label": "三水区",
+        "value": "440607"
+      },
+      {
+        "label": "高明区",
+        "value": "440608"
+      }
+    ],
+    [{
+        "label": "蓬江区",
+        "value": "440703"
+      },
+      {
+        "label": "江海区",
+        "value": "440704"
+      },
+      {
+        "label": "新会区",
+        "value": "440705"
+      },
+      {
+        "label": "台山市",
+        "value": "440781"
+      },
+      {
+        "label": "开平市",
+        "value": "440783"
+      },
+      {
+        "label": "鹤山市",
+        "value": "440784"
+      },
+      {
+        "label": "恩平市",
+        "value": "440785"
+      }
+    ],
+    [{
+        "label": "赤坎区",
+        "value": "440802"
+      },
+      {
+        "label": "霞山区",
+        "value": "440803"
+      },
+      {
+        "label": "坡头区",
+        "value": "440804"
+      },
+      {
+        "label": "麻章区",
+        "value": "440811"
+      },
+      {
+        "label": "遂溪县",
+        "value": "440823"
+      },
+      {
+        "label": "徐闻县",
+        "value": "440825"
+      },
+      {
+        "label": "廉江市",
+        "value": "440881"
+      },
+      {
+        "label": "雷州市",
+        "value": "440882"
+      },
+      {
+        "label": "吴川市",
+        "value": "440883"
+      }
+    ],
+    [{
+        "label": "茂南区",
+        "value": "440902"
+      },
+      {
+        "label": "电白区",
+        "value": "440904"
+      },
+      {
+        "label": "高州市",
+        "value": "440981"
+      },
+      {
+        "label": "化州市",
+        "value": "440982"
+      },
+      {
+        "label": "信宜市",
+        "value": "440983"
+      }
+    ],
+    [{
+        "label": "端州区",
+        "value": "441202"
+      },
+      {
+        "label": "鼎湖区",
+        "value": "441203"
+      },
+      {
+        "label": "高要区",
+        "value": "441204"
+      },
+      {
+        "label": "广宁县",
+        "value": "441223"
+      },
+      {
+        "label": "怀集县",
+        "value": "441224"
+      },
+      {
+        "label": "封开县",
+        "value": "441225"
+      },
+      {
+        "label": "德庆县",
+        "value": "441226"
+      },
+      {
+        "label": "四会市",
+        "value": "441284"
+      }
+    ],
+    [{
+        "label": "惠城区",
+        "value": "441302"
+      },
+      {
+        "label": "惠阳区",
+        "value": "441303"
+      },
+      {
+        "label": "博罗县",
+        "value": "441322"
+      },
+      {
+        "label": "惠东县",
+        "value": "441323"
+      },
+      {
+        "label": "龙门县",
+        "value": "441324"
+      }
+    ],
+    [{
+        "label": "梅江区",
+        "value": "441402"
+      },
+      {
+        "label": "梅县区",
+        "value": "441403"
+      },
+      {
+        "label": "大埔县",
+        "value": "441422"
+      },
+      {
+        "label": "丰顺县",
+        "value": "441423"
+      },
+      {
+        "label": "五华县",
+        "value": "441424"
+      },
+      {
+        "label": "平远县",
+        "value": "441426"
+      },
+      {
+        "label": "蕉岭县",
+        "value": "441427"
+      },
+      {
+        "label": "兴宁市",
+        "value": "441481"
+      }
+    ],
+    [{
+        "label": "城区",
+        "value": "441502"
+      },
+      {
+        "label": "海丰县",
+        "value": "441521"
+      },
+      {
+        "label": "陆河县",
+        "value": "441523"
+      },
+      {
+        "label": "陆丰市",
+        "value": "441581"
+      }
+    ],
+    [{
+        "label": "源城区",
+        "value": "441602"
+      },
+      {
+        "label": "紫金县",
+        "value": "441621"
+      },
+      {
+        "label": "龙川县",
+        "value": "441622"
+      },
+      {
+        "label": "连平县",
+        "value": "441623"
+      },
+      {
+        "label": "和平县",
+        "value": "441624"
+      },
+      {
+        "label": "东源县",
+        "value": "441625"
+      }
+    ],
+    [{
+        "label": "江城区",
+        "value": "441702"
+      },
+      {
+        "label": "阳东区",
+        "value": "441704"
+      },
+      {
+        "label": "阳西县",
+        "value": "441721"
+      },
+      {
+        "label": "阳春市",
+        "value": "441781"
+      }
+    ],
+    [{
+        "label": "清城区",
+        "value": "441802"
+      },
+      {
+        "label": "清新区",
+        "value": "441803"
+      },
+      {
+        "label": "佛冈县",
+        "value": "441821"
+      },
+      {
+        "label": "阳山县",
+        "value": "441823"
+      },
+      {
+        "label": "连山壮族瑶族自治县",
+        "value": "441825"
+      },
+      {
+        "label": "连南瑶族自治县",
+        "value": "441826"
+      },
+      {
+        "label": "英德市",
+        "value": "441881"
+      },
+      {
+        "label": "连州市",
+        "value": "441882"
+      }
+    ],
+    [{
+      "label": "东莞市",
+      "value": "441900"
+    }],
+    [{
+      "label": "中山市",
+      "value": "442000"
+    }],
+    [{
+        "label": "湘桥区",
+        "value": "445102"
+      },
+      {
+        "label": "潮安区",
+        "value": "445103"
+      },
+      {
+        "label": "饶平县",
+        "value": "445122"
+      }
+    ],
+    [{
+        "label": "榕城区",
+        "value": "445202"
+      },
+      {
+        "label": "揭东区",
+        "value": "445203"
+      },
+      {
+        "label": "揭西县",
+        "value": "445222"
+      },
+      {
+        "label": "惠来县",
+        "value": "445224"
+      },
+      {
+        "label": "普宁市",
+        "value": "445281"
+      }
+    ],
+    [{
+        "label": "云城区",
+        "value": "445302"
+      },
+      {
+        "label": "云安区",
+        "value": "445303"
+      },
+      {
+        "label": "新兴县",
+        "value": "445321"
+      },
+      {
+        "label": "郁南县",
+        "value": "445322"
+      },
+      {
+        "label": "罗定市",
+        "value": "445381"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "兴宁区",
+        "value": "450102"
+      },
+      {
+        "label": "青秀区",
+        "value": "450103"
+      },
+      {
+        "label": "江南区",
+        "value": "450105"
+      },
+      {
+        "label": "西乡塘区",
+        "value": "450107"
+      },
+      {
+        "label": "良庆区",
+        "value": "450108"
+      },
+      {
+        "label": "邕宁区",
+        "value": "450109"
+      },
+      {
+        "label": "武鸣区",
+        "value": "450110"
+      },
+      {
+        "label": "隆安县",
+        "value": "450123"
+      },
+      {
+        "label": "马山县",
+        "value": "450124"
+      },
+      {
+        "label": "上林县",
+        "value": "450125"
+      },
+      {
+        "label": "宾阳县",
+        "value": "450126"
+      },
+      {
+        "label": "横县",
+        "value": "450127"
+      }
+    ],
+    [{
+        "label": "城中区",
+        "value": "450202"
+      },
+      {
+        "label": "鱼峰区",
+        "value": "450203"
+      },
+      {
+        "label": "柳南区",
+        "value": "450204"
+      },
+      {
+        "label": "柳北区",
+        "value": "450205"
+      },
+      {
+        "label": "柳江区",
+        "value": "450206"
+      },
+      {
+        "label": "柳城县",
+        "value": "450222"
+      },
+      {
+        "label": "鹿寨县",
+        "value": "450223"
+      },
+      {
+        "label": "融安县",
+        "value": "450224"
+      },
+      {
+        "label": "融水苗族自治县",
+        "value": "450225"
+      },
+      {
+        "label": "三江侗族自治县",
+        "value": "450226"
+      }
+    ],
+    [{
+        "label": "秀峰区",
+        "value": "450302"
+      },
+      {
+        "label": "叠彩区",
+        "value": "450303"
+      },
+      {
+        "label": "象山区",
+        "value": "450304"
+      },
+      {
+        "label": "七星区",
+        "value": "450305"
+      },
+      {
+        "label": "雁山区",
+        "value": "450311"
+      },
+      {
+        "label": "临桂区",
+        "value": "450312"
+      },
+      {
+        "label": "阳朔县",
+        "value": "450321"
+      },
+      {
+        "label": "灵川县",
+        "value": "450323"
+      },
+      {
+        "label": "全州县",
+        "value": "450324"
+      },
+      {
+        "label": "兴安县",
+        "value": "450325"
+      },
+      {
+        "label": "永福县",
+        "value": "450326"
+      },
+      {
+        "label": "灌阳县",
+        "value": "450327"
+      },
+      {
+        "label": "龙胜各族自治县",
+        "value": "450328"
+      },
+      {
+        "label": "资源县",
+        "value": "450329"
+      },
+      {
+        "label": "平乐县",
+        "value": "450330"
+      },
+      {
+        "label": "荔浦县",
+        "value": "450331"
+      },
+      {
+        "label": "恭城瑶族自治县",
+        "value": "450332"
+      }
+    ],
+    [{
+        "label": "万秀区",
+        "value": "450403"
+      },
+      {
+        "label": "长洲区",
+        "value": "450405"
+      },
+      {
+        "label": "龙圩区",
+        "value": "450406"
+      },
+      {
+        "label": "苍梧县",
+        "value": "450421"
+      },
+      {
+        "label": "藤县",
+        "value": "450422"
+      },
+      {
+        "label": "蒙山县",
+        "value": "450423"
+      },
+      {
+        "label": "岑溪市",
+        "value": "450481"
+      }
+    ],
+    [{
+        "label": "海城区",
+        "value": "450502"
+      },
+      {
+        "label": "银海区",
+        "value": "450503"
+      },
+      {
+        "label": "铁山港区",
+        "value": "450512"
+      },
+      {
+        "label": "合浦县",
+        "value": "450521"
+      }
+    ],
+    [{
+        "label": "港口区",
+        "value": "450602"
+      },
+      {
+        "label": "防城区",
+        "value": "450603"
+      },
+      {
+        "label": "上思县",
+        "value": "450621"
+      },
+      {
+        "label": "东兴市",
+        "value": "450681"
+      }
+    ],
+    [{
+        "label": "钦南区",
+        "value": "450702"
+      },
+      {
+        "label": "钦北区",
+        "value": "450703"
+      },
+      {
+        "label": "灵山县",
+        "value": "450721"
+      },
+      {
+        "label": "浦北县",
+        "value": "450722"
+      }
+    ],
+    [{
+        "label": "港北区",
+        "value": "450802"
+      },
+      {
+        "label": "港南区",
+        "value": "450803"
+      },
+      {
+        "label": "覃塘区",
+        "value": "450804"
+      },
+      {
+        "label": "平南县",
+        "value": "450821"
+      },
+      {
+        "label": "桂平市",
+        "value": "450881"
+      }
+    ],
+    [{
+        "label": "玉州区",
+        "value": "450902"
+      },
+      {
+        "label": "福绵区",
+        "value": "450903"
+      },
+      {
+        "label": "容县",
+        "value": "450921"
+      },
+      {
+        "label": "陆川县",
+        "value": "450922"
+      },
+      {
+        "label": "博白县",
+        "value": "450923"
+      },
+      {
+        "label": "兴业县",
+        "value": "450924"
+      },
+      {
+        "label": "北流市",
+        "value": "450981"
+      }
+    ],
+    [{
+        "label": "右江区",
+        "value": "451002"
+      },
+      {
+        "label": "田阳县",
+        "value": "451021"
+      },
+      {
+        "label": "田东县",
+        "value": "451022"
+      },
+      {
+        "label": "平果县",
+        "value": "451023"
+      },
+      {
+        "label": "德保县",
+        "value": "451024"
+      },
+      {
+        "label": "那坡县",
+        "value": "451026"
+      },
+      {
+        "label": "凌云县",
+        "value": "451027"
+      },
+      {
+        "label": "乐业县",
+        "value": "451028"
+      },
+      {
+        "label": "田林县",
+        "value": "451029"
+      },
+      {
+        "label": "西林县",
+        "value": "451030"
+      },
+      {
+        "label": "隆林各族自治县",
+        "value": "451031"
+      },
+      {
+        "label": "靖西市",
+        "value": "451081"
+      }
+    ],
+    [{
+        "label": "八步区",
+        "value": "451102"
+      },
+      {
+        "label": "平桂区",
+        "value": "451103"
+      },
+      {
+        "label": "昭平县",
+        "value": "451121"
+      },
+      {
+        "label": "钟山县",
+        "value": "451122"
+      },
+      {
+        "label": "富川瑶族自治县",
+        "value": "451123"
+      }
+    ],
+    [{
+        "label": "金城江区",
+        "value": "451202"
+      },
+      {
+        "label": "宜州区",
+        "value": "451203"
+      },
+      {
+        "label": "南丹县",
+        "value": "451221"
+      },
+      {
+        "label": "天峨县",
+        "value": "451222"
+      },
+      {
+        "label": "凤山县",
+        "value": "451223"
+      },
+      {
+        "label": "东兰县",
+        "value": "451224"
+      },
+      {
+        "label": "罗城仫佬族自治县",
+        "value": "451225"
+      },
+      {
+        "label": "环江毛南族自治县",
+        "value": "451226"
+      },
+      {
+        "label": "巴马瑶族自治县",
+        "value": "451227"
+      },
+      {
+        "label": "都安瑶族自治县",
+        "value": "451228"
+      },
+      {
+        "label": "大化瑶族自治县",
+        "value": "451229"
+      }
+    ],
+    [{
+        "label": "兴宾区",
+        "value": "451302"
+      },
+      {
+        "label": "忻城县",
+        "value": "451321"
+      },
+      {
+        "label": "象州县",
+        "value": "451322"
+      },
+      {
+        "label": "武宣县",
+        "value": "451323"
+      },
+      {
+        "label": "金秀瑶族自治县",
+        "value": "451324"
+      },
+      {
+        "label": "合山市",
+        "value": "451381"
+      }
+    ],
+    [{
+        "label": "江州区",
+        "value": "451402"
+      },
+      {
+        "label": "扶绥县",
+        "value": "451421"
+      },
+      {
+        "label": "宁明县",
+        "value": "451422"
+      },
+      {
+        "label": "龙州县",
+        "value": "451423"
+      },
+      {
+        "label": "大新县",
+        "value": "451424"
+      },
+      {
+        "label": "天等县",
+        "value": "451425"
+      },
+      {
+        "label": "凭祥市",
+        "value": "451481"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "秀英区",
+        "value": "460105"
+      },
+      {
+        "label": "龙华区",
+        "value": "460106"
+      },
+      {
+        "label": "琼山区",
+        "value": "460107"
+      },
+      {
+        "label": "美兰区",
+        "value": "460108"
+      }
+    ],
+    [{
+        "label": "海棠区",
+        "value": "460202"
+      },
+      {
+        "label": "吉阳区",
+        "value": "460203"
+      },
+      {
+        "label": "天涯区",
+        "value": "460204"
+      },
+      {
+        "label": "崖州区",
+        "value": "460205"
+      }
+    ],
+    [{
+        "label": "西沙群岛",
+        "value": "460321"
+      },
+      {
+        "label": "南沙群岛",
+        "value": "460322"
+      },
+      {
+        "label": "中沙群岛的岛礁及其海域",
+        "value": "460323"
+      }
+    ],
+    [{
+      "label": "儋州市",
+      "value": "460400"
+    }],
+    [{
+        "label": "五指山市",
+        "value": "469001"
+      },
+      {
+        "label": "琼海市",
+        "value": "469002"
+      },
+      {
+        "label": "文昌市",
+        "value": "469005"
+      },
+      {
+        "label": "万宁市",
+        "value": "469006"
+      },
+      {
+        "label": "东方市",
+        "value": "469007"
+      },
+      {
+        "label": "定安县",
+        "value": "469021"
+      },
+      {
+        "label": "屯昌县",
+        "value": "469022"
+      },
+      {
+        "label": "澄迈县",
+        "value": "469023"
+      },
+      {
+        "label": "临高县",
+        "value": "469024"
+      },
+      {
+        "label": "白沙黎族自治县",
+        "value": "469025"
+      },
+      {
+        "label": "昌江黎族自治县",
+        "value": "469026"
+      },
+      {
+        "label": "乐东黎族自治县",
+        "value": "469027"
+      },
+      {
+        "label": "陵水黎族自治县",
+        "value": "469028"
+      },
+      {
+        "label": "保亭黎族苗族自治县",
+        "value": "469029"
+      },
+      {
+        "label": "琼中黎族苗族自治县",
+        "value": "469030"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "万州区",
+        "value": "500101"
+      },
+      {
+        "label": "涪陵区",
+        "value": "500102"
+      },
+      {
+        "label": "渝中区",
+        "value": "500103"
+      },
+      {
+        "label": "大渡口区",
+        "value": "500104"
+      },
+      {
+        "label": "江北区",
+        "value": "500105"
+      },
+      {
+        "label": "沙坪坝区",
+        "value": "500106"
+      },
+      {
+        "label": "九龙坡区",
+        "value": "500107"
+      },
+      {
+        "label": "南岸区",
+        "value": "500108"
+      },
+      {
+        "label": "北碚区",
+        "value": "500109"
+      },
+      {
+        "label": "綦江区",
+        "value": "500110"
+      },
+      {
+        "label": "大足区",
+        "value": "500111"
+      },
+      {
+        "label": "渝北区",
+        "value": "500112"
+      },
+      {
+        "label": "巴南区",
+        "value": "500113"
+      },
+      {
+        "label": "黔江区",
+        "value": "500114"
+      },
+      {
+        "label": "长寿区",
+        "value": "500115"
+      },
+      {
+        "label": "江津区",
+        "value": "500116"
+      },
+      {
+        "label": "合川区",
+        "value": "500117"
+      },
+      {
+        "label": "永川区",
+        "value": "500118"
+      },
+      {
+        "label": "南川区",
+        "value": "500119"
+      },
+      {
+        "label": "璧山区",
+        "value": "500120"
+      },
+      {
+        "label": "铜梁区",
+        "value": "500151"
+      },
+      {
+        "label": "潼南区",
+        "value": "500152"
+      },
+      {
+        "label": "荣昌区",
+        "value": "500153"
+      },
+      {
+        "label": "开州区",
+        "value": "500154"
+      },
+      {
+        "label": "梁平区",
+        "value": "500155"
+      },
+      {
+        "label": "武隆区",
+        "value": "500156"
+      }
+    ],
+    [{
+        "label": "城口县",
+        "value": "500229"
+      },
+      {
+        "label": "丰都县",
+        "value": "500230"
+      },
+      {
+        "label": "垫江县",
+        "value": "500231"
+      },
+      {
+        "label": "忠县",
+        "value": "500233"
+      },
+      {
+        "label": "云阳县",
+        "value": "500235"
+      },
+      {
+        "label": "奉节县",
+        "value": "500236"
+      },
+      {
+        "label": "巫山县",
+        "value": "500237"
+      },
+      {
+        "label": "巫溪县",
+        "value": "500238"
+      },
+      {
+        "label": "石柱土家族自治县",
+        "value": "500240"
+      },
+      {
+        "label": "秀山土家族苗族自治县",
+        "value": "500241"
+      },
+      {
+        "label": "酉阳土家族苗族自治县",
+        "value": "500242"
+      },
+      {
+        "label": "彭水苗族土家族自治县",
+        "value": "500243"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "锦江区",
+        "value": "510104"
+      },
+      {
+        "label": "青羊区",
+        "value": "510105"
+      },
+      {
+        "label": "金牛区",
+        "value": "510106"
+      },
+      {
+        "label": "武侯区",
+        "value": "510107"
+      },
+      {
+        "label": "成华区",
+        "value": "510108"
+      },
+      {
+        "label": "龙泉驿区",
+        "value": "510112"
+      },
+      {
+        "label": "青白江区",
+        "value": "510113"
+      },
+      {
+        "label": "新都区",
+        "value": "510114"
+      },
+      {
+        "label": "温江区",
+        "value": "510115"
+      },
+      {
+        "label": "双流区",
+        "value": "510116"
+      },
+      {
+        "label": "郫都区",
+        "value": "510117"
+      },
+      {
+        "label": "金堂县",
+        "value": "510121"
+      },
+      {
+        "label": "大邑县",
+        "value": "510129"
+      },
+      {
+        "label": "蒲江县",
+        "value": "510131"
+      },
+      {
+        "label": "新津县",
+        "value": "510132"
+      },
+      {
+        "label": "都江堰市",
+        "value": "510181"
+      },
+      {
+        "label": "彭州市",
+        "value": "510182"
+      },
+      {
+        "label": "邛崃市",
+        "value": "510183"
+      },
+      {
+        "label": "崇州市",
+        "value": "510184"
+      },
+      {
+        "label": "简阳市",
+        "value": "510185"
+      }
+    ],
+    [{
+        "label": "自流井区",
+        "value": "510302"
+      },
+      {
+        "label": "贡井区",
+        "value": "510303"
+      },
+      {
+        "label": "大安区",
+        "value": "510304"
+      },
+      {
+        "label": "沿滩区",
+        "value": "510311"
+      },
+      {
+        "label": "荣县",
+        "value": "510321"
+      },
+      {
+        "label": "富顺县",
+        "value": "510322"
+      }
+    ],
+    [{
+        "label": "东区",
+        "value": "510402"
+      },
+      {
+        "label": "西区",
+        "value": "510403"
+      },
+      {
+        "label": "仁和区",
+        "value": "510411"
+      },
+      {
+        "label": "米易县",
+        "value": "510421"
+      },
+      {
+        "label": "盐边县",
+        "value": "510422"
+      }
+    ],
+    [{
+        "label": "江阳区",
+        "value": "510502"
+      },
+      {
+        "label": "纳溪区",
+        "value": "510503"
+      },
+      {
+        "label": "龙马潭区",
+        "value": "510504"
+      },
+      {
+        "label": "泸县",
+        "value": "510521"
+      },
+      {
+        "label": "合江县",
+        "value": "510522"
+      },
+      {
+        "label": "叙永县",
+        "value": "510524"
+      },
+      {
+        "label": "古蔺县",
+        "value": "510525"
+      }
+    ],
+    [{
+        "label": "旌阳区",
+        "value": "510603"
+      },
+      {
+        "label": "罗江区",
+        "value": "510604"
+      },
+      {
+        "label": "中江县",
+        "value": "510623"
+      },
+      {
+        "label": "广汉市",
+        "value": "510681"
+      },
+      {
+        "label": "什邡市",
+        "value": "510682"
+      },
+      {
+        "label": "绵竹市",
+        "value": "510683"
+      }
+    ],
+    [{
+        "label": "涪城区",
+        "value": "510703"
+      },
+      {
+        "label": "游仙区",
+        "value": "510704"
+      },
+      {
+        "label": "安州区",
+        "value": "510705"
+      },
+      {
+        "label": "三台县",
+        "value": "510722"
+      },
+      {
+        "label": "盐亭县",
+        "value": "510723"
+      },
+      {
+        "label": "梓潼县",
+        "value": "510725"
+      },
+      {
+        "label": "北川羌族自治县",
+        "value": "510726"
+      },
+      {
+        "label": "平武县",
+        "value": "510727"
+      },
+      {
+        "label": "江油市",
+        "value": "510781"
+      }
+    ],
+    [{
+        "label": "利州区",
+        "value": "510802"
+      },
+      {
+        "label": "昭化区",
+        "value": "510811"
+      },
+      {
+        "label": "朝天区",
+        "value": "510812"
+      },
+      {
+        "label": "旺苍县",
+        "value": "510821"
+      },
+      {
+        "label": "青川县",
+        "value": "510822"
+      },
+      {
+        "label": "剑阁县",
+        "value": "510823"
+      },
+      {
+        "label": "苍溪县",
+        "value": "510824"
+      }
+    ],
+    [{
+        "label": "船山区",
+        "value": "510903"
+      },
+      {
+        "label": "安居区",
+        "value": "510904"
+      },
+      {
+        "label": "蓬溪县",
+        "value": "510921"
+      },
+      {
+        "label": "射洪县",
+        "value": "510922"
+      },
+      {
+        "label": "大英县",
+        "value": "510923"
+      }
+    ],
+    [{
+        "label": "市中区",
+        "value": "511002"
+      },
+      {
+        "label": "东兴区",
+        "value": "511011"
+      },
+      {
+        "label": "威远县",
+        "value": "511024"
+      },
+      {
+        "label": "资中县",
+        "value": "511025"
+      },
+      {
+        "label": "内江经济开发区",
+        "value": "511071"
+      },
+      {
+        "label": "隆昌市",
+        "value": "511083"
+      }
+    ],
+    [{
+        "label": "市中区",
+        "value": "511102"
+      },
+      {
+        "label": "沙湾区",
+        "value": "511111"
+      },
+      {
+        "label": "五通桥区",
+        "value": "511112"
+      },
+      {
+        "label": "金口河区",
+        "value": "511113"
+      },
+      {
+        "label": "犍为县",
+        "value": "511123"
+      },
+      {
+        "label": "井研县",
+        "value": "511124"
+      },
+      {
+        "label": "夹江县",
+        "value": "511126"
+      },
+      {
+        "label": "沐川县",
+        "value": "511129"
+      },
+      {
+        "label": "峨边彝族自治县",
+        "value": "511132"
+      },
+      {
+        "label": "马边彝族自治县",
+        "value": "511133"
+      },
+      {
+        "label": "峨眉山市",
+        "value": "511181"
+      }
+    ],
+    [{
+        "label": "顺庆区",
+        "value": "511302"
+      },
+      {
+        "label": "高坪区",
+        "value": "511303"
+      },
+      {
+        "label": "嘉陵区",
+        "value": "511304"
+      },
+      {
+        "label": "南部县",
+        "value": "511321"
+      },
+      {
+        "label": "营山县",
+        "value": "511322"
+      },
+      {
+        "label": "蓬安县",
+        "value": "511323"
+      },
+      {
+        "label": "仪陇县",
+        "value": "511324"
+      },
+      {
+        "label": "西充县",
+        "value": "511325"
+      },
+      {
+        "label": "阆中市",
+        "value": "511381"
+      }
+    ],
+    [{
+        "label": "东坡区",
+        "value": "511402"
+      },
+      {
+        "label": "彭山区",
+        "value": "511403"
+      },
+      {
+        "label": "仁寿县",
+        "value": "511421"
+      },
+      {
+        "label": "洪雅县",
+        "value": "511423"
+      },
+      {
+        "label": "丹棱县",
+        "value": "511424"
+      },
+      {
+        "label": "青神县",
+        "value": "511425"
+      }
+    ],
+    [{
+        "label": "翠屏区",
+        "value": "511502"
+      },
+      {
+        "label": "南溪区",
+        "value": "511503"
+      },
+      {
+        "label": "宜宾县",
+        "value": "511521"
+      },
+      {
+        "label": "江安县",
+        "value": "511523"
+      },
+      {
+        "label": "长宁县",
+        "value": "511524"
+      },
+      {
+        "label": "高县",
+        "value": "511525"
+      },
+      {
+        "label": "珙县",
+        "value": "511526"
+      },
+      {
+        "label": "筠连县",
+        "value": "511527"
+      },
+      {
+        "label": "兴文县",
+        "value": "511528"
+      },
+      {
+        "label": "屏山县",
+        "value": "511529"
+      }
+    ],
+    [{
+        "label": "广安区",
+        "value": "511602"
+      },
+      {
+        "label": "前锋区",
+        "value": "511603"
+      },
+      {
+        "label": "岳池县",
+        "value": "511621"
+      },
+      {
+        "label": "武胜县",
+        "value": "511622"
+      },
+      {
+        "label": "邻水县",
+        "value": "511623"
+      },
+      {
+        "label": "华蓥市",
+        "value": "511681"
+      }
+    ],
+    [{
+        "label": "通川区",
+        "value": "511702"
+      },
+      {
+        "label": "达川区",
+        "value": "511703"
+      },
+      {
+        "label": "宣汉县",
+        "value": "511722"
+      },
+      {
+        "label": "开江县",
+        "value": "511723"
+      },
+      {
+        "label": "大竹县",
+        "value": "511724"
+      },
+      {
+        "label": "渠县",
+        "value": "511725"
+      },
+      {
+        "label": "达州经济开发区",
+        "value": "511771"
+      },
+      {
+        "label": "万源市",
+        "value": "511781"
+      }
+    ],
+    [{
+        "label": "雨城区",
+        "value": "511802"
+      },
+      {
+        "label": "名山区",
+        "value": "511803"
+      },
+      {
+        "label": "荥经县",
+        "value": "511822"
+      },
+      {
+        "label": "汉源县",
+        "value": "511823"
+      },
+      {
+        "label": "石棉县",
+        "value": "511824"
+      },
+      {
+        "label": "天全县",
+        "value": "511825"
+      },
+      {
+        "label": "芦山县",
+        "value": "511826"
+      },
+      {
+        "label": "宝兴县",
+        "value": "511827"
+      }
+    ],
+    [{
+        "label": "巴州区",
+        "value": "511902"
+      },
+      {
+        "label": "恩阳区",
+        "value": "511903"
+      },
+      {
+        "label": "通江县",
+        "value": "511921"
+      },
+      {
+        "label": "南江县",
+        "value": "511922"
+      },
+      {
+        "label": "平昌县",
+        "value": "511923"
+      },
+      {
+        "label": "巴中经济开发区",
+        "value": "511971"
+      }
+    ],
+    [{
+        "label": "雁江区",
+        "value": "512002"
+      },
+      {
+        "label": "安岳县",
+        "value": "512021"
+      },
+      {
+        "label": "乐至县",
+        "value": "512022"
+      }
+    ],
+    [{
+        "label": "马尔康市",
+        "value": "513201"
+      },
+      {
+        "label": "汶川县",
+        "value": "513221"
+      },
+      {
+        "label": "理县",
+        "value": "513222"
+      },
+      {
+        "label": "茂县",
+        "value": "513223"
+      },
+      {
+        "label": "松潘县",
+        "value": "513224"
+      },
+      {
+        "label": "九寨沟县",
+        "value": "513225"
+      },
+      {
+        "label": "金川县",
+        "value": "513226"
+      },
+      {
+        "label": "小金县",
+        "value": "513227"
+      },
+      {
+        "label": "黑水县",
+        "value": "513228"
+      },
+      {
+        "label": "壤塘县",
+        "value": "513230"
+      },
+      {
+        "label": "阿坝县",
+        "value": "513231"
+      },
+      {
+        "label": "若尔盖县",
+        "value": "513232"
+      },
+      {
+        "label": "红原县",
+        "value": "513233"
+      }
+    ],
+    [{
+        "label": "康定市",
+        "value": "513301"
+      },
+      {
+        "label": "泸定县",
+        "value": "513322"
+      },
+      {
+        "label": "丹巴县",
+        "value": "513323"
+      },
+      {
+        "label": "九龙县",
+        "value": "513324"
+      },
+      {
+        "label": "雅江县",
+        "value": "513325"
+      },
+      {
+        "label": "道孚县",
+        "value": "513326"
+      },
+      {
+        "label": "炉霍县",
+        "value": "513327"
+      },
+      {
+        "label": "甘孜县",
+        "value": "513328"
+      },
+      {
+        "label": "新龙县",
+        "value": "513329"
+      },
+      {
+        "label": "德格县",
+        "value": "513330"
+      },
+      {
+        "label": "白玉县",
+        "value": "513331"
+      },
+      {
+        "label": "石渠县",
+        "value": "513332"
+      },
+      {
+        "label": "色达县",
+        "value": "513333"
+      },
+      {
+        "label": "理塘县",
+        "value": "513334"
+      },
+      {
+        "label": "巴塘县",
+        "value": "513335"
+      },
+      {
+        "label": "乡城县",
+        "value": "513336"
+      },
+      {
+        "label": "稻城县",
+        "value": "513337"
+      },
+      {
+        "label": "得荣县",
+        "value": "513338"
+      }
+    ],
+    [{
+        "label": "西昌市",
+        "value": "513401"
+      },
+      {
+        "label": "木里藏族自治县",
+        "value": "513422"
+      },
+      {
+        "label": "盐源县",
+        "value": "513423"
+      },
+      {
+        "label": "德昌县",
+        "value": "513424"
+      },
+      {
+        "label": "会理县",
+        "value": "513425"
+      },
+      {
+        "label": "会东县",
+        "value": "513426"
+      },
+      {
+        "label": "宁南县",
+        "value": "513427"
+      },
+      {
+        "label": "普格县",
+        "value": "513428"
+      },
+      {
+        "label": "布拖县",
+        "value": "513429"
+      },
+      {
+        "label": "金阳县",
+        "value": "513430"
+      },
+      {
+        "label": "昭觉县",
+        "value": "513431"
+      },
+      {
+        "label": "喜德县",
+        "value": "513432"
+      },
+      {
+        "label": "冕宁县",
+        "value": "513433"
+      },
+      {
+        "label": "越西县",
+        "value": "513434"
+      },
+      {
+        "label": "甘洛县",
+        "value": "513435"
+      },
+      {
+        "label": "美姑县",
+        "value": "513436"
+      },
+      {
+        "label": "雷波县",
+        "value": "513437"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "南明区",
+        "value": "520102"
+      },
+      {
+        "label": "云岩区",
+        "value": "520103"
+      },
+      {
+        "label": "花溪区",
+        "value": "520111"
+      },
+      {
+        "label": "乌当区",
+        "value": "520112"
+      },
+      {
+        "label": "白云区",
+        "value": "520113"
+      },
+      {
+        "label": "观山湖区",
+        "value": "520115"
+      },
+      {
+        "label": "开阳县",
+        "value": "520121"
+      },
+      {
+        "label": "息烽县",
+        "value": "520122"
+      },
+      {
+        "label": "修文县",
+        "value": "520123"
+      },
+      {
+        "label": "清镇市",
+        "value": "520181"
+      }
+    ],
+    [{
+        "label": "钟山区",
+        "value": "520201"
+      },
+      {
+        "label": "六枝特区",
+        "value": "520203"
+      },
+      {
+        "label": "水城县",
+        "value": "520221"
+      },
+      {
+        "label": "盘州市",
+        "value": "520281"
+      }
+    ],
+    [{
+        "label": "红花岗区",
+        "value": "520302"
+      },
+      {
+        "label": "汇川区",
+        "value": "520303"
+      },
+      {
+        "label": "播州区",
+        "value": "520304"
+      },
+      {
+        "label": "桐梓县",
+        "value": "520322"
+      },
+      {
+        "label": "绥阳县",
+        "value": "520323"
+      },
+      {
+        "label": "正安县",
+        "value": "520324"
+      },
+      {
+        "label": "道真仡佬族苗族自治县",
+        "value": "520325"
+      },
+      {
+        "label": "务川仡佬族苗族自治县",
+        "value": "520326"
+      },
+      {
+        "label": "凤冈县",
+        "value": "520327"
+      },
+      {
+        "label": "湄潭县",
+        "value": "520328"
+      },
+      {
+        "label": "余庆县",
+        "value": "520329"
+      },
+      {
+        "label": "习水县",
+        "value": "520330"
+      },
+      {
+        "label": "赤水市",
+        "value": "520381"
+      },
+      {
+        "label": "仁怀市",
+        "value": "520382"
+      }
+    ],
+    [{
+        "label": "西秀区",
+        "value": "520402"
+      },
+      {
+        "label": "平坝区",
+        "value": "520403"
+      },
+      {
+        "label": "普定县",
+        "value": "520422"
+      },
+      {
+        "label": "镇宁布依族苗族自治县",
+        "value": "520423"
+      },
+      {
+        "label": "关岭布依族苗族自治县",
+        "value": "520424"
+      },
+      {
+        "label": "紫云苗族布依族自治县",
+        "value": "520425"
+      }
+    ],
+    [{
+        "label": "七星关区",
+        "value": "520502"
+      },
+      {
+        "label": "大方县",
+        "value": "520521"
+      },
+      {
+        "label": "黔西县",
+        "value": "520522"
+      },
+      {
+        "label": "金沙县",
+        "value": "520523"
+      },
+      {
+        "label": "织金县",
+        "value": "520524"
+      },
+      {
+        "label": "纳雍县",
+        "value": "520525"
+      },
+      {
+        "label": "威宁彝族回族苗族自治县",
+        "value": "520526"
+      },
+      {
+        "label": "赫章县",
+        "value": "520527"
+      }
+    ],
+    [{
+        "label": "碧江区",
+        "value": "520602"
+      },
+      {
+        "label": "万山区",
+        "value": "520603"
+      },
+      {
+        "label": "江口县",
+        "value": "520621"
+      },
+      {
+        "label": "玉屏侗族自治县",
+        "value": "520622"
+      },
+      {
+        "label": "石阡县",
+        "value": "520623"
+      },
+      {
+        "label": "思南县",
+        "value": "520624"
+      },
+      {
+        "label": "印江土家族苗族自治县",
+        "value": "520625"
+      },
+      {
+        "label": "德江县",
+        "value": "520626"
+      },
+      {
+        "label": "沿河土家族自治县",
+        "value": "520627"
+      },
+      {
+        "label": "松桃苗族自治县",
+        "value": "520628"
+      }
+    ],
+    [{
+        "label": "兴义市",
+        "value": "522301"
+      },
+      {
+        "label": "兴仁县",
+        "value": "522322"
+      },
+      {
+        "label": "普安县",
+        "value": "522323"
+      },
+      {
+        "label": "晴隆县",
+        "value": "522324"
+      },
+      {
+        "label": "贞丰县",
+        "value": "522325"
+      },
+      {
+        "label": "望谟县",
+        "value": "522326"
+      },
+      {
+        "label": "册亨县",
+        "value": "522327"
+      },
+      {
+        "label": "安龙县",
+        "value": "522328"
+      }
+    ],
+    [{
+        "label": "凯里市",
+        "value": "522601"
+      },
+      {
+        "label": "黄平县",
+        "value": "522622"
+      },
+      {
+        "label": "施秉县",
+        "value": "522623"
+      },
+      {
+        "label": "三穗县",
+        "value": "522624"
+      },
+      {
+        "label": "镇远县",
+        "value": "522625"
+      },
+      {
+        "label": "岑巩县",
+        "value": "522626"
+      },
+      {
+        "label": "天柱县",
+        "value": "522627"
+      },
+      {
+        "label": "锦屏县",
+        "value": "522628"
+      },
+      {
+        "label": "剑河县",
+        "value": "522629"
+      },
+      {
+        "label": "台江县",
+        "value": "522630"
+      },
+      {
+        "label": "黎平县",
+        "value": "522631"
+      },
+      {
+        "label": "榕江县",
+        "value": "522632"
+      },
+      {
+        "label": "从江县",
+        "value": "522633"
+      },
+      {
+        "label": "雷山县",
+        "value": "522634"
+      },
+      {
+        "label": "麻江县",
+        "value": "522635"
+      },
+      {
+        "label": "丹寨县",
+        "value": "522636"
+      }
+    ],
+    [{
+        "label": "都匀市",
+        "value": "522701"
+      },
+      {
+        "label": "福泉市",
+        "value": "522702"
+      },
+      {
+        "label": "荔波县",
+        "value": "522722"
+      },
+      {
+        "label": "贵定县",
+        "value": "522723"
+      },
+      {
+        "label": "瓮安县",
+        "value": "522725"
+      },
+      {
+        "label": "独山县",
+        "value": "522726"
+      },
+      {
+        "label": "平塘县",
+        "value": "522727"
+      },
+      {
+        "label": "罗甸县",
+        "value": "522728"
+      },
+      {
+        "label": "长顺县",
+        "value": "522729"
+      },
+      {
+        "label": "龙里县",
+        "value": "522730"
+      },
+      {
+        "label": "惠水县",
+        "value": "522731"
+      },
+      {
+        "label": "三都水族自治县",
+        "value": "522732"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "五华区",
+        "value": "530102"
+      },
+      {
+        "label": "盘龙区",
+        "value": "530103"
+      },
+      {
+        "label": "官渡区",
+        "value": "530111"
+      },
+      {
+        "label": "西山区",
+        "value": "530112"
+      },
+      {
+        "label": "东川区",
+        "value": "530113"
+      },
+      {
+        "label": "呈贡区",
+        "value": "530114"
+      },
+      {
+        "label": "晋宁区",
+        "value": "530115"
+      },
+      {
+        "label": "富民县",
+        "value": "530124"
+      },
+      {
+        "label": "宜良县",
+        "value": "530125"
+      },
+      {
+        "label": "石林彝族自治县",
+        "value": "530126"
+      },
+      {
+        "label": "嵩明县",
+        "value": "530127"
+      },
+      {
+        "label": "禄劝彝族苗族自治县",
+        "value": "530128"
+      },
+      {
+        "label": "寻甸回族彝族自治县",
+        "value": "530129"
+      },
+      {
+        "label": "安宁市",
+        "value": "530181"
+      }
+    ],
+    [{
+        "label": "麒麟区",
+        "value": "530302"
+      },
+      {
+        "label": "沾益区",
+        "value": "530303"
+      },
+      {
+        "label": "马龙县",
+        "value": "530321"
+      },
+      {
+        "label": "陆良县",
+        "value": "530322"
+      },
+      {
+        "label": "师宗县",
+        "value": "530323"
+      },
+      {
+        "label": "罗平县",
+        "value": "530324"
+      },
+      {
+        "label": "富源县",
+        "value": "530325"
+      },
+      {
+        "label": "会泽县",
+        "value": "530326"
+      },
+      {
+        "label": "宣威市",
+        "value": "530381"
+      }
+    ],
+    [{
+        "label": "红塔区",
+        "value": "530402"
+      },
+      {
+        "label": "江川区",
+        "value": "530403"
+      },
+      {
+        "label": "澄江县",
+        "value": "530422"
+      },
+      {
+        "label": "通海县",
+        "value": "530423"
+      },
+      {
+        "label": "华宁县",
+        "value": "530424"
+      },
+      {
+        "label": "易门县",
+        "value": "530425"
+      },
+      {
+        "label": "峨山彝族自治县",
+        "value": "530426"
+      },
+      {
+        "label": "新平彝族傣族自治县",
+        "value": "530427"
+      },
+      {
+        "label": "元江哈尼族彝族傣族自治县",
+        "value": "530428"
+      }
+    ],
+    [{
+        "label": "隆阳区",
+        "value": "530502"
+      },
+      {
+        "label": "施甸县",
+        "value": "530521"
+      },
+      {
+        "label": "龙陵县",
+        "value": "530523"
+      },
+      {
+        "label": "昌宁县",
+        "value": "530524"
+      },
+      {
+        "label": "腾冲市",
+        "value": "530581"
+      }
+    ],
+    [{
+        "label": "昭阳区",
+        "value": "530602"
+      },
+      {
+        "label": "鲁甸县",
+        "value": "530621"
+      },
+      {
+        "label": "巧家县",
+        "value": "530622"
+      },
+      {
+        "label": "盐津县",
+        "value": "530623"
+      },
+      {
+        "label": "大关县",
+        "value": "530624"
+      },
+      {
+        "label": "永善县",
+        "value": "530625"
+      },
+      {
+        "label": "绥江县",
+        "value": "530626"
+      },
+      {
+        "label": "镇雄县",
+        "value": "530627"
+      },
+      {
+        "label": "彝良县",
+        "value": "530628"
+      },
+      {
+        "label": "威信县",
+        "value": "530629"
+      },
+      {
+        "label": "水富县",
+        "value": "530630"
+      }
+    ],
+    [{
+        "label": "古城区",
+        "value": "530702"
+      },
+      {
+        "label": "玉龙纳西族自治县",
+        "value": "530721"
+      },
+      {
+        "label": "永胜县",
+        "value": "530722"
+      },
+      {
+        "label": "华坪县",
+        "value": "530723"
+      },
+      {
+        "label": "宁蒗彝族自治县",
+        "value": "530724"
+      }
+    ],
+    [{
+        "label": "思茅区",
+        "value": "530802"
+      },
+      {
+        "label": "宁洱哈尼族彝族自治县",
+        "value": "530821"
+      },
+      {
+        "label": "墨江哈尼族自治县",
+        "value": "530822"
+      },
+      {
+        "label": "景东彝族自治县",
+        "value": "530823"
+      },
+      {
+        "label": "景谷傣族彝族自治县",
+        "value": "530824"
+      },
+      {
+        "label": "镇沅彝族哈尼族拉祜族自治县",
+        "value": "530825"
+      },
+      {
+        "label": "江城哈尼族彝族自治县",
+        "value": "530826"
+      },
+      {
+        "label": "孟连傣族拉祜族佤族自治县",
+        "value": "530827"
+      },
+      {
+        "label": "澜沧拉祜族自治县",
+        "value": "530828"
+      },
+      {
+        "label": "西盟佤族自治县",
+        "value": "530829"
+      }
+    ],
+    [{
+        "label": "临翔区",
+        "value": "530902"
+      },
+      {
+        "label": "凤庆县",
+        "value": "530921"
+      },
+      {
+        "label": "云县",
+        "value": "530922"
+      },
+      {
+        "label": "永德县",
+        "value": "530923"
+      },
+      {
+        "label": "镇康县",
+        "value": "530924"
+      },
+      {
+        "label": "双江拉祜族佤族布朗族傣族自治县",
+        "value": "530925"
+      },
+      {
+        "label": "耿马傣族佤族自治县",
+        "value": "530926"
+      },
+      {
+        "label": "沧源佤族自治县",
+        "value": "530927"
+      }
+    ],
+    [{
+        "label": "楚雄市",
+        "value": "532301"
+      },
+      {
+        "label": "双柏县",
+        "value": "532322"
+      },
+      {
+        "label": "牟定县",
+        "value": "532323"
+      },
+      {
+        "label": "南华县",
+        "value": "532324"
+      },
+      {
+        "label": "姚安县",
+        "value": "532325"
+      },
+      {
+        "label": "大姚县",
+        "value": "532326"
+      },
+      {
+        "label": "永仁县",
+        "value": "532327"
+      },
+      {
+        "label": "元谋县",
+        "value": "532328"
+      },
+      {
+        "label": "武定县",
+        "value": "532329"
+      },
+      {
+        "label": "禄丰县",
+        "value": "532331"
+      }
+    ],
+    [{
+        "label": "个旧市",
+        "value": "532501"
+      },
+      {
+        "label": "开远市",
+        "value": "532502"
+      },
+      {
+        "label": "蒙自市",
+        "value": "532503"
+      },
+      {
+        "label": "弥勒市",
+        "value": "532504"
+      },
+      {
+        "label": "屏边苗族自治县",
+        "value": "532523"
+      },
+      {
+        "label": "建水县",
+        "value": "532524"
+      },
+      {
+        "label": "石屏县",
+        "value": "532525"
+      },
+      {
+        "label": "泸西县",
+        "value": "532527"
+      },
+      {
+        "label": "元阳县",
+        "value": "532528"
+      },
+      {
+        "label": "红河县",
+        "value": "532529"
+      },
+      {
+        "label": "金平苗族瑶族傣族自治县",
+        "value": "532530"
+      },
+      {
+        "label": "绿春县",
+        "value": "532531"
+      },
+      {
+        "label": "河口瑶族自治县",
+        "value": "532532"
+      }
+    ],
+    [{
+        "label": "文山市",
+        "value": "532601"
+      },
+      {
+        "label": "砚山县",
+        "value": "532622"
+      },
+      {
+        "label": "西畴县",
+        "value": "532623"
+      },
+      {
+        "label": "麻栗坡县",
+        "value": "532624"
+      },
+      {
+        "label": "马关县",
+        "value": "532625"
+      },
+      {
+        "label": "丘北县",
+        "value": "532626"
+      },
+      {
+        "label": "广南县",
+        "value": "532627"
+      },
+      {
+        "label": "富宁县",
+        "value": "532628"
+      }
+    ],
+    [{
+        "label": "景洪市",
+        "value": "532801"
+      },
+      {
+        "label": "勐海县",
+        "value": "532822"
+      },
+      {
+        "label": "勐腊县",
+        "value": "532823"
+      }
+    ],
+    [{
+        "label": "大理市",
+        "value": "532901"
+      },
+      {
+        "label": "漾濞彝族自治县",
+        "value": "532922"
+      },
+      {
+        "label": "祥云县",
+        "value": "532923"
+      },
+      {
+        "label": "宾川县",
+        "value": "532924"
+      },
+      {
+        "label": "弥渡县",
+        "value": "532925"
+      },
+      {
+        "label": "南涧彝族自治县",
+        "value": "532926"
+      },
+      {
+        "label": "巍山彝族回族自治县",
+        "value": "532927"
+      },
+      {
+        "label": "永平县",
+        "value": "532928"
+      },
+      {
+        "label": "云龙县",
+        "value": "532929"
+      },
+      {
+        "label": "洱源县",
+        "value": "532930"
+      },
+      {
+        "label": "剑川县",
+        "value": "532931"
+      },
+      {
+        "label": "鹤庆县",
+        "value": "532932"
+      }
+    ],
+    [{
+        "label": "瑞丽市",
+        "value": "533102"
+      },
+      {
+        "label": "芒市",
+        "value": "533103"
+      },
+      {
+        "label": "梁河县",
+        "value": "533122"
+      },
+      {
+        "label": "盈江县",
+        "value": "533123"
+      },
+      {
+        "label": "陇川县",
+        "value": "533124"
+      }
+    ],
+    [{
+        "label": "泸水市",
+        "value": "533301"
+      },
+      {
+        "label": "福贡县",
+        "value": "533323"
+      },
+      {
+        "label": "贡山独龙族怒族自治县",
+        "value": "533324"
+      },
+      {
+        "label": "兰坪白族普米族自治县",
+        "value": "533325"
+      }
+    ],
+    [{
+        "label": "香格里拉市",
+        "value": "533401"
+      },
+      {
+        "label": "德钦县",
+        "value": "533422"
+      },
+      {
+        "label": "维西傈僳族自治县",
+        "value": "533423"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "城关区",
+        "value": "540102"
+      },
+      {
+        "label": "堆龙德庆区",
+        "value": "540103"
+      },
+      {
+        "label": "林周县",
+        "value": "540121"
+      },
+      {
+        "label": "当雄县",
+        "value": "540122"
+      },
+      {
+        "label": "尼木县",
+        "value": "540123"
+      },
+      {
+        "label": "曲水县",
+        "value": "540124"
+      },
+      {
+        "label": "达孜县",
+        "value": "540126"
+      },
+      {
+        "label": "墨竹工卡县",
+        "value": "540127"
+      },
+      {
+        "label": "格尔木藏青工业园区",
+        "value": "540171"
+      },
+      {
+        "label": "拉萨经济技术开发区",
+        "value": "540172"
+      },
+      {
+        "label": "西藏文化旅游创意园区",
+        "value": "540173"
+      },
+      {
+        "label": "达孜工业园区",
+        "value": "540174"
+      }
+    ],
+    [{
+        "label": "桑珠孜区",
+        "value": "540202"
+      },
+      {
+        "label": "南木林县",
+        "value": "540221"
+      },
+      {
+        "label": "江孜县",
+        "value": "540222"
+      },
+      {
+        "label": "定日县",
+        "value": "540223"
+      },
+      {
+        "label": "萨迦县",
+        "value": "540224"
+      },
+      {
+        "label": "拉孜县",
+        "value": "540225"
+      },
+      {
+        "label": "昂仁县",
+        "value": "540226"
+      },
+      {
+        "label": "谢通门县",
+        "value": "540227"
+      },
+      {
+        "label": "白朗县",
+        "value": "540228"
+      },
+      {
+        "label": "仁布县",
+        "value": "540229"
+      },
+      {
+        "label": "康马县",
+        "value": "540230"
+      },
+      {
+        "label": "定结县",
+        "value": "540231"
+      },
+      {
+        "label": "仲巴县",
+        "value": "540232"
+      },
+      {
+        "label": "亚东县",
+        "value": "540233"
+      },
+      {
+        "label": "吉隆县",
+        "value": "540234"
+      },
+      {
+        "label": "聂拉木县",
+        "value": "540235"
+      },
+      {
+        "label": "萨嘎县",
+        "value": "540236"
+      },
+      {
+        "label": "岗巴县",
+        "value": "540237"
+      }
+    ],
+    [{
+        "label": "卡若区",
+        "value": "540302"
+      },
+      {
+        "label": "江达县",
+        "value": "540321"
+      },
+      {
+        "label": "贡觉县",
+        "value": "540322"
+      },
+      {
+        "label": "类乌齐县",
+        "value": "540323"
+      },
+      {
+        "label": "丁青县",
+        "value": "540324"
+      },
+      {
+        "label": "察雅县",
+        "value": "540325"
+      },
+      {
+        "label": "八宿县",
+        "value": "540326"
+      },
+      {
+        "label": "左贡县",
+        "value": "540327"
+      },
+      {
+        "label": "芒康县",
+        "value": "540328"
+      },
+      {
+        "label": "洛隆县",
+        "value": "540329"
+      },
+      {
+        "label": "边坝县",
+        "value": "540330"
+      }
+    ],
+    [{
+        "label": "巴宜区",
+        "value": "540402"
+      },
+      {
+        "label": "工布江达县",
+        "value": "540421"
+      },
+      {
+        "label": "米林县",
+        "value": "540422"
+      },
+      {
+        "label": "墨脱县",
+        "value": "540423"
+      },
+      {
+        "label": "波密县",
+        "value": "540424"
+      },
+      {
+        "label": "察隅县",
+        "value": "540425"
+      },
+      {
+        "label": "朗县",
+        "value": "540426"
+      }
+    ],
+    [{
+        "label": "乃东区",
+        "value": "540502"
+      },
+      {
+        "label": "扎囊县",
+        "value": "540521"
+      },
+      {
+        "label": "贡嘎县",
+        "value": "540522"
+      },
+      {
+        "label": "桑日县",
+        "value": "540523"
+      },
+      {
+        "label": "琼结县",
+        "value": "540524"
+      },
+      {
+        "label": "曲松县",
+        "value": "540525"
+      },
+      {
+        "label": "措美县",
+        "value": "540526"
+      },
+      {
+        "label": "洛扎县",
+        "value": "540527"
+      },
+      {
+        "label": "加查县",
+        "value": "540528"
+      },
+      {
+        "label": "隆子县",
+        "value": "540529"
+      },
+      {
+        "label": "错那县",
+        "value": "540530"
+      },
+      {
+        "label": "浪卡子县",
+        "value": "540531"
+      }
+    ],
+    [{
+        "label": "那曲县",
+        "value": "542421"
+      },
+      {
+        "label": "嘉黎县",
+        "value": "542422"
+      },
+      {
+        "label": "比如县",
+        "value": "542423"
+      },
+      {
+        "label": "聂荣县",
+        "value": "542424"
+      },
+      {
+        "label": "安多县",
+        "value": "542425"
+      },
+      {
+        "label": "申扎县",
+        "value": "542426"
+      },
+      {
+        "label": "索县",
+        "value": "542427"
+      },
+      {
+        "label": "班戈县",
+        "value": "542428"
+      },
+      {
+        "label": "巴青县",
+        "value": "542429"
+      },
+      {
+        "label": "尼玛县",
+        "value": "542430"
+      },
+      {
+        "label": "双湖县",
+        "value": "542431"
+      }
+    ],
+    [{
+        "label": "普兰县",
+        "value": "542521"
+      },
+      {
+        "label": "札达县",
+        "value": "542522"
+      },
+      {
+        "label": "噶尔县",
+        "value": "542523"
+      },
+      {
+        "label": "日土县",
+        "value": "542524"
+      },
+      {
+        "label": "革吉县",
+        "value": "542525"
+      },
+      {
+        "label": "改则县",
+        "value": "542526"
+      },
+      {
+        "label": "措勤县",
+        "value": "542527"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "新城区",
+        "value": "610102"
+      },
+      {
+        "label": "碑林区",
+        "value": "610103"
+      },
+      {
+        "label": "莲湖区",
+        "value": "610104"
+      },
+      {
+        "label": "灞桥区",
+        "value": "610111"
+      },
+      {
+        "label": "未央区",
+        "value": "610112"
+      },
+      {
+        "label": "雁塔区",
+        "value": "610113"
+      },
+      {
+        "label": "阎良区",
+        "value": "610114"
+      },
+      {
+        "label": "临潼区",
+        "value": "610115"
+      },
+      {
+        "label": "长安区",
+        "value": "610116"
+      },
+      {
+        "label": "高陵区",
+        "value": "610117"
+      },
+      {
+        "label": "鄠邑区",
+        "value": "610118"
+      },
+      {
+        "label": "蓝田县",
+        "value": "610122"
+      },
+      {
+        "label": "周至县",
+        "value": "610124"
+      }
+    ],
+    [{
+        "label": "王益区",
+        "value": "610202"
+      },
+      {
+        "label": "印台区",
+        "value": "610203"
+      },
+      {
+        "label": "耀州区",
+        "value": "610204"
+      },
+      {
+        "label": "宜君县",
+        "value": "610222"
+      }
+    ],
+    [{
+        "label": "渭滨区",
+        "value": "610302"
+      },
+      {
+        "label": "金台区",
+        "value": "610303"
+      },
+      {
+        "label": "陈仓区",
+        "value": "610304"
+      },
+      {
+        "label": "凤翔县",
+        "value": "610322"
+      },
+      {
+        "label": "岐山县",
+        "value": "610323"
+      },
+      {
+        "label": "扶风县",
+        "value": "610324"
+      },
+      {
+        "label": "眉县",
+        "value": "610326"
+      },
+      {
+        "label": "陇县",
+        "value": "610327"
+      },
+      {
+        "label": "千阳县",
+        "value": "610328"
+      },
+      {
+        "label": "麟游县",
+        "value": "610329"
+      },
+      {
+        "label": "凤县",
+        "value": "610330"
+      },
+      {
+        "label": "太白县",
+        "value": "610331"
+      }
+    ],
+    [{
+        "label": "秦都区",
+        "value": "610402"
+      },
+      {
+        "label": "杨陵区",
+        "value": "610403"
+      },
+      {
+        "label": "渭城区",
+        "value": "610404"
+      },
+      {
+        "label": "三原县",
+        "value": "610422"
+      },
+      {
+        "label": "泾阳县",
+        "value": "610423"
+      },
+      {
+        "label": "乾县",
+        "value": "610424"
+      },
+      {
+        "label": "礼泉县",
+        "value": "610425"
+      },
+      {
+        "label": "永寿县",
+        "value": "610426"
+      },
+      {
+        "label": "彬县",
+        "value": "610427"
+      },
+      {
+        "label": "长武县",
+        "value": "610428"
+      },
+      {
+        "label": "旬邑县",
+        "value": "610429"
+      },
+      {
+        "label": "淳化县",
+        "value": "610430"
+      },
+      {
+        "label": "武功县",
+        "value": "610431"
+      },
+      {
+        "label": "兴平市",
+        "value": "610481"
+      }
+    ],
+    [{
+        "label": "临渭区",
+        "value": "610502"
+      },
+      {
+        "label": "华州区",
+        "value": "610503"
+      },
+      {
+        "label": "潼关县",
+        "value": "610522"
+      },
+      {
+        "label": "大荔县",
+        "value": "610523"
+      },
+      {
+        "label": "合阳县",
+        "value": "610524"
+      },
+      {
+        "label": "澄城县",
+        "value": "610525"
+      },
+      {
+        "label": "蒲城县",
+        "value": "610526"
+      },
+      {
+        "label": "白水县",
+        "value": "610527"
+      },
+      {
+        "label": "富平县",
+        "value": "610528"
+      },
+      {
+        "label": "韩城市",
+        "value": "610581"
+      },
+      {
+        "label": "华阴市",
+        "value": "610582"
+      }
+    ],
+    [{
+        "label": "宝塔区",
+        "value": "610602"
+      },
+      {
+        "label": "安塞区",
+        "value": "610603"
+      },
+      {
+        "label": "延长县",
+        "value": "610621"
+      },
+      {
+        "label": "延川县",
+        "value": "610622"
+      },
+      {
+        "label": "子长县",
+        "value": "610623"
+      },
+      {
+        "label": "志丹县",
+        "value": "610625"
+      },
+      {
+        "label": "吴起县",
+        "value": "610626"
+      },
+      {
+        "label": "甘泉县",
+        "value": "610627"
+      },
+      {
+        "label": "富县",
+        "value": "610628"
+      },
+      {
+        "label": "洛川县",
+        "value": "610629"
+      },
+      {
+        "label": "宜川县",
+        "value": "610630"
+      },
+      {
+        "label": "黄龙县",
+        "value": "610631"
+      },
+      {
+        "label": "黄陵县",
+        "value": "610632"
+      }
+    ],
+    [{
+        "label": "汉台区",
+        "value": "610702"
+      },
+      {
+        "label": "南郑区",
+        "value": "610703"
+      },
+      {
+        "label": "城固县",
+        "value": "610722"
+      },
+      {
+        "label": "洋县",
+        "value": "610723"
+      },
+      {
+        "label": "西乡县",
+        "value": "610724"
+      },
+      {
+        "label": "勉县",
+        "value": "610725"
+      },
+      {
+        "label": "宁强县",
+        "value": "610726"
+      },
+      {
+        "label": "略阳县",
+        "value": "610727"
+      },
+      {
+        "label": "镇巴县",
+        "value": "610728"
+      },
+      {
+        "label": "留坝县",
+        "value": "610729"
+      },
+      {
+        "label": "佛坪县",
+        "value": "610730"
+      }
+    ],
+    [{
+        "label": "榆阳区",
+        "value": "610802"
+      },
+      {
+        "label": "横山区",
+        "value": "610803"
+      },
+      {
+        "label": "府谷县",
+        "value": "610822"
+      },
+      {
+        "label": "靖边县",
+        "value": "610824"
+      },
+      {
+        "label": "定边县",
+        "value": "610825"
+      },
+      {
+        "label": "绥德县",
+        "value": "610826"
+      },
+      {
+        "label": "米脂县",
+        "value": "610827"
+      },
+      {
+        "label": "佳县",
+        "value": "610828"
+      },
+      {
+        "label": "吴堡县",
+        "value": "610829"
+      },
+      {
+        "label": "清涧县",
+        "value": "610830"
+      },
+      {
+        "label": "子洲县",
+        "value": "610831"
+      },
+      {
+        "label": "神木市",
+        "value": "610881"
+      }
+    ],
+    [{
+        "label": "汉滨区",
+        "value": "610902"
+      },
+      {
+        "label": "汉阴县",
+        "value": "610921"
+      },
+      {
+        "label": "石泉县",
+        "value": "610922"
+      },
+      {
+        "label": "宁陕县",
+        "value": "610923"
+      },
+      {
+        "label": "紫阳县",
+        "value": "610924"
+      },
+      {
+        "label": "岚皋县",
+        "value": "610925"
+      },
+      {
+        "label": "平利县",
+        "value": "610926"
+      },
+      {
+        "label": "镇坪县",
+        "value": "610927"
+      },
+      {
+        "label": "旬阳县",
+        "value": "610928"
+      },
+      {
+        "label": "白河县",
+        "value": "610929"
+      }
+    ],
+    [{
+        "label": "商州区",
+        "value": "611002"
+      },
+      {
+        "label": "洛南县",
+        "value": "611021"
+      },
+      {
+        "label": "丹凤县",
+        "value": "611022"
+      },
+      {
+        "label": "商南县",
+        "value": "611023"
+      },
+      {
+        "label": "山阳县",
+        "value": "611024"
+      },
+      {
+        "label": "镇安县",
+        "value": "611025"
+      },
+      {
+        "label": "柞水县",
+        "value": "611026"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "城关区",
+        "value": "620102"
+      },
+      {
+        "label": "七里河区",
+        "value": "620103"
+      },
+      {
+        "label": "西固区",
+        "value": "620104"
+      },
+      {
+        "label": "安宁区",
+        "value": "620105"
+      },
+      {
+        "label": "红古区",
+        "value": "620111"
+      },
+      {
+        "label": "永登县",
+        "value": "620121"
+      },
+      {
+        "label": "皋兰县",
+        "value": "620122"
+      },
+      {
+        "label": "榆中县",
+        "value": "620123"
+      },
+      {
+        "label": "兰州新区",
+        "value": "620171"
+      }
+    ],
+    [{
+      "label": "嘉峪关市",
+      "value": "620201"
+    }],
+    [{
+        "label": "金川区",
+        "value": "620302"
+      },
+      {
+        "label": "永昌县",
+        "value": "620321"
+      }
+    ],
+    [{
+        "label": "白银区",
+        "value": "620402"
+      },
+      {
+        "label": "平川区",
+        "value": "620403"
+      },
+      {
+        "label": "靖远县",
+        "value": "620421"
+      },
+      {
+        "label": "会宁县",
+        "value": "620422"
+      },
+      {
+        "label": "景泰县",
+        "value": "620423"
+      }
+    ],
+    [{
+        "label": "秦州区",
+        "value": "620502"
+      },
+      {
+        "label": "麦积区",
+        "value": "620503"
+      },
+      {
+        "label": "清水县",
+        "value": "620521"
+      },
+      {
+        "label": "秦安县",
+        "value": "620522"
+      },
+      {
+        "label": "甘谷县",
+        "value": "620523"
+      },
+      {
+        "label": "武山县",
+        "value": "620524"
+      },
+      {
+        "label": "张家川回族自治县",
+        "value": "620525"
+      }
+    ],
+    [{
+        "label": "凉州区",
+        "value": "620602"
+      },
+      {
+        "label": "民勤县",
+        "value": "620621"
+      },
+      {
+        "label": "古浪县",
+        "value": "620622"
+      },
+      {
+        "label": "天祝藏族自治县",
+        "value": "620623"
+      }
+    ],
+    [{
+        "label": "甘州区",
+        "value": "620702"
+      },
+      {
+        "label": "肃南裕固族自治县",
+        "value": "620721"
+      },
+      {
+        "label": "民乐县",
+        "value": "620722"
+      },
+      {
+        "label": "临泽县",
+        "value": "620723"
+      },
+      {
+        "label": "高台县",
+        "value": "620724"
+      },
+      {
+        "label": "山丹县",
+        "value": "620725"
+      }
+    ],
+    [{
+        "label": "崆峒区",
+        "value": "620802"
+      },
+      {
+        "label": "泾川县",
+        "value": "620821"
+      },
+      {
+        "label": "灵台县",
+        "value": "620822"
+      },
+      {
+        "label": "崇信县",
+        "value": "620823"
+      },
+      {
+        "label": "华亭县",
+        "value": "620824"
+      },
+      {
+        "label": "庄浪县",
+        "value": "620825"
+      },
+      {
+        "label": "静宁县",
+        "value": "620826"
+      },
+      {
+        "label": "平凉工业园区",
+        "value": "620871"
+      }
+    ],
+    [{
+        "label": "肃州区",
+        "value": "620902"
+      },
+      {
+        "label": "金塔县",
+        "value": "620921"
+      },
+      {
+        "label": "瓜州县",
+        "value": "620922"
+      },
+      {
+        "label": "肃北蒙古族自治县",
+        "value": "620923"
+      },
+      {
+        "label": "阿克塞哈萨克族自治县",
+        "value": "620924"
+      },
+      {
+        "label": "玉门市",
+        "value": "620981"
+      },
+      {
+        "label": "敦煌市",
+        "value": "620982"
+      }
+    ],
+    [{
+        "label": "西峰区",
+        "value": "621002"
+      },
+      {
+        "label": "庆城县",
+        "value": "621021"
+      },
+      {
+        "label": "环县",
+        "value": "621022"
+      },
+      {
+        "label": "华池县",
+        "value": "621023"
+      },
+      {
+        "label": "合水县",
+        "value": "621024"
+      },
+      {
+        "label": "正宁县",
+        "value": "621025"
+      },
+      {
+        "label": "宁县",
+        "value": "621026"
+      },
+      {
+        "label": "镇原县",
+        "value": "621027"
+      }
+    ],
+    [{
+        "label": "安定区",
+        "value": "621102"
+      },
+      {
+        "label": "通渭县",
+        "value": "621121"
+      },
+      {
+        "label": "陇西县",
+        "value": "621122"
+      },
+      {
+        "label": "渭源县",
+        "value": "621123"
+      },
+      {
+        "label": "临洮县",
+        "value": "621124"
+      },
+      {
+        "label": "漳县",
+        "value": "621125"
+      },
+      {
+        "label": "岷县",
+        "value": "621126"
+      }
+    ],
+    [{
+        "label": "武都区",
+        "value": "621202"
+      },
+      {
+        "label": "成县",
+        "value": "621221"
+      },
+      {
+        "label": "文县",
+        "value": "621222"
+      },
+      {
+        "label": "宕昌县",
+        "value": "621223"
+      },
+      {
+        "label": "康县",
+        "value": "621224"
+      },
+      {
+        "label": "西和县",
+        "value": "621225"
+      },
+      {
+        "label": "礼县",
+        "value": "621226"
+      },
+      {
+        "label": "徽县",
+        "value": "621227"
+      },
+      {
+        "label": "两当县",
+        "value": "621228"
+      }
+    ],
+    [{
+        "label": "临夏市",
+        "value": "622901"
+      },
+      {
+        "label": "临夏县",
+        "value": "622921"
+      },
+      {
+        "label": "康乐县",
+        "value": "622922"
+      },
+      {
+        "label": "永靖县",
+        "value": "622923"
+      },
+      {
+        "label": "广河县",
+        "value": "622924"
+      },
+      {
+        "label": "和政县",
+        "value": "622925"
+      },
+      {
+        "label": "东乡族自治县",
+        "value": "622926"
+      },
+      {
+        "label": "积石山保安族东乡族撒拉族自治县",
+        "value": "622927"
+      }
+    ],
+    [{
+        "label": "合作市",
+        "value": "623001"
+      },
+      {
+        "label": "临潭县",
+        "value": "623021"
+      },
+      {
+        "label": "卓尼县",
+        "value": "623022"
+      },
+      {
+        "label": "舟曲县",
+        "value": "623023"
+      },
+      {
+        "label": "迭部县",
+        "value": "623024"
+      },
+      {
+        "label": "玛曲县",
+        "value": "623025"
+      },
+      {
+        "label": "碌曲县",
+        "value": "623026"
+      },
+      {
+        "label": "夏河县",
+        "value": "623027"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "城东区",
+        "value": "630102"
+      },
+      {
+        "label": "城中区",
+        "value": "630103"
+      },
+      {
+        "label": "城西区",
+        "value": "630104"
+      },
+      {
+        "label": "城北区",
+        "value": "630105"
+      },
+      {
+        "label": "大通回族土族自治县",
+        "value": "630121"
+      },
+      {
+        "label": "湟中县",
+        "value": "630122"
+      },
+      {
+        "label": "湟源县",
+        "value": "630123"
+      }
+    ],
+    [{
+        "label": "乐都区",
+        "value": "630202"
+      },
+      {
+        "label": "平安区",
+        "value": "630203"
+      },
+      {
+        "label": "民和回族土族自治县",
+        "value": "630222"
+      },
+      {
+        "label": "互助土族自治县",
+        "value": "630223"
+      },
+      {
+        "label": "化隆回族自治县",
+        "value": "630224"
+      },
+      {
+        "label": "循化撒拉族自治县",
+        "value": "630225"
+      }
+    ],
+    [{
+        "label": "门源回族自治县",
+        "value": "632221"
+      },
+      {
+        "label": "祁连县",
+        "value": "632222"
+      },
+      {
+        "label": "海晏县",
+        "value": "632223"
+      },
+      {
+        "label": "刚察县",
+        "value": "632224"
+      }
+    ],
+    [{
+        "label": "同仁县",
+        "value": "632321"
+      },
+      {
+        "label": "尖扎县",
+        "value": "632322"
+      },
+      {
+        "label": "泽库县",
+        "value": "632323"
+      },
+      {
+        "label": "河南蒙古族自治县",
+        "value": "632324"
+      }
+    ],
+    [{
+        "label": "共和县",
+        "value": "632521"
+      },
+      {
+        "label": "同德县",
+        "value": "632522"
+      },
+      {
+        "label": "贵德县",
+        "value": "632523"
+      },
+      {
+        "label": "兴海县",
+        "value": "632524"
+      },
+      {
+        "label": "贵南县",
+        "value": "632525"
+      }
+    ],
+    [{
+        "label": "玛沁县",
+        "value": "632621"
+      },
+      {
+        "label": "班玛县",
+        "value": "632622"
+      },
+      {
+        "label": "甘德县",
+        "value": "632623"
+      },
+      {
+        "label": "达日县",
+        "value": "632624"
+      },
+      {
+        "label": "久治县",
+        "value": "632625"
+      },
+      {
+        "label": "玛多县",
+        "value": "632626"
+      }
+    ],
+    [{
+        "label": "玉树市",
+        "value": "632701"
+      },
+      {
+        "label": "杂多县",
+        "value": "632722"
+      },
+      {
+        "label": "称多县",
+        "value": "632723"
+      },
+      {
+        "label": "治多县",
+        "value": "632724"
+      },
+      {
+        "label": "囊谦县",
+        "value": "632725"
+      },
+      {
+        "label": "曲麻莱县",
+        "value": "632726"
+      }
+    ],
+    [{
+        "label": "格尔木市",
+        "value": "632801"
+      },
+      {
+        "label": "德令哈市",
+        "value": "632802"
+      },
+      {
+        "label": "乌兰县",
+        "value": "632821"
+      },
+      {
+        "label": "都兰县",
+        "value": "632822"
+      },
+      {
+        "label": "天峻县",
+        "value": "632823"
+      },
+      {
+        "label": "大柴旦行政委员会",
+        "value": "632857"
+      },
+      {
+        "label": "冷湖行政委员会",
+        "value": "632858"
+      },
+      {
+        "label": "茫崖行政委员会",
+        "value": "632859"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "兴庆区",
+        "value": "640104"
+      },
+      {
+        "label": "西夏区",
+        "value": "640105"
+      },
+      {
+        "label": "金凤区",
+        "value": "640106"
+      },
+      {
+        "label": "永宁县",
+        "value": "640121"
+      },
+      {
+        "label": "贺兰县",
+        "value": "640122"
+      },
+      {
+        "label": "灵武市",
+        "value": "640181"
+      }
+    ],
+    [{
+        "label": "大武口区",
+        "value": "640202"
+      },
+      {
+        "label": "惠农区",
+        "value": "640205"
+      },
+      {
+        "label": "平罗县",
+        "value": "640221"
+      }
+    ],
+    [{
+        "label": "利通区",
+        "value": "640302"
+      },
+      {
+        "label": "红寺堡区",
+        "value": "640303"
+      },
+      {
+        "label": "盐池县",
+        "value": "640323"
+      },
+      {
+        "label": "同心县",
+        "value": "640324"
+      },
+      {
+        "label": "青铜峡市",
+        "value": "640381"
+      }
+    ],
+    [{
+        "label": "原州区",
+        "value": "640402"
+      },
+      {
+        "label": "西吉县",
+        "value": "640422"
+      },
+      {
+        "label": "隆德县",
+        "value": "640423"
+      },
+      {
+        "label": "泾源县",
+        "value": "640424"
+      },
+      {
+        "label": "彭阳县",
+        "value": "640425"
+      }
+    ],
+    [{
+        "label": "沙坡头区",
+        "value": "640502"
+      },
+      {
+        "label": "中宁县",
+        "value": "640521"
+      },
+      {
+        "label": "海原县",
+        "value": "640522"
+      }
+    ]
+  ],
+  [
+    [{
+        "label": "天山区",
+        "value": "650102"
+      },
+      {
+        "label": "沙依巴克区",
+        "value": "650103"
+      },
+      {
+        "label": "新市区",
+        "value": "650104"
+      },
+      {
+        "label": "水磨沟区",
+        "value": "650105"
+      },
+      {
+        "label": "头屯河区",
+        "value": "650106"
+      },
+      {
+        "label": "达坂城区",
+        "value": "650107"
+      },
+      {
+        "label": "米东区",
+        "value": "650109"
+      },
+      {
+        "label": "乌鲁木齐县",
+        "value": "650121"
+      },
+      {
+        "label": "乌鲁木齐经济技术开发区",
+        "value": "650171"
+      },
+      {
+        "label": "乌鲁木齐高新技术产业开发区",
+        "value": "650172"
+      }
+    ],
+    [{
+        "label": "独山子区",
+        "value": "650202"
+      },
+      {
+        "label": "克拉玛依区",
+        "value": "650203"
+      },
+      {
+        "label": "白碱滩区",
+        "value": "650204"
+      },
+      {
+        "label": "乌尔禾区",
+        "value": "650205"
+      }
+    ],
+    [{
+        "label": "高昌区",
+        "value": "650402"
+      },
+      {
+        "label": "鄯善县",
+        "value": "650421"
+      },
+      {
+        "label": "托克逊县",
+        "value": "650422"
+      }
+    ],
+    [{
+        "label": "伊州区",
+        "value": "650502"
+      },
+      {
+        "label": "巴里坤哈萨克自治县",
+        "value": "650521"
+      },
+      {
+        "label": "伊吾县",
+        "value": "650522"
+      }
+    ],
+    [{
+        "label": "昌吉市",
+        "value": "652301"
+      },
+      {
+        "label": "阜康市",
+        "value": "652302"
+      },
+      {
+        "label": "呼图壁县",
+        "value": "652323"
+      },
+      {
+        "label": "玛纳斯县",
+        "value": "652324"
+      },
+      {
+        "label": "奇台县",
+        "value": "652325"
+      },
+      {
+        "label": "吉木萨尔县",
+        "value": "652327"
+      },
+      {
+        "label": "木垒哈萨克自治县",
+        "value": "652328"
+      }
+    ],
+    [{
+        "label": "博乐市",
+        "value": "652701"
+      },
+      {
+        "label": "阿拉山口市",
+        "value": "652702"
+      },
+      {
+        "label": "精河县",
+        "value": "652722"
+      },
+      {
+        "label": "温泉县",
+        "value": "652723"
+      }
+    ],
+    [{
+        "label": "库尔勒市",
+        "value": "652801"
+      },
+      {
+        "label": "轮台县",
+        "value": "652822"
+      },
+      {
+        "label": "尉犁县",
+        "value": "652823"
+      },
+      {
+        "label": "若羌县",
+        "value": "652824"
+      },
+      {
+        "label": "且末县",
+        "value": "652825"
+      },
+      {
+        "label": "焉耆回族自治县",
+        "value": "652826"
+      },
+      {
+        "label": "和静县",
+        "value": "652827"
+      },
+      {
+        "label": "和硕县",
+        "value": "652828"
+      },
+      {
+        "label": "博湖县",
+        "value": "652829"
+      },
+      {
+        "label": "库尔勒经济技术开发区",
+        "value": "652871"
+      }
+    ],
+    [{
+        "label": "阿克苏市",
+        "value": "652901"
+      },
+      {
+        "label": "温宿县",
+        "value": "652922"
+      },
+      {
+        "label": "库车县",
+        "value": "652923"
+      },
+      {
+        "label": "沙雅县",
+        "value": "652924"
+      },
+      {
+        "label": "新和县",
+        "value": "652925"
+      },
+      {
+        "label": "拜城县",
+        "value": "652926"
+      },
+      {
+        "label": "乌什县",
+        "value": "652927"
+      },
+      {
+        "label": "阿瓦提县",
+        "value": "652928"
+      },
+      {
+        "label": "柯坪县",
+        "value": "652929"
+      }
+    ],
+    [{
+        "label": "阿图什市",
+        "value": "653001"
+      },
+      {
+        "label": "阿克陶县",
+        "value": "653022"
+      },
+      {
+        "label": "阿合奇县",
+        "value": "653023"
+      },
+      {
+        "label": "乌恰县",
+        "value": "653024"
+      }
+    ],
+    [{
+        "label": "喀什市",
+        "value": "653101"
+      },
+      {
+        "label": "疏附县",
+        "value": "653121"
+      },
+      {
+        "label": "疏勒县",
+        "value": "653122"
+      },
+      {
+        "label": "英吉沙县",
+        "value": "653123"
+      },
+      {
+        "label": "泽普县",
+        "value": "653124"
+      },
+      {
+        "label": "莎车县",
+        "value": "653125"
+      },
+      {
+        "label": "叶城县",
+        "value": "653126"
+      },
+      {
+        "label": "麦盖提县",
+        "value": "653127"
+      },
+      {
+        "label": "岳普湖县",
+        "value": "653128"
+      },
+      {
+        "label": "伽师县",
+        "value": "653129"
+      },
+      {
+        "label": "巴楚县",
+        "value": "653130"
+      },
+      {
+        "label": "塔什库尔干塔吉克自治县",
+        "value": "653131"
+      }
+    ],
+    [{
+        "label": "和田市",
+        "value": "653201"
+      },
+      {
+        "label": "和田县",
+        "value": "653221"
+      },
+      {
+        "label": "墨玉县",
+        "value": "653222"
+      },
+      {
+        "label": "皮山县",
+        "value": "653223"
+      },
+      {
+        "label": "洛浦县",
+        "value": "653224"
+      },
+      {
+        "label": "策勒县",
+        "value": "653225"
+      },
+      {
+        "label": "于田县",
+        "value": "653226"
+      },
+      {
+        "label": "民丰县",
+        "value": "653227"
+      }
+    ],
+    [{
+        "label": "伊宁市",
+        "value": "654002"
+      },
+      {
+        "label": "奎屯市",
+        "value": "654003"
+      },
+      {
+        "label": "霍尔果斯市",
+        "value": "654004"
+      },
+      {
+        "label": "伊宁县",
+        "value": "654021"
+      },
+      {
+        "label": "察布查尔锡伯自治县",
+        "value": "654022"
+      },
+      {
+        "label": "霍城县",
+        "value": "654023"
+      },
+      {
+        "label": "巩留县",
+        "value": "654024"
+      },
+      {
+        "label": "新源县",
+        "value": "654025"
+      },
+      {
+        "label": "昭苏县",
+        "value": "654026"
+      },
+      {
+        "label": "特克斯县",
+        "value": "654027"
+      },
+      {
+        "label": "尼勒克县",
+        "value": "654028"
+      }
+    ],
+    [{
+        "label": "塔城市",
+        "value": "654201"
+      },
+      {
+        "label": "乌苏市",
+        "value": "654202"
+      },
+      {
+        "label": "额敏县",
+        "value": "654221"
+      },
+      {
+        "label": "沙湾县",
+        "value": "654223"
+      },
+      {
+        "label": "托里县",
+        "value": "654224"
+      },
+      {
+        "label": "裕民县",
+        "value": "654225"
+      },
+      {
+        "label": "和布克赛尔蒙古自治县",
+        "value": "654226"
+      }
+    ],
+    [{
+        "label": "阿勒泰市",
+        "value": "654301"
+      },
+      {
+        "label": "布尔津县",
+        "value": "654321"
+      },
+      {
+        "label": "富蕴县",
+        "value": "654322"
+      },
+      {
+        "label": "福海县",
+        "value": "654323"
+      },
+      {
+        "label": "哈巴河县",
+        "value": "654324"
+      },
+      {
+        "label": "青河县",
+        "value": "654325"
+      },
+      {
+        "label": "吉木乃县",
+        "value": "654326"
+      }
+    ],
+    [{
+        "label": "石河子市",
+        "value": "659001"
+      },
+      {
+        "label": "阿拉尔市",
+        "value": "659002"
+      },
+      {
+        "label": "图木舒克市",
+        "value": "659003"
+      },
+      {
+        "label": "五家渠市",
+        "value": "659004"
+      },
+      {
+        "label": "铁门关市",
+        "value": "659006"
+      }
+    ]
+  ],
+  [
+    [{
+      "label": "台北",
+      "value": "660101"
+    }],
+    [{
+      "label": "高雄",
+      "value": "660201"
+    }],
+    [{
+      "label": "基隆",
+      "value": "660301"
+    }],
+    [{
+      "label": "台中",
+      "value": "660401"
+    }],
+    [{
+      "label": "台南",
+      "value": "660501"
+    }],
+    [{
+      "label": "新竹",
+      "value": "660601"
+    }],
+    [{
+      "label": "嘉义",
+      "value": "660701"
+    }],
+    [{
+      "label": "宜兰",
+      "value": "660801"
+    }],
+    [{
+      "label": "桃园",
+      "value": "660901"
+    }],
+    [{
+      "label": "苗栗",
+      "value": "661001"
+    }],
+    [{
+      "label": "彰化",
+      "value": "661101"
+    }],
+    [{
+      "label": "南投",
+      "value": "661201"
+    }],
+    [{
+      "label": "云林",
+      "value": "661301"
+    }],
+    [{
+      "label": "屏东",
+      "value": "661401"
+    }],
+    [{
+      "label": "台东",
+      "value": "661501"
+    }],
+    [{
+      "label": "花莲",
+      "value": "661601"
+    }],
+    [{
+      "label": "澎湖",
+      "value": "661701"
+    }]
+  ],
+  [
+    [{
+      "label": "香港岛",
+      "value": "670101"
+    }],
+    [{
+      "label": "九龙",
+      "value": "670201"
+    }],
+    [{
+      "label": "新界",
+      "value": "670301"
+    }]
+  ],
+  [
+    [{
+      "label": "澳门半岛",
+      "value": "680101"
+    }],
+    [{
+      "label": "氹仔岛",
+      "value": "680201"
+    }],
+    [{
+      "label": "路环岛",
+      "value": "680301"
+    }],
+    [{
+      "label": "路氹城",
+      "value": "680401"
+    }]
+  ]
+]
+export default areaData;

+ 1503 - 0
components/w-picker/city-data/city.js

@@ -0,0 +1,1503 @@
+/* eslint-disable */
+var cityData = [
+  [{
+    "label": "市辖区",
+    "value": "1101"
+  }],
+  [{
+    "label": "市辖区",
+    "value": "1201"
+  }],
+  [{
+      "label": "石家庄市",
+      "value": "1301"
+    },
+    {
+      "label": "唐山市",
+      "value": "1302"
+    },
+    {
+      "label": "秦皇岛市",
+      "value": "1303"
+    },
+    {
+      "label": "邯郸市",
+      "value": "1304"
+    },
+    {
+      "label": "邢台市",
+      "value": "1305"
+    },
+    {
+      "label": "保定市",
+      "value": "1306"
+    },
+    {
+      "label": "张家口市",
+      "value": "1307"
+    },
+    {
+      "label": "承德市",
+      "value": "1308"
+    },
+    {
+      "label": "沧州市",
+      "value": "1309"
+    },
+    {
+      "label": "廊坊市",
+      "value": "1310"
+    },
+    {
+      "label": "衡水市",
+      "value": "1311"
+    }
+  ],
+  [{
+      "label": "太原市",
+      "value": "1401"
+    },
+    {
+      "label": "大同市",
+      "value": "1402"
+    },
+    {
+      "label": "阳泉市",
+      "value": "1403"
+    },
+    {
+      "label": "长治市",
+      "value": "1404"
+    },
+    {
+      "label": "晋城市",
+      "value": "1405"
+    },
+    {
+      "label": "朔州市",
+      "value": "1406"
+    },
+    {
+      "label": "晋中市",
+      "value": "1407"
+    },
+    {
+      "label": "运城市",
+      "value": "1408"
+    },
+    {
+      "label": "忻州市",
+      "value": "1409"
+    },
+    {
+      "label": "临汾市",
+      "value": "1410"
+    },
+    {
+      "label": "吕梁市",
+      "value": "1411"
+    }
+  ],
+  [{
+      "label": "呼和浩特市",
+      "value": "1501"
+    },
+    {
+      "label": "包头市",
+      "value": "1502"
+    },
+    {
+      "label": "乌海市",
+      "value": "1503"
+    },
+    {
+      "label": "赤峰市",
+      "value": "1504"
+    },
+    {
+      "label": "通辽市",
+      "value": "1505"
+    },
+    {
+      "label": "鄂尔多斯市",
+      "value": "1506"
+    },
+    {
+      "label": "呼伦贝尔市",
+      "value": "1507"
+    },
+    {
+      "label": "巴彦淖尔市",
+      "value": "1508"
+    },
+    {
+      "label": "乌兰察布市",
+      "value": "1509"
+    },
+    {
+      "label": "兴安盟",
+      "value": "1522"
+    },
+    {
+      "label": "锡林郭勒盟",
+      "value": "1525"
+    },
+    {
+      "label": "阿拉善盟",
+      "value": "1529"
+    }
+  ],
+  [{
+      "label": "沈阳市",
+      "value": "2101"
+    },
+    {
+      "label": "大连市",
+      "value": "2102"
+    },
+    {
+      "label": "鞍山市",
+      "value": "2103"
+    },
+    {
+      "label": "抚顺市",
+      "value": "2104"
+    },
+    {
+      "label": "本溪市",
+      "value": "2105"
+    },
+    {
+      "label": "丹东市",
+      "value": "2106"
+    },
+    {
+      "label": "锦州市",
+      "value": "2107"
+    },
+    {
+      "label": "营口市",
+      "value": "2108"
+    },
+    {
+      "label": "阜新市",
+      "value": "2109"
+    },
+    {
+      "label": "辽阳市",
+      "value": "2110"
+    },
+    {
+      "label": "盘锦市",
+      "value": "2111"
+    },
+    {
+      "label": "铁岭市",
+      "value": "2112"
+    },
+    {
+      "label": "朝阳市",
+      "value": "2113"
+    },
+    {
+      "label": "葫芦岛市",
+      "value": "2114"
+    }
+  ],
+  [{
+      "label": "长春市",
+      "value": "2201"
+    },
+    {
+      "label": "吉林市",
+      "value": "2202"
+    },
+    {
+      "label": "四平市",
+      "value": "2203"
+    },
+    {
+      "label": "辽源市",
+      "value": "2204"
+    },
+    {
+      "label": "通化市",
+      "value": "2205"
+    },
+    {
+      "label": "白山市",
+      "value": "2206"
+    },
+    {
+      "label": "松原市",
+      "value": "2207"
+    },
+    {
+      "label": "白城市",
+      "value": "2208"
+    },
+    {
+      "label": "延边朝鲜族自治州",
+      "value": "2224"
+    }
+  ],
+  [{
+      "label": "哈尔滨市",
+      "value": "2301"
+    },
+    {
+      "label": "齐齐哈尔市",
+      "value": "2302"
+    },
+    {
+      "label": "鸡西市",
+      "value": "2303"
+    },
+    {
+      "label": "鹤岗市",
+      "value": "2304"
+    },
+    {
+      "label": "双鸭山市",
+      "value": "2305"
+    },
+    {
+      "label": "大庆市",
+      "value": "2306"
+    },
+    {
+      "label": "伊春市",
+      "value": "2307"
+    },
+    {
+      "label": "佳木斯市",
+      "value": "2308"
+    },
+    {
+      "label": "七台河市",
+      "value": "2309"
+    },
+    {
+      "label": "牡丹江市",
+      "value": "2310"
+    },
+    {
+      "label": "黑河市",
+      "value": "2311"
+    },
+    {
+      "label": "绥化市",
+      "value": "2312"
+    },
+    {
+      "label": "大兴安岭地区",
+      "value": "2327"
+    }
+  ],
+  [{
+    "label": "市辖区",
+    "value": "3101"
+  }],
+  [{
+      "label": "南京市",
+      "value": "3201"
+    },
+    {
+      "label": "无锡市",
+      "value": "3202"
+    },
+    {
+      "label": "徐州市",
+      "value": "3203"
+    },
+    {
+      "label": "常州市",
+      "value": "3204"
+    },
+    {
+      "label": "苏州市",
+      "value": "3205"
+    },
+    {
+      "label": "南通市",
+      "value": "3206"
+    },
+    {
+      "label": "连云港市",
+      "value": "3207"
+    },
+    {
+      "label": "淮安市",
+      "value": "3208"
+    },
+    {
+      "label": "盐城市",
+      "value": "3209"
+    },
+    {
+      "label": "扬州市",
+      "value": "3210"
+    },
+    {
+      "label": "镇江市",
+      "value": "3211"
+    },
+    {
+      "label": "泰州市",
+      "value": "3212"
+    },
+    {
+      "label": "宿迁市",
+      "value": "3213"
+    }
+  ],
+  [{
+      "label": "杭州市",
+      "value": "3301"
+    },
+    {
+      "label": "宁波市",
+      "value": "3302"
+    },
+    {
+      "label": "温州市",
+      "value": "3303"
+    },
+    {
+      "label": "嘉兴市",
+      "value": "3304"
+    },
+    {
+      "label": "湖州市",
+      "value": "3305"
+    },
+    {
+      "label": "绍兴市",
+      "value": "3306"
+    },
+    {
+      "label": "金华市",
+      "value": "3307"
+    },
+    {
+      "label": "衢州市",
+      "value": "3308"
+    },
+    {
+      "label": "舟山市",
+      "value": "3309"
+    },
+    {
+      "label": "台州市",
+      "value": "3310"
+    },
+    {
+      "label": "丽水市",
+      "value": "3311"
+    }
+  ],
+  [{
+      "label": "合肥市",
+      "value": "3401"
+    },
+    {
+      "label": "芜湖市",
+      "value": "3402"
+    },
+    {
+      "label": "蚌埠市",
+      "value": "3403"
+    },
+    {
+      "label": "淮南市",
+      "value": "3404"
+    },
+    {
+      "label": "马鞍山市",
+      "value": "3405"
+    },
+    {
+      "label": "淮北市",
+      "value": "3406"
+    },
+    {
+      "label": "铜陵市",
+      "value": "3407"
+    },
+    {
+      "label": "安庆市",
+      "value": "3408"
+    },
+    {
+      "label": "黄山市",
+      "value": "3410"
+    },
+    {
+      "label": "滁州市",
+      "value": "3411"
+    },
+    {
+      "label": "阜阳市",
+      "value": "3412"
+    },
+    {
+      "label": "宿州市",
+      "value": "3413"
+    },
+    {
+      "label": "六安市",
+      "value": "3415"
+    },
+    {
+      "label": "亳州市",
+      "value": "3416"
+    },
+    {
+      "label": "池州市",
+      "value": "3417"
+    },
+    {
+      "label": "宣城市",
+      "value": "3418"
+    }
+  ],
+  [{
+      "label": "福州市",
+      "value": "3501"
+    },
+    {
+      "label": "厦门市",
+      "value": "3502"
+    },
+    {
+      "label": "莆田市",
+      "value": "3503"
+    },
+    {
+      "label": "三明市",
+      "value": "3504"
+    },
+    {
+      "label": "泉州市",
+      "value": "3505"
+    },
+    {
+      "label": "漳州市",
+      "value": "3506"
+    },
+    {
+      "label": "南平市",
+      "value": "3507"
+    },
+    {
+      "label": "龙岩市",
+      "value": "3508"
+    },
+    {
+      "label": "宁德市",
+      "value": "3509"
+    }
+  ],
+  [{
+      "label": "南昌市",
+      "value": "3601"
+    },
+    {
+      "label": "景德镇市",
+      "value": "3602"
+    },
+    {
+      "label": "萍乡市",
+      "value": "3603"
+    },
+    {
+      "label": "九江市",
+      "value": "3604"
+    },
+    {
+      "label": "新余市",
+      "value": "3605"
+    },
+    {
+      "label": "鹰潭市",
+      "value": "3606"
+    },
+    {
+      "label": "赣州市",
+      "value": "3607"
+    },
+    {
+      "label": "吉安市",
+      "value": "3608"
+    },
+    {
+      "label": "宜春市",
+      "value": "3609"
+    },
+    {
+      "label": "抚州市",
+      "value": "3610"
+    },
+    {
+      "label": "上饶市",
+      "value": "3611"
+    }
+  ],
+  [{
+      "label": "济南市",
+      "value": "3701"
+    },
+    {
+      "label": "青岛市",
+      "value": "3702"
+    },
+    {
+      "label": "淄博市",
+      "value": "3703"
+    },
+    {
+      "label": "枣庄市",
+      "value": "3704"
+    },
+    {
+      "label": "东营市",
+      "value": "3705"
+    },
+    {
+      "label": "烟台市",
+      "value": "3706"
+    },
+    {
+      "label": "潍坊市",
+      "value": "3707"
+    },
+    {
+      "label": "济宁市",
+      "value": "3708"
+    },
+    {
+      "label": "泰安市",
+      "value": "3709"
+    },
+    {
+      "label": "威海市",
+      "value": "3710"
+    },
+    {
+      "label": "日照市",
+      "value": "3711"
+    },
+    {
+      "label": "莱芜市",
+      "value": "3712"
+    },
+    {
+      "label": "临沂市",
+      "value": "3713"
+    },
+    {
+      "label": "德州市",
+      "value": "3714"
+    },
+    {
+      "label": "聊城市",
+      "value": "3715"
+    },
+    {
+      "label": "滨州市",
+      "value": "3716"
+    },
+    {
+      "label": "菏泽市",
+      "value": "3717"
+    }
+  ],
+  [{
+      "label": "郑州市",
+      "value": "4101"
+    },
+    {
+      "label": "开封市",
+      "value": "4102"
+    },
+    {
+      "label": "洛阳市",
+      "value": "4103"
+    },
+    {
+      "label": "平顶山市",
+      "value": "4104"
+    },
+    {
+      "label": "安阳市",
+      "value": "4105"
+    },
+    {
+      "label": "鹤壁市",
+      "value": "4106"
+    },
+    {
+      "label": "新乡市",
+      "value": "4107"
+    },
+    {
+      "label": "焦作市",
+      "value": "4108"
+    },
+    {
+      "label": "濮阳市",
+      "value": "4109"
+    },
+    {
+      "label": "许昌市",
+      "value": "4110"
+    },
+    {
+      "label": "漯河市",
+      "value": "4111"
+    },
+    {
+      "label": "三门峡市",
+      "value": "4112"
+    },
+    {
+      "label": "南阳市",
+      "value": "4113"
+    },
+    {
+      "label": "商丘市",
+      "value": "4114"
+    },
+    {
+      "label": "信阳市",
+      "value": "4115"
+    },
+    {
+      "label": "周口市",
+      "value": "4116"
+    },
+    {
+      "label": "驻马店市",
+      "value": "4117"
+    },
+    {
+      "label": "省直辖县级行政区划",
+      "value": "4190"
+    }
+  ],
+  [{
+      "label": "武汉市",
+      "value": "4201"
+    },
+    {
+      "label": "黄石市",
+      "value": "4202"
+    },
+    {
+      "label": "十堰市",
+      "value": "4203"
+    },
+    {
+      "label": "宜昌市",
+      "value": "4205"
+    },
+    {
+      "label": "襄阳市",
+      "value": "4206"
+    },
+    {
+      "label": "鄂州市",
+      "value": "4207"
+    },
+    {
+      "label": "荆门市",
+      "value": "4208"
+    },
+    {
+      "label": "孝感市",
+      "value": "4209"
+    },
+    {
+      "label": "荆州市",
+      "value": "4210"
+    },
+    {
+      "label": "黄冈市",
+      "value": "4211"
+    },
+    {
+      "label": "咸宁市",
+      "value": "4212"
+    },
+    {
+      "label": "随州市",
+      "value": "4213"
+    },
+    {
+      "label": "恩施土家族苗族自治州",
+      "value": "4228"
+    },
+    {
+      "label": "省直辖县级行政区划",
+      "value": "4290"
+    }
+  ],
+  [{
+      "label": "长沙市",
+      "value": "4301"
+    },
+    {
+      "label": "株洲市",
+      "value": "4302"
+    },
+    {
+      "label": "湘潭市",
+      "value": "4303"
+    },
+    {
+      "label": "衡阳市",
+      "value": "4304"
+    },
+    {
+      "label": "邵阳市",
+      "value": "4305"
+    },
+    {
+      "label": "岳阳市",
+      "value": "4306"
+    },
+    {
+      "label": "常德市",
+      "value": "4307"
+    },
+    {
+      "label": "张家界市",
+      "value": "4308"
+    },
+    {
+      "label": "益阳市",
+      "value": "4309"
+    },
+    {
+      "label": "郴州市",
+      "value": "4310"
+    },
+    {
+      "label": "永州市",
+      "value": "4311"
+    },
+    {
+      "label": "怀化市",
+      "value": "4312"
+    },
+    {
+      "label": "娄底市",
+      "value": "4313"
+    },
+    {
+      "label": "湘西土家族苗族自治州",
+      "value": "4331"
+    }
+  ],
+  [{
+      "label": "广州市",
+      "value": "4401"
+    },
+    {
+      "label": "韶关市",
+      "value": "4402"
+    },
+    {
+      "label": "深圳市",
+      "value": "4403"
+    },
+    {
+      "label": "珠海市",
+      "value": "4404"
+    },
+    {
+      "label": "汕头市",
+      "value": "4405"
+    },
+    {
+      "label": "佛山市",
+      "value": "4406"
+    },
+    {
+      "label": "江门市",
+      "value": "4407"
+    },
+    {
+      "label": "湛江市",
+      "value": "4408"
+    },
+    {
+      "label": "茂名市",
+      "value": "4409"
+    },
+    {
+      "label": "肇庆市",
+      "value": "4412"
+    },
+    {
+      "label": "惠州市",
+      "value": "4413"
+    },
+    {
+      "label": "梅州市",
+      "value": "4414"
+    },
+    {
+      "label": "汕尾市",
+      "value": "4415"
+    },
+    {
+      "label": "河源市",
+      "value": "4416"
+    },
+    {
+      "label": "阳江市",
+      "value": "4417"
+    },
+    {
+      "label": "清远市",
+      "value": "4418"
+    },
+    {
+      "label": "东莞市",
+      "value": "4419"
+    },
+    {
+      "label": "中山市",
+      "value": "4420"
+    },
+    {
+      "label": "潮州市",
+      "value": "4451"
+    },
+    {
+      "label": "揭阳市",
+      "value": "4452"
+    },
+    {
+      "label": "云浮市",
+      "value": "4453"
+    }
+  ],
+  [{
+      "label": "南宁市",
+      "value": "4501"
+    },
+    {
+      "label": "柳州市",
+      "value": "4502"
+    },
+    {
+      "label": "桂林市",
+      "value": "4503"
+    },
+    {
+      "label": "梧州市",
+      "value": "4504"
+    },
+    {
+      "label": "北海市",
+      "value": "4505"
+    },
+    {
+      "label": "防城港市",
+      "value": "4506"
+    },
+    {
+      "label": "钦州市",
+      "value": "4507"
+    },
+    {
+      "label": "贵港市",
+      "value": "4508"
+    },
+    {
+      "label": "玉林市",
+      "value": "4509"
+    },
+    {
+      "label": "百色市",
+      "value": "4510"
+    },
+    {
+      "label": "贺州市",
+      "value": "4511"
+    },
+    {
+      "label": "河池市",
+      "value": "4512"
+    },
+    {
+      "label": "来宾市",
+      "value": "4513"
+    },
+    {
+      "label": "崇左市",
+      "value": "4514"
+    }
+  ],
+  [{
+      "label": "海口市",
+      "value": "4601"
+    },
+    {
+      "label": "三亚市",
+      "value": "4602"
+    },
+    {
+      "label": "三沙市",
+      "value": "4603"
+    },
+    {
+      "label": "儋州市",
+      "value": "4604"
+    },
+    {
+      "label": "省直辖县级行政区划",
+      "value": "4690"
+    }
+  ],
+  [{
+      "label": "市辖区",
+      "value": "5001"
+    },
+    {
+      "label": "县",
+      "value": "5002"
+    }
+  ],
+  [{
+      "label": "成都市",
+      "value": "5101"
+    },
+    {
+      "label": "自贡市",
+      "value": "5103"
+    },
+    {
+      "label": "攀枝花市",
+      "value": "5104"
+    },
+    {
+      "label": "泸州市",
+      "value": "5105"
+    },
+    {
+      "label": "德阳市",
+      "value": "5106"
+    },
+    {
+      "label": "绵阳市",
+      "value": "5107"
+    },
+    {
+      "label": "广元市",
+      "value": "5108"
+    },
+    {
+      "label": "遂宁市",
+      "value": "5109"
+    },
+    {
+      "label": "内江市",
+      "value": "5110"
+    },
+    {
+      "label": "乐山市",
+      "value": "5111"
+    },
+    {
+      "label": "南充市",
+      "value": "5113"
+    },
+    {
+      "label": "眉山市",
+      "value": "5114"
+    },
+    {
+      "label": "宜宾市",
+      "value": "5115"
+    },
+    {
+      "label": "广安市",
+      "value": "5116"
+    },
+    {
+      "label": "达州市",
+      "value": "5117"
+    },
+    {
+      "label": "雅安市",
+      "value": "5118"
+    },
+    {
+      "label": "巴中市",
+      "value": "5119"
+    },
+    {
+      "label": "资阳市",
+      "value": "5120"
+    },
+    {
+      "label": "阿坝藏族羌族自治州",
+      "value": "5132"
+    },
+    {
+      "label": "甘孜藏族自治州",
+      "value": "5133"
+    },
+    {
+      "label": "凉山彝族自治州",
+      "value": "5134"
+    }
+  ],
+  [{
+      "label": "贵阳市",
+      "value": "5201"
+    },
+    {
+      "label": "六盘水市",
+      "value": "5202"
+    },
+    {
+      "label": "遵义市",
+      "value": "5203"
+    },
+    {
+      "label": "安顺市",
+      "value": "5204"
+    },
+    {
+      "label": "毕节市",
+      "value": "5205"
+    },
+    {
+      "label": "铜仁市",
+      "value": "5206"
+    },
+    {
+      "label": "黔西南布依族苗族自治州",
+      "value": "5223"
+    },
+    {
+      "label": "黔东南苗族侗族自治州",
+      "value": "5226"
+    },
+    {
+      "label": "黔南布依族苗族自治州",
+      "value": "5227"
+    }
+  ],
+  [{
+      "label": "昆明市",
+      "value": "5301"
+    },
+    {
+      "label": "曲靖市",
+      "value": "5303"
+    },
+    {
+      "label": "玉溪市",
+      "value": "5304"
+    },
+    {
+      "label": "保山市",
+      "value": "5305"
+    },
+    {
+      "label": "昭通市",
+      "value": "5306"
+    },
+    {
+      "label": "丽江市",
+      "value": "5307"
+    },
+    {
+      "label": "普洱市",
+      "value": "5308"
+    },
+    {
+      "label": "临沧市",
+      "value": "5309"
+    },
+    {
+      "label": "楚雄彝族自治州",
+      "value": "5323"
+    },
+    {
+      "label": "红河哈尼族彝族自治州",
+      "value": "5325"
+    },
+    {
+      "label": "文山壮族苗族自治州",
+      "value": "5326"
+    },
+    {
+      "label": "西双版纳傣族自治州",
+      "value": "5328"
+    },
+    {
+      "label": "大理白族自治州",
+      "value": "5329"
+    },
+    {
+      "label": "德宏傣族景颇族自治州",
+      "value": "5331"
+    },
+    {
+      "label": "怒江傈僳族自治州",
+      "value": "5333"
+    },
+    {
+      "label": "迪庆藏族自治州",
+      "value": "5334"
+    }
+  ],
+  [{
+      "label": "拉萨市",
+      "value": "5401"
+    },
+    {
+      "label": "日喀则市",
+      "value": "5402"
+    },
+    {
+      "label": "昌都市",
+      "value": "5403"
+    },
+    {
+      "label": "林芝市",
+      "value": "5404"
+    },
+    {
+      "label": "山南市",
+      "value": "5405"
+    },
+    {
+      "label": "那曲地区",
+      "value": "5424"
+    },
+    {
+      "label": "阿里地区",
+      "value": "5425"
+    }
+  ],
+  [{
+      "label": "西安市",
+      "value": "6101"
+    },
+    {
+      "label": "铜川市",
+      "value": "6102"
+    },
+    {
+      "label": "宝鸡市",
+      "value": "6103"
+    },
+    {
+      "label": "咸阳市",
+      "value": "6104"
+    },
+    {
+      "label": "渭南市",
+      "value": "6105"
+    },
+    {
+      "label": "延安市",
+      "value": "6106"
+    },
+    {
+      "label": "汉中市",
+      "value": "6107"
+    },
+    {
+      "label": "榆林市",
+      "value": "6108"
+    },
+    {
+      "label": "安康市",
+      "value": "6109"
+    },
+    {
+      "label": "商洛市",
+      "value": "6110"
+    }
+  ],
+  [{
+      "label": "兰州市",
+      "value": "6201"
+    },
+    {
+      "label": "嘉峪关市",
+      "value": "6202"
+    },
+    {
+      "label": "金昌市",
+      "value": "6203"
+    },
+    {
+      "label": "白银市",
+      "value": "6204"
+    },
+    {
+      "label": "天水市",
+      "value": "6205"
+    },
+    {
+      "label": "武威市",
+      "value": "6206"
+    },
+    {
+      "label": "张掖市",
+      "value": "6207"
+    },
+    {
+      "label": "平凉市",
+      "value": "6208"
+    },
+    {
+      "label": "酒泉市",
+      "value": "6209"
+    },
+    {
+      "label": "庆阳市",
+      "value": "6210"
+    },
+    {
+      "label": "定西市",
+      "value": "6211"
+    },
+    {
+      "label": "陇南市",
+      "value": "6212"
+    },
+    {
+      "label": "临夏回族自治州",
+      "value": "6229"
+    },
+    {
+      "label": "甘南藏族自治州",
+      "value": "6230"
+    }
+  ],
+  [{
+      "label": "西宁市",
+      "value": "6301"
+    },
+    {
+      "label": "海东市",
+      "value": "6302"
+    },
+    {
+      "label": "海北藏族自治州",
+      "value": "6322"
+    },
+    {
+      "label": "黄南藏族自治州",
+      "value": "6323"
+    },
+    {
+      "label": "海南藏族自治州",
+      "value": "6325"
+    },
+    {
+      "label": "果洛藏族自治州",
+      "value": "6326"
+    },
+    {
+      "label": "玉树藏族自治州",
+      "value": "6327"
+    },
+    {
+      "label": "海西蒙古族藏族自治州",
+      "value": "6328"
+    }
+  ],
+  [{
+      "label": "银川市",
+      "value": "6401"
+    },
+    {
+      "label": "石嘴山市",
+      "value": "6402"
+    },
+    {
+      "label": "吴忠市",
+      "value": "6403"
+    },
+    {
+      "label": "固原市",
+      "value": "6404"
+    },
+    {
+      "label": "中卫市",
+      "value": "6405"
+    }
+  ],
+  [{
+      "label": "乌鲁木齐市",
+      "value": "6501"
+    },
+    {
+      "label": "克拉玛依市",
+      "value": "6502"
+    },
+    {
+      "label": "吐鲁番市",
+      "value": "6504"
+    },
+    {
+      "label": "哈密市",
+      "value": "6505"
+    },
+    {
+      "label": "昌吉回族自治州",
+      "value": "6523"
+    },
+    {
+      "label": "博尔塔拉蒙古自治州",
+      "value": "6527"
+    },
+    {
+      "label": "巴音郭楞蒙古自治州",
+      "value": "6528"
+    },
+    {
+      "label": "阿克苏地区",
+      "value": "6529"
+    },
+    {
+      "label": "克孜勒苏柯尔克孜自治州",
+      "value": "6530"
+    },
+    {
+      "label": "喀什地区",
+      "value": "6531"
+    },
+    {
+      "label": "和田地区",
+      "value": "6532"
+    },
+    {
+      "label": "伊犁哈萨克自治州",
+      "value": "6540"
+    },
+    {
+      "label": "塔城地区",
+      "value": "6542"
+    },
+    {
+      "label": "阿勒泰地区",
+      "value": "6543"
+    },
+    {
+      "label": "自治区直辖县级行政区划",
+      "value": "6590"
+    }
+  ],
+  [{
+      "label": "台北",
+      "value": "6601"
+    },
+    {
+      "label": "高雄",
+      "value": "6602"
+    },
+    {
+      "label": "基隆",
+      "value": "6603"
+    },
+    {
+      "label": "台中",
+      "value": "6604"
+    },
+    {
+      "label": "台南",
+      "value": "6605"
+    },
+    {
+      "label": "新竹",
+      "value": "6606"
+    },
+    {
+      "label": "嘉义",
+      "value": "6607"
+    },
+    {
+      "label": "宜兰",
+      "value": "6608"
+    },
+    {
+      "label": "桃园",
+      "value": "6609"
+    },
+    {
+      "label": "苗栗",
+      "value": "6610"
+    },
+    {
+      "label": "彰化",
+      "value": "6611"
+    },
+    {
+      "label": "南投",
+      "value": "6612"
+    },
+    {
+      "label": "云林",
+      "value": "6613"
+    },
+    {
+      "label": "屏东",
+      "value": "6614"
+    },
+    {
+      "label": "台东",
+      "value": "6615"
+    },
+    {
+      "label": "花莲",
+      "value": "6616"
+    },
+    {
+      "label": "澎湖",
+      "value": "6617"
+    }
+  ],
+  [{
+      "label": "香港岛",
+      "value": "6701"
+    },
+    {
+      "label": "九龙",
+      "value": "6702"
+    },
+    {
+      "label": "新界",
+      "value": "6703"
+    }
+  ],
+  [{
+      "label": "澳门半岛",
+      "value": "6801"
+    },
+    {
+      "label": "氹仔岛",
+      "value": "6802"
+    },
+    {
+      "label": "路环岛",
+      "value": "6803"
+    },
+    {
+      "label": "路氹城",
+      "value": "6804"
+    }
+  ]
+]
+export default cityData;

+ 139 - 0
components/w-picker/city-data/province.js

@@ -0,0 +1,139 @@
+/* eslint-disable */
+var provinceData = [{
+    "label": "北京市",
+    "value": "11"
+  },
+  {
+    "label": "天津市",
+    "value": "12"
+  },
+  {
+    "label": "河北省",
+    "value": "13"
+  },
+  {
+    "label": "山西省",
+    "value": "14"
+  },
+  {
+    "label": "内蒙古自治区",
+    "value": "15"
+  },
+  {
+    "label": "辽宁省",
+    "value": "21"
+  },
+  {
+    "label": "吉林省",
+    "value": "22"
+  },
+  {
+    "label": "黑龙江省",
+    "value": "23"
+  },
+  {
+    "label": "上海市",
+    "value": "31"
+  },
+  {
+    "label": "江苏省",
+    "value": "32"
+  },
+  {
+    "label": "浙江省",
+    "value": "33"
+  },
+  {
+    "label": "安徽省",
+    "value": "34"
+  },
+  {
+    "label": "福建省",
+    "value": "35"
+  },
+  {
+    "label": "江西省",
+    "value": "36"
+  },
+  {
+    "label": "山东省",
+    "value": "37"
+  },
+  {
+    "label": "河南省",
+    "value": "41"
+  },
+  {
+    "label": "湖北省",
+    "value": "42"
+  },
+  {
+    "label": "湖南省",
+    "value": "43"
+  },
+  {
+    "label": "广东省",
+    "value": "44"
+  },
+  {
+    "label": "广西壮族自治区",
+    "value": "45"
+  },
+  {
+    "label": "海南省",
+    "value": "46"
+  },
+  {
+    "label": "重庆市",
+    "value": "50"
+  },
+  {
+    "label": "四川省",
+    "value": "51"
+  },
+  {
+    "label": "贵州省",
+    "value": "52"
+  },
+  {
+    "label": "云南省",
+    "value": "53"
+  },
+  {
+    "label": "西藏自治区",
+    "value": "54"
+  },
+  {
+    "label": "陕西省",
+    "value": "61"
+  },
+  {
+    "label": "甘肃省",
+    "value": "62"
+  },
+  {
+    "label": "青海省",
+    "value": "63"
+  },
+  {
+    "label": "宁夏回族自治区",
+    "value": "64"
+  },
+  {
+    "label": "新疆维吾尔自治区",
+    "value": "65"
+  },
+  {
+    "label": "台湾",
+    "value": "66"
+  },
+  {
+    "label": "香港",
+    "value": "67"
+  },
+  {
+    "label": "澳门",
+    "value": "68"
+  }
+]
+export default provinceData;

+ 502 - 0
components/w-picker/w-picker.js

@@ -0,0 +1,502 @@
+const forMatNum=(num)=>{
+	return num<10?'0'+num:num+'';
+}
+const initPicker={
+	//日期
+	date:{
+		init(start,end,mode="date",step,value,flag,disabled){
+			let aToday=new Date();
+			let tYear,tMonth,tDay,tHours,tMinutes,tSeconds,defaultVal=[];
+			let initstartDate=new Date(start);
+			let endDate=new Date(end);
+			if(start>end){
+				initstartDate=new Date(end);
+				endDate=new Date(start);
+			};
+			let startYear=initstartDate.getFullYear();
+			let startMonth=initstartDate.getMonth()+1;
+			let endYear=endDate.getFullYear();
+			let years=[],months=[],days=[],hours=[],minutes=[],seconds=[],areas=[],returnArr=[];
+			let curMonth=flag?value[1]*1:(value[1]+1);
+			let dYear=aToday.getFullYear();
+			let dMonth=aToday.getMonth()+1;
+			let dDate=aToday.getDate();
+			let totalDays=new Date(startYear,curMonth,0).getDate();
+			for(let s=startYear;s<=endYear;s++){
+				years.push(s+'');
+			};
+			let curYear=years[value[0]];
+			switch(mode){
+				case "half":
+				case "date":
+				case "yearMonth":
+					if(disabled&&curYear==dYear){
+						for(let m=1;m<=dMonth;m++){
+							months.push(forMatNum(m));
+						};
+						for(let d=1;d<=dDate;d++){
+							days.push(forMatNum(d));
+						}
+					}else{
+						for(let m=1;m<=12;m++){
+							months.push(forMatNum(m));
+						};
+						for(let d=1;d<=totalDays;d++){
+							days.push(forMatNum(d));
+						}
+					};
+					break;
+				default:
+					for(let m=1;m<=12;m++){
+						months.push(forMatNum(m));
+					};
+					for(let d=1;d<=totalDays;d++){
+						days.push(forMatNum(d));
+					}
+					break;
+			}
+			for(let h=0;h<24;h++){
+				hours.push(forMatNum(h));
+			}
+			for(let m=0;m<60;m+=step*1){
+				minutes.push(forMatNum(m));
+			}
+			for(let s=0;s<60;s++){
+				seconds.push(forMatNum(s));
+			}
+			if(flag){
+				returnArr=[
+					years.indexOf(value[0]),
+					months.indexOf(value[1]),
+					days.indexOf(value[2]),
+					hours.indexOf(value[3]),
+					minutes.indexOf(value[4])==-1?0:minutes.indexOf(value[4]),
+					seconds.indexOf(value[5])
+				]
+			};
+			switch(mode){
+				case "range":
+					if(flag){
+						defaultVal=[returnArr[0],returnArr[1],returnArr[2],0,returnArr[0],returnArr[1],returnArr[2]];
+						return {years,months,days,defaultVal}
+					}else{
+						return {years,months,days}
+					}
+					break;
+				case "date":
+					if(flag){
+						defaultVal=[returnArr[0],returnArr[1],returnArr[2]];
+						return {years,months,days,defaultVal}
+					}else{
+						return {years,months,days}
+					}
+					break;
+				case "half":
+					areas=[{
+						label:"上午",
+						value:0
+					},{
+						label:"下午",
+						value:1
+					}];
+					if(flag){
+						defaultVal=[returnArr[0],returnArr[1],returnArr[2],returnArr[3]];
+						return {years,months,days,areas,defaultVal}
+					}else{
+						return {years,months,days,areas}
+					}
+					break;	
+				case "yearMonth":
+					if(flag){
+						defaultVal=[returnArr[0],returnArr[1]];
+						return {years,months,defaultVal}
+					}else{
+						return {years,months}
+					}
+					break;
+				case "dateTime":
+					if(flag){
+						defaultVal=returnArr;
+						return {years,months,days,hours,minutes,seconds,defaultVal}
+					}else{
+						return {years,months,days,hours,minutes,seconds}
+					}
+					break;
+				case "time":
+					if(flag){
+						defaultVal=[returnArr[3],returnArr[4],returnArr[5]];
+						return {hours,minutes,seconds,defaultVal}
+					}else{
+						return {hours,minutes,seconds}
+					}
+					break;			
+			}
+		},
+		initMonths:(year,disabled)=>{
+			let aDate=new Date();
+			let dYear=aDate.getFullYear();
+			let dMonth=aDate.getMonth()+1;
+			let dDate=aDate.getDate();
+			let flag=dYear==year?true:false;
+			let months=[];
+			if(flag&&disabled){
+				for(let m=1;m<=dMonth;m++){
+					months.push(forMatNum(m));
+				};			
+			}else{
+				for(let m=1;m<=12;m++){
+					months.push(forMatNum(m));
+				};
+			};
+			return months;
+		},
+		initDays:(year,month,disabled)=>{
+			let aDate=new Date();
+			let dYear=aDate.getFullYear();
+			let dMonth=aDate.getMonth()+1;
+			let dDate=aDate.getDate();
+			let flag=(dYear==year&&dMonth==month)?true:false;
+			let totalDays=new Date(year,month,0).getDate();
+			let dates=[];
+			if(flag&&disabled){
+				for(let d=1;d<=dDate;d++){
+					dates.push(forMatNum(d));
+				};			
+			}else{
+				for(let d=1;d<=totalDays;d++){
+					dates.push(forMatNum(d));
+				};
+			};
+			return dates;
+		},
+	},
+	//短期日期上下午
+	limitHour:{
+		init(dayStep=7){
+			let startDate=new Date();
+			let date=[],areas=[],hours=[];
+			let hour=new Date().getHours();
+			let weeks=["周日","周一","周二","周三","周四","周五","周六"];
+			let arrs=[];
+			for(let i=0;i<dayStep;i++){
+				let year,month,day,weekday;
+				year=startDate.getFullYear();
+				month=forMatNum(startDate.getMonth()+1);
+				day=forMatNum(startDate.getDate());
+				weekday=weeks[startDate.getDay()];
+				let label="";
+				switch(i){
+					case 0:
+						label="今天";
+						break;
+					case 1:
+						label="明天"
+						break;
+					case 2:
+						label="后天"
+						break;
+					default:
+						label=month+"月"+day+"日"+" "+weekday;
+						break;
+				}
+				date.push({
+					label:label,
+					value:year+"-"+month+"-"+day,
+					today:i==0?true:false
+				})
+				startDate.setDate(startDate.getDate()+1);
+			}
+			if(hour>12){
+				areas=[{
+					label:"下午",
+					value:1
+				}]
+			}else{
+				areas=[{
+					label:"上午",
+					value:0
+				},{
+					label:"下午",
+					value:1
+				}]
+			};
+			for(let k=hour>12?hour-12:hour;k<=12;k++){
+				hours.push({
+					label:forMatNum(k),
+					value:forMatNum(hour>12?k+12:k)
+				})
+			};
+			return {date,areas,hours};
+		},
+		initAreas(date){
+			let areas=[];
+			let hour=new Date().getHours();
+			if(date.today){
+				if(hour>12){
+					areas=[{
+						label:"下午",
+						value:1
+					}]
+				}else{
+					areas=[{
+						label:"上午",
+						value:0
+					},{
+						label:"下午",
+						value:1
+					}]
+				};
+			}else{
+				areas=[{
+					label:"上午",
+					value:0
+				},{
+					label:"下午",
+					value:1
+				}]
+			}
+			return areas;areas=[{
+					label:"上午",
+					value:0
+				},{
+					label:"下午",
+					value:1
+				}]
+		},
+		initHours(dateCol,hourCol){
+			let hours=[];
+			let hour=new Date().getHours();
+			if(dateCol.today){
+				if(hourCol.value==1&&hour<=12){
+					for(let k=1;k<=12;k++){
+						hours.push({
+							label:forMatNum(k),
+							value:forMatNum(hourCol.value==1?k+12:k)
+						})
+					};
+				}else{
+					for(let k=hour>12?hour-12:hour;k<=12;k++){
+						hours.push({
+							label:forMatNum(k),
+							value:forMatNum(hourCol.value==1?k+12:k)
+						})
+					};
+				}
+				
+			}else{
+				for(let k=1;k<=12;k++){
+					hours.push({
+						label:forMatNum(k),
+						value:forMatNum(hourCol.value==1?k+12:k)
+					})
+				};
+			};
+			return hours
+		}
+	},
+	//短期日期时间初始化
+	limit:{
+		init(dayStep=7,startHour=8,endHour=20,minuteStep=1,afterStep=30){
+			let startDate=new Date();
+			let bsDate=new Date(new Date().getTime()+afterStep*60*1000);
+			let date=[],hours=[],minutes=[];
+			let hour=bsDate.getHours();
+			let minute=Math.floor(bsDate.getMinutes()/minuteStep)*minuteStep;
+			let weeks=["周日","周一","周二","周三","周四","周五","周六"];
+			for(let i=0;i<dayStep;i++){
+				let year,month,day,weekday;
+				year=startDate.getFullYear();
+				month=forMatNum(startDate.getMonth()+1);
+				day=forMatNum(startDate.getDate());
+				weekday=weeks[startDate.getDay()];
+				let label="";
+				switch(i){
+					case 0:
+						label="今天";
+						break;
+					case 1:
+						label="明天"
+						break;
+					case 2:
+						label="后天"
+						break;
+					default:
+						label=month+"月"+day+"日"+" "+weekday;
+						break;
+				}
+				date.push({
+					label:label,
+					value:year+"-"+month+"-"+day,
+					flag:i==0?true:false
+				})
+				startDate.setDate(startDate.getDate()+1);
+			}
+			if(hour<startHour){
+				hour=startHour;
+			};
+			if(hour>endHour){
+				hour=endHour;
+			};
+			for(let k=hour*1;k<=endHour*1;k++){
+				hours.push({
+					label:forMatNum(k),
+					value:forMatNum(k),
+					flag:k==hour?true:false
+				})
+			};
+			for(let j=minute;j<60;j+=minuteStep*1){
+				minutes.push({
+					label:forMatNum(j),
+					value:forMatNum(j)
+				});
+			}
+			return {date,hours,minutes};
+		},
+		initHours(startHour=8,endHour=20,minuteStep=1,afterStep=30,date){
+			let hours=[];
+			let arr=date.split("-");
+			let aDate=new Date();
+			let dYear=aDate.getFullYear();
+			let dMonth=aDate.getMonth()+1;
+			let dDate=aDate.getDate();
+			let bsDate=new Date(new Date().getTime()+afterStep*60*1000);
+			let hour=bsDate.getHours();
+			let flag=(dYear==arr[0]&&dMonth==arr[1]&&dDate==arr[2])?true:false;
+			if(hour>endHour){
+				hour=endHour;
+			};
+			if(flag){
+				for(let k=hour*1;k<=endHour*1;k++){
+					hours.push({
+						label:forMatNum(k),
+						value:forMatNum(k),
+						flag:k==hour?true:false
+					})
+				};			
+			}else{
+				for(let k=startHour*1;k<=endHour*1;k++){
+					hours.push({
+						label:forMatNum(k),
+						value:forMatNum(k),
+						flag:false
+					})
+				}			
+			};
+			return hours;
+		},
+		initMinutes(startHour=8,endHour=20,minuteStep=1,afterStep=30,date,hour){
+			let minutes=[];
+			let bsDate=new Date(new Date().getTime()+afterStep*60*1000);
+			let arr=date.split("-");
+			let aDate=new Date();
+			let dYear=aDate.getFullYear();
+			let dMonth=aDate.getMonth()+1;
+			let dDate=aDate.getDate();
+			let dHour=bsDate.getHours();;
+			let minute=Math.floor(bsDate.getMinutes()/minuteStep)*minuteStep;
+			let flag=(dYear==arr[0]&&dMonth==arr[1]&&dDate==arr[2])?true:false;
+			if(flag){
+				if(hour==dHour){
+					for(let j=minute;j<60;j+=minuteStep*1){
+						minutes.push({
+							label:forMatNum(j),
+							value:forMatNum(j)
+						});
+					}	
+				}else{
+					for(let j=0;j<60;j+=minuteStep*1){
+						minutes.push({
+							label:forMatNum(j),
+							value:forMatNum(j)
+						})
+					}
+				}
+						
+			}else{
+				for(let j=0;j<60;j+=minuteStep*1){
+					minutes.push({
+						label:forMatNum(j),
+						value:forMatNum(j)
+					})
+				}			
+			}
+			return minutes;
+		}
+	},
+	//选择区间初始化
+	range:{
+		init(start,end,value,flag){
+			let aToday=new Date();
+			let tYear,tMonth,tDay,tHours,tMinutes,tSeconds,defaultVal=[];
+			let initstartDate=new Date(start);
+			let endDate=new Date(end);
+			if(start>end){
+				initstartDate=new Date(end);
+				endDate=new Date(start);
+			};
+			let startYear=initstartDate.getFullYear();
+			let startMonth=initstartDate.getMonth()+1;
+			let endYear=endDate.getFullYear();
+			let fyears=[],fmonths=[],fdays=[],tyears=[],tmonths=[],tdays=[],returnArr=[];
+			let curMonth=flag?value[1]*1:(value[1]+1);
+			let totalDays=new Date(startYear,curMonth,0).getDate();
+			for(let s=startYear;s<=endYear;s++){
+				fyears.push(s+'');
+			};
+			for(let m=1;m<=12;m++){
+				fmonths.push(forMatNum(m));
+			};
+			for(let d=1;d<=totalDays;d++){
+				fdays.push(forMatNum(d));
+			};
+			for(let s=startYear;s<=endYear;s++){
+				tyears.push(s+'');
+			};
+			for(let m=1;m<=12;m++){
+				tmonths.push(forMatNum(m));
+			};
+			for(let d=1;d<=totalDays;d++){
+				tdays.push(forMatNum(d));
+			};
+			if(flag){
+				defaultVal=[
+					fyears.indexOf(value[0]),
+					fmonths.indexOf(value[1]),
+					fdays.indexOf(value[2]),
+					0,
+					tyears.indexOf(value[0]),
+					tmonths.indexOf(value[1]),
+					tdays.indexOf(value[2])
+				];
+				return {
+					fyears,
+					fmonths,
+					fdays,
+					tyears,
+					tmonths,
+					tdays,
+					defaultVal
+				}
+			}else{
+				return {
+					fyears,
+					fmonths,
+					fdays,
+					tyears,
+					tmonths,
+					tdays,
+				}
+			}
+		},
+		initDays(year,month){
+			let totalDays=new Date(year,month,0).getDate();
+			let dates=[];
+			for(let d=1;d<=totalDays;d++){
+				dates.push(forMatNum(d));
+			};
+			return dates;
+		}
+	}
+}
+
+export default initPicker

+ 801 - 0
components/w-picker/w-picker.vue

@@ -0,0 +1,801 @@
+<template>
+	<view class="w-picker">
+		<view class="mask" :class="showPicker ? 'show' : ''" @tap="maskTap" @touchmove.stop.prevent catchtouchmove="true"></view>
+		<view class="w-picker-cnt" :class="{'show':showPicker}">
+			<view class="w-picker-hd" @touchmove.stop.prevent catchtouchmove="true">
+			  <view class="w-picker-btn" @tap="pickerCancel">取消</view>
+			  <view class="w-picker-btn" :style="{'color':themeColor}" @tap="pickerConfirm">确定</view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='half'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.years" :key="index">{{item}}年</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.months" :key="index">{{item}}月</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.days" :key="index">{{item}}日</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.areas" :key="index">{{item.label}}</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='date'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.years" :key="index">{{item}}年</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.months" :key="index">{{item}}月</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.days" :key="index">{{item}}日</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='yearMonth'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.years" :key="index">{{item}}年</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.months" :key="index">{{item}}月</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='dateTime'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.years" :key="index">{{item}}年</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.months" :key="index">{{item}}月</view>
+					</picker-view-column>
+					<picker-view-column >
+						<view class="w-picker-item" v-for="(item,index) in data.days" :key="index">{{item}}日</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.hours" :key="index">{{item}}时</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.minutes" :key="index">{{item}}分</view>
+					</picker-view-column>
+<!-- 					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.seconds" :key="index">{{item}}秒</view>
+					</picker-view-column> -->
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='range'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.fyears" :key="index">{{item}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.fmonths" :key="index">{{item}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.fdays" :key="index">{{item}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item">-</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.tyears" :key="index">{{item}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.tmonths" :key="index">{{item}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.tdays" :key="index">{{item}}</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='time'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.hours" :key="index">{{item}}时</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.minutes" :key="index">{{item}}分</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.seconds" :key="index">{{item}}秒</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='region'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.provinces" :key="index">{{item.label}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.citys" :key="index">{{item.label}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.areas" :key="index">{{item.label}}</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='selector'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data" :key="index">{{item.label}}</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='limit'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.date" :key="index">{{item.label}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.hours" :key="index">{{item.label}}时</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.minutes" :key="index">{{item.label}}分</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+			<view class="w-picker-view" v-if="mode=='limitHour'">
+				<picker-view :indicator-style="itemHeight" :value="pickVal" @change="bindChange">
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.date" :key="index">{{item.label}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.areas" :key="index">{{item.label}}</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="w-picker-item" v-for="(item,index) in data.hours" :key="index">{{item.label}}时</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import provinces from './city-data/province.js';
+	import citys from './city-data/city.js';
+	import areas from './city-data/area.js';
+	import initPicker from "./w-picker.js";
+	function oneOf (value, validList) {
+		for (let i = 0; i < validList.length; i++) {
+		  if (value === validList[i]) {
+			return true;
+		  }
+		}
+		throw new Error('mode无效,请选择有效的mode!');
+		return false;
+	}
+	export default {
+		data() {
+			return {
+				result:[],
+				data:{},
+				checkArr:[],
+				checkValue:[],
+				pickVal:[],
+				showPicker:false,
+				resultStr:"",
+				itemHeight:`height: ${uni.upx2px(88)}px;`
+			};
+		},
+		computed:{
+			
+		},
+		props:{
+			mode:{
+				type:String,
+				validator(mode){
+					let modeList=['half','date', 'dateTime', 'yearMonth','time','region','selector','limit','limitHour','range'];//过滤无效mode;
+					return oneOf(mode,modeList);
+				},
+				default(){
+					return "date"
+				}
+			},
+			themeColor:{
+				type:String,
+				default(){
+					return "#f5a200"
+				}
+			},
+			startYear:{
+				type:[String,Number],
+				default(){
+					return "1970"
+				}
+			},
+			endYear:{
+				type:[String,Number],
+				default(){
+					return new Date().getFullYear()+''
+				}
+			},
+			defaultVal:{
+				type:Array,
+				default(){
+					return [0,0,0,0,0,0,0]
+				}
+			},
+			step:{
+				type:[String,Number],
+				default:1
+			},
+			current:{
+				type:Boolean,
+				default:false
+			},
+			selectList:{
+				type:Array,
+				default(){
+					return [];
+				}
+			},
+			//以下参数仅对mode==limit有效
+			dayStep:{
+				type:[String,Number],
+				default:7
+			},
+			startHour:{
+				type:[String,Number],
+				default:8
+			},
+			endHour:{
+				type:[String,Number],
+				default:20
+			},
+			minuteStep:{
+				type:[String,Number],
+				default:10
+			},
+			afterStep:{
+				type:[String,Number],
+				default:30
+			},
+			disabledAfter:{
+				type:Boolean,
+				default:false
+			}
+		},
+		watch:{
+			mode(){
+				this.initData();
+			},
+			selectList(){
+				this.initData();
+			}
+		},
+		methods:{
+			getRegionVal(value){
+				let province=value[0];
+				let city=value[1];
+				let area=value[2];
+				let a=0,b=0,c=0;
+				provinces.map((v,k)=>{
+					if(v.label==province){
+						a=k;
+					}
+				})
+				citys[a].map((v,k)=>{
+					if(v.label==city){
+						b=k;
+					}
+				})
+				areas[a][b].map((v,k)=>{
+					if(v.label==area){
+						c=k;
+					}
+				})
+				let dval=[a,b,c];
+				return dval;
+			},
+			useCurrent(){
+				let aToday=new Date();
+				let tYear=aToday.getFullYear().toString();
+				let tMonth=this.formatNum(aToday.getMonth()+1).toString();
+				let tDay=this.formatNum(aToday.getDate()).toString();
+				let tHours=this.formatNum(aToday.getHours()).toString();
+				let tMinutes=this.formatNum(aToday.getMinutes()).toString();
+				let tSeconds=this.formatNum(aToday.getSeconds()).toString();
+				if(this.current){
+					return [tYear,tMonth,tDay,tHours,(Math.floor(tMinutes/this.step)*this.step).toString(),tSeconds];
+				}else{
+					return this.defaultVal;
+				}
+			},
+			formatNum(num){
+				return num<10?'0'+num:num+'';
+			},
+			maskTap(){
+				this.showPicker = false;
+			},
+			show(){
+				this.showPicker = true;
+			},
+			hide(){ 
+				this.showPicker = false;
+			},
+			pickerCancel(){
+				this.$emit("cancel",{
+					checkArr:this.checkArr,
+					defaultVal:this.pickVal
+				});
+				this.showPicker = false;
+			},
+			pickerConfirm(e){
+				switch(this.mode){
+					case "range":
+						let checkArr=this.checkArr;
+						let fDateTime=new Date(checkArr[0],checkArr[1],checkArr[2]);
+						let tDateTime=new Date(checkArr[3],checkArr[4],checkArr[5]);
+						let dVal=this.pickVal;
+						if(fDateTime>tDateTime){
+							this.checkArr=[checkArr[3],checkArr[4],checkArr[5],checkArr[0],checkArr[1],checkArr[2]];
+							this.pickVal=[dVal[4],dVal[5],dVal[6],0,dVal[0],dVal[1],dVal[2]];
+							this.$emit("confirm",{
+								checkArr:this.checkArr,
+								from:checkArr[3]+"-"+checkArr[4]+"-"+checkArr[5],
+								to:checkArr[0]+"-"+checkArr[1]+"-"+checkArr[2],
+								defaultVal:this.pickVal,
+								result:this.resultStr
+							});
+						}else{
+							this.$emit("confirm",{
+								checkArr:this.checkArr,
+								from:checkArr[0]+"-"+checkArr[1]+"-"+checkArr[2],
+								to:checkArr[3]+"-"+checkArr[4]+"-"+checkArr[5],
+								defaultVal:this.pickVal,
+								result:this.resultStr
+							});
+						}
+						break;
+					case "limit":
+						let aTime=new Date().getTime();
+						let bTime=new Date(this.resultStr.replace(/-/g,'/')).getTime();
+						if(aTime>bTime){
+							uni.showModal({
+								title:"提示",
+								content:"选择时间必须大于当前时间",
+								confirmColor:this.themeColor
+							});
+							return;
+						}
+						this.$emit("confirm",{
+							checkArr:this.checkArr,
+							defaultVal:this.pickVal,
+							result:this.resultStr
+						});
+						break;
+					case "region":
+						this.$emit("confirm",{
+							checkArr:this.checkArr,
+							checkValue:this.checkValue,
+							defaultVal:this.pickVal,
+							result:this.resultStr
+						});
+						break;
+					default:
+						this.$emit("confirm",{
+							checkArr:this.checkArr,
+							defaultVal:this.pickVal,
+							result:this.resultStr
+						});
+						break;
+				}
+				//this.showPicker = false;
+			},
+			bindChange(val){
+				let _this=this;
+				let arr=val.detail.value;
+				let year="",month="",day="",hour="",minute="",second="",note=[],province,city,area;
+				let checkArr=_this.checkArr;
+				let days=[];
+				let months=[];
+				let mode=_this.mode;
+				let col1,col2,col3,d,a,h,m;
+				switch(mode){
+					case "limitHour":
+						col1=_this.data.date[arr[0]];
+						col2=_this.data.areas[arr[1]];
+						col3=_this.data.hours[arr[2]];
+						if(col1.value!=checkArr[0].value){
+							arr[1]=0;
+							arr[2]=0;
+							let areas=initPicker.limitHour.initAreas(col1);
+							_this.data.areas=areas;
+							let hours=initPicker.limitHour.initHours(col1,_this.data.areas[arr[1]]);
+							_this.data.hours=hours;
+						};
+						if(col2.value!=checkArr[1].value){
+							arr[2]=0;
+							let hours=initPicker.limitHour.initHours(col1,_this.data.areas[arr[1]]);
+							_this.data.hours=hours;
+						};
+						d=_this.data.date[arr[0]]||_this.data.date[_this.data.date.length-1];
+						a=_this.data.areas[arr[1]]||_this.data.areas[_this.data.areas.length-1];
+						h=_this.data.hours[arr[2]]||_this.data.hours[_this.data.hours.length-1];
+						_this.checkArr=[d,a,h];
+						_this.resultStr=`${d.value+' '+a.label+' '+h.label+"时"}`;
+						break;
+					case "limit":
+						col1=_this.data.date[arr[0]];
+						col2=_this.data.hours[arr[1]];
+						if(col1.value!=checkArr[0].value){
+							let hours=initPicker.limit.initHours(_this.startHour,_this.endHour,_this.minuteStep,_this.afterStep,col1.value);
+							let minutes=initPicker.limit.initMinutes(_this.startHour,_this.endHour,_this.minuteStep,_this.afterStep,col1.value,col2.value);
+							_this.data.hours=hours;
+							_this.data.minutes=minutes;
+						};
+						if(col2.value!=checkArr[1].value){
+							let minutes=initPicker.limit.initMinutes(_this.startHour,_this.endHour,_this.minuteStep,_this.afterStep,col1.value,col2.value);
+							_this.data.minutes=minutes;
+						};
+						d=_this.data.date[arr[0]]||_this.data.date[_this.data.date.length-1];
+						h=_this.data.hours[arr[1]]||_this.data.hours[_this.data.hours.length-1];
+						m=_this.data.minutes[arr[2]]||_this.data.minutes[_this.data.minutes.length-1];
+						_this.checkArr=[d,h,m];
+						_this.resultStr=`${d.value+' '+h.value+':'+m.value+":"+"00"}`;
+						break;
+					case "range":
+						let fyear=_this.data.fyears[arr[0]]||_this.data.fyears[_this.data.fyears.length-1];
+						let fmonth=_this.data.fmonths[arr[1]]||_this.data.fmonths[_this.data.fmonths.length-1];
+						let fday=_this.data.fdays[arr[2]]||_this.data.fdays[_this.data.fdays.length-1];
+						let tyear=_this.data.tyears[arr[4]]||_this.data.tyears[_this.data.tyears.length-1];
+						let tmonth=_this.data.tmonths[arr[5]]||_this.data.tmonths[_this.data.tmonths.length-1];
+						let tday=_this.data.tdays[arr[6]]||_this.data.tdays[_this.data.tdays.length-1];
+						if(fyear!=checkArr[0]){
+							days=initPicker.range.initDays(fyear,fmonth);
+							_this.data.fdays=days;
+						};
+						if(fmonth!=checkArr[1]){
+							days=initPicker.range.initDays(fyear,fmonth);
+							_this.data.fdays=days;
+						};
+						if(tyear!=checkArr[3]){
+							days=initPicker.range.initDays(tyear,tmonth);
+							_this.data.tdays=days;
+						};
+						if(tmonth!=checkArr[4]){
+							days=initPicker.range.initDays(tyear,tmonth);
+							_this.data.tdays=days;
+						};
+						_this.checkArr=[fyear,fmonth,fday,tyear,tmonth,tday];
+						_this.resultStr=`${fyear+'-'+fmonth+'-'+fday+'至'+tyear+'-'+tmonth+'-'+tday}`;
+						break;
+					case "half":
+						year=_this.data.years[arr[0]]||_this.data.years[_this.data.years.length-1];
+						month=_this.data.months[arr[1]]||_this.data.months[_this.data.months.length-1];
+						day=_this.data.days[arr[2]]||_this.data.days[_this.data.days.length-1];
+						area=_this.data.areas[arr[3]]||_this.data.areas[_this.data.areas.length-1];
+						if(year!=checkArr[0]){
+							days=initPicker.date.initDays(year,month,_this.disabledAfter);
+							months=initPicker.date.initMonths(year,_this.disabledAfter);
+							_this.data.days=days;
+							_this.data.months=months;
+						};
+						if(month!=checkArr[1]){
+							days=initPicker.date.initDays(year,month,_this.disabledAfter);
+							_this.data.days=days;
+						};
+						_this.checkArr=[year,month,day,area];
+						_this.resultStr=`${year+'-'+month+'-'+day+area.label}`;
+						break;		
+					case "date":
+						year=_this.data.years[arr[0]]||_this.data.years[_this.data.years.length-1];
+						month=_this.data.months[arr[1]]||_this.data.months[_this.data.months.length-1];
+						day=_this.data.days[arr[2]]||_this.data.days[_this.data.days.length-1];
+						if(year!=checkArr[0]){
+							days=initPicker.date.initDays(year,month,_this.disabledAfter);
+							months=initPicker.date.initMonths(year,_this.disabledAfter);
+							_this.data.days=days;
+							_this.data.months=months;
+						};
+						if(month!=checkArr[1]){
+							days=initPicker.date.initDays(year,month,_this.disabledAfter);
+							_this.data.days=days;
+						};
+						_this.checkArr=[year,month,day];
+						_this.resultStr=`${year+'-'+month+'-'+day}`;
+						break;
+					case "yearMonth":
+						year=_this.data.years[arr[0]]||_this.data.years[_this.data.years.length-1];
+						month=_this.data.months[arr[1]]||_this.data.months[_this.data.months.length-1];
+						if(year!=checkArr[0]){
+							months=initPicker.date.initMonths(year,_this.disabledAfter);
+							_this.data.months=months;
+						};
+						_this.checkArr=[year,month];
+						_this.resultStr=`${year+'-'+month}`;
+						break;
+					case "dateTime":
+						year=_this.data.years[arr[0]]||_this.data.years[_this.data.years.length-1];
+						month=_this.data.months[arr[1]]||_this.data.months[_this.data.months.length-1];
+						day=_this.data.days[arr[2]]||_this.data.days[_this.data.days.length-1];
+						hour=_this.data.hours[arr[3]]||_this.data.hours[_this.data.hours.length-1];
+						minute=_this.data.minutes[arr[4]]||_this.data.minutes[_this.data.minutes.length-1];
+						second=_this.data.seconds[arr[5]]||_this.data.seconds[_this.data.seconds.length-1];
+						if(year!=checkArr[0]){
+							days=initPicker.date.initDays(year,month);
+							_this.data.days=days;
+						};
+						if(month!=checkArr[1]){
+							days=initPicker.date.initDays(year,month);
+							_this.data.days=days;
+						};
+						second = "00";
+						_this.checkArr=[year,month,day,hour,minute,second];
+						_this.resultStr=`${year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second}`;
+						break;
+					case "time":
+						hour=_this.data.hours[arr[0]]||_this.data.hours[_this.data.hours.length-1];
+						minute=_this.data.minutes[arr[1]]||_this.data.minutes[_this.data.minutes.length-1];
+						second=_this.data.seconds[arr[2]]||_this.data.seconds[_this.data.seconds.length-1];
+						_this.checkArr=[hour,minute,second];
+						_this.resultStr=`${hour+':'+minute+':'+second}`;
+						break;
+					case "region":
+						province=_this.data.provinces[arr[0]].label;
+						city=_this.data.citys[arr[1]].label;
+						area=_this.data.areas[arr[2]].label;
+						if(province!=checkArr[0]){
+							_this.data.citys = citys[arr[0]];
+							_this.data.areas = areas[arr[0]][0];
+							arr[1] = 0;
+							arr[2] = 0;
+							city=_this.data.citys[arr[1]].label;
+							area=_this.data.areas[arr[2]].label;
+						};
+						if(city!=checkArr[1]){
+							_this.data.areas = areas[arr[0]][arr[1]];
+							arr[2]=0;
+							area=_this.data.areas[arr[2]].label;
+						};
+						_this.checkArr=[province,city,area];
+						_this.checkValue=[_this.data.provinces[arr[0]].value,_this.data.citys[arr[1]].value,_this.data.areas[arr[2]].value];
+						_this.resultStr=province+city+area;
+						break;
+					case "selector":
+						_this.checkArr=_this.data[arr[0]]||_this.data[_this.data.length-1];
+						_this.resultStr=_this.data[arr[0]].label||_this.data[_this.data.length-1].label;
+						break;	
+				}
+				_this.$nextTick(()=>{
+					_this.pickVal=arr;
+				})
+			},
+			initData(){
+				let _this=this;
+				let data={};
+				let mode=_this.mode;
+				let year,month,day,hour,minute,second,province,city,area;
+				let col1,col2,col3;
+				let dVal=[];
+				switch(mode){
+					case "region":
+						dVal=_this.getRegionVal(_this.defaultVal);
+						data={
+							provinces:provinces,
+							citys:citys[dVal[0]],
+							areas:areas[dVal[0]][dVal[1]]
+						};
+						break;
+					case "selector":
+						data=_this.selectList;
+						dVal=_this.defaultVal;
+						break;
+					case "limit":
+						data=initPicker.limit.init(_this.dayStep,_this.startHour,_this.endHour,_this.minuteStep,_this.afterStep);
+						dVal=(data.defaultVal&&_this.current)?data.defaultVal:_this.defaultVal
+						break;
+					case "limitHour":
+						data=initPicker.limitHour.init(_this.dayStep);
+						dVal=(data.defaultVal&&_this.current)?data.defaultVal:_this.defaultVal
+						break;	
+					case "range":
+						data=initPicker.range.init(_this.startYear,_this.endYear,_this.useCurrent(),_this.current);
+						dVal=(data.defaultVal&&_this.current)?data.defaultVal:_this.defaultVal
+						break;
+					default:
+						data=initPicker.date.init(_this.startYear,_this.endYear,_this.mode,_this.step,_this.useCurrent(),_this.current,_this.disabledAfter);
+						dVal=(data.defaultVal&&_this.current)?data.defaultVal:_this.defaultVal
+						break;
+				}
+				_this.data=data;
+				switch(mode){
+					case "limitHour":
+						col1=data.date[dVal[0]]||data.date[data.date.length-1];
+						col2=data.areas[dVal[2]]||data.areas[data.areas.length-1];
+						col3=data.hours[dVal[1]]||data.hours[data.hours.length-1];
+						_this.checkArr=[col1,col2,col3];
+						_this.resultStr=`${col1.value+' '+col2.label+' '+col3.label+'时'}`;
+						break;
+					case "limit":
+						col1=data.date[dVal[0]]||data.date[data.date.length-1];
+						col2=data.hours[dVal[1]]||data.hours[data.hours.length-1];
+						col3=data.minutes[dVal[2]]||data.minutes[data.minutes.length-1];
+						_this.checkArr=[col1,col2,col3];
+						_this.resultStr=`${col1.value+' '+col2.value+':'+col3.value+":"+"00"}`;
+						break;
+					case "range":
+						let fYear=data.fyears[dVal[0]]||data.fyears[data.fyears.length-1];
+						let fmonth=data.fmonths[dVal[1]]||data.fmonths[data.fmonths.length-1];
+						let fday=data.fdays[dVal[2]]||data.fdays[data.fdays.length-1];
+						let tYear=data.tyears[dVal[4]]||data.tyears[data.tyears.length-1];
+						let tmonth=data.tmonths[dVal[5]]||data.tmonths[data.tmonths.length-1];
+						let tday=data.tdays[dVal[6]]||data.tdays[data.tdays.length-1];
+						_this.checkArr=[fYear,fmonth,fday,tYear,tmonth,tday];
+						_this.resultStr=`${fYear+'-'+fmonth+'-'+fday+'至'+tYear+'-'+tmonth+'-'+tday}`;
+						break;
+					case "half":
+						year=data.years[dVal[0]]||data.years[data.years.length-1];
+						month=data.months[dVal[1]]||data.months[data.months.length-1];
+						day=data.days[dVal[2]]||data.days[data.days.length-1];
+						area=data.areas[dVal[3]]||data.areas[data.areas.length-1];
+						_this.checkArr=[year,month,day,area];
+						_this.resultStr=`${year+'-'+month+'-'+day+' '+area.label}`;
+						break;	
+					case "date":
+						year=data.years[dVal[0]]||data.years[data.years.length-1];
+						month=data.months[dVal[1]]||data.months[data.months.length-1];
+						day=data.days[dVal[2]]||data.days[data.days.length-1];
+						_this.checkArr=[year,month,day];
+						_this.resultStr=`${year+'-'+month+'-'+day}`;
+						break;
+					case "yearMonth":
+						year=data.years[dVal[0]]||data.years[data.years.length-1];
+						month=data.months[dVal[1]]||data.months[data.months.length-1];
+						_this.checkArr=[year,month];
+						_this.resultStr=`${year+'-'+month}`;
+						break;
+					case "dateTime":
+						year=data.years[dVal[0]]||data.years[data.years.length-1];
+						month=data.months[dVal[1]]||data.months[data.months.length-1];
+						day=data.days[dVal[2]]||data.days[data.days.length-1];
+						hour=data.hours[dVal[3]]||data.hours[data.hours.length-1];
+						minute=data.minutes[dVal[4]]||data.minutes[data.minutes.length-1];
+						second=data.seconds[dVal[5]]||data.seconds[data.seconds.length-1];
+						second="00"
+						_this.resultStr=`${year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second}`;
+						_this.checkArr=[year,month,day,hour,minute];
+						break;
+					case "time":
+						hour=data.hours[dVal[0]]||data.hours[data.hours.length-1];
+						minute=data.minutes[dVal[1]]||data.minutes[data.minutes.length-1];
+						second=data.seconds[dVal[2]]||data.seconds[data.seconds.length-1];
+						_this.checkArr=[hour,minute,second];
+						_this.resultStr=`${hour+':'+minute+':'+second}`;
+						break;
+					case "region":
+						province=data.provinces[dVal[0]];
+						city=data.citys[dVal[1]];
+						area=data.areas[dVal[2]];
+						_this.checkArr=[province.label,city.label,area.label];
+						_this.checkValue=[province.value,city.value,area.value];
+						_this.resultStr=province.label+city.label+area.label;
+						break;
+					case "selector":
+						_this.checkArr=data[dVal[0]]||data[data.length-1];
+						_this.resultStr=data[dVal[0]].label||data[data.length-1].label;
+						break;
+				}
+				_this.$nextTick(()=>{
+					_this.pickVal=dVal;
+				})
+			},
+			
+			getParse:function(str,type) {
+				if(type == 'date') {
+					if(str != null && str != "") {
+						var dataAr = str.split("-");
+						var yearIndex = (dataAr.length > 0  && !isNaN(dataAr[0])) ? parseInt(dataAr[0]) - 1940 : 0;
+						var monthIndex = (dataAr.length > 1 && !isNaN(dataAr[1])) ? parseInt(dataAr[1])  - 1   : 0;
+						var dayIndex = (dataAr.length > 2 && !isNaN(dataAr[2])) ? parseInt(dataAr[2])  - 1   : 0;
+						return [yearIndex,monthIndex,dayIndex]
+					}
+					return [0,0,0];
+				}
+				
+				if(type == 'region') {
+					if(str != null && str != "") {
+						var dataAr = str.split("-");
+						return[dataAr.length > 0 ? dataAr[0] : "",
+						dataAr.length > 1 ? dataAr[1] : "",
+						dataAr.length > 2 ? dataAr[2] : ""
+						]
+					}
+					return ["","",""];
+				}
+				
+			}
+			
+		},
+		mounted() {
+			this.initData();
+		}
+	}
+</script>
+
+<style lang="scss">
+	.w-picker{
+		position: relative;
+		z-index: 888;
+		.mask {
+		  position: fixed;
+		  z-index: 1000;
+		  top: 0;
+		  right: 0;
+		  left: 0;
+		  bottom: 0;
+		  background: rgba(0, 0, 0, 0.6);
+		  visibility: hidden;
+		  opacity: 0;
+		  transition: all 0.3s ease;
+		}
+		.mask.show{
+			visibility: visible;
+			opacity: 1;
+		}
+		.w-picker-cnt {
+		  position: fixed;
+		  bottom: 0;
+		  left: 0;
+		  width: 100%;
+		  transition: all 0.3s ease;
+		  transform: translateY(100%);
+		  z-index: 3000;
+		}
+		.w-picker-cnt.show {
+		  transform: translateY(0);
+		}
+		.w-picker-hd {
+		  display: flex;
+		  align-items: center;
+		  padding: 0 30upx;
+		  height: 88upx;
+		  background-color: #fff;
+		  position: relative;
+		  text-align: center;
+		  font-size: 32upx;
+		  justify-content: space-between;
+		  .w-picker-btn{
+		  	font-size: 30upx;
+		  }
+		}
+		
+		.w-picker-hd:after {
+		  content: ' ';
+		  position: absolute;
+		  left: 0;
+		  bottom: 0;
+		  right: 0;
+		  height: 1px;
+		  border-bottom: 1px solid #e5e5e5;
+		  color: #e5e5e5;
+		  transform-origin: 0 100%;
+		  transform: scaleY(0.5);
+		}
+		.w-picker-item {
+		  text-align: center;
+		  width: 100%;
+		  height: 88upx;
+		  line-height: 88upx;
+		  text-overflow: ellipsis;
+		  white-space: nowrap;
+		  font-size: 30upx;
+		}
+		.w-picker-view {
+		  width: 100%;
+		  height: 476upx;
+		  overflow: hidden;
+		  background-color: rgba(255, 255, 255, 1);
+		  z-index: 666;
+		}
+		picker-view{
+			height: 100%;
+		}
+	}
+
+</style>

+ 223 - 0
config/api.js

@@ -0,0 +1,223 @@
+const api_http = "api";
+//const api_http = 'http://127.0.0.1:8002/api';  
+const get_api = {  
+	sysInit				: api_http + '/index/sysInit',//基本配置
+	  
+	qiniu 				: api_http + "/pub/qiniu",//七牛
+	
+	  
+	indexInit			: api_http + "/index/index", //获取首页信息 
+	indexGuLx			: api_http + '/index/guLx',//馆长联系方式 
+	merchants			: api_http + '/index/merchants',//首页加盟店
+	merchantItem		: api_http + "/index/merchantItem",//加盟商详情
+	tradeweb			: api_http + "/index/tradeweb",//文票系统
+	merchantList 		: api_http + '/merchants/list',//首页加盟店
+	guInit				: api_http + '/index/guInit',//馆长列表信息
+	newsList			: api_http + '/index/newsList',//新闻分类
+	getContent			: api_http + '/index/getContent',//获取详情数据
+	indexGu				: api_http + '/index/indexGu',//首页馆
+	
+	
+	
+	getYzm   			: api_http + '/login/getYzm',//获取验证码
+	register			: api_http + '/login/register',//提交数据
+	userLogin			: api_http + '/login/index', //会员登录
+	findYzm				: api_http + '/login/findYzm',//验证码
+	findPassword		: api_http + '/login/findPass',//找回密码
+	
+	goodsList			: api_http + '/goods/list',//产品列表
+	goodsItem			: api_http + '/goods/item',//产品详情
+	getBalance			: api_http + '/goods/getBalance',//整理订单提交数据
+	addOrder			: api_http + '/goods/addOrder',//下单状态
+	
+	
+	auctionSubscribe	  : api_http + '/auction/subscribe',//预约订单
+	auctionItem			  : api_http + '/auction/item',//获取当前馆情况
+	auctionPro			  : api_http + '/auction/pro',//抢单列表
+	auctionProItem		  : api_http + '/auction/proItem',//抢单详情
+	auctionProItemHistory : api_http + '/auction/proItemHistory',//抢单历史追溯
+	auctionProRush        : api_http + '/auction/proRush',//抢单操作
+	auctionOrder          : api_http + '/auction/order',//订单信息
+	auctionOrderInit	  : api_http + '/auction/orderInit',//订单init
+	
+	auctionOrderItem	  : api_http + '/auction/orderItem',//订单详情
+	auctionOrderDetail	  : api_http + '/auction/orderItemDetail',//订单明细
+	
+	auctionOrderSubProof  : api_http + '/auction/subProof',//上传凭证
+	auctionOrderSellerInit:  api_http + '/auction/sellerInit',//我要售出初始化
+	auctionOrderSeller	  : api_http + '/auction/seller',//我要售出
+	auctionAdopt		  : api_http + '/auction/adopt',//【审核通过】
+	auctionPlead		  : api_http + "/auction/plead",//订单申诉
+	auctionRevoke		  : api_http + '/auction/revoke',//取消申诉
+	auctionHangingSale	  : api_http + '/auction/hangingSale',//挂售详情
+	auctionHangingSaleSub : api_http + '/auction/hangingSaleSub',//挂售
+	
+	
+	auctionMyPro		 : api_http + '/auction/myPro',//我的产品
+	
+	gzInit				 : api_http + '/gz/init',//馆tapSs长基本数据
+	gzBooking			 : api_http + '/gz/booking',//预约记录
+	gzAuction			 : api_http + '/gz/auction',//获取馆长场次
+	gzOrder				 : api_http + '/gz/order',//馆长底下订单
+	auctionOrderRecycle	 : api_http + '/gz/orderRecycle',//馆长回收订单
+	auctionOrderSlim 	 : api_http + '/gz/orderSlim',//瘦身订单
+	auctionOrderCf		 : api_http + '/gz/orderCf',//订单拆分
+	gzUserInit			 : api_http + '/gz/userInit',//馆长用户UID
+	gzUserList			 : api_http + '/gz/userList',//馆长用户列表
+	
+	
+	
+	
+	auctionSlimLog 	: api_http + '/gz/slimLog',//瘦身订单记录
+	slimInit			:  api_http + '/gz/slimInit',//瘦身配置信息
+	
+	auctionrecycleLog 	: api_http + '/gz/recycleLog',//瘦身订单记录
+	auctionDisassembleInit : api_http + '/gz/disassembleInit',//拆分init
+	auctionDisassembleLog :  api_http + '/gz/disassembleLog',//拆分订单记录
+	
+	
+	//会员中心
+	userInit			: api_http + '/user/init', //会员基本配置
+	userInfo			: api_http + '/user/userInfo', //用户信息
+	userYzm      		: api_http + '/user/getYzm',//修改【验证码】
+	updatePassword      : api_http + '/user/updatePassword',//修改密码
+	userInfoSave 		: api_http + '/user/userInfoSave',//会员信息修改
+	saveAvatar			: api_http + '/user/saveAvatar',//保存头像
+	zxUser				: api_http + '/user/zxUser',//申请【注销】
+	bindYzm				: api_http + '/user/bindYzm',//绑定验证码
+	bindPhone			: api_http + '/user/bindPhone',//绑定手机号
+	
+	getUserGu			: api_http + '/user/userGu',//获取自己馆信息
+	setUserCert			 : api_http + '/user/setUserCert',//实名认证
+	
+	userSpreadBanner	 : api_http + '/user/spreadBanner',//用户海报
+	userSpreadQrcode	 : api_http + '/user/spreadQrcode',//生成海报
+	
+	userPayment			 : api_http + '/user/payment',//设置二级密码
+	paymentCkYzm 		 : api_http + '/user/paymentCkYzm',//验证二级密码
+	userCkPayment		 : api_http + '/user/ckPayment',//验证密码	
+	
+	userAddress			 : api_http + '/user/address',//收货地址
+	userAddressInfo      : api_http + '/user/addressInfo',//获取详情
+	userAddressSave		 : api_http + '/user/addressSave',//保存修改地址
+	userAddressDel		 : api_http + '/user/addressDel',//删除地址
+	userAddressDeflault  : api_http + '/user/addressDefault',//默认地址
+	userOrder			 : api_http + '/user/order',//用户订单
+	userOrderInfo		 : api_http + '/user/orderInfo',//订单详情
+	orderConfim			 : api_http + '/user/orderConfirm',//订单确认
+	orderLogistics		 : api_http + '/user/orderLogistics',//物流查询
+	
+	userDetailTotal		 : api_http + '/user/detailTotal',//提货积分统计
+	userDetail			 : api_http + '/user/detail',//提货积分列表
+	
+	userIntegralTotal	 : api_http + '/user/integralTotal',//趣豆统计
+	userIntegral		 : api_http + '/user/integral',//趣豆列表
+	userCkUserName 		 : api_http + '/user/ckUserName',//确认用户信息
+	integralGive		 : api_http + '/user/integralGive',//趣豆转账
+	
+	integralTicketInit   : api_http + '/user/ticketInit',//文票基本数据
+	integralTicket		 : api_http + '/user/integralTicket',//趣豆转账文票
+	
+	
+	
+	userAnticipate 		: api_http + '/user/anticipate',//我的易趣卷
+	userAnticipateTotal : api_http + '/user/anticipateTotal',//易趣卷统计
+	anticipateGive		: api_http + '/user/anticipateGive',//易趣卷转账
+	
+	
+	userBrokerageTotal	: api_http + '/user/brokerageTotal',//我的金豆统计
+	userBrokerage		: api_http + '/user/brokerage',//我的金豆
+	userBrokerageExchange: api_http + '/user/brokerageExchange',//金豆兑换明细
+	userSubBrokerage	: api_http + '/user/subBrokerage',//提现金豆
+	userBrokerageTxLog : api_http + '/user/brokerageTxLog',//日志
+	
+	userTeamTotal		 : api_http + '/user/teamTotal',//团队统计
+	userTeam			 : api_http + '/user/team',//团队列表
+	
+	
+	sqAwardInit			: api_http + '/user/awardInit',//新人奖配置查询
+	sqAward				: api_http + '/user/awardSq',//新人奖申请
+	userAwardSqLog		: api_http + '/user/awardSqLog',//申请日志
+	
+	
+	bankSave			: api_http + '/user/bankSave',//保存银行卡
+	getBankItem			: api_http + '/user/bankItem',//获取银行卡信息
+	getBank				:  api_http + '/user/getBank',//获取银行信息
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	/** 聊天工具 **/
+	
+	
+	chatList			: api_http + '/chat/chatList',//聊天数据
+	findChat			: api_http + '/chat/findChat',//查询会话信息【单人】
+	chatMsg				: api_http + '/chat/chatMsg',//消息详情
+	chatDel				: api_http + '/chat/del',//聊天删除消息
+	chatRead			: api_http + '/chat/chatRead',//阅读数量【H5】
+	chatUpVoice			: api_http + '/chat/upVoice',//上传语音文件
+	collectAdd			: api_http + '/chat/collect',//我要收藏
+	withdraw			: api_http + '/chat/withdraw',//撤回消息
+	chatListAll			: api_http + '/chat/listAll',//群聊 + 好友
+	chatSearchMsg		: api_http + '/chat/searchMsg',//查看聊天记录
+	//收藏
+	chatCollect			: api_http + '/chat/collectList',//查看收藏
+	chatCollectDel		: api_http + '/chat/collectDel',//删除收藏
+	chatCollectSend		: api_http + '/chat/collectSend',//转发收藏
+	forwarding			: api_http + '/chat/forwarding',//转发消息
+	clearChat			: api_http + '/chat/clearChat',//清理聊天
+	
+	
+	
+	
+	chatBagenum			: api_http + '/chat/bagenum',//消息数量
+	chatFindCode		: api_http + '/friend/findCode',//查询会员获取code
+	chatFriendFind      : api_http + '/friend/find',//获取会员信息
+	FriendIndex			: api_http + "/friend/index",//好友列表
+	chatFriendAdd		: api_http + '/friend/add',//添加好友
+	FriendVerification	: api_http + '/friend/verification',//添加会员验证
+	FriendApplyList		: api_http + "/friend/verificationList",//查询申请列表	
+	verificationInfo	: api_http + '/friend/verificationInfo',//查询验证数据
+	FriendVerificationSub:api_http + '/friend/verificationSub',//验证数据提交
+	FriendApplyAction	: api_http + '/friend/applyaction',//【删除|忽略】验证信息
+	FriendSetRemark		: api_http + '/friend/setRemark',//设置备注信息
+	setBlack			: api_http + '/friend/setBlack',//加入黑名单
+	FriendDel			: api_http + '/friend/del',//删除好友
+	
+	GroupCreate			: api_http + "/chatGroup/create",//城建群聊
+	GroupList			: api_http + '/chatGroup/getList',//我的群聊列表
+	chatGroupInit		: api_http + '/chatGroup/init',//基本配置
+	chatChatFindGroup	: api_http + '/chatGroup/findChat',//查询群聊信息
+	chatGroupAvatar		: api_http + '/chatGroup/upAvatar',//更换头像
+	chatGroupEditName	: api_http + '/chatGroup/editName',//修改群聊名称
+	chatGroupEditRemark	: api_http + '/chatGroup/editRemark',//修改群聊昵称
+	chatGroupQrcode		: api_http + '/chatGroup/qrcode',//查看群聊二维码
+	chatGroupEditMsg	: api_http + '/chatGroup/editMsg',//修改群公告
+	GroupDissolve		: api_http + '/chatGroup/dissolve',//解散群聊
+	chatGroupUser		: api_http + '/chatGroup/user',//获取成员列表
+	chatGroupUserAll	: api_http + '/chatGroup/userAll',//获取全部成语
+	GroupAdd			: api_http + '/chatGroup/add',//创建群聊 groupId 原来群聊ID usercodes 加入会员逗号隔开
+	GroupJdd			: api_http + '/chatGroup/jdd',//移除好友
+	GroupRemind			: api_http + '/chatGroup/remind',//@提醒功能
+	GroupRemindOk		: api_http + '/chatGroup/remindOk',//@提醒Ok
+	
+	
+	GroupTransfer			: api_http + '/chatGroup/transfer',//转让群主
+	chatGroupAdminuser		: api_http + '/chatGroup/adminuser',//群里面管理人员
+	chatGroupAdminAdd		: api_http + '/chatGroup/adminAdd',//添加管理员
+	chatGroupAdminJdd		: api_http + '/chatGroup/adminJdd',//移除管理员
+	chatGroupUserMsg		: api_http + '/chatGroup/userMsg',//聊天记录
+	chatUpdateChat			: api_http + "/chat/updateChat",//设置会话(置顶免打扰)
+		
+	
+	
+}
+
+
+
+export default get_api;

+ 17 - 0
config/global.js

@@ -0,0 +1,17 @@
+export default {
+	//web通讯
+	wsSocketUrl		: "wss://im.yiqucbb.cn/phone",
+	//缓存值
+	cachekey		:  "appview",
+	
+	putoken		 	:  "u$ii#uH!uF7LJkz&a4fcE50AdzHIbBAH",
+	
+	version			:  "0.0.1",
+	
+	app_code		: 1,
+	
+	apiHttps		: [
+		"https://ifl23dfjjdddfl.yiqucbb.cn/",
+		"https://newcbb.yiqucbb.cn/"
+	]
+}

+ 49 - 0
index.html

@@ -0,0 +1,49 @@
+
+<!DOCTYPE html>
+<html lang="zh-CN">
+	
+    <head>
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <title>
+            <%= htmlWebpackPlugin.options.title %>
+        </title>
+        <!-- Open Graph data -->
+        <!-- <meta property="og:title" content="Title Here" /> -->
+        <!-- <meta property="og:url" content="http://www.example.com/" /> -->
+        <!-- <meta property="og:image" content="http://example.com/image.jpg" /> -->
+        <!-- <meta property="og:description" content="Description Here" /> 
+		<script type="text/javascript" src="https://cn-shanghai-aliyun-cloudauth.oss-cn-shanghai.aliyuncs.com/web_sdk_js/jsvm_all.js" ></script>
+		-->
+        <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>
+        <link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
+		<script src=https://cn-shanghai-aliyun-cloudauth.oss-cn-shanghai.aliyuncs.com/web_sdk_js/jsvm_all.js></script>
+		<script src="https://cstaticdun.126.net/load.min.js?t=201903281201"></script>
+    </head>
+    <body>
+        <noscript>
+            <strong>Please enable JavaScript to continue.</strong>
+        </noscript>
+		<script src="https://cstaticdun.126.net/load.min.js?t=201903281201"></script>
+        <div id="app"></div>
+        <!-- built files will be auto injected -->
+    </body>
+</html>
+<script>if(("standalone" in window.navigator) && window.navigator.standalone){
+	var noddy, remotes = false;
+	document.addEventListener('click', function(event) {
+		noddy = event.target;
+		while(noddy.nodeName !== "A" && noddy.nodeName !== "HTML") {
+			noddy = noddy.parentNode;
+		}
+		if('href' in noddy && noddy.href.indexOf('http') !== -1 && (noddy.href.indexOf(document.location.host) !== -1 || remotes)){
+			event.preventDefault();
+			document.location.href = noddy.href;
+		}
+	},false);
+}
+
+</script>

+ 110 - 0
library/Base.js

@@ -0,0 +1,110 @@
+import WebSokcet from "./socket/WebSokcet.js";
+import SocketEvent from "./Event/SocketEvent.js";
+class Base {
+	Vue = {};
+	//容器
+	Container = null;
+	constructor(vue,container) {
+		this.Vue = vue;
+		this.Container = container;
+		this.init();
+	}
+	init() {
+		//添加全局库
+		this.Vue.prototype.global = this.Container.make(require("@/config/global.js"),"global");
+		//添加com库
+		this.Vue.prototype.utils = this.Container.make(require("@/library/utils/Comm.js"),"utils");
+		//请求库
+		this.Vue.prototype.request = this.Container.make(require('@/library/Request.js'));
+		//webSocket
+		let websocket = new WebSokcet({wsUrl:this.Vue.prototype.global.wsSocketUrl});
+		websocket.setKey(this.Vue.prototype.global.putoken);
+		this.Vue.prototype.$deviceType = 'web';
+		//#ifdef H5
+		var ua = navigator.userAgent.toLowerCase();
+		//判断登录模式
+		if (/MicroMessenger/i.test(ua)) {
+			//var wx = require('jweixin-module');
+			//this.Vue.prototype.$wx = wx;
+			this.Vue.prototype.$deviceType = 'weixin';
+		}
+		//判断支付宝  
+		if (/alipayclient/.test(ua)) {
+			this.Vue.prototype.$deviceType = 'alipay';
+		}
+		//#endif
+		//小程序
+		// #ifdef MP-WEIXIN
+		this.Vue.prototype.$deviceType = 'mp_weixin';
+		// #endif
+		//APP
+		// #ifdef APP-PLUS
+		this.Vue.prototype.$deviceType = 'app';
+		// #endif
+		//获取设备信息
+		uni.getSystemInfo({
+			success:(res) => {
+				this.Vue.prototype.$device = res;
+			}
+		});
+		let socketEvent = new SocketEvent(this.Vue.prototype);
+		websocket.setBackCall((type,res)=>{
+			if(type == 'onOpen'){
+				socketEvent.onOpen(res);
+			}
+			if(type == 'onMessage'){
+				socketEvent.onMessage(res);
+			}
+			if(type == 'onError'){
+				socketEvent.onError(res);
+			}
+			if(type == 'onStop'){
+				socketEvent.onStop(res);
+			}
+			if(type == 'onClose'){
+				socketEvent.onClose(res);
+			}
+			if(type == 'onSendError') {
+				socketEvent.onSendError(res);
+			}
+			if(type == 'onSendSuccess') {
+				socketEvent.onSendSuccess(res);
+			}
+			if(type == 'onHeartBeat') {
+				socketEvent.onHeartBeat(res);
+			}
+		});
+		// websocket.connect();
+		this.Vue.prototype.webSocket = websocket;
+	}
+	/**
+	 * ipc全局拦截访问
+	 * @param {Object} page 当前页面page
+	 * @param {Object} options 参数
+	 */
+	ipc(page,options){
+		var tj_uid = options.tj_uid || '';
+		var ipc = options.ipc || '';
+		
+		if(tj_uid != '' && tj_uid != null) {
+			this.Vue.prototype.$store.commit('setTjuid',tj_uid);
+		}
+		
+		if(ipc == '') {
+			return ;
+		}
+		//微信登录ipc
+		
+		if(ipc == 'weixin_login') {
+			var data = options.data || '';
+			try{
+				let dataAr = JSON.parse(data);
+				this.Vue.prototype.$store.commit('setUser',dataAr);
+			}  catch(e){}	
+		}
+	}
+	
+	
+}
+
+export default Base;

+ 75 - 0
library/Container.js

@@ -0,0 +1,75 @@
+class Container {
+	/**
+	 * 容器对象实例
+	 * @var Container
+	 */
+	static $instance;
+	/**
+	 * 容器中的对象实例
+	 * @var array
+	 */
+	instances = {};
+
+
+	static getInstance() {
+		if (Container.$instance == null) {
+			Container.$instance = new Container();
+		}
+		return Container.$instance;
+	}
+
+
+	/**
+	 * 获取容器中的对象实例
+	 * @access public
+	 * @param  string        name       类名或者标识
+	 * @return object
+	 */
+	static get(name) {
+		return Container.getInstance().instances[name];
+	}
+
+
+	/**
+	 * 移除容器中的对象实例
+	 * @access public
+	 * @param  string  name    类标识、接口
+	 * @return void
+	 */
+	static remove(name) {
+		return Container.getInstance().del(name);
+	}
+
+	/**
+	 * 创建类的实例
+	 * @access public
+	 * @param  string        vImport       导入improt
+	 * @param  {}	         vars           变量
+	 * @return object
+	 */
+	make(vImport, alias, vars = "default") {
+		this.instances[alias] = vars == "" ? vImport : vImport[vars];
+		return this.instances[alias];
+	}
+	
+	/**
+	 * 获取容器中的对象实例
+	 * @access public
+	 * @param  string        name       类名或者标识
+	 * @return object
+	 */
+	 get(name) {
+		return this.instances[name];
+	}
+	
+	/**
+	 * 删除实例对象
+	 * @param {Object} name
+	 */
+	del(name) {
+		delete this.instances[name];
+	}
+	
+}
+
+export default Container;

+ 104 - 0
library/Event/SocketEvent.js

@@ -0,0 +1,104 @@
+/// +----------------------------------------------------------------------
+// | HTTP 全局监听口[监听远程执行之后]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016-2017 ,Lioc All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+import store from "../../store";
+import md5 from "../vendor/md5.js";
+import Message from "../socket/Message.js";
+
+class SocketEvent {
+	app = null;
+	constructor(app) {
+	    this.app = app;
+	}
+	/**
+	 * 打开项目
+	 * @param {Object} res
+	 */
+	onOpen(res) {
+		uni.$emit('socketOpen',res);
+		let user = store.state.user;
+		if(user != null) {
+			this.app.webSocket.send(new Message(user.token,"auth",true),
+			(res)=>{
+				let data = JSON.parse(res);
+				if(data.type == 'auth_yes') {
+					
+				}
+				
+				if(data.type == 'auth_error') {
+					//store.commit('loginOut');
+				//	uni.showToast({ 'title'	: data.msg,duration : 3000,icon:'none'});
+				}
+				
+				this.app.request.get("chatBagenum").then(res=>{
+					if(res.code == 200) {
+						store.commit('setTxbagenum',res.data);
+					}
+				}).catch((err)=>{
+					
+				});
+				
+			},()=>{
+				console.log('测试失败了');
+			});
+		}
+	}
+	onMessage(res) {
+		if(res.code == 'chat' || res.code == 'group_chat') {
+			let bagenum = store.state.txbagenum;
+			//bagenum.count ++;
+			bagenum.chatCount ++;
+			store.commit('setTxbagenum',bagenum);
+		}
+		
+		//对方添加好友
+		if(res.code == 'friend_add') {
+			if(this.app.utils.isJSON(res.data)) {
+				var data= JSON.parse(res.data);
+				//消息提示
+				let bagenumAr = store.state.txbagenum;
+				bagenumAr.applyCount ++;
+				store.commit('setTxbagenum',bagenumAr);
+			}
+		}
+		
+		//申请进群
+		if(res.code == 'group_add') {
+			
+		}
+		
+		
+		uni.$emit('socketMessage',res);
+		return '';
+	}
+	
+	onError(res) {
+		uni.$emit('socketClose',res);
+	}
+	
+	onStop(res) {
+		uni.$emit('socketClose',res);
+	}
+	
+	onClose(res) {
+		uni.$emit('socketClose',res);
+	}
+	onSendError(res){
+		uni.$emit('socketSendError',res);
+	}
+	onSendSuccess(res) {
+		uni.$emit('socketSendSuccess',res);
+	}
+	
+	onHeartBeat(res){
+		uni.$emit('socketHeartBeat',res);
+	}
+}
+
+export default SocketEvent;

+ 209 - 0
library/Http.js

@@ -0,0 +1,209 @@
+class Http {
+	//头部文件
+	header = {}
+	//远程地址
+	baseUrl = ""
+	params = {}
+	//函数存放口
+	baseCall = {
+		before: [], //请求之前
+		after: [], //请求之后
+		success: [], //请求成功
+		fail: [], //请求失败
+		complete: [] ,//请求完毕
+		_intercept:null,//拦截器专用
+	}
+	//传递格式
+	type = "json"
+	//监听器
+	interceptors = {
+		//请求之前
+		before: (call) =>  {
+			this.baseCall.before.push(call);
+		},
+		//请求之后
+		after: (call) => {
+			this.baseCall.after.push(call);
+		},
+		//请求成功
+		success: (call) => {
+			this.baseCall.success.push(call);
+		},
+		//请求失败
+		fail: (call) =>  {
+			this.baseCall.fail.push(call);
+		},
+		//请求完毕
+		complete: (call) => {
+			this.baseCall.complete.push(call);
+		},
+		//被拦截
+		_intercept:(call)=>{
+			this.baseCall._intercept = call;
+		}
+	};
+	constructor() {
+
+	}
+	
+	setParams(key,value) {
+		this.params[key] = value;
+	}
+	
+	/**
+	 * get提交
+	 * @param {Object} url
+	 * @param {Object} post
+	 */
+	get(url, post) {
+		this.baseUrl = url;
+		this.params = post || {_t:new Date().getTime()};
+		this.buld('get');
+	}
+	/** 
+	 * post提交
+	 * @param {Object} url
+	 * @param {Object} post
+	 */
+	post(url, post) {
+		this.baseUrl = url;
+		this.setHeader('content-type', "application/x-www-form-urlencoded");
+		this.params = post;
+		this.buld('post');
+	}
+	/**
+	 * 上传文件
+	 * @param {Object} url
+	 * @param {Object} post
+	 */
+	uploadFile(url,post,img,name) {
+		this.baseUrl = url;
+		this.params = post;
+		this.upFile(img,name);
+	}
+	/**
+	 * 提交数据
+	 */
+	buld(method) {
+		//提交之前
+		for (var i in this.baseCall.before) {
+			var b = this.baseCall.before[i].call(this);
+			//进行拦截
+			if(b != null && b === false) {
+				this.intercept();
+				return;
+			}
+		}
+		uni.request({
+			url: this.baseUrl,
+			method: method,
+			data: this.params,
+			header: this.header,
+			dataType: this.type,
+			success: res => {	
+				//提交之后
+				for (var i in this.baseCall.after) {
+					var b = this.baseCall.after[i].call(this,res);
+					//进行拦截
+					if(b != null && b === false) {
+						this.intercept();
+						return;
+					}
+				}
+				if (res.statusCode == 200) {
+					for (var i in this.baseCall.success) {
+						this.baseCall.success[i].call(this,res.data);
+					}
+				} else {
+					for (var i in this.baseCall.fail) {
+						this.baseCall.fail[i].call(this,res.data);
+					}
+				}
+			},
+			fail: (res) => {
+				/**
+				uni.showModal({
+					title:"错误提示",
+					content:JSON.stringify(res)
+				});
+				console.log(res); **/
+				for (var i in this.baseCall.fail) {
+					this.baseCall.fail[i].call(this,res.errMsg);
+				}
+			},
+			complete: (res) => {
+				if(res.errMsg == 'request:ok') {
+					for (var i in this.baseCall.complete) {
+						this.baseCall.complete[i].call(this,res);
+					}
+				} else {
+					console.log(res);
+					for (var i in this.baseCall.fail) {
+						this.baseCall.fail[i].call(this,res.errMsg);
+					}
+				}
+				
+			}
+		});
+	}
+	
+	upFile(img,name) {
+		var that = this;
+		//提交之前
+		for (var i in this.baseCall.before) {
+			var b = this.baseCall.before[i].call(this);
+			//进行拦截
+			if(b != null && b === false) {
+				this.intercept();
+				return;
+			}
+		}
+		uni.uploadFile({
+			url : this.baseUrl,
+			filePath : img,
+			name : name,
+			formData: this.params,
+			header:this.header,
+			success : (res)=>{
+				try{
+					res = JSON.parse(res.data);
+					
+					for (var i in this.baseCall.success) {
+						this.baseCall.success[i].call(this,res);
+					}
+				}catch(e) {
+					for (var i in this.baseCall.fail) {
+						this.baseCall.fail[i].call(this,e);
+					}
+				}
+			}	
+		});
+	}
+	
+	/**
+	 * 提交头部数据
+	 * @param {Object} key
+	 * @param {Object} value
+	 */
+	setHeader(key, value) {
+		this.header[key] = value;
+		return this;
+	}
+	/**
+	 * 设置类型
+	 * @param {Object} type
+	 */
+	setType(type) {
+		this.type = type;
+	}
+	/**
+	 * 告诉监听者,被拦截了,可以进行反应操作
+	 */
+	intercept() {
+		if(this.baseCall._intercept != null) {
+			this.baseCall._intercept.call(this);
+		}
+	}
+};
+
+export default Http;

+ 134 - 0
library/Request.js

@@ -0,0 +1,134 @@
+import api from "../config/api.js";
+import Http from "./Http.js";
+import After from "./interceptors/After.js";
+import Before from "./interceptors/Before.js";
+import Complete from "./interceptors/Complete.js";
+import Success from "./interceptors/Success.js";
+import Fail from "./interceptors/Fail.js";
+import store from "../store";
+let Request = {
+	//全局 监听器 和 拦截器
+	interceptors:function(){
+		return {
+			after : (new After()).create,
+			before : (new Before()).create,
+			success : (new Success()).create,
+			fail : (new Fail()).create,
+			complete : (new Complete()).create
+		};
+	},
+	/**
+	 * 获取API接口
+	 * @param {Object} name
+	 */
+	getApi:function(name){
+		return store.state.http + api[name];
+	},
+	/**
+	 * get 提交数据
+	 * @param {Object} name api类目
+	 * @param {Object} post 提交参数
+	 * @param {Object} data 其他参数 {
+		 type : "json",//默认 返回用json进行解析
+		 header : {key:value},//使用字典模式 传递http头数据
+		 interceptors : {
+			 before:()=>{},//请求之前[返回false表示拦击 | 返回true不拦截]
+			 after:()=>{},//请求之后 [返回false表示拦击 | 返回true不拦截]
+			 success:()=>{},//请求成功 [只能监听]
+			 fail:()=>{},//请求失败 [只能监听]
+			 complete:()=>{}//无论失败和成功 [只能监听]
+		 },//拦截器 | 监听器
+		 //执行顺序
+		 before  ->  after  -> success | fail | complete
+	 } 
+	 * 
+	 */
+	get: async function(name,post,data = {}) {
+		return this.build(name,post,"get",data);
+	},
+	/**
+	 * post 提交数据
+	 * @param {Object} name api类目
+	 * @param {Object} post 提交参数
+	 * @param {Object} data 其他参数  参考上面
+	 *
+	 */
+	post: async function(name,post,data = {}) {
+		return this.build(name,post,"post",data);
+	},
+	/**
+	 * 上传文件
+	 * @param {Object} name api类目
+	 * @param {Object} post 提交参数
+	 * @param {Object} post 文件数据
+	 * @param {Object} post 提交input名字
+	 * @param {Object} data 其他参数  参考上面
+	 *
+	 */
+	uploadFile: async function(name,img,inputName,post,data = {}) {
+		return this.build(name,post,"file",data,img,inputName);
+	},
+	/**
+	 * 提交数据
+	 */
+	build: async function(name,post,method,data = {},img = null,inputName=null){
+		return await new Promise((resolve, reject) => {
+			let http = new Http();
+			//类型
+			if(data.type != null) {
+				http.setType(data.type);
+			}
+			//头部文件
+			if(data.header != null){
+				for(var i in data.header) {
+					http.setHeader(i,data.header[i]);
+				}
+			}
+			//全局监听口
+			let interceptors = this.interceptors();
+			for(var i in interceptors) {
+				http.interceptors.hasOwnProperty(i) ? http.interceptors[i](interceptors[i]) : '';
+			}
+			//监听口
+			if(data.interceptors != null) {
+				for(var i in data.interceptors) {
+					http.interceptors.hasOwnProperty(i) ? http.interceptors[i](data.interceptors[i]) : '';
+				}
+			}
+			// [成功|失败]返回口
+			http.interceptors.success((res)=>{
+				resolve(res);
+			});
+			//失败返回
+			http.interceptors.fail((res)=>{
+				console.log(res);
+				reject(-1,res);
+			});
+			//监听拦截器,告诉调用口(catch)是否被拦截 
+			http.interceptors._intercept(() =>{
+				console.log("intercept");
+				reject(-2);
+			});
+			var url = "";
+			
+			if(name.indexOf('http://') == 0 || name.indexOf("https://") == 0) {
+				url = name;
+			} else {
+				url = store.state.http + api[name];
+			}
+			
+			
+			if(method == 'get')
+				http.get(url,post);
+			
+			if(method == 'post')
+				http.post(url,post);
+			if(method == 'file')
+				http.uploadFile(url,post,img,inputName);
+		});
+	}
+	
+	
+};
+
+export default Request;

+ 25 - 0
library/interceptors/After.js

@@ -0,0 +1,25 @@
+/// +----------------------------------------------------------------------
+// | HTTP 全局监听口[监听远程执行之后]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016-2017 ,Lioc All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+import store from "../../store";
+class After {
+	app = null;
+	constructor(http) {
+	    this.app = getApp();
+	}
+	
+	create() {
+		//console.log(store.user);
+	}
+	
+	
+	
+}
+
+export default After;

+ 64 - 0
library/interceptors/Before.js

@@ -0,0 +1,64 @@
+/// +----------------------------------------------------------------------
+// | HTTP 全局监听口[监听远程执行之前]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016-2017 ,Lioc All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+import store from "../../store";
+import md5 from "../vendor/md5.js";
+import global from "../../config/global.js";
+import { v4 as uuidv4 } from "uuid";
+class Before {
+	app = null;
+	http = null;
+	constructor(http) {
+	    this.app = getApp();
+	}
+	/**
+	 * [监听]和[拦截]
+	 */
+	create() {
+		var salt = global.putoken;
+		var app = getApp();
+		var post = {};
+		post['token'] = store.state.user != null ? store.state.user.token : "";
+		//设备号
+		post['deviceId'] = store.state.uuid;
+		//设备类型
+		post["deviceType"] = app.$device.platform == 'ios' ? 2 : 1;
+		//#ifdef APP-PLUS
+			post["fromApp"] = "app";
+		//#endif
+			
+		//#ifndef APP-PLUS
+			post["fromApp"] = "h5";
+		//#endif
+		
+		post["mobileType"] = app.$device.model + "(" + app.$device.system + ")";
+		//版本号
+		post["version"] = global.version;
+		//内部版本号
+		post['appCode'] = global.app_code;
+		//校验标码
+		post['noction']  = uuidv4();
+		//访问时间戳
+		post["timestamp"] =  Date.parse(new Date());
+		var signAr = [];
+		for(var i in post) {
+			signAr.push(i + "=" + post[i]);
+		}
+		var signStr = md5(salt + signAr.join(','));
+		post['sign'] = signStr;
+		for(var i in post) {
+			this.setHeader(i,post[i]);
+		}
+	}
+	
+	
+	
+}
+
+export default Before;

+ 24 - 0
library/interceptors/Complete.js

@@ -0,0 +1,24 @@
+/// +----------------------------------------------------------------------
+// | HTTP 全局监听口[监听远程执行执行]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016-2017 ,Lioc All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+class Complete {
+	app = null;
+	constructor(http) {
+	    this.app = getApp();
+	}
+	//不支持拦截
+	create() {
+		
+	}
+	
+	
+	
+}
+
+export default Complete;

+ 24 - 0
library/interceptors/Fail.js

@@ -0,0 +1,24 @@
+/// +----------------------------------------------------------------------
+// | HTTP 全局监听口[监听远程执行失败]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016-2017 ,Lioc All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+class Fail {
+	app = null;
+	constructor(http) {
+	    this.app = getApp();
+	}
+	//不支持拦截
+	create() {
+		
+	}
+	
+	
+	
+}
+
+export default Fail;

+ 24 - 0
library/interceptors/Success.js

@@ -0,0 +1,24 @@
+/// +----------------------------------------------------------------------
+// | HTTP 全局监听口[监听远程执行失败]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016-2017 ,Lioc All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+class Success {
+	app = null;
+	constructor(http) {
+	    this.app = getApp();
+	}
+	//不支持拦截
+	create() {
+		
+	}
+	
+	
+	
+}
+
+export default Success;

+ 79 - 0
library/socket/Message.js

@@ -0,0 +1,79 @@
+class Message {
+	
+	 /**
+	    * 消息ID
+	     */
+	    msgId = "";
+	    /**
+	     * 消息类型
+	     */
+	    msgType = 1;
+	    /**
+	     * 消息类型
+	     */
+	    code = "";
+	    /**
+	     * 认证通行证
+	     */
+	    token = "";
+	    /**
+	     * 消息数据
+	     */
+	    data = "";
+	    /**
+	     * 确认帧ID
+	     */
+	    askId = "";
+	    /**
+	     * 需要对方确认应答
+	     */
+	    ask = false;
+	    /**
+	     * 是否回复数据
+	     */
+	    reply = false;
+		
+		/**
+		 * 其他数据
+		 */
+		remark = "";
+		
+	
+	
+	/**
+	 * 
+	 * @param {Object} data 消息数据
+	 * @param {Object} MsgType 消息类型 1: 普通包文 ,2:消息确认帧
+	 * @param {Object} code 消息类型[]
+	 * @param {Object} ask 需要对方确认应答
+	 * @param {Object} isReply 是否应答数据
+	 */
+	constructor(data = '',code = '',ask = false,MsgType = 1,isReply = false) {
+		this.data = data;
+		this.msgType = MsgType;
+		this.code = code;
+		this.ask = ask;
+		this.reply = isReply;
+	}
+	
+	
+	getJson() {
+		return JSON.stringify(this.getData());
+	}
+	
+	getData(){
+		
+		return {
+			data	: this.data,
+			msgType : this.msgType,
+			code	: this.code,
+			ask		: this.ask,
+			reply	: this.reply,
+			msgId	: this.msgId,
+			askId	: this.askId,
+			remark  : this.remark
+		};
+	}	
+}
+
+export default Message

+ 502 - 0
library/socket/WebSokcet.js

@@ -0,0 +1,502 @@
+// +----------------------------------------------------------------------
+// | 桌子工作室 [webSokcet] V0.12015014  Released
+// |  上行数据 clinet   下行数据 service
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2019 ,MrTable All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: Mr Table <admin@hjf.pw>
+// +----------------------------------------------------------------------
+import CryptoJS from "../vendor/CryptoJS.js";
+import { Base64 } from '../vendor/base64.js';
+import Message from "./Message.js";
+class WebSokcet {
+  index = 0;
+  //scoket
+  socketTask = null;
+  //事件返回
+  eventCall = null;
+  //是否已连接
+  socketOpen = false;
+  //定时器
+  //心跳
+  timerId = 0;
+  //重发包
+  timerId2 = 0;
+  //是否在重连中
+  isReconnect = false;
+  //临时获取数据
+  tmpData = [];
+  //临时提交数据包[上行数据]
+  tmpCliData = [];
+  //临时提交数据包[下行数据]
+  tmpSerData = [];
+  //设备标识符
+  deveicId = 0;
+  //重试次数
+  retryCount = 5;
+  isClose = false;
+
+
+  opts = {};
+  constructor(opt) {
+	let option = {wsUrl:""};  
+    this.opts = this.extend(option,opt);
+  }
+
+  /**
+   * 连接socket
+   */
+  connect() {
+    var that = this;
+	this.isClose = false;
+    this.socketTask = new wxSocket({
+      wsUrl: this.opts.wsUrl,
+      //打开
+      onOpen:(res => {
+        console.log("webSokcet连接成功");
+        that.socketOpen = true;
+        if (that.eventCall != null) that.eventCall('onOpen', '');
+		//心跳包
+        that.heartBeat();
+      }),
+      //获取消息
+      onMessage:(onMessage) => {
+        var aData = that.asyMessage(onMessage);
+        if (aData == null) return;
+        if (aData == '') return;
+		console.log("接受到消息:" + JSON.stringify(aData));
+        //确认帧【客户端主包】
+        if (aData.msgType == 2) {
+			that.ackFrame(aData);
+			return;
+        }
+		
+		 //检查重复包帧【服务端主包】
+        if (that.checkFrame(aData)) {
+			if (that.eventCall != null) that.eventCall('onSendSuccess', aData);
+          return;
+        }
+        that.tmpSerData.push({ time: new Date().getTime(),data: aData, msgId: aData.msgId});
+        aData.isReSend = true;
+		if(aData.isAsk) {
+			let obj 	= new Message();
+			obj.code 	= aData.code;
+			obj.msgType = 2;
+			obj.askId 	= aData.msgId;
+			obj.data 	=  that.eventCall == null ? "" : that.eventCall('onMessage', aData);	
+			this.send(obj.getData(),false);
+		} else {
+			if (that.eventCall != null) that.eventCall('onMessage', aData);
+		}
+      },
+      //获取错误信息
+      onError:res=>{
+        console.log(res);
+        that.socketOpen = false;
+        if (res.errMsg != 'exceed max task count'){
+          if (that.eventCall != null) that.eventCall('onError', res.errMsg);
+		  if(!this.isClose) that.reConnon();
+        } else {
+          if (that.eventCall != null) that.eventCall('onStop', res.errMsg);
+        }
+      },
+      onClose:onClose => {
+        console.log("webSokcet已关闭");
+        that.socketOpen = false;
+        if (that.eventCall != null) that.eventCall('onClose', '');
+        this.socketTask.socket.close();
+       if(!this.isClose) that.reConnon();
+      }
+    });
+  }
+  /**
+   * 设置事件
+   */
+  setBackCall(call) {
+    this.eventCall = call;
+  }
+  
+  ttClose(){
+	  clearInterval(this.timerId);
+	  clearInterval(this.timerId2);
+	  this.isClose = true;
+	  if(this.socketTask != null)
+		this.socketTask.socket.close();
+  }
+
+  /**
+   * 设置生成密钥
+   * @param key
+   */
+  setKey(key) {
+    this.opts.key = key;
+  }
+  /**
+   * 发送数据
+   * @param data 数据
+   * fn
+   * error
+   * @returns {boolean}
+   * 
+   */
+  send(data,fn = null,error = null) {
+    if (!this.socketOpen) { return null; }
+    //发送数据
+    try {
+		
+      //生成消息[分配设备ID]
+      if (data.msgId == "") data.msgId = this.createMsgId();
+      //解析加密数据
+	  console.log("发送数据:" + JSON.stringify(data.getData()));
+      var AES = new CryptoJS.AES(this.opts.key);
+      var jsonStr = AES.encrypt(JSON.stringify(data.getData()));
+      //发送数据到服务器
+      this.socketTask.send({data:jsonStr});
+      //确认证就不存到缓存
+      if (!data.ask) return null;  
+      //是否缓存存在
+      var msgObj = this.findCliMsgId(data.msgId);
+      //记录发送数据
+      if (msgObj == null){
+        this.tmpCliData.push({
+          'msgId'     : data.msgId,//消息ID
+          'data'      : data,
+          'count'     : 1,//尝试次数
+          'time'      : new Date().getTime(),//最红发送时间
+          'code'      : 0,
+		  'fn'		  : fn,
+		  'error'	  : error
+        });
+      } else {
+        msgObj['count']++;
+        msgObj['time'] = new Date().getTime();
+      }
+      return data.msgId;
+    } catch (e) {
+      console.log(e.message);
+      return null;
+    }
+  }
+	
+  /**
+   * 掉线从连接
+   */
+  reConnon() {
+    clearInterval(this.timerId);
+	clearInterval(this.timerId2);
+	var time = new Date().getTime();
+	
+	for (var i in this.tmpSerData) {
+		var d = this.tmpSerData[i];
+		if (time - d.time > 10 * 1000){
+			this.tmpSerData.splice(i, 1);
+			if (this.eventCall != null) this.eventCall('onSendError', d.data);
+		}
+	}
+    setTimeout(function () {
+      if (this.socketTask.readyState == 3) {
+        console.log('webSokcet重连接');
+        this.connect(this.token);
+      }
+    }.bind(this), 2000);
+  }
+  /**
+   * 心跳包
+   */
+  heartBeat() {
+    this.timerId = setInterval(function () {
+      if (this.socketTask.readyState == 1) {
+        this.socketTask.send({ data: '01'});
+		if (this.eventCall != null) this.eventCall('onHeartBeat', {});
+      }
+    }.bind(this), 10 * 1000);
+	
+	//重发包
+	this.timerId2 = setInterval(function () {
+	  if (this.socketTask.readyState == 1) {
+	    //重发机制
+	    this.reSend();
+	    //清理下行包
+	    this.clerSerData();
+	  }
+	}.bind(this), 5 * 1000);
+	
+    return this;
+  }
+  /**
+   * 数据重发
+   */
+  reSend(){
+    var time = new Date().getTime();
+    for (var i in this.tmpCliData) {
+      var d = this.tmpCliData[i];
+	  //重发
+      if(d.count < this.retryCount && time - d.time> 5000) {
+		  d.time = time;
+        if (this.eventCall != null) this.eventCall('onReSend', d.data,d.count);
+        this.send(d.data,false,null,null);
+        continue;
+      }
+	  if(d.count >= this.retryCount) {
+		  //发送失败
+		  if (this.eventCall != null) this.eventCall('onSendError', d.data);
+		  if(d.error != null) d.error();
+		  this.tmpCliData.splice(i, 1);
+	  }
+    }
+  }
+  /**
+   * 清理下行数据包[超过30秒]
+   */
+  clerSerData(){
+    var time = new Date().getTime();
+    for (var i in this.tmpSerData) {
+      var d = this.tmpSerData[i];
+      if (time - d.time > 30 * 1000){
+        this.tmpSerData.splice(i, 1);
+      }
+    }
+  }
+  /**
+   * 查找消息位置[上行数据]
+   */
+  findCliMsgId(msgId){
+    for (var i = 0; i < this.tmpCliData.length;i++){
+      if (this.tmpCliData[i].msgId == msgId) return this.tmpCliData[i];
+      }
+      return null;
+  }
+  
+  
+  /**
+   * 重复包检测【服务端主包】【服务端重发消息(重复包拦截)】
+   */
+  checkFrame(data){
+	 // console.log(this.tmpSerData);
+	  for(var i in this.tmpSerData) {
+		 if(this.tmpSerData[i].data.msgId == data.msgId) {
+			 let sendAr = this.tmpSerData[i].data;
+			 if(sendAr.isAsk) {
+				let obj = new Message();
+				obj.code = sendAr.code;
+				obj.msgType = 2;
+				obj.askId = sendAr.msgId;
+				obj.data = sendAr.data;
+				this.send(obj.getData(),false);
+				 return true;
+			 }
+		 }	
+	  }
+	   return false;
+  }
+
+  /**
+   * 
+   *  确认帧【客户端主包】【取消客户端重发消息】
+   * 
+   */
+  ackFrame(data) {
+	for (var i = 0; i < this.tmpCliData.length; i++) {
+		if (this.tmpCliData[i].msgId == data.askId){
+			if(this.tmpCliData[i].fn !== null) this.tmpCliData[i].fn(data.data);
+			this.tmpCliData.splice(i, 1);
+			break;
+		}
+	}
+  }
+
+  /**
+     * 解析uStr
+     */
+  asyMessage(uStr) {
+	  try{	
+		  //不支持这个
+		 if(uStr instanceof ArrayBuffer) {
+			 return null;
+		 } 
+		//是否分割线
+		var isEof = false;
+		if(uStr.length >= 4) {
+			//\r\n\r\n
+			if(uStr[uStr.length - 1] == "\n"
+				&& uStr[uStr.length - 2] == "\r"
+				&& uStr[uStr.length - 3] == "\n"
+				&& uStr[uStr.length - 4] == "\r"
+			) {
+				isEof = true;
+			}
+		}
+		//获取全部数据
+		if (isEof) {
+			  var unAr = [],unArStr = "";
+			  //累加之前数据分包
+			  for (var i in this.tmpData) {
+				unAr.push(this.tmpData[i]);
+			  }
+			unArStr = unAr.join('');
+			unArStr += uStr;
+			this.tmpData = [];
+			if(unArStr == "") return null;
+			var AES = new CryptoJS.AES(this.opts.key);
+			var data = AES.decrypt(unArStr.trim());
+			if(data == "") return null;
+			//console.log(data);
+			return JSON.parse(data);	
+		} else {
+			this.tmpData.push(uStr);
+		}
+	  } catch(err) {
+		  console.log(err);
+		  return null;
+	  }
+  }
+  /**
+   * 格式化转化
+   */
+  Uint8ArrayToString(fileData) {
+      var dataString = "";
+      for (var i = 0; i < fileData.length; i++) {
+        dataString += String.fromCharCode(fileData[i]);
+      }
+      return dataString
+  }
+
+  createMsgId(){
+    this.index ++;
+    return "web" + this.deveicId + new Date().getTime() + this.index;
+  }
+  /**
+   * 配置数据默认匹配
+   * $a 默认数据比如:[]
+   * $b 现在有
+   */
+  extend($a, $b) {
+    let $r = [];
+    //先遍历$b数据
+    for (var i in $b) {
+      $r[i] = $b[i];
+    }
+    //遍历默认数据
+    for (var i in $a) {
+      if ($r[i] == null) $r[i] = $a[i];
+    }
+    return $r;
+  }
+}
+
+/**
+ * websokcet
+ * @param options
+ * @returns {websocket}
+ */
+class wxSocket {
+  readyState = 0;
+  socket = null;
+  opts = {
+    wsUrl: "",
+    onOpen:()=>{},
+    onMessage:()=>{},
+    onError:()=>{},
+    onClose:()=>{}
+  };
+
+
+  constructor(opt) {
+    this.opts = this.extend(this.opts,opt);
+    this.onInit();
+  }
+
+  onInit(){
+	console.log('发起链接');
+	console.log(this.opts.wsUrl);
+	this.socket = uni.connectSocket({ 
+		url:this.opts.wsUrl,
+		complete:(res)=>{}
+	
+	});
+	
+	if(this.socket == null ){
+	  setTimeout(()=>{
+		  this.onInit();
+	  },1000);
+	  return;
+	} else {
+		
+		//监听返回
+		this.socket.onMessage(onMessage => { this.onMessage(onMessage);});
+		this.socket.onOpen(res => { this.onOpen(res); });
+		this.socket.onError(res => {this.onError(res);});
+		this.socket.onClose(res => {this.onClose(res);});
+	}
+	
+  }
+
+  send(data) {
+    this.socket.send({ data : data.data});
+  }
+
+  onOpen(event){
+    this.bOpen = true;
+    if(this.opts.onOpen){
+      this.readyState= 1;
+      this.opts.onOpen(event);
+    }
+  }
+
+  /**
+   *
+   * @param msg
+   */
+  onSend(msg){
+    if(this.opts.onSend){
+      this.opts.onSend(msg);
+    }
+    this.socket.send(msg);
+  }
+
+  /**
+   *
+   * @param msg
+   */
+  onMessage(msg){
+    if(this.opts.onMessage){
+      this.opts.onMessage(msg.data);
+    }
+  }
+
+  /**
+   *
+   * @param event
+   */
+  onError(event){
+	  console.log(event);
+    if(this.opts.onError){
+      this.readyState = 3;
+      this.opts.onError(event);
+
+    }
+  }
+
+  /**
+   *
+   * @param event
+   */
+  onClose(event){
+    if(this.opts.onClose){
+      this.readyState = 3;
+      this.opts.onClose(event);
+    }
+    if(this.socket.close() != null){
+      this.socket = null;
+    }
+  }
+
+
+  extend($a, $b){
+    let $r = [];for (var i in $b) {$r[i] = $b[i];}for (var i in $a) {if ($r[i] == null) $r[i] = $a[i];}return $r;
+  }
+}
+
+export default WebSokcet

+ 889 - 0
library/utils/Comm.js

@@ -0,0 +1,889 @@
+
+import IDCard  from "../vendor/IDCard.js";
+const dialog=uni.requireNativePlugin("CL-Dialog");
+/**
+ * @param  {string} text   提示内容 
+ * @param  {int}    time 多少时间消失 
+ * @return {function}  fn 函数
+ * 
+ */
+const Tip = (text, time = 2000, fn = null) => {
+	uni.showToast({
+		'title'	: text,
+		duration : time,
+		icon:'none'
+	});
+  if (fn != null)  setTimeout(() => {fn();}, time);
+  }
+  /**
+   * 加载数据
+   */
+  const loadIng = (title = false,mask = false) => {
+	uni.showLoading({
+		title: title ? title : "加载中...",
+		mask : mask
+	});
+  }
+  //询问框
+  const showModal = (title,success = null,fail = null) =>{
+	if(dialog != null){
+		let options = {
+			title: "系统提示", //标题 (可选)
+			con: title, //内容(可选)但是标题和内容至少选择一个
+			okTitle: "确认", //确认按钮文字(可选)
+			cancleTitle: "取消", //取消按钮文字(可选)
+			okTextColor: "#f1851e", //确认按钮颜色(可选)
+			cancleTextColor: "#999999", //取消按钮颜色(可选)
+			singer: false, //是否只显示确认按钮,默认false(可选
+			textAlign: "center", //对齐方式 //left居左,center居中  ,right 居右 默认居中
+			conColor: "",
+			bgColor: "#ffffff", //自定义弹框颜色
+			titleColor: "#3d3d3d" //自定义title颜色
+			//提示框内容颜色;
+		}
+		dialog.show(options,()=>{
+			if(success != null) success();
+		},()=>{
+			if(fail != null) fail();
+		});		
+	} else {
+		uni.showModal({
+			title: "系统提示",
+			content: title,
+			confirmText: "确定",
+			cancelText: "取消",
+		  		success:function(res){
+		  			if(res.confirm && success != null){
+		  				success();
+		  				return;
+		  			}
+		  			if(!res.confirm && fail != null){
+		  				fail();
+		  				return;
+		  			}
+		  		}
+		})		 
+	}	
+  }
+  
+  /**
+   * 提示框
+   */
+  const showAlert = (ob,success = null) =>{
+	  var oAr = {};
+	  if(ob instanceof Object){
+		  oAr = ob;
+		  if(oAr['title'] == null || oAr['title'] == '') {
+			  oAr['title'] = "系统提示";
+		  }
+	  } else {
+		  oAr['title'] = "系统提示";  
+		  oAr['content'] = ob;
+	  }
+	if(dialog != null){
+		let options = {
+			title: oAr['title'], //标题 (可选)
+			con: oAr['content'], //内容(可选)但是标题和内容至少选择一个
+			okTitle: oAr['btn'] == null ? '确认' : oAr['btn'], //确认按钮文字(可选)
+			okTextColor: "#f1851e", //确认按钮颜色(可选)
+			singer: true, //是否只显示确认按钮,默认false(可选
+			textAlign: "center", //对齐方 式 //left居左,center居中  ,right 居右 默认居中
+			conColor: "",
+			bgColor: "#ffffff", //自定义弹框颜色
+			titleColor: "#3d3d3d" //自定义title颜色
+			//提示框内容颜色;
+		}
+		console.log(dialog);
+		dialog.show(options,()=>{
+			if(success != null) success();
+		});			
+	 } else {
+		uni.showModal({
+			title: oAr['title'],
+			content: oAr['content'],
+			confirmText:oAr['btn'] == null ? '确认' : oAr['btn'],
+			showCancel: false,
+				success:function(){
+					if(success != null) success();
+				}
+		});
+	 }
+  }
+  
+  
+  /**
+	 * 判断是否微信
+	 *  @return {bool}  是否微信
+	 */
+	function isWeiXin(){
+    var ua = window.navigator.userAgent.toLowerCase();
+    if(ua.match(/MicroMessenger/i) == 'micromessenger'){
+        return true;
+    }else{
+        return false;
+    }
+}
+
+/**
+ * 判断是否存在
+ * @param {Object} value
+ */
+function isDefine(value) {
+  if (value == null || value == "" || value == "undefined" || value == undefined || value == "null" || value == "(null)" || value == 'NULL' || typeof (value) == 'undefined') {
+    return false;
+  }
+  else {
+    value = value + "";
+    value = value.replace(/\s/g, "");
+    if (value == "") {
+      return false;
+    }
+    return true;
+  }
+}
+/**
+ * 时间戳11位
+ */
+function timest() {
+  var tmp = Date.parse( new Date() ).toString();
+  tmp = tmp.substr(0,10);
+  return tmp;
+}
+/** 
+ * 时间戳格式化函数 
+ * @param  {string} format    格式 
+ * @param  {int}    timestamp 要格式化的时间 默认为当前时间 
+ * @return {string}           格式化的时间字符串 
+ */
+function date(format, timestamp) {
+  var a, jsdate = ((timestamp) ? new Date(timestamp * 1000) : new Date());
+  var pad = function (n, c) {
+    n = n + "";
+    if (n.length < c) {
+      var i = c - n.length;
+      var v = '';
+      for (var j = 0; j < i; j++) {
+        v += '0';
+      }
+      return v + n;
+    } else {
+      return n;
+    }
+  };
+  var txt_weekdays = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
+  var txt_ordin = { "1": "st", "2": "nd", "3": "rd", "21": "st", "22": "nd", "23": "rd", "31": "st" };
+  var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
+
+  var f = {
+    // Day 
+    d: function () { return pad(f.j(), 2) },
+    D: function () { return f.l().substr(0, 3) },
+    j: function () { return jsdate.getDate() },
+    l: function () { return txt_weekdays[f.w()] },
+    N: function () { return f.w() + 1 },
+    S: function () { return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th' },
+    w: function () { return jsdate.getDay() }
+    ,
+    // Week 
+    W: function () {
+      var a = f.z(), b = 364 + f.L() - a;
+      var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
+      if (b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b) {
+        return 1;
+      } else {
+        if (a <= 2 && nd >= 4 && a >= (6 - nd)) {
+          nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
+          return date("W", Math.round(nd2.getTime() / 1000));
+        } else {
+          return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
+        }
+      }
+    },
+
+    // Month 
+    F: function () { return txt_months[f.n()] },
+    m: function () { return pad(f.n(), 2) },
+    M: function () { return f.F().substr(0, 3) },
+    n: function () { return jsdate.getMonth() + 1 },
+    t: function () {
+      var n;
+      if ((n = jsdate.getMonth() + 1) == 2) {
+        return 28 + f.L();
+      } else {
+        if (n & 1 && n < 8 || !(n & 1) && n > 7) {
+          return 31;
+        } else {
+          return 30;
+        }
+      }
+    },
+    //o not supported yet 
+    Y: function () { return jsdate.getFullYear() },
+    y: function () { return (jsdate.getFullYear() + "") },
+
+    // Time 
+    a: function () { return jsdate.getHours() > 11 ? "pm" : "am" },
+    A: function () { return f.a().toUpperCase() },
+    B: function () {
+      // peter paul koch: 
+      var off = (jsdate.getTimezoneOffset() + 60) * 60;
+      var theSeconds = (jsdate.getHours() * 3600) + (jsdate.getMinutes() * 60) + jsdate.getSeconds() + off;
+      var beat = Math.floor(theSeconds / 86.4);
+      if (beat > 1000) beat -= 1000;
+      if (beat < 0) beat += 1000;
+      if ((String(beat)).length == 1) beat = "00" + beat;
+      if ((String(beat)).length == 2) beat = "0" + beat;
+      return beat;
+    },
+    g: function () { return jsdate.getHours() % 12 || 12 },
+    G: function () { return jsdate.getHours() },
+    h: function () { return pad(f.g(), 2) },
+    H: function () { return pad(jsdate.getHours(), 2) },
+    i: function () { return pad(jsdate.getMinutes(), 2) },
+    s: function () { return pad(jsdate.getSeconds(), 2) },
+    //u not supported yet 
+
+    // Timezone 
+    //e not supported yet 
+    //I not supported yet 
+    O: function () {
+      var t = pad(Math.abs(jsdate.getTimezoneOffset() / 60 * 100), 4);
+      if (jsdate.getTimezoneOffset() > 0) t = "-" + t; else t = "+" + t;
+      return t;
+    },
+    P: function () { var O = f.O(); return (O.substr(0, 3) + ":" + O.substr(3, 2)) },
+    //T not supported yet 
+    //Z not supported yet 
+
+    // Full Date/Time 
+    c: function () { return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P() },
+    //r not supported yet 
+    U: function () { return Math.round(jsdate.getTime() / 1000) }
+  };
+
+  return format.replace(/[\\]?([a-zA-Z])/g, function (t, s) {
+      var ret = '';
+      if (t != s) {
+        ret = s;
+      } else if (f[s]) {
+        ret = f[s]();
+      } else {
+        ret = s;
+      }
+      return ret;
+    });
+}
+
+/**
+ * strtotime()函数
+ * strtotime('2012-07-27 12:43:43') OR strtotime('2012-07-27')
+ * @return 时间戳
+ */
+function strtotime(str = '') {
+  if(str == '') {
+	var _temp = new Date();
+	return parseInt(_temp.getTime() / 1000);
+  }	
+  var _arr = str.split(' ');
+  var _day = _arr[0].split('-');
+  _arr[1] = (_arr[1] == null) ? '0:0:0' : _arr[1];
+  var _time = _arr[1].split(':');
+  for (var i = _day.length - 1; i >= 0; i--) {
+    _day[i] = isNaN(parseInt(_day[i])) ? 0 : parseInt(_day[i]);
+  };
+  for (var i = _time.length - 1; i >= 0; i--) {
+    _time[i] = isNaN(parseInt(_time[i])) ? 0 : parseInt(_time[i]);
+  };
+  var _temp = new Date(_day[0], _day[1] - 1, _day[2], _time[0], _time[1], _time[2]);
+  return parseInt(_temp.getTime() / 1000);
+}
+
+
+/**
+ * 小数保留默认2位
+ */
+function returnFloat(value) {
+  var value = Math.round(parseFloat(value) * 100) / 100;
+  var xsd = value.toString().split(".");
+  if (xsd.length == 1) {
+    value = value.toString() + ".00";
+    return value;
+  }
+  if (xsd.length > 1) {
+    if (xsd[1].length < 2) {
+      value = value.toString() + "0";
+    }
+    return value;
+  }
+}
+
+
+/**
+ * 百分比
+ */
+function percentage(value,value2) {
+	return returnFloat((value / value2) * 100);
+}
+
+/**
+ * 倒计时【验证码】
+ * @time 倒计时 秒
+ * @结束
+ */
+function CountDowm(time, fe = null) {
+  var id = setInterval(() => {
+    time--;
+    if (fe != null) fe(time, 0);
+    if (time <= 0) {
+      clearInterval(id);
+      fe(0, 1);
+    }
+  }, 1000);
+}
+/**
+ * 远程获取[GET同步返回]
+ * @parm url 地址
+ * @parm data get数据
+ * @parm fn 异步返回 
+ */
+const httpGet = (url, data, fn, fe) => {
+//  if (fe == null) { fe = () => { Tip("网络错误,请稍等尝试..."); wx.hideLoading() } };
+if (data == null) data = {time:Math.round(new Date().getTime() / 1000)};
+  uni.request({
+    url: url,
+    data: post,
+    success: res => {
+      if (res.statusCode == 200) if (fn != null) fn(res.data); else fe();
+    },
+    fail: () => { fe(); }});
+}
+
+/**
+ * 远程获取[GET异步返回]
+ * @parm url 地址
+ * @parm data get数据
+ */
+const httpGetAsy = (url, data) => {
+ return new Promise((resolve, reject) => {
+   if (data == null) data = {time:Math.round(new Date().getTime() / 1000)};
+   uni.request({
+     url     : url,
+     data    : data,
+     success : res => {if (res.statusCode == 200) resolve(res.data); else reject();},
+     fail: ()=> {reject();}
+   });   
+ });
+};
+/**
+ * 判断手机号码是否准确
+ */
+const isPoneAvailable = (tel) => {
+	var myreg=/^[1][3,4,5,6,7,8,9][0-9]{9}$/;
+	if (!myreg.test(tel)) {
+		return false;
+	} else {
+		return true;
+	}
+};
+/**
+ * 远程获取[POST异步操作]
+ * @parm url 地址
+ * @parm post post数据 
+ */
+const httpPostAsy = (url, post) => {
+  return new Promise((resolve, reject) => {
+    uni.request({
+      url     : url,
+      method  : 'POST',
+      data    : post,
+	  header  : {
+		"content-type"	: "application/x-www-form-urlencoded"
+	  },	
+      success: res => { if (res.statusCode == 200) resolve(res.data); else reject(); },
+      fail: () => { reject(); } 
+    });
+  });
+};
+
+/**
+ * 广告跳转页面
+ * @param {Object} url
+ */
+function navigateTo(url) {
+	if (url == '#' || url == '') {
+		return;
+	}
+	var switchAr = [
+		'/pages/cart/index'
+	]; 
+	for(var i in switchAr) {
+		if(switchAr[i] == url) {
+			uni.switchTab({
+				url : url
+			});
+		}
+	}
+	if(url.indexOf("http://") >= 0 || url.indexOf("https://") >= 0) {
+		location.href = url;
+		return;
+	}
+	
+	uni.navigateTo({
+		url: url
+	});
+}
+/**
+ * 阿拉伯数字转中文数字
+ * @param {Object} num
+ */
+function noToChinese(num) {
+    if (!/^\d*(\.\d*)?$/.test(num)) {
+        alert("Number is wrong!");
+        return "Number is wrong!";
+    }
+    var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
+    var BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
+    var a = ("" + num).replace(/(^0*)/g, "").split("."),
+        k = 0,
+        re = "";
+    for (var i = a[0].length - 1; i >= 0; i--) {
+        switch (k) {
+            case 0:
+                re = BB[7] + re;
+                break;
+            case 4:
+                if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
+                    re = BB[4] + re;
+                break;
+            case 8:
+                re = BB[5] + re;
+                BB[7] = BB[5];
+                k = 0;
+                break;
+        }
+        if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
+        if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re;
+        k++;
+    }
+    if (a.length > 1) //加上小数部分(如果有小数部分) 
+    {
+        re += BB[6];
+        for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
+    }
+    return re;
+};
+
+/**
+ * 字节转换
+ */
+function bytesToSize(bytes) {
+  if (bytes === 0) return '0 B';
+  var k = 1024;
+  var sizes = ['B', 'KB', 'M', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
+  var i = Math.floor(Math.log(bytes) / Math.log(k));
+  return toDecimal(bytes / Math.pow(k, i)) + ' ' + sizes[i];
+}
+/**
+ * 星座
+ */
+function constellation(strBirthday) {
+  if (strBirthday == '0') return '无';
+  var strBirthdayArr = strBirthday.split("-");
+  var month = strBirthdayArr[1];
+  var date = strBirthdayArr[2]; 
+  if (month == 1 && date >= 20 || month == 2 && date <= 18) { return "水瓶座"; }
+  if (month == 2 && date >= 19 || month == 3 && date <= 20) { return "双鱼座"; }
+  if (month == 3 && date >= 21 || month == 4 && date <= 19) { return "白羊座"; }
+  if (month == 4 && date >= 20 || month == 5 && date <= 20) { return "金牛座"; }
+  if (month == 5 && date >= 21 || month == 6 && date <= 21) { return "双子座"; }
+  if (month == 6 && date >= 22 || month == 7 && date <= 22) { return "巨蟹座"; }
+  if (month == 7 && date >= 23 || month == 8 && date <= 22) { return "狮子座"; }
+  if (month == 8 && date >= 23 || month == 9 && date <= 22) { return "室女座"; }
+  if (month == 9 && date >= 23 || month == 10 && date <= 22) { return "天秤座"; }
+  if (month == 10 && date >= 23 || month == 11 && date <= 21) { return "天蝎座"; }
+  if (month == 11 && date >= 22 || month == 12 && date <= 21) { return "人马座"; }
+  if (month == 12 && date >= 22 || month == 1 && date <= 19) { return "摩羯座"; }
+}
+
+/** 
+ * 消息时间值转化  
+ * @param  {int}    timestamp 要格式化的时间 默认为当前时间 
+ * @return {string}           格式化的时间字符串 
+ */
+function timeLastdate(timestamp,isWeekTime = false){
+  //判断是否今天
+  var stoday = strtotime(date('Y-m-d 00:00:00'));
+  
+  if (timestamp > stoday){
+    var h = date('H');
+    if(h <= 12) 
+      return '早上' + date('H:i', timestamp);
+    else 
+      return '下午' + date('H:i', timestamp);
+  }
+  //昨天
+  var day = new Date();
+  day.setTime(day.getTime() - 24 * 60 * 60 * 1000);
+  var ytoday = day.getTime() / 1000;
+  var s_yesterday = strtotime(date('Y-m-d 0:0:0', ytoday));
+  var e_yesterday = strtotime(date('Y-m-d 23:59:59', ytoday));
+  if (timestamp > s_yesterday && timestamp < e_yesterday){
+    return '昨天' + date('H:i', timestamp);
+  }
+
+  //获取周一时间
+  var dayInWeek = day.getDay();
+  dayInWeek == 0 && (dayInWeek = 7);
+  var beginWeek = strtotime(date('Y-m-d 0:0:0',(day.getTime() - (dayInWeek - 1) * 86400000) / 1000));
+  if (timestamp >= beginWeek){
+    return date('l', timestamp) + (isWeekTime == true ? date('h:i',timestamp) : '');
+  }
+
+  //判断是否今年
+  var y  = day.getFullYear() ;
+  var y1 = date('Y', timestamp);
+  if(y == y1){
+    return isWeekTime ? date('m月d日 H:i', timestamp) : date('m月d日', timestamp);
+  }
+
+  return date('Y年m月d日 H:i', timestamp);
+}
+
+function countdown(time,isAr) {
+	var str = "";
+	var day = parseInt(time / (3600 * 24));
+	var day_yusu = time % (3600 * 24);
+	var housr = parseInt(day_yusu / 3600);
+	var housr_yusu = day_yusu % 3600;
+	var minutes = parseInt(housr_yusu / 60);
+	var seconds = housr_yusu % 60;
+	if(isAr) {
+		return [day,
+		(housr > 9 ? housr : ('0' + housr) ),
+		(minutes > 9 ? minutes : ('0' + minutes) ),
+		(seconds > 9 ? seconds : ('0' + seconds))];	
+	}
+	
+	if(day > 0){
+		str = day + '天';
+	} 
+	console.log(seconds);
+	str += (housr > 9 ? housr : ('0' + housr) ) + ':'
+			+ (minutes > 9 ? minutes : ('0' + minutes) ) + ':' + 
+			(seconds > 9 ? seconds : ('0' + seconds) );	
+
+	return str;
+}
+
+/**
+ * 金钱单位模拟
+ * @param {Object} str
+ */
+function moneyUnit(str){
+	let money = parseFloat(str);
+	if(money < 1000) {
+		return money + "元";
+	}
+	
+	if(money >= 1000) {
+		return Math.floor(money / 1000) + "K";
+	}
+}
+
+/**
+ * 返回薪水
+ * @param {Object} min_price 最小金额
+ * @param {Object} max_price 最大金额
+ * @param {Object} salary_type 薪水类型
+ */
+function nxMoney(min_price,max_price,salary_type) {
+	var tls = "";
+	if(min_price == max_price && min_price == 0) {
+		return '面议';
+	}
+	if(min_price == max_price && min_price > 0) {
+		tls = (min_price) +"元";
+	}
+	//以上
+	if(min_price > 0 && max_price == 0) {
+		tls = (min_price) + "元以上";
+	}
+	//区间
+	if(min_price > 0 && max_price > 0) {
+		tls = (min_price) + "元-" + (max_price)+"元";
+	}
+	//小时制
+	if(salary_type == 2) {
+		tls += "/每小时";
+	} 
+	//天制
+	if(salary_type == 3) {
+		tls += "/每天";
+	}
+	return tls;
+}
+
+/**
+ * 最小年龄 | 最大年龄
+ * @param {Object} min_age
+ * @param {Object} max_age
+ */
+function nxAge(min_age,max_age) {
+	if(min_age > 0 && max_age > 0 && max_age != min_age) {
+		return min_age + "岁-" + max_age + "岁";
+	}
+	
+	if(min_age > 0 && max_age > 0 && max_age == min_age) {
+		return min_age + "岁";
+	}
+	
+	if(min_age > 0 && max_age == 0) {
+		return min_age + "岁以上";
+	}
+	
+	if(min_age == 0 && max_age > 0) {
+		return max_age + "岁以下";
+	}
+	
+	if(min_age == 0 && max_age == 0) {
+		return "不限年龄";
+	}
+}
+
+function toH5ml(str) {
+	if(str == null || str.length == 0)
+	return '';
+	
+	//#ifdef H5
+		var newStr = str.replace(/\n/g, '_@').replace(/\r/g, '_#');
+		newStr = newStr.replace(/_#_@/g, '<br/>');//IE7-8
+		newStr = newStr.replace(/_@/g, '<br/>');//IE9、FF、chrome
+		newStr = newStr.replace(/\s/g, '&nbsp;');//空格处理
+		return newStr;
+	//#endif
+	
+	//#ifndef H5
+		str = str.replace(/&nbsp;/ig, ' ');//替换HTML空格
+	//#endif
+	   
+	return str;
+}
+
+function bankCode(code) {
+	if(code.length <= 12) {
+		return code;
+	}
+	var len = parseInt(code.length / 4) + (code.length % 4 > 0 ? 1 : 0);
+	var reStr = "";
+	for(var i = 0;i<len;i++) {
+		var llen = ((i * 4) + 4) >= code.length ? code.length : (i * 4); 
+		reStr += code.substr((i * 4),4) + " ";
+	}
+	return reStr;
+}
+
+/**
+ * 标题搜索突出关键词
+ * @param {Object} title1
+ * @param {Object} title2
+ */
+function titleTag(title1,title2) {
+	var dAr = [];
+	for(var i in title2) {
+		if(title1.indexOf(title2[i]) >= 0) {
+			dAr.push({ name : title2[i], type : 's'});
+		} else {
+			dAr.push({ name : title2[i], type : 'e'});
+		}
+	}
+	return dAr;
+}
+
+
+/**
+* 检验18位身份证号码(15位号码可以只检测生日是否正确即可)
+* @author wolfchen
+* @param cid 18为的身份证号码
+* @return Boolean 是否合法
+**/
+function isCnNewID(cid){
+	return IDCard(cid);
+}
+
+/**
+ * 自动计算高度 | 宽度
+ * @param width 原始
+ * @param height 原始
+ * @param mWidth 现在 0不参与计算
+ * @param mHeight 现在
+ */
+function getAotuWidth(width,height,mWidth,mHeight = 0) {
+    if(mWidth > 0 && mHeight == 0) {
+        return (height / width) * mWidth;
+    }
+
+    if(mWidth == 0 && mHeight > 0) {
+        return (width / height) * mHeight;
+    }
+
+    return  0;
+}
+
+
+function getAvatar(img,type){
+	if(isDefine(img) && img != "") {
+		return img;
+	}
+	
+	return type == 'chat' ? '/static/chat/user-avatar.png' : '/static/chat/group_chat.png';
+}
+
+/**
+ * 销售量
+ * @param {Object} count
+ */
+function sales(count){
+	if(isNaN(count)) return 0;
+	if(count < 100) return count + "";
+	if(count > 100 && count < 1000) return parseInt(count / 100) * 100 + "+";
+	if(count >= 1000 && count < 10000) return parseInt(count / 1000) * 1000 + "+";
+	if(count >= 10000 ) return parseInt(count / 10000) + "万+";
+}
+
+/**
+ * 数字转化文字
+ * @param {Object} num
+ */
+function numberToChinese(num) {
+  var cnNums = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
+  var cnIntRadice = ["", "十", "百", "千"];
+  var cnIntUnits = ["", "万", "亿", "兆"];
+  
+  var integerNum = Math.floor(num);
+  var decimalNum = Math.round((num - integerNum) * 100);
+  
+  function convertToChinese(num) {
+    var cnStr = "";
+    var numStr = num.toString();
+    var length = numStr.length;
+    var lastNonZero = false; // 用于处理连续的零
+    
+    for (var i = 0; i < length; i++) {
+      var digit = numStr.charAt(i);
+      if (digit === "0") {
+        lastNonZero = false;
+        if (i === length - 1 || numStr.charAt(i + 1) !== "0") {
+          cnStr += cnNums[parseInt(digit)];
+        }
+      } else {
+        cnStr += cnNums[parseInt(digit)] + cnIntRadice[length - i - 1];
+        lastNonZero = true;
+      }
+    }
+    
+    return cnStr;
+  }
+  
+  var chineseStr = "";
+  var zeroCount = 0;
+  
+  while (integerNum > 0) {
+    var section = integerNum % 10000;
+    if (zeroCount > 0) {
+      chineseStr = cnNums[0] + chineseStr; // 处理连续的零
+    }
+    chineseStr = convertToChinese(section) + cnIntUnits[zeroCount] + chineseStr;
+    integerNum = Math.floor(integerNum / 10000);
+    zeroCount++;
+  }
+  chineseStr += convertToChinese(decimalNum);
+  chineseStr = chineseStr.replace(/(零.)*零$/, "").replace(/^$/, "零");
+  if(chineseStr[chineseStr.length - 1] == '零'){
+	  chineseStr  = chineseStr.substring(0,chineseStr.length - 1);
+  }
+  return chineseStr;
+}
+ 
+ /**
+  * 取小数位0
+  * @param {Object} num
+  */
+ function removeTrailingZeros(num) {
+	let str = num.toString();
+	  if (str.indexOf('.') !== -1) {
+	    let parts = str.split('.');
+	    let decimalPart = parts[1].replace(/0+$/, '');
+	    if (decimalPart.length === 0) {
+	      return parseInt(parts[0]);
+	    } else {
+	      return parts[0] + '.' + decimalPart;
+	    }
+	  } else {
+	    return str;
+	  }
+ }
+
+
+
+
+
+function isJSON(str) {
+    if (typeof str == 'string') {
+        try {
+            var obj=JSON.parse(str);
+            if(typeof obj == 'object' && obj ){
+                return true;
+            }else{
+                return false;
+            }
+        } catch(e) {
+            return false;
+        }
+    }
+}
+
+
+
+
+
+export default {
+	Tip				: Tip,//
+	sales			: sales,//销售数量
+	loadIng     	: loadIng,//加载效果
+	showModal   	: showModal,//确认框 
+	showAlert		: showAlert,//提示框
+	date 			: date,//时间戳解析时间
+	strtotime   	: strtotime,//日期解析时间戳
+	returnFloat 	: returnFloat,//小数保留二位
+	CountDowm	  	: CountDowm,//倒计时
+	isDefine    	: isDefine,//判断是否空
+	httpGet		  	: httpGet,//同步获取GET
+	timest			: timest,//获取11位时间戳
+	httpGetAsy		: httpGetAsy,//异步GET
+	httpPostAsy		: httpPostAsy,//异步POST
+	isPoneAvailable : isPoneAvailable,//判断手机号码
+	navigateTo		: navigateTo,//页面跳转
+	noToChinese		: noToChinese,//数字转为中文数字
+	timeLastdate	: timeLastdate,
+	moneyUnit		: moneyUnit,//金钱单位
+	bankCode		: bankCode,//银行卡hide
+	toH5ml			: toH5ml,//格式化
+	nxAge			: nxAge,//年龄格式化
+	nxMoney			: nxMoney,//金钱格式化
+	titleTag		: titleTag,//标题tag
+	countdown		: countdown,
+	isCnNewID		: isCnNewID,
+	getAotuWidth	: getAotuWidth,
+	percentage		: percentage,
+	getAvatar		: getAvatar,
+	isJSON			: isJSON,
+	numberToChinese : numberToChinese,//数字转化中文
+	removeTrailingZeros : removeTrailingZeros,
+		navigateBack    : ()=>{
+			const pages = getCurrentPages();
+			pages.length > 1 ? uni.navigateBack() : uni.reLaunch({
+						url:"/pages/index/home"
+					});
+			
+		}
+}

+ 699 - 0
library/utils/Face.js

@@ -0,0 +1,699 @@
+module.exports = {
+	face : [{
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-open-mouth_1f603.png",
+			"name": "大眼睛咧嘴笑着的脸",
+			"value": "😃"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-open-mouth-and-smiling-eyes_1f604.png",
+			"name": "微笑的脸和微笑的眼睛",
+			"value": "😄"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/grinning-face-with-smiling-eyes_1f601.png",
+			"name": "笑容可掬的脸",
+			"value": "😁"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-open-mouth-and-tightly-closed-eyes_1f606.png",
+			"name": "咧嘴眯眼的脸",
+			"value": "😆"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-tears-of-joy_1f602.png",
+			"name": "喜极而泣",
+			"value": "😂"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/slightly-smiling-face_1f642.png",
+			"name": "略带微笑的脸",
+			"value": "🙂"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-smiling-eyes_1f60a.png",
+			"name": "微笑的脸和微笑的眼睛",
+			"value": "😊"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-halo_1f607.png",
+			"name": "带光环的笑脸",
+			"value": "😇"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-throwing-a-kiss_1f618.png",
+			"name": "吹出一个吻的脸、飞吻",
+			"value": "😘"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/kissing-face_1f617.png",
+			"name": "亲吻的脸",
+			"value": "😗"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/kissing-face-with-smiling-eyes_1f619.png",
+			"name": "用微笑的眼睛亲吻脸",
+			"value": "😙"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-savouring-delicious-food_1f60b.png",
+			"name": "馋嘴的笑脸",
+			"value": "😋"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-stuck-out-tongue-and-winking-eye_1f61c.png",
+			"name": "伸舌头眨眼的脸",
+			"value": "😜"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-stuck-out-tongue-and-tightly-closed-eyes_1f61d.png",
+			"name": "眯眼伸舌头笑脸",
+			"value": "😝"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-smiling-eyes-and-hand-covering-mouth_1f92d.png",
+			"name": "手捂嘴的脸",
+			"value": "🤭"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/confounded-face_1f616.png",
+			"name": "困惑的脸",
+			"value": "😖"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/persevering-face_1f623.png",
+			"name": "挣扎的脸",
+			"value": "😣"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-look-of-triumph_1f624.png",
+			"name": "愤怒、鼻子冒白气的脸",
+			"value": "😤"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pouting-face_1f621.png",
+			"name": "愤怒的红脸",
+			"value": "😡"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-horns_1f608.png",
+			"name": "恶作剧邪恶的笑脸",
+			"value": "😈"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/japanese-goblin_1f47a.png",
+			"name": "妖精",
+			"value": "👺"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/i-love-you-hand-sign_1f91f.png",
+			"name": "爱你的手势(美国)",
+			"value": "🤟"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/person-raising-both-hands-in-celebration_1f64c.png",
+			"name": "举起手来",
+			"value": "🙌"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-frowning_1f64d-200d-2640-fe0f.png",
+			"name": "女人皱眉",
+			"value": "🙍‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-raising-hand_1f64b-200d-2640-fe0f.png",
+			"name": "举手的女人",
+			"value": "🙋‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pedestrian_1f6b6.png",
+			"name": "步行的人",
+			"value": "🚶"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/man-walking_1f6b6-200d-2642-fe0f.png",
+			"name": "行走的男人",
+			"value": "🚶‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-walking_1f6b6-200d-2640-fe0f.png",
+			"name": "行走的女人",
+			"value": "🚶‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/runner_1f3c3.png",
+			"name": "跑步的人",
+			"value": "🏃"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/man-running_1f3c3-200d-2642-fe0f.png",
+			"name": "男子跑步",
+			"value": "🏃‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-running_1f3c3-200d-2640-fe0f.png",
+			"name": "女子跑步",
+			"value": "🏃‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/person-in-steamy-room_1f9d6.png",
+			"name": "在潮湿的房间里的人",
+			"value": "🧖"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/man-in-steamy-room_1f9d6-200d-2642-fe0f.png",
+			"name": "在潮湿的房间里的男人",
+			"value": "🧖‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-in-steamy-room_1f9d6-200d-2640-fe0f.png",
+			"name": "蒸汽房的女人",
+			"value": "🧖‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/balloon_1f388.png",
+			"name": "气球",
+			"value": "🎈"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pine-decoration_1f38d.png",
+			"name": "松木装饰",
+			"value": "🎍"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-open-mouth-and-cold-sweat_1f605.png",
+			"name": "满脸汗水的笑容",
+			"value": "😅"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/upside-down-face_1f643.png",
+			"name": "颠倒的脸",
+			"value": "🙃"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/winking-face_1f609.png",
+			"name": "眨眼的脸",
+			"value": "😉"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-heart-shaped-eyes_1f60d.png",
+			"name": "带着心眼的笑脸",
+			"value": "😍"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/grinning-face-with-star-eyes_1f929.png",
+			"name": "星光闪耀",
+			"value": "🤩"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/white-smiling-face_263a.png",
+			"name": "笑脸",
+			"value": "☺️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/kissing-face-with-closed-eyes_1f61a.png",
+			"name": "闭着眼睛亲吻脸",
+			"value": "😚"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-stuck-out-tongue_1f61b.png",
+			"name": "有舌头的脸",
+			"value": "😛"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/grinning-face-with-one-large-and-one-small-eye_1f92a.png",
+			"name": "滑稽的脸",
+			"value": "🤪"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/money-mouth-face_1f911.png",
+			"name": "张嘴眼睛冒钱脸",
+			"value": "🤑"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/hugging-face_1f917.png",
+			"name": "紧抱的脸",
+			"value": "🤗"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-finger-covering-closed-lips_1f92b.png",
+			"name": "嘘声的脸",
+			"value": "🤫"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/thinking-face_1f914.png",
+			"name": "思考的脸",
+			"value": "🤔"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-one-eyebrow-raised_1f928.png",
+			"name": "扬起一只眉毛的脸",
+			"value": "🤨"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/neutral-face_1f610.png",
+			"name": "平淡的脸",
+			"value": "😐"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/expressionless-face_1f611.png",
+			"name": "无表情的脸",
+			"value": "😑"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-without-mouth_1f636.png",
+			"name": "没有嘴的脸",
+			"value": "😶"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smirking-face_1f60f.png",
+			"name": "歪嘴笑的脸",
+			"value": "😏"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-rolling-eyes_1f644.png",
+			"name": "大眼滚动的脸",
+			"value": "🙄"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/grimacing-face_1f62c.png",
+			"name": "鬼脸",
+			"value": "😬"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/relieved-face_1f60c.png",
+			"name": "松了口气的脸",
+			"value": "😌"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/drooling-face_1f924.png",
+			"name": "流着口水的脸",
+			"value": "🤤"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/sleeping-face_1f634.png",
+			"name": "睡觉的脸",
+			"value": "😴"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-head-bandage_1f915.png",
+			"name": "带头巾的脸",
+			"value": "🤕"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/shocked-face-with-exploding-head_1f92f.png",
+			"name": "冒蘑菇云的头",
+			"value": "🤯"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-cowboy-hat_1f920.png",
+			"name": "牛仔帽脸",
+			"value": "🤠"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/smiling-face-with-sunglasses_1f60e.png",
+			"name": "带太阳镜(墨镜)的笑脸",
+			"value": "😎"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/nerd-face_1f913.png",
+			"name": "书呆子、戴眼镜的脸",
+			"value": "🤓"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-monocle_1f9d0.png",
+			"name": "用放大镜的脸",
+			"value": "🧐"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/confused-face_1f615.png",
+			"name": "小郁闷的脸",
+			"value": "😕"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/white-frowning-face_2639.png",
+			"name": "伤心的脸",
+			"value": "☹️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/astonished-face_1f632.png",
+			"name": "惊讶的脸",
+			"value": "😲"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/flushed-face_1f633.png",
+			"name": "脸红、茫然的脸",
+			"value": "😳"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/disappointed-but-relieved-face_1f625.png",
+			"name": "愁眉苦脸的脸",
+			"value": "😥"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-screaming-in-fear_1f631.png",
+			"name": "恐惧中尖叫的脸",
+			"value": "😱"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pile-of-poo_1f4a9.png",
+			"name": "一堆粪便\/大便",
+			"value": "💩"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/clown-face_1f921.png",
+			"name": "小丑脸",
+			"value": "🤡"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/extraterrestrial-alien_1f47d.png",
+			"name": "外星人",
+			"value": "👽"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/beating-heart_1f493.png",
+			"name": "跳动的心脏",
+			"value": "💓"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/boy_1f466.png",
+			"name": "男孩",
+			"value": "👦"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/girl_1f467.png",
+			"name": "女孩",
+			"value": "👧"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/man-tipping-hand_1f481-200d-2642-fe0f.png",
+			"name": "单手举起的男人",
+			"value": "💁‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/man-raising-hand_1f64b-200d-2642-fe0f.png",
+			"name": "举手的男人",
+			"value": "🙋‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/baby-angel_1f47c.png",
+			"name": "小天使",
+			"value": "👼"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/haircut_1f487.png",
+			"name": "理发师",
+			"value": "💇"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/couple-with-heart_1f491.png",
+			"name": "有爱心的情侣",
+			"value": "💑"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/couple-with-heart-man-man_1f468-200d-2764-fe0f-200d-1f468.png",
+			"name": "情侣:伙计,伙计",
+			"value": "👨‍❤️‍👨"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/couple-with-heart-woman-woman_1f469-200d-2764-fe0f-200d-1f469.png",
+			"name": "情侣:女人,女人",
+			"value": "👩‍❤️‍👩"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/monkey-face_1f435.png",
+			"name": "猴脸",
+			"value": "🐵"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/french-fries_1f35f.png",
+			"name": "炸薯条",
+			"value": "🍟"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/new-moon-with-face_1f31a.png",
+			"name": "新月脸",
+			"value": "🌚"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/first-quarter-moon-with-face_1f31b.png",
+			"name": "第一季月亮脸",
+			"value": "🌛"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/last-quarter-moon-with-face_1f31c.png",
+			"name": "最后四分之一的月亮脸",
+			"value": "🌜"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/full-moon-with-face_1f31d.png",
+			"name": "满月脸",
+			"value": "🌝"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/sun-with-face_1f31e.png",
+			"name": "有脸的太阳",
+			"value": "🌞"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/snowman_2603.png",
+			"name": "雪人",
+			"value": "☃️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/snowman-without-snow_26c4.png",
+			"name": "没有雪的雪人",
+			"value": "⛄"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/loudly-crying-face_1f62d.png",
+			"name": "大哭的脸",
+			"value": "😭"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-fairy_1f9da-200d-2640-fe0f.png",
+			"name": "女仙女",
+			"value": "🧚‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/family-woman-girl-boy_1f469-200d-1f467-200d-1f466.png",
+			"name": "家庭:女人,女孩,男孩",
+			"value": "👩‍👧‍👦"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/cactus_1f335.png",
+			"name": "仙人掌",
+			"value": "🌵"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/zipper-mouth-face_1f910.png",
+			"name": "嘴巴上有拉链的脸",
+			"value": "🤐"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/child_1f9d2.png",
+			"name": "孩子",
+			"value": "🧒"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/older-woman_1f475.png",
+			"name": "老妇人",
+			"value": "👵"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/male-health-worker_1f468-200d-2695-fe0f.png",
+			"name": "男子卫生工作者",
+			"value": "👨‍⚕️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/female-health-worker_1f469-200d-2695-fe0f.png",
+			"name": "女保健员",
+			"value": "👩‍⚕️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/rolling-on-the-floor-laughing_1f923.png",
+			"name": "在地板上滚来滚去大笑",
+			"value": "🤣"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/unamused-face_1f612.png",
+			"name": "有点郁闷的脸",
+			"value": "😒"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/lying-face_1f925.png",
+			"name": "长鼻子的脸",
+			"value": "🤥"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pensive-face_1f614.png",
+			"name": "沉思的脸",
+			"value": "😔"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/sleepy-face_1f62a.png",
+			"name": "困倦的脸",
+			"value": "😪"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-medical-mask_1f637.png",
+			"name": "带口罩的脸",
+			"value": "😷"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-thermometer_1f912.png",
+			"name": "嘴巴含着温度计的脸",
+			"value": "🤒"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/nauseated-face_1f922.png",
+			"name": "恶心、绿色的脸",
+			"value": "🤢"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-open-mouth-vomiting_1f92e.png",
+			"name": "呕吐的脸",
+			"value": "🤮"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/sneezing-face_1f927.png",
+			"name": "打喷嚏的脸",
+			"value": "🤧"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/dizzy-face_1f635.png",
+			"name": "头晕的脸",
+			"value": "😵"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/worried-face_1f61f.png",
+			"name": "担心的脸",
+			"value": "😟"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/slightly-frowning-face_1f641.png",
+			"name": "不高兴的脸",
+			"value": "🙁"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-open-mouth_1f62e.png",
+			"name": "张开嘴(惊讶)的脸",
+			"value": "😮"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/hushed-face_1f62f.png",
+			"name": "小困惑的脸",
+			"value": "😯"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/frowning-face-with-open-mouth_1f626.png",
+			"name": "微微张嘴的脸",
+			"value": "😦"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/anguished-face_1f627.png",
+			"name": "忧虑困惑的脸",
+			"value": "😧"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/fearful-face_1f628.png",
+			"name": "恐惧的脸",
+			"value": "😨"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-open-mouth-and-cold-sweat_1f630.png",
+			"name": "焦虑的脸",
+			"value": "😰"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/crying-face_1f622.png",
+			"name": "哭泣的脸",
+			"value": "😢"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/disappointed-face_1f61e.png",
+			"name": "悔恨的脸",
+			"value": "😞"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-with-cold-sweat_1f613.png",
+			"name": "一点汗的挫折脸",
+			"value": "😓"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/weary-face_1f629.png",
+			"name": "苦恼的脸",
+			"value": "😩"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/tired-face_1f62b.png",
+			"name": "疲惫厌烦的脸",
+			"value": "😫"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/angry-face_1f620.png",
+			"name": "愤怒瞪眼的脸",
+			"value": "😠"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/serious-face-with-symbols-covering-mouth_1f92c.png",
+			"name": "骂人说脏话的脸",
+			"value": "🤬"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/imp_1f47f.png",
+			"name": "生气的小怪物脸",
+			"value": "👿"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/skull_1f480.png",
+			"name": "颅骨\/骷髅",
+			"value": "💀"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/skull-and-crossbones_2620.png",
+			"name": "头骨和交叉骨\/骷髅",
+			"value": "☠️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/japanese-ogre_1f479.png",
+			"name": "食人魔",
+			"value": "👹"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/ghost_1f47b.png",
+			"name": "幽灵、鬼",
+			"value": "👻"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/alien-monster_1f47e.png",
+			"name": "外星怪物(像素怪物)",
+			"value": "👾"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/see-no-evil-monkey_1f648.png",
+			"name": "捂眼睛的猴子",
+			"value": "🙈"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/hear-no-evil-monkey_1f649.png",
+			"name": "捂耳朵的猴子",
+			"value": "🙉"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/speak-no-evil-monkey_1f64a.png",
+			"name": "捂嘴巴的猴子",
+			"value": "🙊"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/left-facing-fist_1f91b.png",
+			"name": "左拳",
+			"value": "🤛"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/right-facing-fist_1f91c.png",
+			"name": "右拳",
+			"value": "🤜"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/baby_1f476.png",
+			"name": "婴儿",
+			"value": "👶"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-palm_1f926.png",
+			"name": "单手捂脸的人",
+			"value": "🤦"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/man-facepalming_1f926-200d-2642-fe0f.png",
+			"name": "单手捂脸的男人",
+			"value": "🤦‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/woman-facepalming_1f926-200d-2640-fe0f.png",
+			"name": "女性面部按摩",
+			"value": "🤦‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/male-student_1f468-200d-1f393.png",
+			"name": "男学生",
+			"value": "👨‍🎓"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/female-student_1f469-200d-1f393.png",
+			"name": "女学生",
+			"value": "👩‍🎓"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/male-teacher_1f468-200d-1f3eb.png",
+			"name": "男教师",
+			"value": "👨‍🏫"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/female-teacher_1f469-200d-1f3eb.png",
+			"name": "女教师",
+			"value": "👩‍🏫"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/male-cook_1f468-200d-1f373.png",
+			"name": "男厨师",
+			"value": "👨‍🍳"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/female-cook_1f469-200d-1f373.png",
+			"name": "女厨师",
+			"value": "👩‍🍳"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/sleuth-or-spy_1f575.png",
+			"name": "侦探",
+			"value": "🕵️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/guardsman_1f482.png",
+			"name": "警卫",
+			"value": "💂"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/construction-worker_1f477.png",
+			"name": "建筑工人",
+			"value": "👷"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/male-construction-worker_1f477-200d-2642-fe0f.png",
+			"name": "施工员",
+			"value": "👷‍♂️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/female-construction-worker_1f477-200d-2640-fe0f.png",
+			"name": "女建筑工人",
+			"value": "👷‍♀️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/princess_1f478.png",
+			"name": "公主",
+			"value": "👸"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/elf_1f9dd.png",
+			"name": "精灵",
+			"value": "🧝"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/face-massage_1f486.png",
+			"name": "按摩的人",
+			"value": "💆"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/gorilla_1f98d.png",
+			"name": "大猩猩",
+			"value": "🦍"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/dog-face_1f436.png",
+			"name": "狗脸",
+			"value": "🐶"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/cat-face_1f431.png",
+			"name": "猫脸",
+			"value": "🐱"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/tiger-face_1f42f.png",
+			"name": "老虎脸",
+			"value": "🐯"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/horse-face_1f434.png",
+			"name": "马面",
+			"value": "🐴"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/deer_1f98c.png",
+			"name": "鹿",
+			"value": "🦌"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/cow-face_1f42e.png",
+			"name": "牛脸",
+			"value": "🐮"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pig-face_1f437.png",
+			"name": "猪脸",
+			"value": "🐷"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/pig_1f416.png",
+			"name": "猪",
+			"value": "🐖"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/boar_1f417.png",
+			"name": "野猪",
+			"value": "🐗"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/mouse-face_1f42d.png",
+			"name": "老鼠的脸",
+			"value": "🐭"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/rabbit-face_1f430.png",
+			"name": "兔子脸",
+			"value": "🐰"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/chipmunk_1f43f.png",
+			"name": "花栗鼠",
+			"value": "🐿️"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/koala_1f428.png",
+			"name": "考拉",
+			"value": "🐨"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/dragon-face_1f432.png",
+			"name": "龙脸",
+			"value": "🐲"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/watch_231a.png",
+			"name": "手表",
+			"value": "⌚"
+		}, {
+			"img": "https:\/\/emoji.emojipic.cn\/pic\/72\/google\/wind-blowing-face_1f32c.png",
+			"name": "迎风面",
+			"value": "🌬️"
+		}]
+};

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